From d67a6ebe02bedba31032f774350e008750a8ad00 Mon Sep 17 00:00:00 2001 From: Ghanshyam Mann Date: Sat, 24 Feb 2024 11:33:01 -0800 Subject: [PATCH] Retire Tripleo: remove repo content TripleO project is retiring - https://review.opendev.org/c/openstack/governance/+/905145 this commit remove the content of this project repo Change-Id: Ie970f3f04c78e9bfcd9212bfa97a9cc9ee376b0c --- .gitignore | 17 - .zuul.yaml | 4 - README.rst | 57 +- _custom/admonition_selector.js | 58 - _custom/cookies.js | 117 - _custom/custom.css | 146 - _custom/expandable.js | 31 - _custom/jquery.nav.js | 223 -- _custom/jquery.scrollTo.js | 208 -- _custom/menu.js | 3 - _templates/layout.html | 65 - bindep.txt | 2 - .../_images/TripleO_Network_Diagram_.jpg | Bin 94564 -> 0 bytes .../source/_images/spine_and_leaf.svg | 938 ------- .../source/_images/tripleo_ansible_arch.png | Bin 168894 -> 0 bytes deploy-guide/source/conf.py | 131 - deploy-guide/source/deployment/3rd_party.rst | 447 ---- .../deployment/ansible_config_download.rst | 657 ----- .../ansible_config_download_differences.rst | 133 - .../source/deployment/architecture.rst | 335 --- .../source/deployment/build_single_image.rst | 30 - .../deployment/container_image_prepare.rst | 552 ---- .../source/deployment/deployment_log.rst | 4 - .../source/deployment/deployment_output.rst | 31 - .../source/deployment/deployment_status.rst | 33 - .../source/deployment/ephemeral_heat.rst | 169 -- deploy-guide/source/deployment/index.rst | 35 - .../source/deployment/instack_undercloud.rst | 227 -- .../source/deployment/install_overcloud.rst | 712 ----- .../source/deployment/install_undercloud.rst | 325 --- deploy-guide/source/deployment/network_v2.rst | 485 ---- deploy-guide/source/deployment/overcloud.rst | 84 - .../source/deployment/repositories.rst | 6 - deploy-guide/source/deployment/standalone.rst | 1132 -------- .../source/deployment/template_deploy.rst | 85 - .../source/deployment/tips_tricks.rst | 380 --- deploy-guide/source/deployment/undercloud.rst | 31 - .../source/deployment/upload_single_image.rst | 14 - .../source/environments/baremetal.rst | 399 --- deploy-guide/source/environments/index.rst | 12 - .../source/environments/standalone.rst | 12 - deploy-guide/source/environments/virtual.rst | 14 - deploy-guide/source/features/api_policies.rst | 28 - deploy-guide/source/features/backends.rst | 16 - .../source/features/baremetal_overcloud.rst | 1169 -------- .../source/features/ceph_external.rst | 394 --- .../source/features/cinder_custom_backend.rst | 69 - .../source/features/cinder_netapp.rst | 60 - .../source/features/composable_services.rst | 58 - .../source/features/compute_nvdimm.rst | 83 - .../source/features/custom_networks.rst | 579 ---- deploy-guide/source/features/custom_roles.rst | 141 - .../source/features/deploy_cellv2.rst | 30 - .../features/deploy_cellv2_additional.rst | 155 -- .../features/deploy_cellv2_advanced.rst | 247 -- .../source/features/deploy_cellv2_basic.rst | 416 --- .../features/deploy_cellv2_manage_cell.rst | 189 -- .../source/features/deploy_cellv2_routed.rst | 718 ----- .../source/features/deploy_manila.rst | 349 --- deploy-guide/source/features/deploy_swift.rst | 116 - .../source/features/deployed_ceph.rst | 1968 -------------- .../source/features/deployed_server.rst | 697 ----- deploy-guide/source/features/designate.rst | 62 - .../source/features/disable_telemetry.rst | 28 - .../features/distributed_compute_node.rst | 1166 -------- .../distributed_multibackend_storage.rst | 1331 --------- .../domain_specific_ldap_backends.rst | 295 -- deploy-guide/source/features/extra_config.rst | 279 -- .../source/features/high_availability.rst | 18 - deploy-guide/source/features/index.rst | 51 - deploy-guide/source/features/instance_ha.rst | 81 - deploy-guide/source/features/ipsec.rst | 170 -- .../features/keystone_security_compliance.rst | 50 - deploy-guide/source/features/lvmfilter.rst | 38 - .../source/features/multiple_overclouds.rst | 132 - .../source/features/network_isolation.rst | 1085 -------- .../features/network_isolation_virt.rst | 73 - deploy-guide/source/features/node_config.rst | 99 - .../features/node_specific_hieradata.rst | 113 - deploy-guide/source/features/octavia.rst | 77 - deploy-guide/source/features/ops_tools.rst | 173 -- .../source/features/oslo_messaging_config.rst | 107 - .../source/features/ovs_dpdk_config.rst | 98 - .../source/features/pre_network_config.rst | 116 - deploy-guide/source/features/rhsm.rst | 139 - .../features/role_specific_parameters.rst | 108 - .../features/routed_spine_leaf_network.rst | 621 ----- .../source/features/security_hardening.rst | 408 --- .../source/features/server_blacklist.rst | 87 - deploy-guide/source/features/split_stack.rst | 129 - .../source/features/sriov_deployment.rst | 88 - deploy-guide/source/features/ssl.rst | 399 --- .../source/features/swift_external.rst | 85 - .../source/features/tls-everywhere.rst | 405 --- .../source/features/tls-introduction.rst | 159 -- .../source/features/tolerated_failure.rst | 46 - deploy-guide/source/features/tuned.rst | 61 - .../source/features/undercloud_minion.rst | 152 -- .../source/features/vdpa_deployment.rst | 440 --- deploy-guide/source/index.rst | 19 - .../backup_and_restore/00_index.rst | 26 - .../01_undercloud_backup.rst | 125 - .../02_overcloud_backup.rst | 156 -- .../03_undercloud_restore.rst | 204 -- .../04_overcloud_restore.rst | 185 -- .../backup_and_restore/05_rear.rst | 212 -- .../source/post_deployment/delete_nodes.rst | 71 - .../post_deployment/fernet_key_rotation.rst | 24 - deploy-guide/source/post_deployment/index.rst | 36 - .../source/post_deployment/migration.rst | 53 - .../post_deployment/pre_cache_images.rst | 215 -- .../post_deployment/quiesce_cephstorage.rst | 47 - .../post_deployment/quiesce_compute.rst | 83 - .../source/post_deployment/scale_roles.rst | 9 - .../source/post_deployment/tempest/index.rst | 11 - .../post_deployment/tempest/os_tempest.rst | 168 -- .../post_deployment/tempest/tempest.rst | 703 ----- .../tempest/tempest_plugins.rst | 64 - .../update_undercloud_ssh_keys.rst | 41 - .../post_deployment/updating-stacks-notes.rst | 41 - ..._network_configuration_post_deployment.rst | 32 - .../upgrade/fast_forward_upgrade.rst | 897 ------- .../source/post_deployment/upgrade/index.rst | 12 - .../post_deployment/upgrade/major_upgrade.rst | 913 ------- .../post_deployment/upgrade/minor_update.rst | 237 -- .../post_deployment/upgrade/undercloud.rst | 149 -- .../post_deployment/validations/ansible.rst | 46 - .../post_deployment/validations/cli.rst | 239 -- .../post_deployment/validations/in-flight.rst | 96 - .../post_deployment/validations/index.rst | 77 - .../source/post_deployment/vm_snapshot.rst | 26 - .../provisioning/ansible_deploy_interface.rst | 157 -- .../provisioning/baremetal_provision.rst | 710 ----- .../source/provisioning/bios_settings.rst | 51 - deploy-guide/source/provisioning/cleaning.rst | 58 - deploy-guide/source/provisioning/index.rst | 22 - .../provisioning/introspect_single_node.rst | 28 - .../provisioning/introspection_data.rst | 172 -- .../source/provisioning/node_discovery.rst | 147 - .../source/provisioning/node_placement.rst | 172 -- .../source/provisioning/node_states.rst | 54 - .../source/provisioning/profile_matching.rst | 188 -- .../source/provisioning/ready_state.rst | 31 - .../source/provisioning/root_device.rst | 106 - .../source/provisioning/uefi_boot.rst | 73 - .../source/provisioning/whole_disk_images.rst | 17 - deploy-guide/source/repositories.rst | 34 - deploy-guide/source/troubleshooting/index.rst | 14 - .../troubleshooting-image-build.rst | 16 - ...troubleshooting-log-and-status-capture.rst | 67 - .../troubleshooting/troubleshooting-nodes.rst | 192 -- .../troubleshooting-overcloud.rst | 300 --- ...troubleshooting-tripleo-heat-templates.rst | 8 - .../troubleshooting/troubleshooting.rst | 14 - doc/requirements.txt | 12 - doc/source/ci/_images/baremetal-jobs.svg | 2 - doc/source/ci/_images/grafana1.png | Bin 241376 -> 0 bytes doc/source/ci/_images/grafana2.png | Bin 197457 -> 0 bytes doc/source/ci/_images/grafana3.png | Bin 246127 -> 0 bytes doc/source/ci/_images/sova.png | Bin 178160 -> 0 bytes doc/source/ci/baremetal_jobs.rst | 279 -- doc/source/ci/chasing_promotions.rst | 259 -- doc/source/ci/check_gates.rst | 245 -- doc/source/ci/ci_primer.rst | 159 -- .../ci/component_integration_pipelines.mmd | 5 - .../ci/component_pipeline_tags_flow.mmd | 6 - doc/source/ci/content_provider_jobs.rst | 178 -- doc/source/ci/dlrn-promoter-overview.rst | 141 - doc/source/ci/emit_releases_file.rst | 93 - doc/source/ci/index.rst | 21 - doc/source/ci/promotions.mmd | 6 - doc/source/ci/reproduce-ci.rst | 127 - doc/source/ci/ruck_rover_primer.rst | 201 -- doc/source/ci/stages-overview.rst | 266 -- doc/source/ci/standalone_scenario_jobs.rst | 100 - doc/source/ci/third_party_dependencies_ci.rst | 144 - doc/source/ci/tripleo_ci_job_parenting.rst | 422 --- .../ci/tripleo_dependencies_pipelines.rst | 188 -- doc/source/conf.py | 195 -- doc/source/contributor/contributions.rst | 77 - doc/source/contributor/core.rst | 118 - doc/source/contributor/index.rst | 11 - doc/source/contributor/new_developers.rst | 117 - doc/source/contributor/squads.rst | 45 - doc/source/developer/index.rst | 12 - doc/source/developer/release.rst | 160 -- .../changes-puppet-tripleo.rst | 56 - .../developer/tht_walkthrough/changes-tht.rst | 241 -- .../tht_walkthrough/design-patterns.rst | 105 - .../tht_walkthrough/introduction.rst | 67 - .../service_template_sections.rst | 513 ---- .../developer/tht_walkthrough/summary.rst | 18 - .../tht_walkthrough/tht_walkthrough.rst | 24 - .../tht_walkthrough/tls_for_services.rst | 849 ------ doc/source/developer/tripleoclient_primer.rst | 139 - doc/source/index.rst | 147 - .../_images/TripleO_Network_Diagram_.jpg | Bin 94564 -> 0 bytes .../install/_images/introspection_diagram.png | Bin 31541 -> 0 bytes .../install/_images/introspection_diagram.svg | 717 ----- doc/source/install/_images/logical_view.png | Bin 122773 -> 0 bytes doc/source/install/_images/logical_view.svg | 2383 ----------------- doc/source/install/_images/overview.png | Bin 14348 -> 0 bytes doc/source/install/_images/overview.svg | 32 - doc/source/install/_images/physical_view.png | Bin 141792 -> 0 bytes doc/source/install/_images/physical_view.svg | 2243 ---------------- .../install/_images/tripleo_ansible_arch.png | Bin 205676 -> 0 bytes doc/source/install/_images/tripleo_ui.png | Bin 140771 -> 0 bytes .../install/advanced_deployment/custom.rst | 9 - .../advanced_deployment/deploy_openshift.rst | 452 ---- .../install/advanced_deployment/features.rst | 11 - doc/source/install/deploy-guide.rst | 6 - .../deprecated/basic_deployment_ui.rst | 290 -- doc/source/install/index.rst | 13 - .../install/introduction/architecture.rst | 384 --- .../install/introduction/components.rst | 455 ---- .../install/introduction/introduction.rst | 38 - doc/source/links.rst | 7 - .../developer/upgrades/ci_upgrades.rst | 267 -- .../upgrades/fast_fw_upgrade.plantuml | 190 -- .../developer/upgrades/fast_fw_upgrade.png | Bin 108696 -> 0 bytes .../developer/upgrades/fast_fw_upgrade.rst | 169 -- .../upgrade/developer/upgrades/links.rst | 31 - .../developer/upgrades/major_upgrade.plantuml | 188 -- .../developer/upgrades/major_upgrade.png | Bin 104158 -> 0 bytes .../developer/upgrades/major_upgrade.rst | 392 --- .../upgrades/major_upgrade_with_os.plantuml | 214 -- .../upgrades/major_upgrade_with_os.png | Bin 181519 -> 0 bytes .../developer/upgrades/minor_update.plantuml | 174 -- .../developer/upgrades/minor_update.png | Bin 94426 -> 0 bytes .../developer/upgrades/minor_update.rst | 171 -- .../developer/upgrades/rdo_upgrades_jobs.png | Bin 51229 -> 0 bytes .../upgrade/developer/upgrades/upgrades.rst | 14 - doc/source/upgrade/index.rst | 9 - requirements.txt | 5 - setup.cfg | 17 - setup.py | 20 - tox.ini | 35 - 237 files changed, 8 insertions(+), 47319 deletions(-) delete mode 100644 .gitignore delete mode 100644 .zuul.yaml delete mode 100644 _custom/admonition_selector.js delete mode 100644 _custom/cookies.js delete mode 100644 _custom/custom.css delete mode 100644 _custom/expandable.js delete mode 100644 _custom/jquery.nav.js delete mode 100644 _custom/jquery.scrollTo.js delete mode 100644 _custom/menu.js delete mode 100644 _templates/layout.html delete mode 100644 bindep.txt delete mode 100644 deploy-guide/source/_images/TripleO_Network_Diagram_.jpg delete mode 100644 deploy-guide/source/_images/spine_and_leaf.svg delete mode 100644 deploy-guide/source/_images/tripleo_ansible_arch.png delete mode 100644 deploy-guide/source/conf.py delete mode 100644 deploy-guide/source/deployment/3rd_party.rst delete mode 100644 deploy-guide/source/deployment/ansible_config_download.rst delete mode 100644 deploy-guide/source/deployment/ansible_config_download_differences.rst delete mode 100644 deploy-guide/source/deployment/architecture.rst delete mode 100644 deploy-guide/source/deployment/build_single_image.rst delete mode 100644 deploy-guide/source/deployment/container_image_prepare.rst delete mode 100644 deploy-guide/source/deployment/deployment_log.rst delete mode 100644 deploy-guide/source/deployment/deployment_output.rst delete mode 100644 deploy-guide/source/deployment/deployment_status.rst delete mode 100644 deploy-guide/source/deployment/ephemeral_heat.rst delete mode 100644 deploy-guide/source/deployment/index.rst delete mode 100644 deploy-guide/source/deployment/instack_undercloud.rst delete mode 100644 deploy-guide/source/deployment/install_overcloud.rst delete mode 100644 deploy-guide/source/deployment/install_undercloud.rst delete mode 100644 deploy-guide/source/deployment/network_v2.rst delete mode 100644 deploy-guide/source/deployment/overcloud.rst delete mode 100644 deploy-guide/source/deployment/repositories.rst delete mode 100644 deploy-guide/source/deployment/standalone.rst delete mode 100644 deploy-guide/source/deployment/template_deploy.rst delete mode 100644 deploy-guide/source/deployment/tips_tricks.rst delete mode 100644 deploy-guide/source/deployment/undercloud.rst delete mode 100644 deploy-guide/source/deployment/upload_single_image.rst delete mode 100644 deploy-guide/source/environments/baremetal.rst delete mode 100644 deploy-guide/source/environments/index.rst delete mode 100644 deploy-guide/source/environments/standalone.rst delete mode 100644 deploy-guide/source/environments/virtual.rst delete mode 100644 deploy-guide/source/features/api_policies.rst delete mode 100644 deploy-guide/source/features/backends.rst delete mode 100644 deploy-guide/source/features/baremetal_overcloud.rst delete mode 100644 deploy-guide/source/features/ceph_external.rst delete mode 100644 deploy-guide/source/features/cinder_custom_backend.rst delete mode 100644 deploy-guide/source/features/cinder_netapp.rst delete mode 100644 deploy-guide/source/features/composable_services.rst delete mode 100644 deploy-guide/source/features/compute_nvdimm.rst delete mode 100644 deploy-guide/source/features/custom_networks.rst delete mode 100644 deploy-guide/source/features/custom_roles.rst delete mode 100644 deploy-guide/source/features/deploy_cellv2.rst delete mode 100644 deploy-guide/source/features/deploy_cellv2_additional.rst delete mode 100644 deploy-guide/source/features/deploy_cellv2_advanced.rst delete mode 100644 deploy-guide/source/features/deploy_cellv2_basic.rst delete mode 100644 deploy-guide/source/features/deploy_cellv2_manage_cell.rst delete mode 100644 deploy-guide/source/features/deploy_cellv2_routed.rst delete mode 100644 deploy-guide/source/features/deploy_manila.rst delete mode 100644 deploy-guide/source/features/deploy_swift.rst delete mode 100644 deploy-guide/source/features/deployed_ceph.rst delete mode 100644 deploy-guide/source/features/deployed_server.rst delete mode 100644 deploy-guide/source/features/designate.rst delete mode 100644 deploy-guide/source/features/disable_telemetry.rst delete mode 100644 deploy-guide/source/features/distributed_compute_node.rst delete mode 100644 deploy-guide/source/features/distributed_multibackend_storage.rst delete mode 100644 deploy-guide/source/features/domain_specific_ldap_backends.rst delete mode 100644 deploy-guide/source/features/extra_config.rst delete mode 100644 deploy-guide/source/features/high_availability.rst delete mode 100644 deploy-guide/source/features/index.rst delete mode 100644 deploy-guide/source/features/instance_ha.rst delete mode 100644 deploy-guide/source/features/ipsec.rst delete mode 100644 deploy-guide/source/features/keystone_security_compliance.rst delete mode 100644 deploy-guide/source/features/lvmfilter.rst delete mode 100644 deploy-guide/source/features/multiple_overclouds.rst delete mode 100644 deploy-guide/source/features/network_isolation.rst delete mode 100644 deploy-guide/source/features/network_isolation_virt.rst delete mode 100644 deploy-guide/source/features/node_config.rst delete mode 100644 deploy-guide/source/features/node_specific_hieradata.rst delete mode 100644 deploy-guide/source/features/octavia.rst delete mode 100644 deploy-guide/source/features/ops_tools.rst delete mode 100644 deploy-guide/source/features/oslo_messaging_config.rst delete mode 100644 deploy-guide/source/features/ovs_dpdk_config.rst delete mode 100644 deploy-guide/source/features/pre_network_config.rst delete mode 100644 deploy-guide/source/features/rhsm.rst delete mode 100644 deploy-guide/source/features/role_specific_parameters.rst delete mode 100644 deploy-guide/source/features/routed_spine_leaf_network.rst delete mode 100644 deploy-guide/source/features/security_hardening.rst delete mode 100644 deploy-guide/source/features/server_blacklist.rst delete mode 100644 deploy-guide/source/features/split_stack.rst delete mode 100644 deploy-guide/source/features/sriov_deployment.rst delete mode 100644 deploy-guide/source/features/ssl.rst delete mode 100644 deploy-guide/source/features/swift_external.rst delete mode 100644 deploy-guide/source/features/tls-everywhere.rst delete mode 100644 deploy-guide/source/features/tls-introduction.rst delete mode 100644 deploy-guide/source/features/tolerated_failure.rst delete mode 100644 deploy-guide/source/features/tuned.rst delete mode 100644 deploy-guide/source/features/undercloud_minion.rst delete mode 100644 deploy-guide/source/features/vdpa_deployment.rst delete mode 100644 deploy-guide/source/index.rst delete mode 100644 deploy-guide/source/post_deployment/backup_and_restore/00_index.rst delete mode 100644 deploy-guide/source/post_deployment/backup_and_restore/01_undercloud_backup.rst delete mode 100644 deploy-guide/source/post_deployment/backup_and_restore/02_overcloud_backup.rst delete mode 100644 deploy-guide/source/post_deployment/backup_and_restore/03_undercloud_restore.rst delete mode 100644 deploy-guide/source/post_deployment/backup_and_restore/04_overcloud_restore.rst delete mode 100644 deploy-guide/source/post_deployment/backup_and_restore/05_rear.rst delete mode 100644 deploy-guide/source/post_deployment/delete_nodes.rst delete mode 100644 deploy-guide/source/post_deployment/fernet_key_rotation.rst delete mode 100644 deploy-guide/source/post_deployment/index.rst delete mode 100644 deploy-guide/source/post_deployment/migration.rst delete mode 100644 deploy-guide/source/post_deployment/pre_cache_images.rst delete mode 100644 deploy-guide/source/post_deployment/quiesce_cephstorage.rst delete mode 100644 deploy-guide/source/post_deployment/quiesce_compute.rst delete mode 100644 deploy-guide/source/post_deployment/scale_roles.rst delete mode 100644 deploy-guide/source/post_deployment/tempest/index.rst delete mode 100644 deploy-guide/source/post_deployment/tempest/os_tempest.rst delete mode 100644 deploy-guide/source/post_deployment/tempest/tempest.rst delete mode 100644 deploy-guide/source/post_deployment/tempest/tempest_plugins.rst delete mode 100644 deploy-guide/source/post_deployment/update_undercloud_ssh_keys.rst delete mode 100644 deploy-guide/source/post_deployment/updating-stacks-notes.rst delete mode 100644 deploy-guide/source/post_deployment/updating_network_configuration_post_deployment.rst delete mode 100644 deploy-guide/source/post_deployment/upgrade/fast_forward_upgrade.rst delete mode 100644 deploy-guide/source/post_deployment/upgrade/index.rst delete mode 100644 deploy-guide/source/post_deployment/upgrade/major_upgrade.rst delete mode 100644 deploy-guide/source/post_deployment/upgrade/minor_update.rst delete mode 100644 deploy-guide/source/post_deployment/upgrade/undercloud.rst delete mode 100644 deploy-guide/source/post_deployment/validations/ansible.rst delete mode 100644 deploy-guide/source/post_deployment/validations/cli.rst delete mode 100644 deploy-guide/source/post_deployment/validations/in-flight.rst delete mode 100644 deploy-guide/source/post_deployment/validations/index.rst delete mode 100644 deploy-guide/source/post_deployment/vm_snapshot.rst delete mode 100644 deploy-guide/source/provisioning/ansible_deploy_interface.rst delete mode 100644 deploy-guide/source/provisioning/baremetal_provision.rst delete mode 100644 deploy-guide/source/provisioning/bios_settings.rst delete mode 100644 deploy-guide/source/provisioning/cleaning.rst delete mode 100644 deploy-guide/source/provisioning/index.rst delete mode 100644 deploy-guide/source/provisioning/introspect_single_node.rst delete mode 100644 deploy-guide/source/provisioning/introspection_data.rst delete mode 100644 deploy-guide/source/provisioning/node_discovery.rst delete mode 100644 deploy-guide/source/provisioning/node_placement.rst delete mode 100644 deploy-guide/source/provisioning/node_states.rst delete mode 100644 deploy-guide/source/provisioning/profile_matching.rst delete mode 100644 deploy-guide/source/provisioning/ready_state.rst delete mode 100644 deploy-guide/source/provisioning/root_device.rst delete mode 100644 deploy-guide/source/provisioning/uefi_boot.rst delete mode 100644 deploy-guide/source/provisioning/whole_disk_images.rst delete mode 100644 deploy-guide/source/repositories.rst delete mode 100644 deploy-guide/source/troubleshooting/index.rst delete mode 100644 deploy-guide/source/troubleshooting/troubleshooting-image-build.rst delete mode 100644 deploy-guide/source/troubleshooting/troubleshooting-log-and-status-capture.rst delete mode 100644 deploy-guide/source/troubleshooting/troubleshooting-nodes.rst delete mode 100644 deploy-guide/source/troubleshooting/troubleshooting-overcloud.rst delete mode 100644 deploy-guide/source/troubleshooting/troubleshooting-tripleo-heat-templates.rst delete mode 100644 deploy-guide/source/troubleshooting/troubleshooting.rst delete mode 100644 doc/requirements.txt delete mode 100644 doc/source/ci/_images/baremetal-jobs.svg delete mode 100644 doc/source/ci/_images/grafana1.png delete mode 100644 doc/source/ci/_images/grafana2.png delete mode 100644 doc/source/ci/_images/grafana3.png delete mode 100644 doc/source/ci/_images/sova.png delete mode 100644 doc/source/ci/baremetal_jobs.rst delete mode 100644 doc/source/ci/chasing_promotions.rst delete mode 100644 doc/source/ci/check_gates.rst delete mode 100644 doc/source/ci/ci_primer.rst delete mode 100644 doc/source/ci/component_integration_pipelines.mmd delete mode 100644 doc/source/ci/component_pipeline_tags_flow.mmd delete mode 100644 doc/source/ci/content_provider_jobs.rst delete mode 100644 doc/source/ci/dlrn-promoter-overview.rst delete mode 100644 doc/source/ci/emit_releases_file.rst delete mode 100644 doc/source/ci/index.rst delete mode 100644 doc/source/ci/promotions.mmd delete mode 100644 doc/source/ci/reproduce-ci.rst delete mode 100644 doc/source/ci/ruck_rover_primer.rst delete mode 100644 doc/source/ci/stages-overview.rst delete mode 100644 doc/source/ci/standalone_scenario_jobs.rst delete mode 100644 doc/source/ci/third_party_dependencies_ci.rst delete mode 100644 doc/source/ci/tripleo_ci_job_parenting.rst delete mode 100644 doc/source/ci/tripleo_dependencies_pipelines.rst delete mode 100644 doc/source/conf.py delete mode 100644 doc/source/contributor/contributions.rst delete mode 100644 doc/source/contributor/core.rst delete mode 100644 doc/source/contributor/index.rst delete mode 100644 doc/source/contributor/new_developers.rst delete mode 100644 doc/source/contributor/squads.rst delete mode 100644 doc/source/developer/index.rst delete mode 100644 doc/source/developer/release.rst delete mode 100644 doc/source/developer/tht_walkthrough/changes-puppet-tripleo.rst delete mode 100644 doc/source/developer/tht_walkthrough/changes-tht.rst delete mode 100644 doc/source/developer/tht_walkthrough/design-patterns.rst delete mode 100644 doc/source/developer/tht_walkthrough/introduction.rst delete mode 100644 doc/source/developer/tht_walkthrough/service_template_sections.rst delete mode 100644 doc/source/developer/tht_walkthrough/summary.rst delete mode 100644 doc/source/developer/tht_walkthrough/tht_walkthrough.rst delete mode 100644 doc/source/developer/tht_walkthrough/tls_for_services.rst delete mode 100644 doc/source/developer/tripleoclient_primer.rst delete mode 100644 doc/source/index.rst delete mode 100644 doc/source/install/_images/TripleO_Network_Diagram_.jpg delete mode 100644 doc/source/install/_images/introspection_diagram.png delete mode 100644 doc/source/install/_images/introspection_diagram.svg delete mode 100644 doc/source/install/_images/logical_view.png delete mode 100644 doc/source/install/_images/logical_view.svg delete mode 100644 doc/source/install/_images/overview.png delete mode 100644 doc/source/install/_images/overview.svg delete mode 100644 doc/source/install/_images/physical_view.png delete mode 100644 doc/source/install/_images/physical_view.svg delete mode 100644 doc/source/install/_images/tripleo_ansible_arch.png delete mode 100644 doc/source/install/_images/tripleo_ui.png delete mode 100644 doc/source/install/advanced_deployment/custom.rst delete mode 100644 doc/source/install/advanced_deployment/deploy_openshift.rst delete mode 100644 doc/source/install/advanced_deployment/features.rst delete mode 100644 doc/source/install/deploy-guide.rst delete mode 100644 doc/source/install/deprecated/basic_deployment_ui.rst delete mode 100644 doc/source/install/index.rst delete mode 100644 doc/source/install/introduction/architecture.rst delete mode 100644 doc/source/install/introduction/components.rst delete mode 100644 doc/source/install/introduction/introduction.rst delete mode 100644 doc/source/links.rst delete mode 100644 doc/source/upgrade/developer/upgrades/ci_upgrades.rst delete mode 100644 doc/source/upgrade/developer/upgrades/fast_fw_upgrade.plantuml delete mode 100644 doc/source/upgrade/developer/upgrades/fast_fw_upgrade.png delete mode 100644 doc/source/upgrade/developer/upgrades/fast_fw_upgrade.rst delete mode 100644 doc/source/upgrade/developer/upgrades/links.rst delete mode 100644 doc/source/upgrade/developer/upgrades/major_upgrade.plantuml delete mode 100644 doc/source/upgrade/developer/upgrades/major_upgrade.png delete mode 100644 doc/source/upgrade/developer/upgrades/major_upgrade.rst delete mode 100644 doc/source/upgrade/developer/upgrades/major_upgrade_with_os.plantuml delete mode 100644 doc/source/upgrade/developer/upgrades/major_upgrade_with_os.png delete mode 100644 doc/source/upgrade/developer/upgrades/minor_update.plantuml delete mode 100644 doc/source/upgrade/developer/upgrades/minor_update.png delete mode 100644 doc/source/upgrade/developer/upgrades/minor_update.rst delete mode 100644 doc/source/upgrade/developer/upgrades/rdo_upgrades_jobs.png delete mode 100644 doc/source/upgrade/developer/upgrades/upgrades.rst delete mode 100644 doc/source/upgrade/index.rst delete mode 100644 requirements.txt delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 tox.ini diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ad7f7aba..00000000 --- a/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -*.swp -*~ -*.qcow2 - -.DS_Store - -*.egg* -*.pyc - -.tox -doc/build -deploy-guide/source/_build -build - -# pbr generates these -AUTHORS -ChangeLog diff --git a/.zuul.yaml b/.zuul.yaml deleted file mode 100644 index 739edefa..00000000 --- a/.zuul.yaml +++ /dev/null @@ -1,4 +0,0 @@ -- project: - templates: - - publish-openstack-docs-pti - - deploy-guide-jobs diff --git a/README.rst b/README.rst index 34779d11..4ee2c5f1 100644 --- a/README.rst +++ b/README.rst @@ -1,51 +1,10 @@ -======================== -Team and repository tags -======================== +This project is no longer maintained. -.. image:: https://governance.openstack.org/tc/badges/tripleo-docs.svg - :target: https://governance.openstack.org/tc/reference/tags/index.html +The contents of this repository are still available in the Git +source code management system. To see the contents of this +repository before it reached its end of life, please check out the +previous commit with "git checkout HEAD^1". -.. Change things from this point on - -TripleO Documentation -===================== - -This is the documentation source for the TripleO project. You can read -the generated documentation at `TripleO -Docs `__. - -You can find out more about TripleO at the `TripleO -Wiki `__. - -Getting Started ---------------- - -Documentation for the TripleO project is hosted on the OpenStack Gerrit -site. You can view all open and resolved issues in the -``openstack/tripleo-docs`` project at `TripleO -Reviews `__. - -General information about contributing to the OpenStack documentation -available at `OpenStack Documentation Contributor -Guide `__ - -Quick Start ------------ - -The following is a quick set of instructions to get you up and running -by building the TripleO documentation locally. The first step is to get -your Python environment configured. Information on configuring is -available at `Python Project -Guide `__ - -Next you can generate the documentation using the following command. Be -sure to run all the commands from within the recently checked out -repository. - -:: - - tox -edocs,pdf-docs,deploy-guide - -Now you have the documentation generated for the various available -formats from the local source. The resulting documentation will be -available within the ``doc/build/`` directory. +For any further questions, please email +openstack-discuss@lists.openstack.org or join #openstack-dev on +OFTC. diff --git a/_custom/admonition_selector.js b/_custom/admonition_selector.js deleted file mode 100644 index 3776e9ff..00000000 --- a/_custom/admonition_selector.js +++ /dev/null @@ -1,58 +0,0 @@ -/* - This function will search for all classes matching all IDs which are under - #admonition_selector element and display/hide their content. - - State is saved in cookies so user doesn't lose his settings after page - reload or changing pages. - - To make this feature work, you need to: - - add checkbox to _templates/layout.html file with proper ID - - in admonitions use proper class which matches above mentioned ID -*/ - - - -// after document is loaded -$(document).ready(function() { - - // for each checkbox in #admonition_selector do - $('#admonition_selector :checkbox').each(function() { - - // check value of cookies and set state to the related element - if ($.cookie($(this).attr("id")) == "true") { - $(this).prop("checked", true); - } else { - $(this).prop("checked", false); - } - - // show/hide elements after page loaded - toggle_admonition($(this).attr("id")); - }); - - // when user clicks on the checkbox, react - $('#admonition_selector :checkbox').change(function() { - - // show/hide related elements - toggle_admonition($(this).attr("id")); - - // save the state in the cookies - $.cookie($(this).attr("id"), $(this).is(':checked'), { path: '/' }); - }); -}); - - -// function to show/hide elements based on checkbox state -// checkbox has ID and it toggles elements having class named same way as the ID -function toggle_admonition(admonition) { - - // for each element having class as the checkbox's ID - $(".admonition." + admonition).each(function() { - - // set show/hide - if($("#" + admonition).is(':checked')) { - $(this).show(); - } else { - $(this).hide(); - } - }); -} diff --git a/_custom/cookies.js b/_custom/cookies.js deleted file mode 100644 index a845cd5c..00000000 --- a/_custom/cookies.js +++ /dev/null @@ -1,117 +0,0 @@ -/*! - * jQuery Cookie Plugin v1.4.1 - * https://github.com/carhartl/jquery-cookie - * - * Copyright 2013 Klaus Hartl - * Released under the MIT license - */ -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD - define(['jquery'], factory); - } else if (typeof exports === 'object') { - // CommonJS - factory(require('jquery')); - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - - var pluses = /\+/g; - - function encode(s) { - return config.raw ? s : encodeURIComponent(s); - } - - function decode(s) { - return config.raw ? s : decodeURIComponent(s); - } - - function stringifyCookieValue(value) { - return encode(config.json ? JSON.stringify(value) : String(value)); - } - - function parseCookieValue(s) { - if (s.indexOf('"') === 0) { - // This is a quoted cookie as according to RFC2068, unescape... - s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); - } - - try { - // Replace server-side written pluses with spaces. - // If we can't decode the cookie, ignore it, it's unusable. - // If we can't parse the cookie, ignore it, it's unusable. - s = decodeURIComponent(s.replace(pluses, ' ')); - return config.json ? JSON.parse(s) : s; - } catch(e) {} - } - - function read(s, converter) { - var value = config.raw ? s : parseCookieValue(s); - return $.isFunction(converter) ? converter(value) : value; - } - - var config = $.cookie = function (key, value, options) { - - // Write - - if (value !== undefined && !$.isFunction(value)) { - options = $.extend({}, config.defaults, options); - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setTime(+t + days * 864e+5); - } - - return (document.cookie = [ - encode(key), '=', stringifyCookieValue(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // Read - - var result = key ? undefined : {}; - - // To prevent the for loop in the first place assign an empty array - // in case there are no cookies at all. Also prevents odd result when - // calling $.cookie(). - var cookies = document.cookie ? document.cookie.split('; ') : []; - - for (var i = 0, l = cookies.length; i < l; i++) { - var parts = cookies[i].split('='); - var name = decode(parts.shift()); - var cookie = parts.join('='); - - if (key && key === name) { - // If second argument (value) is a function it's a converter... - result = read(cookie, value); - break; - } - - // Prevent storing a cookie that we couldn't decode. - if (!key && (cookie = read(cookie)) !== undefined) { - result[name] = cookie; - } - } - - return result; - }; - - config.defaults = {}; - - $.removeCookie = function (key, options) { - if ($.cookie(key) === undefined) { - return false; - } - - // Must not alter options, thus extending a fresh object... - $.cookie(key, '', $.extend({}, options, { expires: -1 })); - return !$.cookie(key); - }; - -})); diff --git a/_custom/custom.css b/_custom/custom.css deleted file mode 100644 index c84f039a..00000000 --- a/_custom/custom.css +++ /dev/null @@ -1,146 +0,0 @@ -/* CUSTOM CSS OVERRIDES GO HERE */ -/* ============================ */ - -/* remove backgrounds */ -#admonition_selector { - background: none !important; - color: black !important; -} - -/* admonition selector */ -#admonition_selector { - border-top: 0 none !important; -} - -#admonition_selector .title { - color: rgba(0, 0, 0, 0.6) !important; -} - -.trigger { - color: rgba(0, 0, 0, 0.7) !important; - border-top: 1px solid rgba(0, 0, 0, 0.2); - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - background: rgba(0, 0, 0, 0.05); -} - -.trigger:hover { - color: rgba(0, 0, 0, 0.9) !important; -} - -/* NOTES, ADMONITIONS AND TAGS */ -.admonition { - font-size: 85%; /* match code size */ - background: rgb(240, 240, 240); - color: rgba(0, 0, 0, 0.55); - border: 1px solid rgba(0, 0, 0, 0.1); - padding: 0.5em 1em 0.75em 1em; - margin-bottom: 24px; -} - -.admonition .admonition { - /* Don't keep shrinking the font for nested admonitions. */ - font-size: 100%; -} - -.admonition p { - font-size: inherit; -} - -.admonition p.last { - margin-bottom: 0; -} - -.admonition p.first.admonition-title { - display: inline; - background: none; - font-weight: bold; - color: rgba(0, 0, 0, 0.75); -} - -/* notes */ -.rst-content .note { - background: rgb(240, 240, 240); -} - -/* tags */ -.fedora28 {background: #aee;} -.centos7 {background: #cea;} -.centos8 {background: #cae;} -.rhel {background: #fee;} -.portal {background-color: #ded;} -.satellite {background-color: #dee;} -.stable {background: #eed;} -.newton {background: #ede;} -.ocata {background: #edd;} -.pike {background: #dfb;} -.queens {background: #afd;} -.rocky {background: #aee;} -.stein {background: #ade;} -.centos {background: #fef;} -.baremetal {background: #eef;} -.virtual {background: #efe;} -.ceph {background: #eff;} -.mton {background: #ded;} -.ntoo {background: #edd;} -.otop {background: #dfb;} -.ptoq {background: #afd;} -.qtor {background: #aee;} -.rtos {background: #ade;} -.validations {background: #fdd;} -.optional {background: #ffe;} -.tls {background: #ded;} - -/* admonition selector */ -#admonition_selector { - color: white; - font-size: 85%; - line-height: 1.4; - background: #2980b9; - border-top: 1px solid rgba(255, 255, 255, 0.4); -} - -.trigger { - color: rgba(255, 255, 255, 0.75); - line-height: 2.5; - position: relative; - cursor: pointer; - padding: 0 1.618em; -} - -.trigger:after { - content: '▾'; - font-family: FontAwesome; -} - -.trigger:hover { - color: white; -} - -.content { - display: none; - border-top: 1px solid rgba(255, 255, 255, 0.1); - background: rgba(255, 255, 255, 0.1); - padding: 0.5em 1.618em; -} - -.displayed .trigger:after { - content: '▴'; -} - -#admonition_selector .title { - color: rgba(255, 255, 255, 0.45); -} - -#admonition_selector ul { - margin-bottom: 0.75em; -} - -#admonition_selector ul li { - display: block; -} - -#admonition_selector label { - display: inline; - color: inherit; - text-decoration: underline dotted; -} diff --git a/_custom/expandable.js b/_custom/expandable.js deleted file mode 100644 index a11eb9e2..00000000 --- a/_custom/expandable.js +++ /dev/null @@ -1,31 +0,0 @@ -$(document).ready(function() { - - // for each trigger - $('.trigger').each(function() { - - // check if cookie has value on true - if ($.cookie($(this).parent().prop('id')) == "true") { - // add displayed class and show the content - $(this).parent().addClass("displayed"); - $(this).next('.content').show(); - - } else { - // remove displayed class and hide the content - $(this).parent().removeClass("displayed"); - $(this).next('.content').hide(); - } - }); - - // if user clicked trigger element - $('.trigger').click(function() { - - // toggle parent's class and animate the content - $(this).parent().toggleClass('displayed'); - $(this).next('.content').slideToggle("fast"); - - // save the state to cookies - $.cookie($(this).parent().prop('id'), - $(this).parent().hasClass('displayed'), - { path: '/' }); - }); -}); diff --git a/_custom/jquery.nav.js b/_custom/jquery.nav.js deleted file mode 100644 index 665157f8..00000000 --- a/_custom/jquery.nav.js +++ /dev/null @@ -1,223 +0,0 @@ -/* - * jQuery One Page Nav Plugin - * http://github.com/davist11/jQuery-One-Page-Nav - * - * Copyright (c) 2010 Trevor Davis (http://trevordavis.net) - * Dual licensed under the MIT and GPL licenses. - * Uses the same license as jQuery, see: - * http://jquery.org/license - * - * @version 3.0.0 - * - * Example usage: - * $('#nav').onePageNav({ - * currentClass: 'current', - * changeHash: false, - * scrollSpeed: 750 - * }); - */ - -;(function($, window, document, undefined){ - - // our plugin constructor - var OnePageNav = function(elem, options){ - this.elem = elem; - this.$elem = $(elem); - this.options = options; - this.metadata = this.$elem.data('plugin-options'); - this.$win = $(window); - this.sections = {}; - this.didScroll = false; - this.$doc = $(document); - this.docHeight = this.$doc.height(); - }; - - // the plugin prototype - OnePageNav.prototype = { - defaults: { - navItems: 'a', - currentClass: 'active', - changeHash: false, - easing: 'swing', - filter: '', - scrollSpeed: 750, - scrollThreshold: 0.2, - begin: false, - end: false, - scrollChange: false - }, - - init: function() { - // Introduce defaults that can be extended either - // globally or using an object literal. - this.config = $.extend({}, this.defaults, this.options, this.metadata); - - this.$nav = this.$elem.find(this.config.navItems); - - //Filter any links out of the nav - if(this.config.filter !== '') { - this.$nav = this.$nav.filter(this.config.filter); - } - - //Handle clicks on the nav - this.$nav.on('click.onePageNav', $.proxy(this.handleClick, this)); - - //Get the section positions - this.getPositions(); - - //Handle scroll changes - this.bindInterval(); - - //Update the positions on resize too - this.$win.on('resize.onePageNav', $.proxy(this.getPositions, this)); - - return this; - }, - - adjustNav: function(self, $parent) { - self.$elem.find('.' + self.config.currentClass).removeClass(self.config.currentClass); - $parent.addClass(self.config.currentClass); - }, - - bindInterval: function() { - var self = this; - var docHeight; - - self.$win.on('scroll.onePageNav', function() { - self.didScroll = true; - }); - - self.t = setInterval(function() { - docHeight = self.$doc.height(); - - //If it was scrolled - if(self.didScroll) { - self.didScroll = false; - self.scrollChange(); - } - - //If the document height changes - if(docHeight !== self.docHeight) { - self.docHeight = docHeight; - self.getPositions(); - } - }, 250); - }, - - getHash: function($link) { - return $link.attr('href').split('#')[1]; - }, - - getPositions: function() { - var self = this; - var linkHref; - var topPos; - var $target; - - self.$nav.each(function() { - linkHref = self.getHash($(this)); - $target = $('#' + linkHref); - - if($target.length) { - topPos = $target.offset().top; - self.sections[linkHref] = Math.round(topPos); - } - }); - }, - - getSection: function(windowPos) { - var returnValue = null; - var windowHeight = Math.round(this.$win.height() * this.config.scrollThreshold); - - for(var section in this.sections) { - if((this.sections[section] - windowHeight) < windowPos) { - returnValue = section; - } - } - - return returnValue; - }, - - handleClick: function(e) { - var self = this; - var $link = $(e.currentTarget); - var $parent = $link.parent(); - var newLoc = '#' + self.getHash($link); - - if(!$parent.hasClass(self.config.currentClass)) { - //Start callback - if(self.config.begin) { - self.config.begin(); - } - - //Change the highlighted nav item - self.adjustNav(self, $parent); - - //Removing the auto-adjust on scroll - self.unbindInterval(); - - //Scroll to the correct position - self.scrollTo(newLoc, function() { - //Do we need to change the hash? - if(self.config.changeHash) { - window.location.hash = newLoc; - } - - //Add the auto-adjust on scroll back in - self.bindInterval(); - - //End callback - if(self.config.end) { - self.config.end(); - } - }); - } - - e.preventDefault(); - }, - - scrollChange: function() { - var windowTop = this.$win.scrollTop(); - var position = this.getSection(windowTop); - var $parent; - - //If the position is set - if(position !== null) { - $parent = this.$elem.find('a[href$="#' + position + '"]').parent(); - - //If it's not already the current section - if(!$parent.hasClass(this.config.currentClass)) { - //Change the highlighted nav item - this.adjustNav(this, $parent); - - //If there is a scrollChange callback - if(this.config.scrollChange) { - this.config.scrollChange($parent); - } - } - } - }, - - scrollTo: function(target, callback) { - var offset = $(target).offset().top; - - $('html, body').animate({ - scrollTop: offset - }, this.config.scrollSpeed, this.config.easing, callback); - }, - - unbindInterval: function() { - clearInterval(this.t); - this.$win.unbind('scroll.onePageNav'); - } - }; - - OnePageNav.defaults = OnePageNav.prototype.defaults; - - $.fn.onePageNav = function(options) { - return this.each(function() { - new OnePageNav(this, options).init(); - }); - }; - -})( jQuery, window , document ); diff --git a/_custom/jquery.scrollTo.js b/_custom/jquery.scrollTo.js deleted file mode 100644 index 4fc95659..00000000 --- a/_custom/jquery.scrollTo.js +++ /dev/null @@ -1,208 +0,0 @@ -/*! - * jQuery.scrollTo - * Copyright (c) 2007-2015 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com - * Licensed under MIT - * http://flesler.blogspot.com/2007/10/jqueryscrollto.html - * @projectDescription Easy element scrolling using jQuery. - * @author Ariel Flesler - * @version 2.1.0 - */ -;(function(define) { - 'use strict'; - - define(['jquery'], function($) { - var $scrollTo = $.scrollTo = function(target, duration, settings) { - return $(window).scrollTo(target, duration, settings); - }; - - $scrollTo.defaults = { - axis:'xy', - duration: 0, - limit:true - }; - - function isWin(elem) { - return !elem.nodeName || - $.inArray(elem.nodeName.toLowerCase(), ['iframe','#document','html','body']) !== -1; - } - - $.fn.scrollTo = function(target, duration, settings) { - if (typeof duration === 'object') { - settings = duration; - duration = 0; - } - if (typeof settings === 'function') { - settings = { onAfter:settings }; - } - if (target === 'max') { - target = 9e9; - } - - settings = $.extend({}, $scrollTo.defaults, settings); - // Speed is still recognized for backwards compatibility - duration = duration || settings.duration; - // Make sure the settings are given right - var queue = settings.queue && settings.axis.length > 1; - if (queue) { - // Let's keep the overall duration - duration /= 2; - } - settings.offset = both(settings.offset); - settings.over = both(settings.over); - - return this.each(function() { - // Null target yields nothing, just like jQuery does - if (target === null) return; - - var win = isWin(this), - elem = win ? this.contentWindow || window : this, - $elem = $(elem), - targ = target, - attr = {}, - toff; - - switch (typeof targ) { - // A number will pass the regex - case 'number': - case 'string': - if (/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)) { - targ = both(targ); - // We are done - break; - } - // Relative/Absolute selector - targ = win ? $(targ) : $(targ, elem); - if (!targ.length) return; - /* falls through */ - case 'object': - // DOMElement / jQuery - if (targ.is || targ.style) { - // Get the real position of the target - toff = (targ = $(targ)).offset(); - } - } - - var offset = $.isFunction(settings.offset) && settings.offset(elem, targ) || settings.offset; - - $.each(settings.axis.split(''), function(i, axis) { - var Pos = axis === 'x' ? 'Left' : 'Top', - pos = Pos.toLowerCase(), - key = 'scroll' + Pos, - prev = $elem[key](), - max = $scrollTo.max(elem, axis); - - if (toff) {// jQuery / DOMElement - attr[key] = toff[pos] + (win ? 0 : prev - $elem.offset()[pos]); - - // If it's a dom element, reduce the margin - if (settings.margin) { - attr[key] -= parseInt(targ.css('margin'+Pos), 10) || 0; - attr[key] -= parseInt(targ.css('border'+Pos+'Width'), 10) || 0; - } - - attr[key] += offset[pos] || 0; - - if (settings.over[pos]) { - // Scroll to a fraction of its width/height - attr[key] += targ[axis === 'x'?'width':'height']() * settings.over[pos]; - } - } else { - var val = targ[pos]; - // Handle percentage values - attr[key] = val.slice && val.slice(-1) === '%' ? - parseFloat(val) / 100 * max - : val; - } - - // Number or 'number' - if (settings.limit && /^\d+$/.test(attr[key])) { - // Check the limits - attr[key] = attr[key] <= 0 ? 0 : Math.min(attr[key], max); - } - - // Don't waste time animating, if there's no need. - if (!i && settings.axis.length > 1) { - if (prev === attr[key]) { - // No animation needed - attr = {}; - } else if (queue) { - // Intermediate animation - animate(settings.onAfterFirst); - // Don't animate this axis again in the next iteration. - attr = {}; - } - } - }); - - animate(settings.onAfter); - - function animate(callback) { - var opts = $.extend({}, settings, { - // The queue setting conflicts with animate() - // Force it to always be true - queue: true, - duration: duration, - complete: callback && function() { - callback.call(elem, targ, settings); - } - }); - $elem.animate(attr, opts); - } - }); - }; - - // Max scrolling position, works on quirks mode - // It only fails (not too badly) on IE, quirks mode. - $scrollTo.max = function(elem, axis) { - var Dim = axis === 'x' ? 'Width' : 'Height', - scroll = 'scroll'+Dim; - - if (!isWin(elem)) - return elem[scroll] - $(elem)[Dim.toLowerCase()](); - - var size = 'client' + Dim, - doc = elem.ownerDocument || elem.document, - html = doc.documentElement, - body = doc.body; - - return Math.max(html[scroll], body[scroll]) - Math.min(html[size], body[size]); - }; - - function both(val) { - return $.isFunction(val) || $.isPlainObject(val) ? val : { top:val, left:val }; - } - - // Add special hooks so that window scroll properties can be animated - $.Tween.propHooks.scrollLeft = - $.Tween.propHooks.scrollTop = { - get: function(t) { - return $(t.elem)[t.prop](); - }, - set: function(t) { - var curr = this.get(t); - // If interrupt is true and user scrolled, stop animating - if (t.options.interrupt && t._last && t._last !== curr) { - return $(t.elem).stop(); - } - var next = Math.round(t.now); - // Don't waste CPU - // Browsers don't render floating point scroll - if (curr !== next) { - $(t.elem)[t.prop](next); - t._last = this.get(t); - } - } - }; - - // AMD requirement - return $scrollTo; - }); -}(typeof define === 'function' && define.amd ? define : function(deps, factory) { - 'use strict'; - if (typeof module !== 'undefined' && module.exports) { - // Node - module.exports = factory(require('jquery')); - } else { - factory(jQuery); - } -})); diff --git a/_custom/menu.js b/_custom/menu.js deleted file mode 100644 index ed63fdbb..00000000 --- a/_custom/menu.js +++ /dev/null @@ -1,3 +0,0 @@ -$(document).ready(function() { - $('.wy-menu').onePageNav(); -}); diff --git a/_templates/layout.html b/_templates/layout.html deleted file mode 100644 index 6912afb5..00000000 --- a/_templates/layout.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "!layout.html" %} - -{% set script_files = script_files + ["_static/cookies.js"] %} -{% set script_files = script_files + ["_static/expandable.js"] %} -{% set script_files = script_files + ["_static/admonition_selector.js"] %} -{% set script_files = script_files + ["_static/jquery.scrollTo.js"] %} -{% set script_files = script_files + ["_static/jquery.nav.js"] %} -{% set script_files = script_files + ["_static/menu.js"] %} - -{% set css_files = css_files + ['_static/custom.css'] %} - -{% block otherversions %} -
- Limit Environment Specific Content - -
- Operating Systems -
    -
  • -
  • -
- - Branches -
    -
  • -
  • -
  • -
- - RHEL Registration Types -
    -
  • -
  • -
- - Environments -
    -
  • -
  • -
- - Features -
    -
  • -
  • -
- - Additional Overcloud Roles -
    -
  • -
- - Upgrade Version -
    -
  • -
  • -
  • -
- - -
-
- - {{ super() }} -{% endblock %} diff --git a/bindep.txt b/bindep.txt deleted file mode 100644 index 3991ef06..00000000 --- a/bindep.txt +++ /dev/null @@ -1,2 +0,0 @@ -librsvg2-tools [doc platform:rpm] -librsvg2-bin [doc platform:dpkg] diff --git a/deploy-guide/source/_images/TripleO_Network_Diagram_.jpg b/deploy-guide/source/_images/TripleO_Network_Diagram_.jpg deleted file mode 100644 index 72d9f3a9ef4acf1a3375b0b1a3b63d17d6c0ac0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94564 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
h6~eNk-bTzV641|NN-<=mxs-=WvUgpapD`0W?=3 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%0AP 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 -image/svg+xmlL3 -L2 - - - -Rack A -Rack B -Undercloud -Controller-0 -Controller-1 -Controller-2 -Compute-1 -Compute-2 -Compute-3 -Compute-4 -Spine 1 -Spine Switches -Servers -Rack C -Compute-5 -Compute-6 -Compute-7 -Compute-8 -Rack D -Compute-9 -Compute-10 -Compute-11 -Compute-12 -Spine 2 -Leaf Switches -Leaf 1 -Leaf 1 -Leaf 2 -Leaf 2 -Leaf 3 -Leaf 3 -Leaf 4 -Leaf 4 -Spine 3 - \ No newline at end of file diff --git a/deploy-guide/source/_images/tripleo_ansible_arch.png b/deploy-guide/source/_images/tripleo_ansible_arch.png deleted file mode 100644 index adf4a2a183a775eafa914f88912ea5543e8f5224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168894 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 z%0A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 z zCQ^w28I`EdhxaI$AX`8fp3J1HCH*N6MblT-R0sFfkx()qO2hAZ|Cnf9!nh*Gw9Y8G z-K!iigiFTm=)y2%^&PP@D>l=PZ4|pN7<_LW<89%Tnj3!Aen zDJ)=>duikQzfe0WR5D>s`wRn0RatU686o_EwzPwqE<3hwBN69?n8EGI{@KS%A7X|V z8-*(po3h4v4@QSc+xgR&8(Oss?h8C~N1m*WUzSF1L3}lzXE6TxKVE>$=@F||@nh}z z`Pq&y!hR-`Rs=?}Pv_MNm9brkD{mIR+ z(%T{hki3Qnr;8?S%SP&93rqyRbq{g>RWnv^GBwOis3sUoJefoUyXeXEM zmr`20lnv{?TBkbP%qHnKuI{&-pE*5X?#p_Ol6Fk;fu!FQd?(4%&*hF|eK}v-d8T*9 zh-fyQKP%n)T#*%{lN&qaxGOf8CF;=jahi90z84N^Y=rCyR0chuggyb%{;)%VykPBY zJuU$YsCkp$4UFzr8E54rT68*Pi8rsj2E0~Th+N4+kL5GGmlRqD_-ym;Ut8#vIHhSO z+dFte88kQoYGe>{vAt@oxpz+(^hll|b@vUIop z<*L&nL}x>>%CK$OUfx*K@!la^f1r3JEa>%~HkZXS*45toxtBJdl)sMI>sU-2)xWrS z)I!@6vdNBalL#4Z%N19?yo&`4PZ>j+hf~RQ>7#9p{#L_{VrOh^jEM#(Ki=yXIRBW` z6+hrNCkAhdXZ+a6Lc>iFJ-4p(dnEZc9h{f&^TOF4Ddsp zf};mZjCj*`*Sy{Cli}JEa_lO|JxZ2MbfwYaO#hON?Ldy~s{_T64CSJaZxGfE*U$;+1?C6ah*O!M?|;yi|433czDi0~NetH*n-`@emA@a5zw}eIg)?8tV=8h~%<2oNXR0KJJ5%YPTE+#@{fjQB#i5r%Mab~sF z)LUCWva030l@p4cTRciOJTAsOT9!kW8ZCByXeF{RuORAVcd_PjGjTkgp}z_f@c#2& zt5?PluiOyBVuPHz$|u}K)|^g#s(F*$ zn*htcw5#{PZs>)`oW`#c>7?IO@6`jYt3Jt5#fIL;U7FS-jnLs6yc1_n>uYy>mE`yJ z1&Gs+o`V4go0}R`b7I`La>ZNFRmzVJR`t0!v8O22lmvSq+4&;1CbKy-{lv0=UAO4S ztX`&W>9aZId)Sw@91Y$oXY9xv*1+B;U6g%PeOZGTAyNOvfU7)7wATr}c6Sg#2jV5Qpcsy7(E;L^)rDM|Zd5BB66Zr2Oj;ZNO z00nvQ&m0cq>SNrhOldU9Cn2p0i>x$nguN2y5!5;!gU5Rr1rEC36L1zL!~i-)Hkabp z2edDqa&eU|ROKUafbp1%%z+0mlUBRR%_P1+|E7Rcbd+mUjzU{f2$FVw=i0#T>XpJ0 z0w8<8a0zk#D-e`*V_5~9%XR7Ir51f*?6dhh%z=lF>zNC;I)fQ=?_9a1lTy@4(M>t(&$P!wU zO%1q9IXfg5LI)M?7*JbFa}` z=IZW_x=C!FgXQ5bY30~DNP_pVZ=&EfXsFIifDoTzIj?zTx|6}SR~SMrld#`aGw;dVQV}sUjc(J;C`<}TIeW%rV>8%C`(i*KTyii8P~z&10)wNMsh(W8Df#Ei zkN%{$auxn>^p?#e^vf5i40A6|p=Y295lKI!s?z2AdJ$}0k@%LX0j`dd)~_wH$l7>E z74H`ld-g5ncy(?pH)B>($@GOQqD+4^UVux8@FO;8@ZXW$O#j$7_E@p#ldEP=#VDSa zYZxO_j|*x7m*axVhXcuTz}xbOUDa$K4iCW>vhuQEvd|)4!a$O`1@+8o&_>X^rA+S^ zUA&r$hIS6okfFAsFBKvzHC@iv_=leu)#@51v?8{~=KH>gd}sH!n>PI8SyWGumCPQQX+&`~UoNI%?gnU$XWTc2Rvo zAqmaOkbO_iG#13EO6h}hBy}#9yrG=wrg7~m$&C$k<~|n2>o#=^#{1^Ss~cRtO8QBm z{QnQre)H2+{37b>^SD--qu_eNgb9c%vl&00t4nsW)2-Y27Z@bS1bGTtPhlRNV5>1k zdDFr%lkU@#(E>pBIjCWCjv=73xTX;?_(}GEAEl%BpUSPAh<3*Wm}Y%Z@7=q}8b+@}QeROISu0miU#cUZ3}?RYW@#Q2~e4 zM%BM6hzp!GdJukK*P!zDBE$e|s(Zcm1Ws1$b2Z!2L$TP*uZiSo()&F;l>&MzivL$k z3JzdW=0<2NJ?MA7xXyrop>zDTyC@UI5sLz8ss0WD+td7Y>J@Fouf+kbmE9f)7LfTQSY74O?^S?YY07AE@ zl3cqUN&?Hd!$NrgLHR~SxyU%Qw0H7DD3>rkr=a1-@)_`Pk{Palfjq^7AE_&?wSx%e zzZHk6X4=G6h&Zk5j!VoaFQC~OE0PH(`j?@=QuMAS<{VkR61 zZOHW^|__5F*jPI6-6`+8vj0^+Eeh zC>K%%KR(|L8#z@Z1Wg|xBcm7>{KoXwQiQ{DP(vxhdsBgn^rNNw`*IYm&3-JXomIBN z)P4PjUWsW!my5$DI7R<#CZpN*j|ckUlcP+Uw^8G5u39JiSs^Xf6We0_LqqHmy1Jq! zB5Rs#ti7exUMZb9==Y|}U8UNm4`pmb#g~J_Q#w^q-Pt1>j;*(nO7PWmkPA{l?C1$( z!m8~m%Sbjjp_swl$lm@Pb?~XVsEJgLNvU^2bY~h9ss1cbGqC}Oep5sYq-p^`-p%&W znV>CM(ehe1%ATQ9Pc9pN;qsft)oYSf=_@OdYhjksy%EPR@EpS>gAXSZol-BTW8|B| zz%cmEggE`Vt#95I~Dp1Qfcz&vG)=>2(&#pFi|vDTT-Sjb7J&t*8`~p zsAV_YW)OSzi3jrn|4a=%3jCNzkSVo!l&FeezK}MkDwd5${}#_=Kmx(bGA#RDsx!+v zw2yWsL-=(Hj?EmIY)r%#=$Pk%g_*4TdlgEqX!<7jtab3*JP1=WkJtK=@HyYibEk}) z0zky6v_GIhUP<-U@#{DSf5NlI!Wqj3*_8W`_xO$7UjvyHqO1;Ej~$^k&&nFb0|X83 zWe1Rh$>`UlEtnW@-yu{OX@$Mns^ibCeTKWrSDa3tn6Ow#1mSHAjip_EmUpx+xR1CQ zcW3&)l*1IeYAQTt4pPAUNyW@-s0HNuRigNr(cqQWDiCvpzboLzPfOU09O)ydpRQJw zK%e^2sF>R1sL8Fa8;%qL}tUv+?)^cLYuuKG}PQC={l-Dcqs?hdi#eOO%|dUsGXiy zpJiR9=M!ova0KCLOA z+pR1-s{IOW&LiS<4lTLL9LHtICdP&F9p^E-BoN1<&)B89k-97@@6ahosR&LHd*4X- z8P!|jUw~lkoqUbn-=$^~mNZ&Ru_-3)tNr3q-c4|vt+B-kBxkSD;F`R%LC)?$#%q3Q z67qkGYgZubhO1l}qTrz?JxFE8`_2-53Z?9_L%R&tVuLL`{L5NlJCFF@s?ca#E&j$c zoUk87MPzh0T77~`mwk=iOSf65)n2f7b`_0p)K_%9zkR?QFC!6Q#ZB*T-Q^fDqRqF# z?l5IXuMUzKoR?Q;bk|$c>#_8eP9gBkM;A@wMT-rV3-3M>Oolv4>_=8>=5Wt=_pmV; zOS7(GBfr}(^o>ns&^zgItbSlk=ASJXS%sAciyuYtBbY@ttlV2WfPA$vW(?7wEl(V} zN;R747|WW>f-U%%!CBB$c=tyz=~3(V-vnt3PJf+nSe`O3qf)>66erBq1>cNxAh|fZ z`oZp`=qa15y*IkUzM6%y_xY&yhuiM2*y);rZiwKv(P|Jk^^KxN1Ft)fE-~JSSDUd0 zl)d_oN8@-e>9V zbw<~kpv0b-X0!{nV7QT7$r{Mp`R5{=;9>{g@J*2b?!e!KQn*MC(%O2~!{MmxLE)4^c78ujSQAnfQ+A zzjRX6CAmbI*&TLN>ThW?+)fa0<_1=gWurYjT-ylpMGbjP1vT0z3}dozOi_~C>jE|E zRGG$#>JzbvD0&sUf^Gt1a)qd*)R183@Q)8_iNzKs)&k6?{qd@73;ZKhtHihcML`QD zd|YE25Tl3ckOe8yR&(N*dD!bJsl>B)S&WYinDn?jg0NKQi1gVQ^ig87&S*85AZO5q z`B%}2%VO+8=Der);9(Jcr=xvLTK#m>V7MEfs7v{vl#yLk5tuw)SLXb}50{NN`^uX! zSLIDA!h#zKLw#e0i8AYgg1eN!`A#h5zBT}(tmX8aPt35%i&{q>#JDtgDOEwUuCl`w zWJ#^`SzwkmWgRc2;5J^01;%SD(~ySeuKZm5dR{Ie2u3ZHo5kaDqjtmn(7(=( zvVDIOoqZK`f-V`wCfcl~-pdFBDRn+ilki#`lhZyp^b$J^oNR6>c8D&cTjNx2=Z8-> z_}%HqY+mpdvx@SFqzqd$Ui)z2O>uElG&WgKh)g-vkE_9+gfth70GQfU_45zhyY9+h zMGV_*B?c*xt+m?JGcDTv@vD9$%co#DU+<%`@Q!^M-^JGpEMEve`uyv*_3WV&cnZhV z7xt}q$_&;YD&~mn9PGK0H??C^btirl+kAO&H*trRrg{xcG`gbz4dw_L8}BzU@88B! zEjCb&xFiJpjgzwwYyNak11Zy~^0k>#ECdX`G^6MK^RnQ2sYdGz$v$JpuH)%ba}lwQ zP5$Y?4ZQ7P{wu|CKV3t)etnRU{H$+?rMj+*okgc(h`y+|L#ueHC0r1| zQfpnNiam9#x>JW_E3>!`eS&B^0mFiJ&@92s@8ZSC%u>jFw{lFI*5T~dQc0_4YlYhE6}_h_t=-ER zF7CB9u?>iSDB>QV!<(j?HkJkA^H#7u*LTW3o`IR`ooi_(%gGbjPs5~6?ZO*qjv*%TESmxYD za+A^h#tUJK4@>Xm8raAGR%l;I(%qS(T9ABXKvqH7SWq@H=ugwy6l9UuzKorHj=!LD zn~^assYyW*tp|CpQXeR}>s6OeZeT}*a(Ww(qN@mhUf*haVk$#?-XON;FkvZ3DcJ4` zk)7JWxtM?VPmAV`kY=SRu8E1cB9E+dnk2BgK$viuoYYePLL=;6(HGj<+ite}&_M3k zy`i!Gz(?bzVJ^PeX<Q+Wy5%Q`iA0|)RRRa|W1FFPbLx11{thaODwyvOg(9SV zHc=n0okPLTuv1mW=d!Jf6}fo}2oce`c1wIi+2)XK{$lyv06{I^(vry(d{~&hEsl*B;7DX~=80yi3sp-XYVq$SC9$5S}BfCjL6<_(b$mH>LvvrBqSY_;4dpWYP&=dBbr z@4f&Ko)A!B4jX34*C}kOIn2qwEjsBb=k#uNk!10-HC2UB>Z zV^Vc%e-tKG;5&@wzs@h;qiEW_Z#YuasOIsu^%MzET{*bF{~3*ge&rsM^ER~tp`jH( z=+TxV*-bX~t?|v?!GlvBBn_-^oF=( z5l%MjiKx{o{uA#Ggp>%>s%gZZN}e}pD5CE94B}|i_PMGnJOOgYY0D|`jKi|t4DXVV zW}_W}Bl?Ym{c2^<^!m&!sTo#7)xbaRZW73`bdP-^c$6yj*k@LEU$Q6-a-1{l#P7s0 zJv*XHt1CM1ZX|;!>+JcUD&A-GpmexDL~hOdld(Mm8HXatw=H+BF#Cm<@(>4U!)&s$ zhm}G=5u=lPku$H<8t{bIEe#x58I<}X>%pI#+y8Mn*RyhQtRc*-E$Uw@Z7DkDcGzwI zJ>JE-vDTo?82M1fpb{TYw=F$XS+{LoUH=y9KD>{5))v_%fy!C?Qm_eN{Z>-B%E)Hc z=JG4BiiT0H#86r0yoV7MkiDI3wsqRyLh=S19#pbo7vQo<^blIk;C%>3}upLHK z*y-e-YoI~TreEfHdGgfva8=W{9K-hZA*`Ure1ei^mhev6gR;pZm$3Z!0xpz+ea(_2 zyy2N?QZfirKSK$~jMhGJQ_=k@rl7T7)Av=kYeoK&*twbB1L8Y6I8w;crL-X_V2fS| zSm90`yK1AA6?lWL#E3cZjUaf!JqseAUL^r;@=WD@{>RNwOAL$Icu&>duv2raW^gl> z8Jq0joLOZo+akwoG^U4%!^ze~vDKR~Y*%iq&vWpL6oMmx?mqxe5bH_$w^xv|#fq&{ zU1rd&?4R_=G)7x`1Tc9w$M1!IK>P9xO(K}BhT+`h9XTb%&qy?Vd}Wzr%5KeQGy3Gu zvdMUh4AZXDn<)ZSuLUS8!CQEGUDul$JUskW*ckYtagh%{rphTibKV|Bo|PnJ{8GU9 z*#$c!O-ycZpS3c}7Tazp4Qt9QVXZX$@;BPZH^Y|Le2PKD(!Q~f283BX28#`pvIc;eG-T)I1TRSGF`j!699kW;2oGH| zjmNN^;89u0z$l%TUo`(z5_B&S*X*4=zy)fi=~K~X!yZId`b(8mpRf*Q>2E*6Tk&M6 zdJa1VebY{Wr8`twK?UUqUi`~X#CwPfKhUDy0bSdZL?_Q+DVfT( zRDJ;yac_3W#AK!kp;RPPq!Qfr-LbX1&s%{{0NIGdeL;c7HSu@4bx8N@J-Y_85oB`GFObZDO7%zPlQ9T6q!b(K%KOcE|i z3Kzb53Yl{sHx#n+?@C*|QeTz%ly(5U2(4%yrfZ?}Rvhx|W_I=UR2_YIs%$_6DSllo zq*=_YD%qn|d3_O%xa;M((LVcrDGd{ZREBQqwdBqf?flYcB>Tf4+wVRQ;r+nG{!Pxg z^tiC1*Gd3B9zxsteIqFiD`>U6*e zta^uIG4_?p@p!PXiILnkeMbP}g_qO7QKD1OdT#WMfc*6{trXTWt&0HxV7b`}$MYK$ z8{z&$@6p*9LPUSQ4S3_?P{-|G2g-|w&2gPV%+vv08s)22t^1OLJ2pXt!ID7^WEpUKkxdv)|z9DIp$n*j`@xTo3k#dFYWV)p@}$; z`QqJL+bUuv9}d%IhiUJA`T|6nxw@U5zpON!clAF4vpGnd@z^Q)E3Fn{=G6v6nbayl&H%)>_f}WQ70Rl_smyyH#70K z_v8k0W(!x#T~qT-d?P5^r3=L(^a#er@|>XjYBqaBV`pf0K(u<*qBW4)1x4IiD5G4~ z{hHcEF8kVyBMy5IhBS+G6HX$7dT)s3I3PO0GI}h$Z2Oano9pd@{b1m%2u8E{(BYNG zn#9D-Y&lS>n{rv78fpRd%8%pAE86M3UfIq>W3P8|CK{r}R#snZ-IXJ*q3))nAg<2x z{o>&_#V%*@sCe3LHR>j{z(J)%OP2Q#$~YCvaZi3LkFTpF`RTv+X4M@H>gdkG!|^UD z2POu5Z_O}9DVkFR)jzrSIA7FX8(w)h--!4;GRvs0v}9~EA@(j%o}tcj|5tIkli6&3 z+zp4c(CXD`&h?qa!eYS?cW}72SU^!&ocPP~ zxaw=3m%2->YF64YYrrKnIGy*aJAzT?!fT*6JMIzVq=yU+gIz*Snwxy(Q5G(F*mYp= zYcK${*)647uOKk-wDaK*ixf6c^@GXu2+2Iu)>dDQq>`4~R=7yo6%1>E!52Oy)Pn*m zj0xGUHZjFkU#8fQV>CKb9ir-dW#wv|!?l)Lt^cfmrZVG5+)r3e`(8+?#XFO?*vho9 z{-n*AsX}G9{c#l*^{lEl5#C`p0>$6{dT?dfTGY@?b-3WGHa9+y=i^7(AKm@&(Lt$mh6zbO%t(cHW0@okOgWcXusU?4&jiO|Kbv?alVB{omXE zR1r)H{nco+@uW(HkBa6`o82hVy7w_W|NWai!ddSwgB|{?Cq>CBYrp+!8#vl?t|H_M zp|}1UuvwT9o>A|e93*A4#y6lpnz5&nP3VXuE+i|i+5dOD8Wz;?YjEO-k>J(Y8Pj>Q z<~|kn^v2)RGD-2bg6uO$$ezl|U%dz!(HW7cF&{=;27TlkGrGkeck>XINC*UoS*J_m zm!IdmA;+Vli8Fn-)6K9Y%Qz1b*ByT4ze9b-{|LMy0oE)5+@Es!uj%^Yg_7~S@s57- z+T4h!kMm1@f1d~wXxv`@f19snS*HPZ#a6RfQR~=^g9tCZu35U+e}B#lwS5dx{()M} zNTK(?W%2WrJ&x!RjK~@-m~H=G()aDCxhY5FOe+PsG1xc>`;`qo$J4c?631HNQ#o3a zP{{m_fmdo&U%!_PQ$>6G3QHvwxB7sbpT9MYV}&lsnb+5W1aXCp=UAt+kQ;G9gG;}t z^jG<;G-!RtO#2=?rO3~m6LWp{5$sM2f9Z~#xDmJ%v5^(#7}xvQQy5iWaxlUrdfr;T zy%1z&G?>9CDt2J~U%wc{obH@nf_vQ0VM{P08ZAZ~ZGpcf(WR)TYj`<$T;%jSG=ggb zxaT)zt)$!6QG>x)A#wnX1T1{<$ExHm=k6_xN2U$UdH zjBoU>NOsy5UiHxz`J~pB7+bB$zc)2O1BUIYGwPH0o?91}3=Zt(pY8W9+)X-TOiPO@ zY!E%~qjs46AJMMo&r?&ueb(7hA2lR;_r2vmH=hper;K}l0-xHYB{eAph^H}9?h8je zp!Q9VuZc5e@n8zuf0z$H9-Zzemdj>Q(@S}09Q3H2@A{WG)pGok2rXGYgNkd4T2nLq z-dcUrfF@n{6_X0<_Aud2Yb#3!&tZjL_cII&(;b&~pQ-ftJz=)AlvN5Jj`; zuKQ)-m$&l0zo2Ps#6Su3oyaLfg^5G)qp8@L7^<^&-$f5|5^7;d+y`_n?furU0q8Jl zRjDXIZlTfZsM}QC!~9z;%Yx-g^TpfQC6aXu?z~nWgik@`VmBqHhr9qSPEJTUEN;tz zx3_sipb_31mVJ1u%%%5ZRO0ETz^YDVSb&5gwwSNngPLL19oY)eY>O$>|FRRMpL~7u z>?MY*Pd3R#)OjY4nf#~ENhuoUk=15!z$R4h3YjopmYtF9n-@)2epSgYRr`F?LM+RP zx@~QjVVWT6t3q^b^wjy>*7)5=WubK;Nu;Y6I6v??-o#3L#nGG-ibKceSMHmuC_KX}w0hBRyHleTVUq6lhFnkTlf2!DAyhWB#x6CN{%CVnPGf@3s|H z&1CKduXfKkMq~A)_L^d7`>!i6=_Eb|CLrI}7Hy=ux&e(e6ugtq#T(E^?8H|Xjrx(4ELBd_R7efuRup<%#PgcE4 zH+h}9)C};?XVbzyJODl(y=3PeZm!JCIoUc1@E={O z7uW6R2P3xkHo%CIi)0qvOCG8n#?4{g z?j}bK7~tray4W+sC`qf!M#POVsZWGcZ2f%|(xnUT;`u=!kQl|*dEqzi&^6Y zlGC<~w;6yoe-Tv}B-_<`(b8c5c@gu>48u`Fsg#J*mu`~olD{|Y;HR)@FZYw*rq40dRP1+=0k*=euhZo%Q-2 z)w^c!>+pTCVb%?QwJe`utIjCsTfT9wGt6CfKGvW)v7yFls#$SRM!Y@_b0tn+)jRlQah$+E~dW%rvGBv3b zRgL-c7whE9_d0x3D-#cS7HUzz883T1<8QVeV?3FS2@UI#(jB_e&8WVUn&#jm(lD9b z?Bb1ruG+whnZ=unvdML>(RB=`vxJSM7)2W&KA<{_eML=}SEY4EVEEG|O~X=lv4@<@rJ(b3~jS z&E}$3TJ8Jb?;f}AwAz(hj+N`qw!!EN?=0TM%fcODxVR zsD)&3yc&F0EWwApj#H)^Kjyn2tCM{Bu4g|Mce>Sth+zSTuE!SfX;j7$YH+1*L$hA0 zTvwf`M~ikdR7tgX3MM5>9^;Wh3t*(R^gcY6A}q7pcGEW8NB+AeMP;Ns`=2gJv#pO& z(Fl5m!+p?vu8Z6`)lL?aQ&m%?;KWCVx5&3L9k*iTOyV;6zZ6I1b_E=7>9pE$UOwmQ zQ6yi>anT&3fX!pXzj4k?D}ISeRE!-{@ZD&+A-*Rrbj~f>p}bKvhG(H<{Vn}^oTSF- zT34>>_le$c-PH-tyFl5TFj;6X_tVr(8LVr=!c2|Tro)15?-bX-qsDJ)(TIo-`yD;{ zD!QI&@sAJu(hu<(x0g+I(Kzl*i!Obej{V$(UDmn`Y>}{JOS2>)BdUx&(NkfdPbyB7 zi@H^j+TbDA`upter3)zt7Y9k1ZQr;WBcwuk!|EyFwzTDI+@da*$n_0&!(BucQGhN3 zJdq?`%Bc)u*is`gA8`!pvV1H$bJ>6ROM-Eu+cn)g6%0cql-sX3VRL>#!Yrl*XUO+< zM+DT5HHir?cM7{ABiq(WauFo)-rqoIv>fUO6?DwVOGrMD{Pd3c5atp}=32kG=%!*q zEK&o#hdX3iG(#mS`KnCiTRK35Or%0te9%$6-^LuoJOCeTNT2l%UU=Yx=`%C>=4M2Q&Ic zFGt-K#2G1&yZYdN4UTtw^LynSw8YuxJzPH%q7U19Y@QDvJsMU;J17jJo$6t?FYvMU z7OC{w*kP(0@a_Mt{z*IQHyh>J#If*XK`dhNGxzj>nGUC6o(p8Comkf+ax{bX&4PX;ld z(Esd-@#eQp4eQoiVB1eTpWTbm33&VTwbQVJ2JAz5Sb0~fQ5@or@jO*8zJgYE8y)N^ zQn{QdqF7%<_4&lf zGg=-I+$wlbCip0M0_Tx>NvSgIxXLh#W$!j+2~Ej_j<5Bf(VGP*&r7f>K+YvpxQU=v z7P3O!BCG(5p zWl!F}yBC}_iSS3g1+^h043zvlS}lm@#(EdY?$w*0?zYLV{MB0W(0g(c1%oG6tew9} zlk4(h)EhD)4N9gSup)u}euhmEb$7+<-nXjh7lzuOhv+V?I)R(ed3BN}DJ+qp;)~h2 zE*x-otKk`3HJ4GLPpfNjcmfy7TDcYs$|)HG)@HQE_>e3*Ot|yzxz6x^+jkEX5+GA+Vd-IIu>;p?kBFtvuLVyiHe&Pk{CAVkS5|fvTBQf@sT)h7 zkKzgu%*kty%6V7G!{%tqjPT9uGyYP$97Aj&<~zCd&k&Tdn#O9H%<-VfZC z!_C1&uCAdE;s03#VD{;H$nGmS(VKTtvc2C%YL6V&-22M;fT!%FZ4N+pXlHe>K;@@*!s^GLeC>Ol4sslh>5{}rSUSZ9kieDd zP00^qUfz-%m||MD=&23dTDGS!P9$r@fGw1ZWqs7sfta#`TCZdM&(|NRX2*LJRr=!u zQaEePvCV-^_d!nY^h{*=$@9JXx&GSuLeGqI@cmzG3yHUd(l#nX$uv>P(OjS5UZcI> z?GqzG(z+!&o*sUsGhChiHTV!8gLCX&U7*y8?JLb&ykT@?=>ZooQlAhw?(y98eJ$DU z)t8uC;;~$!_6h$IOVY1c#K{EFB_3kYYGO+8bc$TpeOv87Z0T${WJ=#>+AVM+N-@<$1Ei=pqOiv*ElaQoLBtVp+27L;1b1%tw+} zkkv~CX-A2u^{CUdPkF`KMdh?Y`)S8}eQ+;tNaDg7lx@Di(aFl+xSSg+~38^2qhOJdWyR z?OM8-{W*i%j7V!z@@n@Wbo5yJUF-_UL0uV$l-U-Q><6ut64*d3S+yc4i-Fpcn!Xp`ZX8MY>MZ?NU?ga8yk!G^)LprVcA%(fGC}cZjw*5r;|-|~ zW1iRi0y?AjmH)WPtJTwr$eljnrAf|nx%uu_-b;6ymNb_>@<1_+4VPM2O0@g)-w(Q+ ztXunQ>c&>p{W~PMbQ|0KnDv&|G<_+f1vrbGtEx+U(qZO+aII@w7PdJCGb}OCi3|oc z`J9$3`daI%Iuo+;r9S?t550x9`%2@*0ztJMa!sOlv{1?1wfN(lOj|Ik>cEf`|1Gnb zuz~CRhkBry#5^NXXxYKdd4i4ReB^awjvbk!DEnHdJ^`Pbt$TZ^Une}nFa&$)Bubp9{_dgyOoBopB>D=X{xAbZaJK`2N4E%zSqVPDLT{-qC3Fy%q zCpHkpMsb?iHrER}!>E6U>a1_NrV%bB%A{ zLuAE1*h--@(qBrho8s-<*1x#uIb0jN?tztEcOW1ogM|34`YYALnqbBZU&M`ck(|dD zvSEH+?)-u)x=X&SK^$$UO&~vC}L~>?e z{j0s=+gdWhlR%$|eFGb1zj?V!qh6W%4Yw<=g!@~SzA0Uvlcs)?9`8+K{p=}Tcvy5M zED2jWyQ6!%<>OZ#OTEW`3B*omp-sZJb2#cgu3QI&R(EMGhRC;Bcb$EgdOel$#-??& zOPo*3o4K=Zd($-2L?4zPnamzY=@_-b_hV!0PxFF!S-=(jQ( zBxq7LUkVIfZsOc!e=Y}l#hUeTWGK}*b#iHbNOC5UZ=KG4q77|=otsu4iBvz#f5%sy zbE#A-!4sbtq@qShSnQn3>NVORPhs^U zO=TdjIT_d_Cm}K1A56Zz!OlaydqN-d>RJ%ma6!Ca56w7GxcE>I%>m&D9vzyAB%r=M zM*F(kzC$qV$!NDpo?<6(28(SQKqT3J{gX9JAhL#YyT;%44toAJAJ#%YVLeVyb)V3@ zE_;SgXFXLpj~i7OFw)Tj6zu5?BXcCur4G;=QnxJiX0*1=&!}XD^LMm{%G8#x)JNy| zZHOE3b?LT*l1TVZyJ zSjH$&4R|%fSJw{1I||C=6)FlawCcN;eGM15cKuMc<{=!QI#G`5>DV^O5I37dB%$QC zeeS}zyrnu^gfeJn^N~^;f<0;uTZ-N2bhGL4*^MV%as8fM&TfzF-<-2$cd zH2a<%)00#Jfa51zmq#@;+&64gH%)}71sqPLk1QTLrN)-dmii#dUG_aR+V0WX(ixRn z)tsNx9GWuEQ2NItBiW>(&EmG9KJwXr+foY8T6_~qXgk$3yPGgV#hGQZY5q@amfO2S zSnh5c`)A3{(x5Z=tiN`k3W(TYH|5izVp)N%=h~X82Tq49^H^0}V8FDvF05AH)E(HZ z6@3BsDZm`U5|EaJ5sfMFvF_pQs`w5^ZCzgmH`!cP_oO_#nw;MigA>>Y3XI2E#>@?>Uv)aA-n zP3clurD1Q}!$6#7uSy8R{b{MF>Dj2?)KKT8vN6-aSb7Y-Dt%$4f$G9;^$=}#_SAF_UiatOE)BC1yV%_3mBYF~ zk^v-Td-_A03d^&otE~7Z5)uMY9Dm-=vk*xoN7Go;m5zlD(_ z(GqGqP~hh-c&jXv5=~@H|*41e|GlOn6&3&W_y6b7L z9fWV{U2;CXDAV<4Kk&%kM46mnCRMB1m~&owV$DhoYx$T|GL#4MzE(@M{4NN8wZTz< zHW>>ch-=kar!{+3fyw}UHO8B>B*7AR>QoaL{r+j+BzC-c6!T>oF&y1s_mu4iVF?yb zNeIu*kmDyXpjLk~!Erusu4WpM1Onj&y@Sj)mjqk|19bzk&SI92W3Ge>o5QWtAf+bL z6W#(76+#VO_P&_OIfRMtLi1ewam+bksf6nvbnHV^|0a*<{1ZuPQfi>*IQB2kMGRBU zc2CYlPNz*p>Q^lc%xx~I!cD4(nU0;-nB^2q<0Z^lsvzny($1|6K!4=vOP(w+whb)P z)-#9gk3MO7n30q8bjbDe-?Y=W`7&2vjLhkzmK##rmxYAIbXr@TXrx`v$69sXZ*I=y z?KiuXI3_e519}_y(lX~buVDhAE3X}4#4WWbCMM2nfO~h0Og8fb#4XJ38mSG(#7#VS z^l#!CkWeH0&$2eK%}fze^%YF^+L<#pX`hXV`RV9*fh1SK!+NoXP;1`+Q3a5-?}7tIzyHu1p-gd2^d4nX7YvlY-E}T;cg60;HGgljSdgdM*|CWAPN&JBxFXw?p&JEE4 zeUt30l>j%0(n!W{zyH(ZZ1A7RH#L?jcD1TZa~dS%8?UAR!|y40LC+ z6DbVW_bt$pzJ3?@Q_@>yClIY^j#ym|=dK5vEhd}UF_h^0RTb?8^_yUWR>U|Imvs!hRUp6<|*kAh-#-i0Oz8>BePf{X;3In^|W% zb*|LJxBD`tP7|VJ6hHCjKab1Z?3SkldYAK@<%^^*3$c@hx;zB_843-qr$uGZFdKQ1 z1-5_K;Cq|WXA4sn#Mmwhby@w7*N?_0yY95UW9u`f{2VbRCJv#0xc%_(-%@8{dfszH z@Mq8Lo;TdWfRAzn#tcDD>HhZPwgiO-Xe;qMf^_ufd(Y$afD%-m6vre1q#(@)MAHM% z#W2qWyx||~BjJud5Ufyx+jA>2D_|z8AZ5-|dM+y`Z4Lm4NS-U<)0Bgn3QZ_s>L6K2 zo*xvy{@H7IMCe)2>bqv?j)v_Bp3%y%w#I!rATd;T`mlo2zie;B&qD3lz|ytttVHT{ z*1jA7>w~I$B6Rf9c7swah!$m0a`fu;v)}3Iw1K43+YGGVzGwPyFC*vNlZl0AfQZaF zRI-B=9%peNgXv89(UrG@;3Eq;V*QFQEQcUzcs?;O@@ZI%k? z>s7h;yfMfG8_rS^$aO%1WpbwaDw3XF$aJ zP+!O`sFihH3qo=L3T?iL84@UgW|_lZ?V)dfO9jxcVum3%i>SLj0=5r)&6C1s3?om5 zm#bnUGv*Wkwc5UxkYV=&81~!R_U)w7L;A3Qw`XaaIOdQ{;oA=`JEQ^VN*Ewn#oQt( zI0${9QZe)DTXi_FgaOsrE$_!Z;_`ot<*Jp zQ6K_pYn6wtB2STe{H{~$dMwM^TgAgpBDvX!u@UeXE@W$SzHwTZyEj#?TlEi&cO#FV zla}2h0YS6T)#iak1EfIkT?jdJrA`&&176Xij(X<2VY67SJxo(7r+xNOWvSEuJfT>) zMk!AobRe0nlBcCGk%>Niy@nlO**Q?Q;*}ag882R~c*E-3W=CWHyfrS{W{eka7O;7H zdzaK*t2u^^M0vK6$ArHNOyYPV#*VH5emZo7NrEr82s0s8Slzd07{#5Wv-u)*hBcsg_>%pM?_A~*C**MS&e9I_A4%|fe9dJX)$?b#EG!S z1%E{l2zDw%KLw~}eX^Sn<=#`45!~Ny(MUM=sQDZGL-i=D?m?psF&3z3TBFq7ugx5q zo%-qZFnPJU#quEjy&7CipV_p=Gi5HZajifg(h82xhALO$5Yo{yF9t`d1h5{;M^6Th zxTiHv&(xgYhU{Cm9KIq`D9Hlrx`)}*|C-?4R~dW3hxg|*GqY%%p^Ci$!kOX$=G01! z1RK25!7w+O`sk)@)~DaQ0xsMh^OI&2z2&_a{3tD4E$x$-UiS3UkQju`!!$w$Tldn| zXMwT8z#v3g7w1`=Ki(S^|J=7R1~F-$Hay&-JygBCJ34VY2zLggQqF4 zNBD88mYmsAC|7KJfY2^F5zJrKtG{YcQa84(wrV!Rs3QhRP(RKIde4?$Hoc|% zFd_|18Uw?%sa}TSW#q^-HoBV|0dFbIHRHN_*E({5gZhmZ_BBJb&;Zu9RM~$%fntku zIxyi}t=irdgD=f9j5bzh-m;iD9dH|Yqijc3sW7{2h?J8<8`#Y&(5CTZJmgckR;cg2|x~fEqmHIj^EjTxAg)Lam0F#%=dSH(|a#p|7~lP zS0p>VmInk278(9Djdz+(0Ik#&w~DWr(U%2mb*uCt*n(r+<$6m`{M{h@x|vUf{^L!0J7 z9)98B{6%=ev>ElKfIc8YYt2@g>w~-gEovbj)*7#?l3LfKKdn5l`)xfQyiKwu@9`Hz z4+~imxfy+o*ZG{05l;@iNod_LS1ZJlxiO3W5h(4Y{q2$6Mm52(?fzuDA#s<%K>U4? zJA;8j!GQ2GJ?5Jc`Kp$6JC}ZpaG&5^;2>OHAlO^$_2*8JJ5exT;~mCpOIC6N9Na=a zQ!Iu@fT#xK0U4LGa#oRq~(R^CH=?LbK-q z=|f$Q{M_J#TQDICB%aw3|q1?5vJ*BF-j7GCxAkd0}(2zY668&1Blfm`ZiUlA&1>ABq|AHJIUC=SNW8><&sL)<&pj=%UhUa*Jb)m3?x|$gxRr1oXE8% z9+ldW&_~uJU>Dv_LFd?kJ066Tx%bI`4Cyz91;DH)Q@1!kaNT#K_sC$z_!maYn2v;> z+a&*(L+PT?2)i({^yGG-W%`$P0Nsmgz&$ve5W=?CDpHuQi_AA{G@pJm^IN4J+&jLZ z_o5BKlu>tRHEk#tIgA6)8_}(4&i;)bsoot5JfDa;>oBSNHil6W2RmBfYS*Vbh0kea zoR9*vPJ!ad(5yE@*2`+ZBVJSi1y`<|Hb1g-y#y>Wvw@qur*~9UZ*M|X5i_x~|VdEz=@)r3Cx({8ZBaboC1teC#+LK2DCE_y#+8u!FFl6*}%IFp#{-z>7MaE zss;qOIic;f)Y&f!wQ_byr>A6IQ6+2+sCs znXztDN*y)b%h}h4MCxzuC`;%xT*ttm%2I;LA?3Cwf36@Vy@vGLjD(Vje)V1_h0Kjn ze%4y2zOXaa5@UeP%sX`#`P8J*d32H_T>%UmlTB4Al3ZvMU~GN*ULH3O*FAU&Zr7D7 z6@zFIVA=tA`gyXLR9b<5gKH9P-XGpg&TOPth>-(yeSJXjO~5FlHjk0Al(~9lTsS@? zV)X!}yYxqm941`EKHH?_+;sCh8&K#Ww;|%d(gxMm(kv}g(<~OLtwn`ziwys6Gd;dO zw%w={?ijz<0#b>fgq4?43yiVbgFbFjD843@ZaT=L$v>V{wOS26IJvts5cDu@8>Lr; zsO;YiNoZT$iC8?NJ8hcAKZy3JTQs8%?sBf|vo?kw!Qw=~@W6!X>7nESr&Z9@Xi)9C z`^`gSw<^l}rmZnNTboR)NsFxQtqfosVL&h?Lxih`V1pQA^}?nFPEfZR*T%)j^yY|I ze;gT3-X$uPuU84Ep%_jIn{8C`h3~>nKZ16Yh|F*N)AhF}FEdfc)Lrn&tjf>6w(IDl zVJ{~I3-P_TIJ0Zrl;s6!CR&^f-uHAku`?>}_K3t?gn z8^3zklHXf~Usg?eqUe%s@rR+S_{>OtS&dKzh;Y8YDlCF`?w7iQ)iQ)``7cQ z+Z!kHW{6%`CkmxP3Uf|MvCy8xq0J5QSLJ3GrWtCbyTcS`62X0ItWurcM ziET`-RXlZ!GF8RrKDIlRZK@WzzV1_s8gX$T?S_Y&^6ve$8$6D{?c;g(#LB?R!h(aN z{>CkV@`e77o62n{!8OifqhK;Quze_G9}mq+VLPJq38nvilQ&jMc^*Tg zm(}Vs(^sKVPIi#6+uZv7r~XBpiD~Q3qqqr=*knCJtnQM~c75P;Lz0k$IEuU(TH^21>s;FNGCALFiBf#2pzHdVT3*TwQ9IDW>%oC?=_|2y5Pki z?*rN}0N1Gdqao9Qd1`^|+p)x>w+YseWu?*nu zl&)lo7#uFGI14WDxa2>MkPKhQttQca-=TTaHW&)N%le_~5fjG@2c&VJ=+u`v~#m{|QA zK25Lue!|xC|9-;0;1r^Y7(zpMvK#>r#;kXQz~qN3san2z$B;jT@Pzf*icAeCjo7d4 z`zNGMNI?y=yLkI=S`zX847}5B(qnDV2+8Q{o4IHK`TLLm?yH^IcbHDX6QLwCD)X0^ zQPd9^N;7I@GBFK13&kK5b;0a6+W%(%NrpNDbbR6}4OIu~QlQF`m{7>R0CfE>c>W@s z{cmod*Zy_b%(#_Xqz4;{(L(=dx+MJf{j%I5gfn|F%djnbv1lIgZ#4RYKij{U?2BPA z$qQ*##-u??Uwr=YQ0F^1`Qd%WD@IcqfK_Y#A4Z3NFf^tP%w|AI_aGM_Q&w0?v4FPn zkI{ssFuEcEVvNf|{Uv}Nz}E<34N+FbxIlQ)9EIn9&JPY%mgFZ_s;*$}Z>O9(`*Vhz z5zIaReB#8v0ZtCp{~HP#_YbZvVHAz{_sHaaKYRbU&RqHjeYJb{4?xPKe*fQCE)&O% z|KC56a$M_2hdfTC2`NM{5p9s~nV8~T%ptfZHcB@bOWfa=boSD}f8r - {{ lookup('fileglob', '~/vendor/tcib/cinder-cooldriver/files/*', wantlist=True) }} - tcib_runs: - - dnf install -y /rpms/*.rpm - tcib_user: cinder - -.. note:: Here `tcib_runs` provides a shortcut to `tcib_actions:run`. See more tcib parameters documented in the `tcib`_ role. - -.. _tcib: https://docs.openstack.org/tripleo-ansible/latest/roles/role-tripleo_container_image_build.html#r-o-l-e-d-e-f-a-u-l-t-s - - -* The result file structure should look something like: - - .. code-block:: shell - - $ tree vendor - vendor - ├── containers.yaml - └── tcib - └── cinder-cooldriver - └── cinder-cooldriver.yaml - └── files - └── custom-package.rpm - -* Build the vendor container image: - - .. code-block:: shell - - openstack tripleo container image build \ - --config-file ~/vendor/containers.yaml \ - --config-path ~/vendor - -* Use `sudo buildah images` command to check if the image was built: - - .. code-block:: shell - - localhost/tripleomaster/openstack-cinder-cooldriver latest 257592a90133 1 minute ago 1.22 GB - -.. note:: If you want to push the image into a Docker Registry, you can use - `--push` with `--registry`. Use - `openstack tripleo container image build --help` for more details. - -* Push the image into the TripleO Container registry: - - .. code-block:: shell - - sudo openstack tripleo container image push \ - --local --registry-url 192.168.24.1:8787 \ - localhost/tripleomaster/openstack-cinder-cooldriver:latest - -* Use `openstack tripleo container image list` to check if the image was pushed: - - .. code-block:: shell - - +--------------------------------------------------------------------------------------------------+ - | Image Name | - +--------------------------------------------------------------------------------------------------+ - | docker://undercloud.ctlplane.localdomain:8787/tripleomaster/openstack-cinder-vendor:latest | - +--------------------------------------------------------------------------------------------------+ - -Adding layers to existing containers using Docker -................................................. - -.. note:: Note that this method has been simplified in Victoria and backported - down to train, with the new `openstack tripleo container image build` - command. - -The example below demonstrates how to extend a container on the Undercloud host -machine. It assumes you are running a local docker registry on the undercloud. -We recommend that you create a Dockerfile to extend the existing container. -Here is an example extending the cinder-volume container:: - - FROM 127.0.0.1:8787/tripleo/centos-binary-cinder-volume - MAINTAINER Vendor X - LABEL name="tripleo/centos-binary-cinder-volume-vendorx" vendor="Vendor X" version="2.1" release="1" - - # switch to root and install a custom RPM, etc. - USER root - COPY vendor_x.rpm /tmp - RUN rpm -ivh /tmp/vendor_x.rpm - - # switch the container back to the default user - USER cinder - -Docker build the container above using `docker build` on the command line. This -will output a container image (used below to tag it). Create a docker tag -and push it into the local registry:: - - docker tag 127.0.0.1:8787/tripleo/centos-binary-cinder-volume-vendorx:rev1 - docker push 127.0.0.1:8787/tripleo/centos-binary-cinder-volume-vendorx:rev1 - -Start an overcloud deployment as normal with the extra custom Heat environment -above to obtain the new container. - -.. warning:: Note that the new container will have the complete software stack - built into it as is normal for containers. When other containers - are updated and include security fixes in these lower layers, this - container will NOT be updated as a result and will require rebuilding. - -Building new containers with tripleo container image build ----------------------------------------------------------- - -Usage -..... - -Use the following command to build all of the container images used in TripleO: - - .. code-block:: shell - - openstack tripleo container image build - -Different options are provided for advanced usage. They can be discovered -by using `--help` argument. -Here are some of them: - -* `--config-file` to use a custom YAML config file specifying the images to build. -* `--config-path` to use a custom base configuration path. - This is the base path for all container-image files. If this option is set, - the default path for will be modified. -* `--extra-config` to apply additional options from a given configuration YAML - file. This will apply to all containers built. -* `--exclude` to skip some containers during the build. -* `--registry` to specify a Container Registry where the images will be pushed. -* `--authfile` to specify an authentication file if the Container Registry - requires authentication. -* `--skip-build` if we don't want to build and push images. It will only - generate the configuration files. -* `--push` to push the container images into the Container Registry. -* `--volume` to overrides the default bind mounts needed when the container - images are built. If you use this argument, don't forget that you might need - to include the default ones. -* `--work-dir` to specify the place where the configuration files will be generated. - -Tips and Tricks with tripleo_container_image_build -.................................................. - -Here's a non-exhaustive list of tips and tricks that might make things faster, -especially on a dev env where you need to build multiple times the containers. - -Inject a caching proxy -______________________ - -Using a caching proxy can make things faster when it comes to package fetching. - -One of the way is to either expose the dnf.conf/yum.conf using `--volume`. -Since `dnf.conf is edited during the container build`_, you want to expose a -copy of your host config:: - - sudo cp -r /etc/dnf /srv/container-dnf - openstack tripleo container image build --volume /srv/container-dnf:/etc/dnf:z - -Another way is to expose the `http_proxy` and `https_proxy` environment -variable. - -In order to do so, create a simple yaml file, for instance ~/proxy.yaml:: - - --- - tcib_envs: - LANG: en_US.UTF-8 - container: oci - http_proxy: http://PROXY_HOST:PORT - https_proxy: http://PROXY_HOST:PORT - -Then, pass that file using the `--extra-config` parameter:: - - openstack tripleo container image build --extra-config proxy.yaml - -And you're set. - -.. note:: Please ensure you also pass the `default values`_, since ansible - isn't configured to `merge dicts/lists`_ by default. - -.. _dnf.conf is edited during the container build: https://opendev.org/openstack/tripleo-common/src/commit/156b565bdf74c19d3513f9586fa5fcf1181db3a7/container-images/tcib/base/base.yaml#L3-L14 -.. _default values: https://opendev.org/openstack/tripleo-common/src/commit/156b565bdf74c19d3513f9586fa5fcf1181db3a7/container-images/tcib/base/base.yaml#L35-L37 -.. _merge dicts/lists: https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-hash-behaviour - - -Get a minimal environment to build containers -_____________________________________________ - -As a dev, you might want to get a daily build of your container images. While -you can, of course, run this on an Undercloud, you actually don't need an -undercloud: you can use `this playbook`_ from `tripleo-operator-ansible`_ -project - -With this, you can set a nightly cron that will ensure you're always getting -latest build on your registry. - -.. _this playbook: https://opendev.org/openstack/tripleo-operator-ansible/src/branch/master/playbooks/container-build.yaml -.. _tripleo-operator-ansible: https://docs.openstack.org/tripleo-operator-ansible/latest/ - - -Building new containers with kolla-build -........................................ - -.. note:: Note that this method will be deprecated during the Victoria cycle - and replaced by the new `openstack tripleo container image build` - command. - -To create new containers, or modify existing ones, you can use ``kolla-build`` -from the `Kolla`_ project to build and push the images yourself. The command -to build a new containers is below. Note that this assumes you are on an -undercloud host where the registry IP address is 192.168.24.1. - -Configure Kolla to build images for TripleO, in `/etc/kolla/kolla-build.conf`:: - - [DEFAULT] - base=centos - type=binary - namespace=master - registry=192.168.24.1:8787 - tag=latest - template_override=/usr/share/tripleo-common/container-images/tripleo_kolla_template_overrides.j2 - rpm_setup_config=http://trunk.rdoproject.org/centos9/current-tripleo/delorean.repo,http://trunk.rdoproject.org/centos9/delorean-deps.repo - push=True - -Use the following command to build all of the container images used in TripleO:: - - openstack overcloud container image build \ - --config-file /usr/share/tripleo-common/container-images/overcloud_containers.yaml \ - --kolla-config-file /etc/kolla/kolla-build.conf - -Or use `kolla-build` to build the images yourself, which provides more -flexibility and allows you to rebuild selectively just the images matching -a given name, for example to build only the heat images with the TripleO -customization:: - - kolla-build heat - -Notice that TripleO already uses the -``/usr/share/tripleo-common/container-images/tripleo_kolla_template_overrides.j2`` -to add or change specific aspects of the containers using the `kolla template -override mechanism`_. This file can be copied and modified to create custom -containers. The original copy of this file can be found in the -`tripleo-common`_ repository. - -The following template is an example of the template used for building the base -images that are consumed by TripleO. In this case we are adding the `puppet` -RPM to the base image:: - - {% extends parent_template %} - {% set base_centos_binary_packages_append = ['puppet'] %} - -.. _Kolla: https://github.com/openstack/kolla -.. _kolla template override mechanism: https://docs.openstack.org/kolla/latest/admin/image-building.html#dockerfile-customisation -.. _tripleo-common: https://github.com/openstack/tripleo-common/blob/master/container-images/tripleo_kolla_template_overrides.j2 - - -Integrating 3rd party containers with tripleo-heat-templates ------------------------------------------------------------- - -The `TripleO Heat Templates`_ repo is where most of the logic resides in the form -of heat templates. These templates define each service, the containers' -configuration and the initialization or post-execution operations. - -.. _TripleO Heat Templates: https://opendev.org/openstack/tripleo-heat-templates - -The docker templates can be found under the `docker` sub directory in the -`tripleo-heat-templates` root. The services files are under the -`docker/service` directory. - -For more information on how to integrate containers into the TripleO Heat templates, -see the :ref:`Containerized TripleO architecture` document. - -If all you need to do is change out a container for a specific service, you can -create a custom heat environment file that contains your override. To swap out -the cinder container from our previous example we would add:: - - parameter_defaults: -    ContainerCinderVolumeImage: centos-binary-cinder-volume-vendorx:rev1 - -.. note:: Image parameters were named Docker*Image prior to the Train cycle. - - -3rd party kernel modules ------------------------- - -Some applications (like Neutron or Cinder plugins) require specific kernel modules to be installed -and loaded on the system. - -We recommend two different methods to deploy and load these modules. - -kernel module is deployed on the host -..................................... - -The kernel module is deployed on the base Operating System via RPM or DKMS. -Deploy the module by using the ``tripleo-mount-image`` tool and create a -``chroot``. - -First you need to create a repository file where the module will be downloaded from, and copy the repo file into the image:: - - temp_dir=$(mktemp -d) - sudo tripleo-mount-image -a /path/to/overcloud-full.qcow2 -m $temp_dir - sudo cp my-repo.repo $temp_dir/etc/yum.repos.d/ - -You can now start a chroot and install the rpm that contains the kernel module:: - - sudo mount -o bind /dev $temp_dir/dev/ - sudo cp /etc/resolv.conf $temp_dir/etc/resolv.conf - sudo chroot $temp_dir /bin/bash - dnf install my-rpm - exit - -Then unmount the image:: - - sudo rm $temp_dir/etc/resolv.conf - sudo umount $temp_dir/dev - sudo tripleo-unmount-image -m $temp_dir - -Now that the rpm is deployed with the kernel module, we need to configure TripleO to load it. -To configure an extra kernel module named "dpdk_module" for a specific role, we would add:: - - parameter_defaults: - ControllerExtraKernelModules: - dpdk_module: {} - -Since our containers don't get their own kernels, we load modules on the host. -Therefore, ExtraKernelModules parameter is used to configure which modules we want to configure. -This parameter will be applied to the Puppet manifest (in the kernel.yaml service). -The container needs the modules mounted from the host, so make sure the plugin template has the -following configuration (at minimum):: - - volumes: - - /lib/modules:/lib/modules:ro - -However, this method might be problematic if RPMs dependencies are too complex to deploy the kernel -module on the host. - - -kernel module is containerized -.............................. - -Kernel modules can be loaded from the container. -The module can be deployed in the same container as the application that will use it, or in a separated -container. - -Either way, if you need to run a privileged container, make sure to set this parameter:: - - privileged: true - -If privilege mode isn't required, it is suggested to set it to false for security reasons. - -Kernel modules will need to be loaded when the container will be started by Docker. To do so, it is -suggested to configure the composable service which deploys the module in the container this way:: - - kolla_config: - /var/lib/kolla/config_files/neutron_ovs_agent.json: - command: /dpdk_module_launcher.sh - docker_config_scripts: - dpdk_module_launcher.sh: - mode: "0755" - content: | - #!/bin/bash - set -xe - modprobe dpdk_module - docker_config: - step_3: - neutron_ovs_bridge: - volumes: - list_concat: - - {get_attr: [ContainersCommon, volumes]} - - - - /var/lib/docker-config-scripts/dpdk_module_launcher.sh:/dpdk_module_launcher.sh:ro - -That way, the container will be configured to load the module at start, so the operator can restart containers without caring about loading the module manually. diff --git a/deploy-guide/source/deployment/ansible_config_download.rst b/deploy-guide/source/deployment/ansible_config_download.rst deleted file mode 100644 index 20b35f0f..00000000 --- a/deploy-guide/source/deployment/ansible_config_download.rst +++ /dev/null @@ -1,657 +0,0 @@ -.. _config_download: - -TripleO config-download User's Guide: Deploying with Ansible -============================================================= - -Introduction ------------- -This documentation details using ``config-download``. - -``config-download`` is the feature that enables deploying the Overcloud software -configuration with Ansible in TripleO. - -Summary -------- -Since the Queens release, it has been possible to use Ansible to apply the -overcloud configuration and with the Rocky release it became the default. - -Ansible is used to replace the communication and transport of the software -configuration deployment data between Heat and the Heat agent -(os-collect-config) on the overcloud nodes. - -Instead of os-collect-config running on each overcloud node and polling for -deployment data from Heat, the Ansible control node applies the configuration -by running ``ansible-playbook`` with an Ansible inventory file and a set of -playbooks and tasks. - -The Ansible control node (the node running ``ansible-playbook``) is the -undercloud by default. - -``config-download`` is the feature name that enables using Ansible in this -manner, and will often be used to refer to the method detailed in this -documentation. - -Heat is still used to create the stack, then the ansible playbooks are saved -to the filesystem in a git repository. These playbook are used to deploy the -openstack services and configuration to the Overcloud nodes. -The same parameter values and environment files are passed to Heat as they were -previously. During the stack creation, Heat simply takes the user inputs from the -templates and renders the required playbooks for the deployment. - -The difference with ``config-download`` is that although Heat creates all the -deployment data necessary via SoftwareDeployment resources to perform the -overcloud installation and configuration, it does not apply any of the software -deployments. The data is only made available via the Heat API. Once the stack -is created, deployment data is downloaded from Heat and ansible playbooks are -generated. - -Using the downloaded deployment data and ansible playbooks configuration of -the overcloud using ``ansible-playbook`` are completed. - -This diagram details the overall sequence of how using config-download -completes an overcloud deployment: - -.. image:: ../_images/tripleo_ansible_arch.png - :scale: 40% - - -Deployment with config-download -------------------------------- -Ansible and ``config-download`` are used by default when ``openstack -overcloud deploy`` (tripleoclient) is run. The command is backwards compatible -in terms of functionality, meaning that running ``openstack overcloud deploy`` -will still result in a full overcloud deployment. - -The deployment is done through a series of steps in tripleoclient. All of the -workflow steps are automated by tripleoclient. The workflow steps are summarized -as: - -#. Create deployment plan -#. Create Heat stack -#. Create software configuration within the Heat stack -#. Create tripleo-admin ssh user -#. Download the software configuration from Heat -#. Applying the downloaded software configuration to the overcloud nodes with - ``ansible-playbook``. - -.. _`authorized on the overcloud nodes`: - -Creating the ``tripleo-admin`` user on each overcloud node is necessary since -ansible uses ssh to connect to each node to perform configuration. - -The following steps are done to create the ``tripleo-admin`` user: - -#. Runs a playbook to create ``tripleo-admin`` on each node. Also, gives sudo - permissions to the user, as well as creates and stores a new ssh keypair - for ``tripleo-admin``. - - -The values for these cli arguments must be the same for all nodes in the -overcloud deployment. ``overcloud-ssh-key`` should be the private key that -corresponds with the public key specified by the Heat parameter ``KeyName`` -when using Ironic deployed nodes. - -config-download related CLI arguments -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -There are some new CLI arguments for ``openstack overcloud deploy`` that can be -used to influence the behavior of the overcloud deployment as it relates to -``config-download``:: - - --overcloud-ssh-user # Initial ssh user used for creating tripleo-admin. - # Defaults to heat-admin - - --overcloud-ssh-key # Initial ssh private key (file path) to be used for - # creating tripleo-admin. - # Defaults to ~/.ssh/id_rsa - - --override-ansible-cfg # path to an ansible config file, to inject any - # arbitrary ansible config to be used when running - # ansible-playbook - - --stack-only # Only update the stack. Skips applying the - # software configuration with ansible-playbook. - - --config-download-only # Only apply the software configuration with - # ansible-playbook. Skips the stack update. - -See ``openstack overcloud deploy --help`` for further help text. - -.. include:: deployment_output.rst - -.. _deployment_status: - -.. include:: deployment_status.rst - -.. include:: deployment_log.rst - -Ansible configuration -^^^^^^^^^^^^^^^^^^^^^ -When ``ansible-playbook`` runs, it will use a configuration file with the -following default values:: - - [defaults] - retry_files_enabled = False - log_path = /ansible.log - forks = 25 - - [ssh_connection] - ssh_args = -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ControlMaster=auto -o ControlPersist=60s - control_path_dir = /ansible-ssh - -Any of the above configuration options can be overridden, or any additional -ansible configuration used by passing the path to an ansible configuration file -with ``--override-ansible-cfg`` on the deployment command. - -For example the following command will use the configuration options from -``/home/stack/ansible.cfg``. Any options specified in the override file will -take precedence over the defaults:: - - openstack overcloud deploy \ - ... - --override-ansible-cfg /home/stack/ansible.cfg - - -Ansible project directory -^^^^^^^^^^^^^^^^^^^^^^^^^ -The workflow will create an Ansible project directory with the plan name under -``$HOME/overcloud-deploy//config-download``. For the default plan name of ``overcloud`` the working -directory will be:: - - $HOME/overcloud-deploy/overcloud/config-download/overcloud - -The project directory is where the downloaded software configuration from -Heat will be saved. It also includes other ansible-related files necessary to -run ``ansible-playbook`` to configure the overcloud. - -The contents of the project directory include the following files: - -tripleo-ansible-inventory.yaml - Ansible inventory file containing hosts and vars for all the overcloud nodes. -ansible.log - Log file from the last run of ``ansible-playbook``. -ansible.cfg - Config file used when running ``ansible-playbook``. -ansible-playbook-command.sh - Executable script that can be used to rerun ``ansible-playbook``. -ssh_private_key - Private ssh key used to ssh to the overcloud nodes. - -Reproducing ansible-playbook -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Once in the project directory created, simply run ``ansible-playbook-command.sh`` -to reproduce the deployment:: - - ./ansible-playbook-command.sh - -Any additional arguments passed to this script will be passed unchanged to the -``ansible-playbook`` command:: - - ./ansible-playbook-command.sh --check - -Using this method it is possible to take advantage of various Ansible features, -such as check mode (``--check``), limiting hosts (``--limit``), or overriding -variables (``-e``). - -Git repository -^^^^^^^^^^^^^^ -The ansible project directory is a git repository. Each time config-download -downloads the software configuration data from Heat, the project directory will -be checked for differences. A new commit will be created if there are any -changes from the previous revision. - -From within the ansible project directory, standard git commands can be used to -explore each revision. Commands such as ``git log``, ``git show``, and ``git -diff`` are useful ways to describe how each commit to the software -configuration differs from previous commits. - -Applying earlier versions of configuration -__________________________________________ -Using commands such as ``git revert`` or ``git checkout``, it is possible to -update the ansible project directory to an earlier version of the software -configuration. - -It is possible to then apply this earlier version with ``ansible-playbook``. -However, caution should be exercised as this could lead to a broken overcloud -deployment. Only well understood earlier versions should be attempted to be -applied. - -.. note:: - - Data migration changes will never be undone by applying an earlier version - of the software configuration with config-download. For example, database - schema migrations that had already been applied would never be undone by - only applying an earlier version of the configuration. - - Software changes that were related to hardware changes in the overcloud - (such as scaling up or down) would also not be completely undone by - applying earlier versions of the software configuration. - -.. note:: - - Reverting to earlier revisions of the project directory has no effect on - the configuration stored in the Heat stack. A corresponding change should - be made to the deployment templates, and the stack updated to make the - changes permanent. - -.. _manual-config-download: - -Manual config-download ----------------------- -Prior to running the ansible playbooks generated by config-download, it is necessary -to ensure the baremetal nodes have already been provisioned. See the baremetal deployment -guide first: - -:doc:`configure-nodes-before-deployment <./network_v2>` - -The config-download steps can be skipped when running ``openstack overcloud deploy`` -by passing ``--stack-only``. This will cause tripleoclient to only deploy the Heat -stack. - -When running ``openstack overcloud deploy`` with the ``--stack-only`` option, this -will still download the ansible content to the default directory -``$HOME/overcloud-deploy/overcloud/config-download``. But it will stop before running -the ``ansible-playbook`` command. - -This method is described in the following sections. - - -Run ansible-playbook -^^^^^^^^^^^^^^^^^^^^ -Once the baremetal nodes have been configured, and the configuration has been -downloaded during the ``--stack-only`` run of ``openstack overcloud deploy``. -You can then run ``ansible-playbook`` manually to configure the overcloud nodes:: - - ansible-playbook \ - -i /home/stack/config-download/overcloud/tripleo-ansible-inventory.yaml \ - --private-key /path/private/ssh/key \ - --become \ - config-download/deploy_steps_playbook.yaml - -.. note:: - - ``--become`` is required when running ansible-playbook. - -All default ansible configuration values will be used when manually running -``ansible-playbook`` in this manner. These values can be customized through -`ansible configuration -`_. - -The following minimum configuration is recommended:: - - [defaults] - log_path = ansible.log - forks = 25 - timeout = 30 - - [ssh_connection] - ssh_args = -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ControlMaster=auto -o ControlPersist=30m - retries = 8 - pipelining = True - - -.. note:: - - When running ``ansible-playbook`` manually, the overcloud status as returned - by ``openstack overcloud status`` won't be automatically updated due to the - configuration being applied outside of the API. - - See :ref:`deployment_status` for setting the status manually. - -Ansible project directory contents ----------------------------------- -This section details the structure of the ``config-download`` generated -Ansible project directory. - -Playbooks -^^^^^^^^^ -deploy_steps_playbook.yaml - Initial deployment or template update (not minor update) - - Further detailed in :ref:`deploy_steps_playbook.yaml` -fast_forward_upgrade_playbook.yaml - Fast forward upgrades -post_upgrade_steps_playbook.yaml - Post upgrade steps for major upgrade -pre_upgrade_rolling_steps_playbook.yaml - Pre upgrade steps for major upgrade -update_steps_playbook.yaml - Minor update steps -upgrade_steps_playbook.yaml - Major upgrade steps - -.. _deploy_steps_playbook.yaml: - -deploy_steps_playbook.yaml -__________________________ -``deploy_steps_playbook.yaml`` is the playbook used for deployment and template -update. It applies all the software configuration necessary to deploy a full -overcloud based on the templates provided as input to the deployment command. - -This section will summarize at high level the different ansible plays used -within this playbook. The play names shown here are the same names used within -the playbook and are what will be shown in the output when ``ansible-playbook`` is -run. - -The ansible tags set on each play are also shown below. - -Gather facts from undercloud - Fact gathering for the undercloud node - - tags: facts -Gather facts from overcloud - Fact gathering for the overcloud nodes - - tags: facts -Load global variables - Loads all variables from `l`global_vars.yaml`` - - tags: always -Common roles for TripleO servers - Applies common ansible roles to all overcloud nodes. Includes - ``tripleo_bootstrap`` for installing bootstrap packages and - ``tripleo_ssh_known_hosts`` for configuring ssh known hosts. - - tags: common_roles -Overcloud deploy step tasks for step 0 - Applies tasks from the ``deploy_steps_tasks`` template interface - - tags: overcloud, deploy_steps -Server deployments - Applies server specific Heat deployments for configuration such as networking - and hieradata. Includes ``NetworkDeployment``, ``Deployment``, - ``AllNodesDeployment``, etc. - - tags: overcloud, pre_deploy_steps -Host prep steps - Applies tasks from the ``host_prep_steps`` template interface - - tags: overcloud, host_prep_steps -External deployment step [1,2,3,4,5] - Applies tasks from the ``external_deploy_steps_tasks`` template interface. - These tasks are run against the undercloud node only. - - tags: external, external_deploy_steps -Overcloud deploy step tasks for [1,2,3,4,5] - Applies tasks from the ``deploy_steps_tasks`` template interface - - tags: overcloud, deploy_steps -Overcloud common deploy step tasks [1,2,3,4,5] - Applies the common tasks done at each step to include puppet host - configuration, ``container-puppet.py``, and ``paunch`` or - ``tripleo_container_manage`` Ansible role (container configuration). - - tags: overcloud, deploy_steps -Server Post Deployments - Applies server specific Heat deployments for configuration done after the 5 - step deployment process. - - tags: overcloud, post_deploy_steps -External deployment Post Deploy tasks - Applies tasks from the ``external_post_deploy_steps_tasks`` template interface. - These tasks are run against the undercloud node only. - - tags: external, external_deploy_steps - - -Task files -^^^^^^^^^^ -These task files include tasks specific to their intended function. The task -files are automatically used by specific playbooks from the previous section. - -**boot_param_tasks.yaml** - -**common_deploy_steps_tasks.yaml** - -**docker_puppet_script.yaml** - -**external_deploy_steps_tasks.yaml** - -**external_post_deploy_steps_tasks.yaml** - -**fast_forward_upgrade_bootstrap_role_tasks.yaml** - -**fast_forward_upgrade_bootstrap_tasks.yaml** - -**fast_forward_upgrade_post_role_tasks.yaml** - -**fast_forward_upgrade_prep_role_tasks.yaml** - -**fast_forward_upgrade_prep_tasks.yaml** - -**fast_forward_upgrade_release_tasks.yaml** - -**upgrade_steps_tasks.yaml** - -**update_steps_tasks.yaml** - -**pre_upgrade_rolling_steps_tasks.yaml** - -**post_upgrade_steps_tasks.yaml** - -**post_update_steps_tasks.yaml** - -Heat Role directories -^^^^^^^^^^^^^^^^^^^^^ -Each Heat role from the roles data file used in the deployment (specified with -``-r`` from the ``openstack overcloud deploy`` command), will have a -correspondingly named directory. - -When using the default roles, these directories would be: - -**Controller** - -**Compute** - -**ObjectStorage** - -**BlockStorage** - -**CephStorage** - -A given role directory contains role specific task files and a subdirectory for -each host for that role. For example, when using the default hostnames, the -**Controller** role directory would contain the following host subdirectories: - -**overcloud-controller-0** - -**overcloud-controller-1** - -**overcloud-controller-2** - -Variable and template related files -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -group_vars - Directory which contains variables specific to different ansible inventory - groups. -global_vars.yaml - Global ansible variables applied to all overcloud nodes -templates - Directory containing any templates used during the deployment - -Other files -^^^^^^^^^^^ -Other files in the project directory are: - -ansible-playbook-command.sh - Script to reproduce ansible-playbook command -tripleo-ansible-inventory.yaml - Ansible inventory file -overcloud-config.tar.gz - Tarball of Ansible project directory - -Running specific tasks ----------------------- -Running only specific tasks (or skipping certain tasks) can be done from within -the ansible project directory. - -.. note:: - - Running specific tasks is an advanced use case and only recommended for - specific scenarios where the deployer is aware of the impact of skipping or - only running certain tasks. - - This can be useful during troubleshooting and debugging scenarios, but - should be used with caution as it can result in an overcloud that is not - fully configured. - -.. warning:: - - All tasks that are part of the deployment need to be run, and in the order - specified. When skipping tasks with ``--tags``, ``-skip-tags``, - ``--start-at-task``, the deployment could be left in an inoperable state. - - The functionality to skip tasks or only run certain tasks is meant to aid in - troubleshooting and iterating more quickly on failing deployments and - updates. - - All changes to the deployed cloud must still be applied through the Heat - templates and environment files passed to the ``openstack overcloud deploy`` - command. Doing so ensures that the deployed cloud is kept in sync with the - state of the templates and the state of the Heat stack. - -.. warning:: - - When skipping tasks, the overcloud must be in the state expected by the task - starting task. Meaning, the state of the overcloud should be the same as if - all the skipped tasks had been applied. Otherwise, the result of the tasks - that get executed will be undefined and could leave the cloud in an - inoperable state. - - Likewise, the deployed cloud may not be left in its fully configured state - if tasks are skipped at the end of the deployment. - -Complete the :ref:`manual-config-download` steps to create the ansible project -directory, or use the existing project directory at -``$HOME/overcloud-deploy//config-download/``. - - -Tags -^^^^ -The playbooks use tagged tasks for finer-grained control of what to apply if -desired. Tags can be used with the ``ansible-playbook`` CLI arguments ``--tags`` or -``--skip-tags`` to control what tasks are executed. The enabled tags are: - -facts - fact gathering -common_roles - ansible roles common to all nodes -overcloud - all plays for overcloud deployment -pre_deploy_steps - deployments that happen pre deploy_steps -host_prep_steps - Host preparation steps -deploy_steps - deployment steps -post_deploy_steps - deployments that happen post deploy_steps -external - all external deployments -external_deploy_steps - external deployments that run on the undercloud - -See :ref:`deploy_steps_playbook.yaml` for a description of which tags apply to -specific plays in the deployment playbook. - -Server specific pre and post deployments -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The list of server specific pre and post deployments run during the `Server -deployments` and `Server Post Deployments` plays (see -:ref:`deploy_steps_playbook.yaml`) are dependent upon what custom roles and -templates are used with the deployment. - -The list of these tasks are defined in an ansible group variable that applies -to each server in the inventory group named after the Heat role. From the -ansible project directory, the value can be seen within the group variable file -named after the Heat role:: - - $ cat group_vars/Compute - Compute_pre_deployments: - - UpgradeInitDeployment - - HostsEntryDeployment - - DeployedServerBootstrapDeployment - - InstanceIdDeployment - - NetworkDeployment - - ComputeUpgradeInitDeployment - - ComputeDeployment - - ComputeHostsDeployment - - ComputeAllNodesDeployment - - ComputeAllNodesValidationDeployment - - ComputeHostPrepDeployment - - ComputeArtifactsDeploy - - Compute_post_deployments: [] - -``_pre_deployments`` is the list of pre deployments, and -``_post_deployments`` is the list of post deployments. - -To specify the specific task to run for each deployment, the value of the -variable can be defined on the command line when running ``ansible-playbook``, -which will overwrite the value from the group variable file for that role. - -For example:: - - ansible-playbook \ - -e Compute_pre_deployments=NetworkDeployment \ - --tags pre_deploy_steps - # other CLI arguments - -Using the above example, only the task for the ``NetworkDeployment`` resource -would get applied since it would be the only value defined in -``Compute_pre_deployments``, and ``--tags pre_deploy_steps`` is also specified, -causing all other plays to get skipped. - -Starting at a specific task -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To start the deployment at a specific task, use the ``ansible-playbook`` CLI -argument ``--start-at-task``. To see a list of task names for a given playbook, -``--list-tasks`` can be used to list the task names. - -.. note:: - - Some tasks that include the ``step`` variable or other ansible variables in - the task name do not work with ``--start-at-task`` due to a limitation in - ansible. For example the task with the name:: - - Start containers for step 1 - - won't work with ``--start-at-task`` since the step number is in the name - (1). - -When using ``--start-at-task``, the tasks that gather facts and load global -variables for the playbook execution are skipped by default. Skipping those -tasks can cause unexpected errors in later tasks. To avoid errors, those tasks -can be forced to execute when using ``--start-at-task`` by including the -following options to the ``ansible-playbook`` command:: - - ansible-playbook \ - \ - -e gather_facts=true \ - -e @global_vars.yaml - -The ``global_vars.yaml`` variable file exists in the config-download directory -that was either generated manually or under ``$HOME/config-download``. - -Previewing changes ------------------- -Changes can be previewed to see what will be changed before any changes are -applied to the overcloud. To preview changes, the stack update must be run with -the ``--stack-only`` cli argument:: - - openstack overcloud deploy \ - --stack-only - # other CLI arguments - - -When ansible-playbook is run, use the ``--check`` CLI argument with -ansible-playbook to preview any changes. The extent to which changes can be -previewed is dependent on many factors such as the underlying tools in use -(puppet, docker, etc) and the support for ansible check mode in the given -ansible module. - -The ``--diff`` option can also be used with ``--check`` to show the -differences that would result from changes. - -See `Ansible Check Mode ("Dry Run") -`_ -for more details. diff --git a/deploy-guide/source/deployment/ansible_config_download_differences.rst b/deploy-guide/source/deployment/ansible_config_download_differences.rst deleted file mode 100644 index 399ef4e7..00000000 --- a/deploy-guide/source/deployment/ansible_config_download_differences.rst +++ /dev/null @@ -1,133 +0,0 @@ -.. _config_download_differences: - -Ansible config-download differences -=================================== -With the Queens release, it became possible to use Ansible to apply the -overcloud configuration and this method became the default behavior with -the Rockt release. - -The feature is fully documented at -:doc:`ansible_config_download`, while this page details -the differences to the deployer experience with config-download. - -Ansible vs. os-collect-config ------------------------------ -Previously, TripleO used an agent running on each overcloud node called -``os-collect-config``. This agent periodically polled the undercloud Heat API for -software configuration changes that needed to be applied to the node. - -``os-collect-config`` ran ``os-refresh-config`` and ``os-apply-config`` as -needed whenever new software configuration changes were detected. This model -is a **"pull"** style model given each node polled the Heat API and pulled changes, -then applied them locally. - -With config-download, TripleO has switched to a **"push"** style model. Ansible -is run from a central control node which is the undercloud. -``ansible-playbook`` is run from the undercloud and software configuration -changes are pushed out to each overcloud node via ssh. - -With the new model, ``os-collect-config``, ``os-refresh-config``, and -``os-apply-config`` are no longer used in a TripleO deployment. The -``os-collect-config`` service is now disabled by default and won't start on -boot. - -.. note:: - - Heat standalone software deployments still rely on ``os-collect-config``. - They are a type of deployment that can be applied to overcloud nodes - directly via Heat outside of the overcloud stack, and without having to do - a full stack update of the overcloud stack. - - These types of deployments are **NOT** typically used when doing TripleO. - - However, if these deployments are being used in an environment to manage - overcloud nodes, then the ``os-collect-config`` service must be started and - enabled on the overcloud nodes where these types of deployments are - applied. - - For reference, the Heat CLI commands that are used to create these types of - deployments are:: - - openstack software config create ... - openstack software deployment create ... - - If these commands are not being used in the environment, then - ``os-collect-config`` can be left disabled. - -Deployment workflow -------------------- -The default workflow executed by ``openstack overcloud deploy`` takes care of -all the necessary changes when using config-download. In both the previous and -new workflows, ``openstack overcloud deploy`` (tripleoclient) takes care of -automating all the steps through Mistral workflow(s). Therefore, existing CLI -scripts that called ``openstack overcloud deploy`` will continue to work with -no changes. - -It's important to recognize the differences in the workflow to aid in -understanding the deployment and operator experience. Previously, Heat was -responsible for: - -#. (Heat) Creating OpenStack resources (Neutron networks, Nova/Ironic instances, etc) -#. (Heat) Creating software configuration -#. (Heat) Applying the created software configuration to the Nova/Ironic instances - -With config-download, Heat is no longer responsible for the last item of -applying the created software configuration as ``ansible-playbook`` is used -instead. - -Therefore, only creating the Heat stack for an overcloud is no longer all that -is required to fully deploy the overcloud. Ansible also must be run from the -undercloud to apply the software configuration, and do all the required tasks -to fully deploy an overcloud such as configuring services, bootstrap tasks, and -starting containers. - -The new steps are summarized as: - -#. (Heat) Creating OpenStack resources (Neutron networks, Nova/Ironic instances, etc) -#. (Heat) Creating software configuration -#. (tripleoclient) Enable tripleo-admin ssh user -#. (ansible) Applying the created software configuration to the Nova/Ironic instances - -See :doc:`ansible_config_download` for details on the -tripleo-admin ssh user step. - -Deployment CLI output ---------------------- -During a deployment, the expected output from ``openstack overcloud deploy`` -has changed. Output up to and including the stack create/update is similar to -previous releases. Stack events will be shown until the stack operation is -complete. - -After the stack goes to ``CREATE_COMPLETE`` (or ``UPDATE_COMPLETE``), output -from the steps to enable the tripleo-admin user via ssh are shown. - -.. include:: deployment_output.rst - -.. include:: deployment_status.rst - -.. include:: deployment_log.rst - -config-download Use Cases -------------------------- -config-download exposes the ability to manually run the ``ansible-playbook`` -command against the playbooks that are generated for the deployment. This leads -to many advantages over the older Heat deployment model. - -- Test deployments. Using the - ``ansible-playbook --check --diff deploy_steps_playbook.yaml`` - arguments will not modify an existing deployment. Instead, it will only show - any changes that would be made. -- Development environment testing. Ansible variables can be modified to do - quick testing. Once verified, Heat environment templates need to be updated - to reflect the change permanently. Then the config-download content should - be re-generated by running ``openstack overcloud deploy --stack-only``. -- Run specific tasks. It is possible to run certain parts of a deployment by - using ``--tags``. -- Prepare the deployment or update ahead of time and then run the playbooks - later. The operations around a deployment can be done at different times to - minimize risk. -- Integration with CI/CD. Additional checks and verification can be added to - a CI/CD pipeline relating to updating Heat templates and the Ansible - config-download content. -- AWX or Ansible Tower integration. Ansible content can be imported and ran - through a scalable and distributed system. diff --git a/deploy-guide/source/deployment/architecture.rst b/deploy-guide/source/deployment/architecture.rst deleted file mode 100644 index 528531c0..00000000 --- a/deploy-guide/source/deployment/architecture.rst +++ /dev/null @@ -1,335 +0,0 @@ -TripleO Containers Architecture -=============================== - -This document explains the details around TripleO's containers architecture. The -document goes into the details of how the containers are built for TripleO, -how the configuration files are generated and how the containers are eventually -run. - -Like other areas of TripleO, the containers based deployment requires a couple -of different projects to play together. The next section will cover each of the -parts that allow for deploying OpenStack in containers using TripleO. - - -Containers runtime deployment and configuration notes ------------------------------------------------------ - -TripleO has transitioned to the `podman`_ container runtime. Podman does not -use a persistent daemon to manage containers. TripleO wraps the container -service execution in systemd managed services. These services are named -tripleo_. Prior to Stein, TripleO deployed the containers -runtime and image components from the docker packages. The installed components -include the docker daemon system service and `OCI`_ compliant `Moby`_ and -`Containerd`_ - the building blocks for the container system. - -Containers control plane includes `Paunch`_ or tripleo_container_manage_ and -systemd for the stateless services, and Pacemaker `Bundle`_ for the -containerized stateful services, like the messaging system or database. - -.. _podman: https://podman.io/ -.. _OCI: https://www.opencontainers.org/ -.. _Moby: https://mobyproject.org/ -.. _Containerd: https://github.com/containerd/containerd -.. _Bundle: https://wiki.clusterlabs.org/wiki/Bundle_Walk-Through - -Currently we provide a ``ContainerCli`` parameter which can be used to change -the container runtimes, but only podman is supported for both undercloud and -overcloud. - -We have provided various ``Container*`` configuration parameters in TripleO -Heat Templates for operators to tune some of the container based settings. -There are still some ``Docker*`` configuration parameters in TripleO Heat -Templates available for operators which are left over for the Docker based -deployment or historical reasons. -Parameter override example:: - - parameter_defaults: - DockerDebug: true - DockerOptions: '--log-driver=syslog --live-restore' - DockerNetworkOptions: '--bip=10.10.0.1/16' - DockerInsecureRegistryAddress: ['myregistry.local:8787'] - DockerRegistryMirror: 'mirror.regionone.local:8081/myregistry-1.local/' - -* ``DockerDebug`` adds more framework-specific details to the deployment logs. - -* ``DockerOptions``, ``DockerNetworkOptions``, ``DockerAdditionalSockets`` define - the docker service startup options, like the default IP address for the - `docker0` bridge interface (``--bip``) or SELinux mode (``--selinux-enabled``). - - .. note:: Make sure the default CIDR assigned for the `docker0` bridge interface - does not conflict to other network ranges defined for your deployment. - - .. note:: These options have no effect when using podman. - -* ``DockerInsecureRegistryAddress``, ``DockerRegistryMirror`` allow you to - specify a custom registry mirror which can optionally be accessed insecurely - by using the ``DockerInsecureRegistryAddress`` parameter. - -See the official dockerd `documentation`_ for the reference. - -.. _documentation: https://docs.docker.com/engine/reference/commandline/dockerd/ - - -Building Containers -------------------- - -The containers used for TripleO are sourced from Kolla. Kolla is an OpenStack -team that aims to create tools to allow for deploying OpenStack on container -technologies. Kolla (or Kolla Build) is one of the tools produced by this team -and it allows for building and customizing container images for OpenStack -services and their dependencies. - -TripleO consumes these images and takes advantage of the customization -capabilities provided by the `Kolla`_ build tool to install some packages that -are required by other parts of TripleO. - -TripleO maintains its complete list of kolla customization in the -`tripleo-common`_ project. - -.. _Kolla: https://docs.openstack.org/kolla/latest/admin/image-building.html#dockerfile-customisation -.. _tripleo-common: https://github.com/openstack/tripleo-common/blob/master/container-images/tripleo_kolla_template_overrides.j2 - - -Paunch ------- - -.. note:: During Ussuri cycle, Paunch has been replaced by the - tripleo_container_manage_ Ansible role. Therefore, the following block - is deprecated in favor of the new role. However, the JSON input remains - backward compatible and the containers are configured the same way as it - was with Paunch. - -The `paunch`_ hook is used to manage containers. This hook takes json -as input and uses it to create and run containers on demand. The json -describes how the container will be started. Some example keys are: - -* **net**: To specify what network to use. This is commonly set to host. - -* **privileged**: Whether to give full access to the host's devices to the - container, similar to what happens when the service runs directly on the host. - -* **volumes**: List of host path volumes, named volumes, or dynamic volumes to - bind on the container. - -* **environment**: List of environment variables to set on the container. - -.. note:: The list above is not exhaustive and you should refer to the - `paunch` docs for the complete list. - -The json file passed to this hook is built out of the `docker_config` attribute -defined in the service's yaml file. Refer to the `Docker specific settings`_ -section for more info on this. - -.. _paunch: https://github.com/openstack/paunch -.. _tripleo_container_manage: https://docs.openstack.org/tripleo-ansible/latest/roles/role-tripleo_container_manage.html - -TripleO Heat Templates ----------------------- -.. _containers_arch_tht: - -The `TripleO Heat Templates`_ repo is where most of the logic resides in the form -of heat templates. These templates define each service, the containers' -configuration and the initialization or post-execution operations. - -.. _TripleO Heat Templates: https://opendev.org/openstack/tripleo-heat-templates - -Understanding container related files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The docker templates can be found under the `docker` sub directory in the -`tripleo-heat-templates` root. The services files are under `docker/service` but -the `docker` directory contains a bit more than just service files and some of -them are worth diving into: - -deploy-steps.j2 -............... - -This file is a jinja template and it's rendered before the deployment is -started. This file defines the resources that are executed before and after the -container initialization. - -.. _container-puppet.py: - -container-puppet.py -................... - -This script is responsible for generating the config files for each service. The -script is called from the `deploy-steps.j2` file and it takes a `json` file as -configuration. The json files passed to this script are built out of the -`puppet_config` parameter set in every service template (explained in the -`Docker specific settings`_ section). - -The `container-puppet.py` execution results in a oneshot container being executed -(usually named `puppet-$service_name`) to generate the configuration options or -run other service specific initialization tasks. Example: Create Keystone endpoints. - -.. note:: container-puppet.py was previously docker-puppet.py prior to the Train - cycle. - -Anatomy of a containerized service template -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Containerized services templates inherit almost everything from the puppet based -templates, with some exceptions for some services. New properties have been -added to define container specific configurations, which will be covered in this -section. - -Docker specific settings -........................ - -Each service may define output variable(s) which control config file generation, -initialization, and stepwise deployment of all the containers for this service. -The following sections are available: - -* config_settings: This setting containers hiera data that is used - to control how the Puppet modules generate config files for each service. - -* step_config: This setting controls the manifest that is used to - create docker config files via puppet. The puppet tags below are - used along with this manifest to generate a config directory for - this container. - -* kolla_config: Contains YAML that represents how to map config files - into the kolla container. This config file is typically mapped into - the container itself at the /var/lib/kolla/config_files/config.json - location and drives how kolla's external config mechanisms work. - -* docker_config: Data that is passed to the docker-cmd hook to configure - a container, or step of containers at each step. See the available steps - below and the related docker-cmd hook documentation in the heat-agents - project. - -* puppet_config: This section is a nested set of key value pairs - that drive the creation of config files using puppet. - Required parameters include: - - * puppet_tags: Puppet resource tag names that are used to generate config - files with puppet. Only the named config resources are used to generate - a config file. Any service that specifies tags will have the default - tags of 'file,concat,file_line,augeas,cron' appended to the setting. - Example: keystone_config - - * config_volume: The name of the volume (directory) where config files - will be generated for this service. Use this as the location to - bind mount into the running Kolla container for configuration. - - * config_image: The name of the docker image that will be used for - generating configuration files. This is often the same container - that the runtime service uses. Some services share a common set of - config files which are generated in a common base container. - - * step_config: This setting controls the manifest that is used to - create docker config files via puppet. The puppet tags below are - used along with this manifest to generate a config directory for - this container. - -* container_puppet_tasks: This section provides data to drive the - container-puppet.py tool directly. The task is executed only once - within the cluster (not on each node) and is useful for several - puppet snippets we require for initialization of things like - keystone endpoints, database users, etc. See container-puppet.py - for formatting. NOTE: these tasks were docker_puppet_tasks prior to the - Train cycle. - - -Container steps -............... - -Similar to baremetal, containers are brought up in a stepwise manner. The -current architecture supports bringing up baremetal services alongside of -containers. Therefore, baremetal steps may be required depending on the service -and they are always executed before the corresponding container step. - -The list below represents the correlation between the baremetal and the -containers steps. These steps are executed sequentially: - -* Containers config files generated per hiera settings. -* Host Prep -* Load Balancer configuration baremetal - - * Step 1 external steps (execute Ansible on Undercloud) - * Step 1 deployment steps (Ansible) - * Common Deployment steps - - * Step 1 baremetal (Puppet) - * Step 1 containers - -* Core Services (Database/Rabbit/NTP/etc.) - - * Step 2 external steps (execute Ansible on Undercloud) - * Step 2 deployment steps (Ansible) - * Common Deployment steps - - * Step 2 baremetal (Puppet) - * Step 2 containers - -* Early Openstack Service setup (Ringbuilder, etc.) - - * Step 3 external steps (execute Ansible on Undercloud) - * Step 3 deployment steps (Ansible) - * Common Deployment steps - - * Step 3 baremetal (Puppet) - * Step 3 containers - -* General OpenStack Services - - * Step 4 external steps (execute Ansible on Undercloud) - * Step 4 deployment steps (Ansible) - * Common Deployment steps - - * Step 4 baremetal (Puppet) - * Step 4 containers (Keystone initialization occurs here) - -* Service activation (Pacemaker) - - * Step 5 external steps (execute Ansible on Undercloud) - * Step 5 deployment steps (Ansible) - * Common Deployment steps - - * Step 5 baremetal (Puppet) - * Step 5 containers - - -Service Bootstrap -~~~~~~~~~~~~~~~~~ - -Bootstrapping services is a one-shot operation for most services and it's done -by defining a separate container that shares the same structure as the main -service container commonly defined under the `docker_step` number 3 (see `Container -steps`_ section above). - -Unlike normal service containers, the bootstrap container should be run in the -foreground - `detach: false` - so there can be more control on when the -execution is done and whether it succeeded or not. - -Example taken from Glance's service file:: - - - docker_config: - step_3: - glance_api_db_sync: - image: *glance_image - net: host - privileged: false - detach: false - volumes: &glance_volumes - - /var/lib/kolla/config_files/glance-api.json:/var/lib/kolla/config_files/config.json - - /etc/localtime:/etc/localtime:ro - - /lib/modules:/lib/modules:ro - - /var/lib/config-data/glance_api/:/var/lib/kolla/config_files/src:ro - - /run:/run - - /dev:/dev - - /etc/hosts:/etc/hosts:ro - environment: - - KOLLA_BOOTSTRAP=True - - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS - step_4: - glance_api: - image: *glance_image - net: host - privileged: false - restart: always - volumes: *glance_volumes - environment: - - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS diff --git a/deploy-guide/source/deployment/build_single_image.rst b/deploy-guide/source/deployment/build_single_image.rst deleted file mode 100644 index 7191f6e6..00000000 --- a/deploy-guide/source/deployment/build_single_image.rst +++ /dev/null @@ -1,30 +0,0 @@ -Building a Single Image -======================= - -The ``openstack overcloud image build --all`` command builds all the images -needed for an overcloud deploy. However, you may need to rebuild a single -one of them. Use the following commands if you want to do it:: - - openstack overcloud image build --type {agent-ramdisk|deploy-ramdisk|fedora-user|overcloud-full} - -If the target image exist, this commands ends silently. Make sure to delete a -previous version of the image to run the command as you expect. - -Uploading the New Single Image ------------------------------- - -After the new image is built, it can be uploaded using the same command as -before, with the ``--update-existing`` flag added:: - - openstack overcloud image upload --update-existing - -Note that if the new image is a ramdisk, the Ironic nodes need to be -re-configured to use it. This can be done by re-running:: - - openstack overcloud node configure --all-manageable - -.. note:: - If you want to use custom images for boot configuration, specify their names in - ``--deploy-kernel`` and ``--deploy-ramdisk`` options. - -Now the new image should be fully ready for use by new deployments. diff --git a/deploy-guide/source/deployment/container_image_prepare.rst b/deploy-guide/source/deployment/container_image_prepare.rst deleted file mode 100644 index 39aba3ef..00000000 --- a/deploy-guide/source/deployment/container_image_prepare.rst +++ /dev/null @@ -1,552 +0,0 @@ -.. _prepare-environment-containers: - -Container Image Preparation -=========================== - -This documentation explains how to instruct container image preparation to do -different preparation tasks. - -Choosing an image registry strategy -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Container images need to be pulled from an image registry which is reliably -available to overcloud nodes. The three common options to serve images are to -use the default registry, the registry available on the undercloud, or an -independently managed registry. - -.. note:: Private SSL-enabled registries with a custom CA are not tested. - If you have to use one, the custom CA (certificate authority) that is needed - for the registry should be installed before deploying the overcloud. For - example, it can be injected into the overcloud image, or installed via first - boot scripts. - -During deployment the environment parameter -`ContainerImagePrepare` is used to specify any desired behaviour, including: - -- Where to pull images from -- Optionally, which local repository to push images to -- How to discover the latest versioned tag for each image - -In the following examples, the parameter `ContainerImagePrepare` will be -specified in its own file `containers-prepare-parameters.yaml`. - -Default registry -................ - -By default the images will be pulled from a remote registry namespace such as -`docker.io/tripleomaster`. This is fine for development or POC clouds but is -not appropriate for production clouds due to the transfer of large amounts of -duplicate image data over a potentially unreliable internet connection. - -During deployment with this default, any heat parameters which refer to -required container images will be populated with a value pointing at the -default registry, with a tag representing the latest image version. - -To generate the `containers-prepare-parameters.yaml` containing these defaults, -run this command:: - - openstack tripleo container image prepare default \ - --output-env-file containers-prepare-parameters.yaml - -This will generate a file containing a `ContainerImagePrepare` similar to the -following:: - - parameter_defaults: - ContainerImagePrepare: - - set: - ceph_image: daemon - ceph_namespace: docker.io/ceph - ceph_tag: v4.0.0-stable-4.0-nautilus-centos-7-x86_64 - name_prefix: centos-binary- - name_suffix: '' - namespace: docker.io/tripleomaster - neutron_driver: null - tag: current-tripleo - tag_from_label: rdo_version - -During deployment, this will lookup images in `docker.io/tripleomaster` tagged -with `current-tripleo` and discover a versioned tag by looking up the label -`rdo_version`. This will result in the heat image parameters in the plan being -set with appropriate values, such as:: - - DockerNeutronMetadataImage: docker.io/tripleomaster/centos-binary-neutron-metadata-agent:35414701c176a6288fc2ad141dad0f73624dcb94_43527485 - DockerNovaApiImage: docker.io/tripleomaster/centos-binary-nova-api:35414701c176a6288fc2ad141dad0f73624dcb94_43527485 - -.. note:: The tag is actually a Delorean hash. You can find out the versions - of packages by using this tag. - For example, `35414701c176a6288fc2ad141dad0f73624dcb94_43527485` tag, - is in fact using this `Delorean repository`_. - -.. _populate-local-registry-containers: - -Undercloud registry -................... - -As part of the undercloud install, an image registry is configured on port -`8787`. This can be used to increase reliability of image pulls, and minimise -overall network transfers. -The undercloud registry can be used by generating the following -`containers-prepare-parameters.yaml` file:: - - openstack tripleo container image prepare default \ - --local-push-destination \ - --output-env-file containers-prepare-parameters.yaml - -This will generate a file containing a `ContainerImagePrepare` similar to the -following:: - - parameter_defaults: - ContainerImagePrepare: - - push_destination: true - set: - ceph_image: daemon - ceph_namespace: docker.io/ceph - ceph_tag: v4.0.0-stable-4.0-nautilus-centos-7-x86_64 - name_prefix: centos-binary- - name_suffix: '' - namespace: docker.io/tripleomaster - neutron_driver: null - tag: current-tripleo - tag_from_label: rdo_version - -This is identical to the default registry, except for the `push_destination: -true` entry which indicates that the address of the local undercloud registry -will be discovered at upload time. - -By specifying a `push_destination` value such as `192.168.24.1:8787`, during -deployment all images will be pulled from the remote registry then pushed to -the specified registry. The resulting image parameters will also be modified to -refer to the images in `push_destination` instead of `namespace`. - -.. admonition:: Stein and newer - :class: stein - - Prior to Stein, Docker Registry v2 (provided by "Docker - Distribution" package), was the service running on tcp 8787. - Since Stein it has been replaced with an Apache vhost called - "image-serve", which serves the containers on tcp 8787 and - supports podman or buildah pull commands. Though podman or buildah - tag, push, and commit commands are not supported, they are not - necessary because the same functionality may be achieved through - use of the "sudo openstack tripleo container image prepare" - commands described in this document. - - -Running container image prepare -............................... -The prepare operations are run at the following times: - -#. During ``undercloud install`` when `undercloud.conf` has - `container_images_file=$HOME/containers-prepare-parameters.yaml` (see - :ref:`install_undercloud`) -#. During ``overcloud deploy`` when a `ContainerImagePrepare` parameter is - provided by including the argument `-e - $HOME/containers-prepare-parameters.yaml` - (see :ref:`overcloud-prepare-container-images`) -#. Any other time when ``sudo openstack tripleo container image prepare`` is run - -As seen in the last of the above commands, ``sudo openstack tripleo -container image prepare`` may be run without ``default`` to set up an -undercloud registry without deploying the overcloud. It is run with -``sudo`` because it needs to write to `/var/lib/image-serve` on the -undercloud. - - -Options available in heat parameter ContainerImagePrepare -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To do something different to the above two registry scenarios, your custom -environment can set the value of the ContainerImagePrepare heat parameter to -result in any desired registry and image scenario. - -Discovering versioned tags with tag_from_label -.............................................. - -If you want these parameters to have the actual tag `current-tripleo` instead of -the discovered tag (in this case the Delorean hash, -`35414701c176a6288fc2ad141dad0f73624dcb94_43527485` ) then the `tag_from_label` -entry can be omitted. - -Likewise, if all images should be deployed with a different tag, the value of -`tag` can be set to the desired tag. - -Some build pipelines have a versioned tag which can only be discovered via a -combination of labels. For this case, a template format can be specified -instead:: - - tag_from_label: {version}-{release} - -It's possible to use the above feature while also disabling it only -for a subset of images by using an `includes` and `excludes` list as -described later in this document. This is useful when using the above -but also using containers from external projects which doesn't follow -the same convention like Ceph. - -Copying images with push_destination -.................................... - -By specifying a `push_destination`, the required images will be copied from -`namespace` to this registry, for example:: - - ContainerImagePrepare: - - push_destination: 192.168.24.1:8787 - set: - namespace: docker.io/tripleomaster - ... - -This will result in images being copied from `docker.io/tripleomaster` to -`192.168.24.1:8787/tripleomaster` and heat parameters set with values such as:: - - DockerNeutronMetadataImage: 192.168.24.1:8787/tripleomaster/centos-binary-neutron-metadata-agent:35414701c176a6288fc2ad141dad0f73624dcb94_43527485 - DockerNovaApiImage: 192.168.24.1:8787/tripleomaster/centos-binary-nova-api:35414701c176a6288fc2ad141dad0f73624dcb94_43527485 - -.. note:: Use the IP address of your undercloud, which you previously set with - the `local_ip` parameter in your `undercloud.conf` file. For these example - commands, the address is assumed to be `192.168.24.1:8787`. - -By setting different values for `namespace` and `push_destination` any -alternative registry strategy can be specified. - -Ceph and other set options -.......................... - -The options `ceph_namespace`, `ceph_image`, and `ceph_tag` are similar to -`namespace` and `tag` but they specify the values for the ceph image. It will -often come from a different registry, and have a different versioned tag -policy. - -The values in the `set` map are used when evaluating the file -`/usr/share/openstack-tripleo-common/container-images/tripleo_containers.yaml.j2` -as a Jinja2 template. This file contains the list of every container image and -how it relates to TripleO services and heat parameters. -If Ceph is not part of the overcloud deployment, it's possible to skip pulling -the related containers by setting the `ceph_images` parameter to false as shown -in the example below:: - - ContainerImagePrepare: - - push_destination: 192.168.24.1:8787 - set: - ceph_images: false - -By doing this, the Ceph container images are not pulled from the remote registry -during the deployment. - -Authenticated Registries -........................ - -If a container registry requires a username and password, then those -values may be passed using the following syntax:: - - ContainerImagePrepare: - - push_destination: 192.168.24.1:8787 - set: - namespace: quay.io/... - ... - ContainerImageRegistryCredentials: - 'quay.io': {'': ''} - -.. note:: If the `ContainerImageRegistryCredentials` contain the credentials - for a registry whose name matches the `ceph_namespace` parameter, those - credentials will be extracted and passed to ceph-ansible as the - `ceph_docker_registry_username` and `ceph_docker_registry_password` parameters. - -Layering image preparation entries -.................................. - -Since the value of `ContainerImagePrepare` is a list, multiple entries can be -specified, and later entries will overwrite any earlier ones. Consider the -following:: - - ContainerImagePrepare: - - tag_from_label: rdo_version - push_destination: true - excludes: - - nova-api - set: - namespace: docker.io/tripleomaster - name_prefix: centos-binary- - name_suffix: '' - tag: current-tripleo - - push_destination: true - includes: - - nova-api - set: - namespace: mylocal - tag: myhotfix - -This will result in the following heat parameters which shows a `locally built -` -and tagged `centos-binary-nova-api` being used for `DockerNovaApiImage`:: - - DockerNeutronMetadataImage: 192.168.24.1:8787/tripleomaster/centos-binary-neutron-metadata-agent:35414701c176a6288fc2ad141dad0f73624dcb94_43527485 - DockerNovaApiImage: 192.168.24.1:8787/mylocal/centos-binary-nova-api:myhotfix - -The `includes` and `excludes` entries can control the resulting image list in -addition to the filtering which is determined by roles and containerized -services in the plan. `includes` matches take precedence over `excludes` -matches, followed by role/service filtering. The image name must contain the -value within it to be considered a match. - -The `includes` and `excludes` list is useful when pulling OpenStack -images using `tag_from_label: '{version}-{release}'` while also -pulling images which are not tagged the same way. The following -example shows how to do this with Ceph:: - - ContainerImagePrepare: - - push_destination: true - set: - namespace: docker.io/tripleomaster - name_prefix: centos-binary- - name_suffix: '' - tag: current-tripleo - tag_from_label: '{version}-{release}' - excludes: [ceph] - - push_destination: true - set: - ceph_image: ceph - ceph_namespace: docker.io/ceph - ceph_tag: latest - includes: [ceph] - -Modifying images during prepare -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is possible to modify images during prepare to make any required changes, -then immediately deploy with those changes. The use-cases for modifying images -include: - -- As part of a Continuous Integration pipeline where images are modified with - the changes being tested before deployment -- As part of a development workflow where local changes need to be deployed for - testing and development -- When changes need to be deployed but are not available through an image - build pipeline (proprietary addons, emergency fixes) - -The modification is done by invoking an ansible role on each image which needs -to be modified. The role takes a source image, makes the requested changes, -then tags the result. The prepare can then push the image and set the heat -parameters to refer to the modified image. The modification is done in -the undercloud registry so it is not possible to use this feature when -using the Default registry, where images are pulled directly from a -remote registry during deployment. - -The ansible role `tripleo-modify-image`_ conforms with the required role -interface, and provides the required behaviour for the modify use-cases. Modification is controlled via modify-specific keys in the -`ContainerImagePrepare` parameter: - -- `modify_role` specifies what ansible role to invoke for each image to modify. -- `modify_append_tag` is used to append to the end of the - source image tag. This makes it obvious that the resulting image has been - modified. It is also used to skip modification if the `push_destination` - registry already has that image, so it is recommended to change - `modify_append_tag` whenever the image must be modified. -- `modify_vars` is a dictionary of ansible variables to pass to the role. - -The different use-cases handled by role `tripleo-modify-image`_ are selected by -setting the `tasks_from` variable to the required file in that role. For all of -the following examples, see the documentation for the role -`tripleo-modify-image`_ for the other variables supported by that `tasks_from`. - -While developing and testing the `ContainerImagePrepare` entries which modify -images, it is recommended to run prepare on its own to confirm it is being -modified as expected:: - - sudo openstack tripleo container image prepare \ - -e ~/containers-prepare-parameters.yaml - -Updating existing packages -.......................... - -The following entries will result in all packages being updated in the images, -but using the undercloud host's yum repository configuration:: - - ContainerImagePrepare: - - push_destination: true - ... - modify_role: tripleo-modify-image - modify_append_tag: "-updated" - modify_vars: - tasks_from: yum_update.yml - compare_host_packages: true - yum_repos_dir_path: /etc/yum.repos.d - ... - -Install RPM files -................. - -It is possible to install a directory of RPM files, which is useful for -installing hotfixes, local package builds, or any package which is not -available through a package repository. For example the following would install -some hotfix packages only in the `centos-binary-nova-compute` image:: - - ContainerImagePrepare: - - push_destination: true - ... - includes: - - nova-compute - modify_role: tripleo-modify-image - modify_append_tag: "-hotfix" - modify_vars: - tasks_from: rpm_install.yml - rpms_path: /home/stack/nova-hotfix-pkgs - ... - -Modify with custom Dockerfile -............................. - -For maximum flexibility, it is possible to specify a directory containing a -`Dockerfile` to make the required changes. When the role is invoked, a -`Dockerfile.modified` is generated which changes the `FROM` directive and adds -extra `LABEL` directives. The following example runs the custom -`Dockerfile` on the `centos-binary-nova-compute` image:: - - ContainerImagePrepare: - - push_destination: true - ... - includes: - - nova-compute - modify_role: tripleo-modify-image - modify_append_tag: "-hotfix" - modify_vars: - tasks_from: modify_image.yml - modify_dir_path: /home/stack/nova-custom - ... - -An example `/home/stack/nova-custom/Dockerfile` follows. Note that after any -`USER root` directives have been run, it is necessary to switch back to the -original image default user:: - - FROM docker.io/tripleomaster/centos-binary-nova-compute:latest - - USER root - - COPY customize.sh /tmp/ - RUN /tmp/customize.sh - - USER "nova" - -.. _Delorean repository: https://trunk.rdoproject.org/centos7-master/ac/82/ac82ea9271a4ae3860528eaf8a813da7209e62a6_28eeb6c7/ -.. _tripleo-modify-image: https://github.com/openstack/ansible-role-tripleo-modify-image - - -Modify with Python source code installed via pip from OpenDev Gerrit -.................................................................... - - -If you would like to build an image and apply your patch in a Python project in -OpenStack, you can use this example:: - - ContainerImagePrepare: - - push_destination: true - ... - includes: - - heat-api - modify_role: tripleo-modify-image - modify_append_tag: "-devel" - modify_vars: - tasks_from: dev_install.yml - source_image: docker.io/tripleomaster/centos-binary-heat-api:current-tripleo - refspecs: - - - project: heat - refspec: refs/changes/12/1234/3 - ... - -It will produce a modified image with Python source code installed via pip. - -Building hotfixed containers -............................ - -The `tripleoclient` OpenStack plugin provides a command line interface which -will allow operators to apply packages (hotfixes) to running containers. This -capability leverages the **tripleo-modify-image** role, and automates its -application to a set of containers for a given collection of packages. - -Using the provided command line interface is simple. The interface has very few -required options. The noted options below inform the tooling which containers -need to have the hotfix(es) applied, and where to find the hotfixed package(s). - -============ ================================================================= - option Description -============ ================================================================= ---image The `--image` argument requires the use fully qualified image - name, something like *localhost/image/name:tag-data*. The - `--image` option can be used more than once, which will inform - the tooling that multiple containers need to have the same - hotfix packages applied. ---rpms-path The `--rpms-path` argument requires the full path to a - directory where RPMs exist. The RPMs within this directory will - be installed into the container, producing a new layer for an - existing container. ---tag The `--tag` argument is optional, though it is recommended to - be used. The value of this option will append to the tag of the - running container. By using the tag argument, images that have - been modified can be easily identified. -============ ================================================================= - -With all of the required information, the command to modify existing container -images can be executed like so. - -.. code-block:: shell - - # The shell variables need to be replaced with data that pertains to the given environment. - openstack tripleo container image hotfix --image ${FULLY_QUALIFIED_IMAGE_NAME} \ - --rpms-path ${RPM_DIRECTORY} \ - --tag ${TAG_VALUE} - -When this command completes, new container images will be available on the -local system and are ready to be integrated into the environment. - -You should see the image built on your local system via buildah CLI: - -.. code-block:: shell - - # The shell variables need to be replaced with data that pertains to the given environment. - sudo buildah images | grep ${TAG_VALUE} - -Here is an example on how to push it into the TripleO Container registry: - -.. code-block:: shell - - # ${IMAGE} is in this format: //: - sudo openstack tripleo container image push --local \ - --registry-url 192.168.24.1:8787 ${IMAGE} - -.. note:: - - Container images can be pushed to the TripleO Container registry or - a Docker Registry (using basic auth or the bearer token auth). - -Now that your container image is pushed into a registry, you can deploy it -where it's needed. Two ways are supported: - -* (Long but persistent): Update Container$NameImage where $Name is the name of - the service we update (e.g. ContainerNovaComputeImage). The parameters - can be found in TripleO Heat Templates. Once you update it into your - environment, you need to re-run the "openstack overcloud deploy" command - again and the necessary hosts will get the new container. - - Example:: - - parameter_defaults: - # Replace the values by where the image is stored - ContainerNovaComputeImage: //: - -* (Short but not persistent after a minor update): Run Paunch or Ansible - to update the container on a host. The procedure is already documented - in the :doc:`./tips_tricks` manual. - - -Once the hotfixed container image has been deployed, it's very important to -check that the container is running with the right rpm version. -For example, if the nova-compute container was updated with a new hotfix image, -we want to check that the right nova-compute rpm is installed: - -.. code-block:: shell - - sudo podman exec -ti -u root nova_compute rpm -qa | grep nova-compute - -It will return the version of the openstack-nova-compute rpm and we can compare -it with the one that was delivered via rpm. If the version is not correct (e.g. -older), it means that the hotfix image is wrong and doesn't contain the rpm -provided to build the new image. The image has to be rebuilt and redeployed. diff --git a/deploy-guide/source/deployment/deployment_log.rst b/deploy-guide/source/deployment/deployment_log.rst deleted file mode 100644 index b2d98c1f..00000000 --- a/deploy-guide/source/deployment/deployment_log.rst +++ /dev/null @@ -1,4 +0,0 @@ -Deployment Log -^^^^^^^^^^^^^^ -The ansible part of the deployment creates a log file that is saved on the -undercloud. The log file is available at ``$HOME/ansible.log``. diff --git a/deploy-guide/source/deployment/deployment_output.rst b/deploy-guide/source/deployment/deployment_output.rst deleted file mode 100644 index 1bef7893..00000000 --- a/deploy-guide/source/deployment/deployment_output.rst +++ /dev/null @@ -1,31 +0,0 @@ -Deployment Output -^^^^^^^^^^^^^^^^^ -After the tripleo-admin user is created, ``ansible-playbook`` will be used to -configure the overcloud nodes. - -The output from ``ansible-playbook`` will begin to appear in the console -and will be updated periodically as more tasks are applied. - -When ansible is finished a play recap will be shown, and the usual overcloudrc -details will then be displayed. The following is an example of the end of the -output from a successful deployment:: - - PLAY RECAP **************************************************************** - compute-0 : ok=134 changed=48 unreachable=0 failed=0 - openstack-0 : ok=164 changed=28 unreachable=0 failed=1 - openstack-1 : ok=160 changed=28 unreachable=0 failed=0 - openstack-2 : ok=160 changed=28 unreachable=0 failed=0 - pacemaker-0 : ok=138 changed=30 unreachable=0 failed=0 - pacemaker-1 : ok=138 changed=30 unreachable=0 failed=0 - pacemaker-2 : ok=138 changed=30 unreachable=0 failed=0 - undercloud : ok=2 changed=0 unreachable=0 failed=0 - - Overcloud configuration completed. - Overcloud Endpoint: http://192.168.24.8:5000/ - Overcloud rc file: /home/stack/overcloudrc - Overcloud Deployed - -When a failure happens, the deployment will stop and the error will be shown. - -Review the ``PLAY RECAP`` which will show each host that is part of the -overcloud and the grouped count of each task status. diff --git a/deploy-guide/source/deployment/deployment_status.rst b/deploy-guide/source/deployment/deployment_status.rst deleted file mode 100644 index 8acc64a1..00000000 --- a/deploy-guide/source/deployment/deployment_status.rst +++ /dev/null @@ -1,33 +0,0 @@ -Deployment Status -^^^^^^^^^^^^^^^^^ -Since Heat is no longer the source of authority on the status of the overcloud -deployment, a new tripleoclient command is available to show the overcloud -deployment status:: - - openstack overcloud status - -The output will report the status of the deployment, taking into consideration -the result of all the steps to do the full deployment. The following is an -example of the output:: - - [stack@undercloud ]$ openstack overcloud status - - +------------+-------------------+ - | Stack Name | Deployment Status | - +------------+-------------------+ - | overcloud | DEPLOY_SUCCESS | - +------------+-------------------+ - -A different stack name can be specified with ``--stack``:: - - [stack@undercloud ]$ openstack overcloud status --stack my-deployment - - +---------------+-------------------+ - | Stack Name | Deployment Status | - +-----------+-----------------------+ - | my-deployment | DEPLOY_SUCCESS | - +---------------+-------------------+ - -The deployment status is stored in the YAML file, generated at -``$HOME/overcloud-deploy//-deployment_status.yaml`` in -the undercloud node. diff --git a/deploy-guide/source/deployment/ephemeral_heat.rst b/deploy-guide/source/deployment/ephemeral_heat.rst deleted file mode 100644 index 6e39c9dd..00000000 --- a/deploy-guide/source/deployment/ephemeral_heat.rst +++ /dev/null @@ -1,169 +0,0 @@ -.. _ephemeral_heat: - -Ephemeral Heat -============== - -Introduction ------------- - -Ephemeral Heat is a means to install the overcloud by using an ephemeral Heat -process instead of a system installed Heat process. This change is possible -beginning in the Wallaby release. - -In a typical undercloud, Heat is installed on the undercloud and processes are -run in podman containers for heat-api and heat-engine. When using ephemeral -Heat, there is no longer a requirement that Heat is installed on the -undercloud, instead these processes are started on demand by the deployment, -update, and upgrade commands. - -This model has been in use within TripleO already for both the undercloud and -:ref:`standalone ` installation methods, which start an on demand -all in one heat-all process in order to perform only the installation. Using -ephemeral Heat in this way allows for re-use of the Heat templates from -tripleo-heat-templates without having to require an already fully installed -undercloud. - -Description ------------ - -Ephemeral Heat is enabled by passing the ``--heat-type`` argument to -``openstack overcloud deploy``. The ephemeral process can also be launched -outside of a deployment with the ``openstack tripleo launch heat`` command. The -latter command also takes a ``--heat-type`` argument to enable selecting the -type of Heat process to use. - -Heat types -__________ - -The ``--heat-type`` argument allows for the following options described below. - -installed - Use the system Heat installation. This is the historical TripleO usage of - Heat with Heat fully installed on the undercloud. This is the default - value, and requires a fully installed undercloud. - -native - Use an ephemeral ``heat-all`` process. The process will be started natively - on the system executing tripleoclient commands by way of an OS (operating - system) fork. - -container - A podman container will be started on the executing system that runs a - single ``heat-all`` process. - -pod - A podman pod will be started on the executing system that runs containers - for ``heat-api`` and ``heat-engine``. - -In all cases, the process(es) are terminated at the end of the deployment. - -.. note:: - - The native and container methods are limited in scale due to being a single - Heat process. Deploying more than 3 nodes or 2 roles will significantly - impact the deployment time with these methods as Heat has only a single - worker thread. - - Using the installed or pod methods enable scaling node and role counts as - is typically required. - -Using ------ - -The following example shows using ``--heat-type`` to enable ephemeral Heat:: - - openstack overcloud deploy \ - --stack overcloud \ - --work-dir ~/overcloud-deploy/overcloud \ - --heat-type \ - - -With ephemeral Heat enabled, several additional deployment artifacts are -generated related to the management of the Heat process(es). These artifacts -are generated under the working directory of the deployment in a -``heat-launcher`` subdirectory. The working directory can be overridden with -the ``--work-dir`` argument. - -Using the above example, the Heat artifact directory would be located at -``~/overcloud-deploy/overcloud/heat-launcher``. An example of the directory -contents is shown below:: - - [centos@ephemeral-heat ~]$ ls -l ~/overcloud-deploy/overcloud/heat-launcher/ - total 41864 - -rw-rw-r--. 1 centos centos 650 Mar 24 18:39 api-paste.ini - -rw-rw-r--. 1 centos centos 1054 Mar 24 18:39 heat.conf - -rw-rw-r--. 1 centos centos 42852118 Mar 24 18:31 heat-db-dump.sql - -rw-rw-r--. 1 centos centos 2704 Mar 24 18:39 heat-pod.yaml - drwxrwxr-x. 2 centos centos 49 Mar 24 16:02 log - -rw-rw-r--. 1 centos centos 1589 Mar 24 18:39 token_file.json - -The directory contains the necessary files to inspect and debug the Heat -process(es), and if necessary reproduce the deployment. - -.. note:: - - The consolidated log file for the Heat process is the ``log`` file in the - ``heat-launcher`` directory. - -Launching Ephemeral Heat -________________________ - -Outside of a deployment, the ephemeral Heat process can also be started with the -``openstack tripleo launch heat`` command. This can be used to interactively -use the ephemeral Heat process or to debug a previous deployment. - -When combined with ``--heat-dir`` and ``--restore-db``, the command can be used -to restore the Heat process and database from a previous deployment:: - - openstack tripleo launch heat \ - --heat-type pod \ - --heat-dir ~/overcloud-deploy/overcloud/heat-launcher \ - --restore-db - -The command will exit after launching the Heat process, and the Heat process -will continue to run in the background. - -Interacting with ephemeral Heat -............................... - -With the ephemeral Heat process launched and running, ``openstackclient`` can be -used to interact with the Heat API. The following shell environment -configuration must set up access to the Heat API:: - - unset OS_CLOUD - unset OS_PROJECT_NAME - unset OS_PROJECT_DOMAIN_NAME - unset OS_USER_DOMAIN_NAME - export OS_AUTH_TYPE=none - export OS_ENDPOINT=http://127.0.0.1:8006/v1/admin - -You can also use the ``OS_CLOUD`` environment to set up the same:: - - export OS_CLOUD=heat - -Once the environment is configured, ``openstackclient`` work as expected -against the Heat API:: - - [centos@ephemeral-heat ~]$ openstack stack list - +--------------------------------------+------------+---------+-----------------+----------------------+--------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+------------+---------+-----------------+----------------------+--------------+ - | 761e2a54-c6f9-4e0f-abe6-c8e0ad51a76c | overcloud | admin | CREATE_COMPLETE | 2021-03-22T20:48:37Z | None | - +--------------------------------------+------------+---------+-----------------+----------------------+--------------+ - -Killing ephemeral Heat -...................... - -To stop the ephemeral Heat process previously started with ``openstack tripleo -launch heat``, use the ``--kill`` argument:: - - openstack tripleo launch heat \ - --heat-type pod \ - --heat-dir ~/overcloud-deploy/overcloud/heat-launcher \ - --kill - -Limitations ------------ -Ephemeral Heat currently only supports new deployments. Update and Upgrade -support for deployments that previously used the system installed Heat will be -coming. diff --git a/deploy-guide/source/deployment/index.rst b/deploy-guide/source/deployment/index.rst deleted file mode 100644 index b0cc7fa4..00000000 --- a/deploy-guide/source/deployment/index.rst +++ /dev/null @@ -1,35 +0,0 @@ -TripleO OpenStack Deployment -============================ - -This section describes how to deploy OpenStack clouds on containers, either on -the undercloud or the overcloud. - -.. toctree:: - :maxdepth: 1 - - undercloud - install_undercloud - overcloud - install_overcloud - -TripleO Deployment Advanced Topics -================================== - -This section has additional documentation around advanced deployment related topics. - -.. toctree:: - :maxdepth: 1 - - 3rd_party - ansible_config_download - ansible_config_download_differences - architecture - build_single_image - container_image_prepare - ephemeral_heat - instack_undercloud - network_v2 - standalone - template_deploy - tips_tricks - upload_single_image diff --git a/deploy-guide/source/deployment/instack_undercloud.rst b/deploy-guide/source/deployment/instack_undercloud.rst deleted file mode 100644 index a4d076f7..00000000 --- a/deploy-guide/source/deployment/instack_undercloud.rst +++ /dev/null @@ -1,227 +0,0 @@ -(DEPRECATED) Installing the Undercloud --------------------------------------- - -.. note:: - Instack-undercloud is deprecated in Rocky cycle. Containerized undercloud - should be installed instead. See :doc:`undercloud` for backward - compatibility related information. - -.. note:: - Please ensure all your nodes (undercloud, compute, controllers, etc) have - their internal clock set to UTC in order to prevent any issue with possible - file future-dated timestamp if hwclock is synced before any timezone offset - is applied. - - -#. Log in to your machine (baremetal or VM) where you want to install the - undercloud as a non-root user (such as the stack user):: - - ssh @ - - .. note:: - If you don't have a non-root user created yet, log in as root and create - one with following commands:: - - sudo useradd stack - sudo passwd stack # specify a password - - echo "stack ALL=(root) NOPASSWD:ALL" | sudo tee -a /etc/sudoers.d/stack - sudo chmod 0440 /etc/sudoers.d/stack - - su - stack - - .. note:: - The undercloud is intended to work correctly with SELinux enforcing. - Installations with the permissive/disabled SELinux are not recommended. - The ``undercloud_enable_selinux`` config option controls that setting. - - .. note:: - vlan tagged interfaces must follow the if_name.vlan_id convention, like for - example: eth0.vlan100 or bond0.vlan120. - - .. admonition:: Baremetal - :class: baremetal - - Ensure that there is a FQDN hostname set and that the $HOSTNAME environment - variable matches that value. The easiest way to do this is to set the - ``undercloud_hostname`` option in undercloud.conf before running the - install. This will allow the installer to configure all of the hostname- - related settings appropriately. - - Alternatively the hostname settings can be configured manually, but - this is strongly discouraged. The manual steps are as follows:: - - sudo hostnamectl set-hostname myhost.mydomain - sudo hostnamectl set-hostname --transient myhost.mydomain - - An entry for the system's FQDN hostname is also needed in /etc/hosts. For - example, if the system is named *myhost.mydomain*, /etc/hosts should have - an entry like:: - - 127.0.0.1 myhost.mydomain myhost - - -#. Enable needed repositories: - - .. admonition:: RHEL - :class: rhel - - Enable optional repo:: - - sudo yum install -y yum-utils - sudo yum-config-manager --enable rhelosp-rhel-7-server-opt - - .. include:: ../repositories.rst - - -#. Install the TripleO CLI, which will pull in all other necessary packages as dependencies:: - - sudo yum install -y python-tripleoclient - - .. admonition:: Ceph - :class: ceph - - If you intend to deploy Ceph in the overcloud, or configure the overcloud to use an external Ceph cluster, and are running Pike or newer, then install ceph-ansible on the undercloud:: - - sudo yum install -y ceph-ansible - -#. Prepare the configuration file:: - - cp /usr/share/python-tripleoclient/undercloud.conf.sample ~/undercloud.conf - - It is backwards compatible with non-containerized instack underclouds. - - .. admonition:: Stable Branch - :class: stable - - For a non-containerized undercloud, copy in the sample configuration - file and edit it to reflect your environment:: - - cp /usr/share/instack-undercloud/undercloud.conf.sample ~/undercloud.conf - - .. note:: There is a tool available that can help with writing a basic - ``undercloud.conf``: - `Undercloud Configuration Wizard `_ - It takes some basic information about the intended overcloud - environment and generates sane values for a number of the important - options. - -#. (OPTIONAL) Generate configuration for preparing container images - - As part of the undercloud install, an image registry is configured on port - `8787`. This is used to increase reliability of overcloud image pulls, and - minimise overall network transfers. The undercloud registry will be - populated with images required by the undercloud by generating the following - `containers-prepare-parameter.yaml` file and including it in - ``undercloud.conf: - container_images_file=$HOME/containers-prepare-parameter.yaml``:: - - openstack tripleo container image prepare default \ - --local-push-destination \ - --output-env-file ~/containers-prepare-parameter.yaml - - .. note:: - This command is available since Rocky. - - See :ref:`prepare-environment-containers` for details on using - `containers-prepare-parameter.yaml` to control what can be done - during the container images prepare phase of an undercloud install. - - Additionally, ``docker_insecure_registries`` and ``docker_registry_mirror`` - parameters allow to customize container registries via the - ``undercloud.conf`` file. - -#. (OPTIONAL) Override heat parameters and environment files used for undercloud - deployment. - - Similarly to overcloud deployments, see :ref:`override-heat-templates` and - :ref:`custom-template-location`, the ``undercloud.conf: custom_env_files`` - and ``undercloud.conf: templates`` configuration parameters allow to - use a custom heat templates location and override or specify additional - information for Heat resources used for undercloud deployment. - - Additionally, the ``undercloud.conf: roles_file`` parameter brings in the - ultimate flexibility of :ref:`custom_roles` and :ref:`composable_services`. - This allows you to deploy an undercloud composed of highly customized - containerized services, with the same workflow that TripleO uses for - overcloud deployments. - - .. note:: The CLI and configuration interface used to deploy a containerized - undercloud is the same as that used by 'legacy' non-containerized - underclouds. As noted above however mechanism by which the undercloud is - actually deployed is completely changed and what is more, for the first - time aligns with the overcloud deployment. See the command - ``openstack tripleo deploy --standalone`` help for details. - That interface extension for standalone clouds is experimental for Rocky. - It is normally should not be used directly for undercloud installations. - -#. Run the command to install the undercloud: - - .. admonition:: SSL - :class: optional - - To deploy an undercloud with SSL, see :doc:`../features/ssl`. - - .. admonition:: Validations - :class: validations - - :doc:`../post_deployment/validations/index` will be installed and - configured during undercloud installation. You can set - ``enable_validations = false`` in ``undercloud.conf`` to prevent - that. - - To deploy an undercloud:: - - openstack undercloud install - -.. note:: - The undercloud is containerized by default as of Rocky. - -.. note:: - It's possible to enable verbose logging with ``--verbose`` option. - -Since Rocky, we run all the OpenStack services in a moby container runtime -unless the default settings are overwritten. -This command requires 2 services to be running at all times. The first one is a -basic keystone service, which is currently executed by `tripleoclient` itself, the -second one is `heat-all` which executes the templates and installs the services. -The latter can be run on baremetal or in a container (tripleoclient will run it -in a container by default). - -Once the install has completed, you should take note of the files ``stackrc`` and -``undercloud-passwords.conf``. You can source ``stackrc`` to interact with the -undercloud via the OpenStack command-line client. The ``undercloud-passwords.conf`` -file contains the passwords used for each service in the undercloud. These passwords -will be automatically reused if the undercloud is reinstalled on the same system, -so it is not necessary to copy them to ``undercloud.conf``. - -.. note:: Heat installer configuration, logs and state is ephemeral for - undercloud deployments. Generated artifacts for consequent deployments get - overwritten or removed (when ``undercloud.conf: cleanup = true``). - Although, you can still find them stored in compressed files. - -Miscellaneous undercloud deployment artifacts, like processed heat templates and -compressed files, can be found in ``undercloud.conf: output_dir`` locations -like ``~/tripleo-heat-installer-templates``. - -There is also a compressed file created and placed into the output dir, named as -``undercloud-install-.tar.bzip2``, where TS represents a timestamp. - -Downloaded ansible playbooks and inventory files (see :ref:`config_download`) -used for undercloud deployment are stored in the tempdir -``~/undercloud-ansible-`` by default. - -.. note:: - Any passwords set in ``undercloud.conf`` will take precedence over the ones in - ``undercloud-passwords.conf``. - -.. note:: - The used undercloud installation command can be rerun to reapply changes from - ``undercloud.conf`` to the undercloud. Note that this should **not** be done - if an overcloud has already been deployed or is in progress. - -.. note:: - If running ``docker`` commands as a stack user after an undercloud install fail - with a permission error, log out and log in again. The stack user does get added - to the docker group during install, but that change gets reflected only after a - new login. diff --git a/deploy-guide/source/deployment/install_overcloud.rst b/deploy-guide/source/deployment/install_overcloud.rst deleted file mode 100644 index d3a805ee..00000000 --- a/deploy-guide/source/deployment/install_overcloud.rst +++ /dev/null @@ -1,712 +0,0 @@ -.. _basic-deployment-cli: - -Basic Deployment (CLI) -====================== - -These steps document a basic deployment with |project| in an environment using -the project defaults. - -.. note:: - - Since Rocky, Ansible is used to deploy the software configuration of - the overcloud nodes using a feature called **config-download**. While - there are no necessary changes to the default deployment commands, - there are several differences to the deployer experience. - - It's recommended to review these differences as documented at - :doc:`ansible_config_download_differences` - - **config-download** is fully documented at - :doc:`ansible_config_download` - - -Prepare Your Environment ------------------------- - -#. Make sure you have your environment ready and undercloud running: - - * :doc:`../environments/index` - * :doc:`undercloud` - -#. Log into your undercloud virtual machine and become the non-root user (stack - by default):: - - ssh root@ - - su - stack - -#. In order to use CLI commands easily you need to source needed environment - variables:: - - source stackrc - -.. _basic-deployment-cli-get-images: - -Get Images ----------- - -.. note:: - - If you already have images built, perhaps from a previous installation of - |project|, you can simply copy those image files into your non-root user's - home directory and skip this section. - - If you do this, be aware that sometimes newer versions of |project| do not - work with older images, so if the deployment fails it may be necessary to - delete the older images and restart the process from this step. - - Alternatively, images are available via RDO at - https://images.rdoproject.org/centos9/master/rdo_trunk/ which offers images from both the - CentOS Build System (cbs) and RDO Trunk (called rdo_trunk or delorean). - However this mirror is slow so if you experience slow download speeds - you should skip to building the images instead. - - The image files required are:: - - ironic-python-agent.initramfs - ironic-python-agent.kernel - overcloud-full.initrd - overcloud-full.qcow2 - overcloud-full.vmlinuz - -Images must be built prior to doing a deployment. An IPA ramdisk and -openstack-full image can all be built using tripleo-common. - -It's recommended to build images on the installed undercloud directly since all -the dependencies are already present, but this is not a requirement. - -The following steps can be used to build images. They should be run as the same -non-root user that was used to install the undercloud. If the images are not -created on the undercloud, one should use a non-root user. - - -#. Choose image operating system: - - .. admonition:: CentOS - :class: centos - - The image build with no arguments will build CentOS 8. It will include the - common YAML of - ``/usr/share/openstack-tripleo-common/image-yaml/overcloud-images-python3.yaml`` - and the CentOS YAML at - ``/usr/share/openstack-tripleo-common/image-yaml/overcloud-images-centos8.yaml``. - - .. admonition:: CentOS 9 - :class: centos9 - - The default YAML for Centos 9 is - ``/usr/share/openstack-tripleo-common/image-yaml/overcloud-images-centos9.yaml`` - - :: - - export OS_YAML="/usr/share/openstack-tripleo-common/image-yaml/overcloud-images-centos9.yaml" - - .. admonition:: RHEL - :class: rhel - - The common YAML is - ``/usr/share/openstack-tripleo-common/image-yaml/overcloud-images-python3.yaml``. - It must be specified along with the following. - - The default YAML for RHEL is - ``/usr/share/openstack-tripleo-common/image-yaml/overcloud-images-rhel8.yaml`` - - :: - - export OS_YAML="/usr/share/openstack-tripleo-common/image-yaml/overcloud-images-rhel8.yaml" - - -#. Install the ``current-tripleo`` delorean repository and deps repository: - - .. include:: ../repositories.rst - - -3. Export environment variables - - :: - - export DIB_YUM_REPO_CONF="/etc/yum.repos.d/delorean*" - - .. admonition:: Ceph - :class: ceph - - :: - - export DIB_YUM_REPO_CONF="$DIB_YUM_REPO_CONF /etc/yum.repos.d/tripleo-centos-ceph*.repo" - - .. admonition:: CentOS 9 - :class: centos9 - - :: - - export DIB_YUM_REPO_CONF="/etc/yum.repos.d/delorean* /etc/yum.repos.d/tripleo-centos-*" - - .. admonition:: Stable Branch - :class: stable - - .. admonition:: Victoria - :class: victoria - - :: - - export STABLE_RELEASE="victoria" - - .. admonition:: Ussuri - :class: ussuri - - :: - - export STABLE_RELEASE="ussuri" - - .. admonition:: Train - :class: train - - :: - - export STABLE_RELEASE="train" - -#. Build the required images: - - - .. admonition:: RHEL - :class: rhel - - Download the RHEL 7.4 cloud image or copy it over from a different location, - for example: - ``https://access.redhat.com/downloads/content/69/ver=/rhel---7/7.4/x86_64/product-software``, - and define the needed environment variables for RHEL 7.4 prior to running - ``tripleo-build-images``:: - - export DIB_LOCAL_IMAGE=rhel-server-7.4-x86_64-kvm.qcow2 - - .. admonition:: RHEL Portal Registration - :class: portal - - To register the image builds to the Red Hat Portal define the following variables:: - - export REG_METHOD=portal - export REG_USER="[your username]" - export REG_PASSWORD="[your password]" - # Find this with `sudo subscription-manager list --available` - export REG_POOL_ID="[pool id]" - export REG_REPOS="rhel-7-server-rpms rhel-7-server-extras-rpms rhel-ha-for-rhel-7-server-rpms \ - rhel-7-server-optional-rpms rhel-7-server-openstack-6.0-rpms" - - .. admonition:: Ceph - :class: ceph - - If using Ceph, additional channels need to be added to `REG_REPOS`. - Enable the appropriate channels for the desired release, as indicated below. - Do not enable any other channels not explicitly marked for that release. - - :: - - rhel-7-server-rhceph-2-mon-rpms - rhel-7-server-rhceph-2-osd-rpms - rhel-7-server-rhceph-2-tools-rpms - - - .. admonition:: RHEL Satellite Registration - :class: satellite - - To register the image builds to a Satellite define the following - variables. Only using an activation key is supported when registering to - Satellite, username/password is not supported for security reasons. The - activation key must enable the repos shown:: - - export REG_METHOD=satellite - # REG_SAT_URL should be in the format of: - # http:// - export REG_SAT_URL="[satellite url]" - export REG_ORG="[satellite org]" - # Activation key must enable these repos: - # rhel-7-server-rpms - # rhel-7-server-optional-rpms - # rhel-7-server-extras-rpms - # rhel-7-server-openstack-6.0-rpms - # rhel-7-server-rhceph-{2,1.3}-mon-rpms - # rhel-7-server-rhceph-{2,1.3}-osd-rpms - # rhel-7-server-rhceph-{2,1.3}-tools-rpms - export REG_ACTIVATION_KEY="[activation key]" - - :: - - openstack overcloud image build - - .. - - .. admonition:: RHEL 9 - :class: rhel9 - - :: - - openstack overcloud image build \ - --config-file /usr/share/openstack-tripleo-common/image-yaml/overcloud-images-python3.yaml \ - --config-file /usr/share/openstack-tripleo-common/image-yaml/overcloud-images-rhel9.yaml \ - --config-file $OS_YAML - - .. admonition:: CentOS 9 - :class: centos9 - - :: - - openstack overcloud image build \ - --config-file /usr/share/openstack-tripleo-common/image-yaml/overcloud-images-python3.yaml \ - --config-file /usr/share/openstack-tripleo-common/image-yaml/overcloud-images-centos9.yaml \ - --config-file $OS_YAML - - See the help for ``openstack overcloud image build`` for further options. - - The YAML files are cumulative. Order on the command line is important. The - packages, elements, and options sections will append. All others will overwrite - previously read values. - - .. note:: - This command will build **overcloud-full** images (\*.qcow2, \*.initrd, - \*.vmlinuz) and **ironic-python-agent** images (\*.initramfs, \*.kernel) - - In order to build specific images, one can use the ``--image-name`` flag - to ``openstack overcloud image build``. It can be specified multiple times. - -.. note:: - - If you want to use whole disk images with TripleO, please see :doc:`../provisioning/whole_disk_images`. - -.. _basic-deployment-cli-upload-images: - -Upload Images -------------- - -Load the images into the containerized undercloud Glance:: - - openstack overcloud image upload - - -To upload a single image, see :doc:`upload_single_image`. - -If working with multiple architectures and/or platforms with an architecture these -attributes can be specified at upload time as in:: - - openstack overcloud image upload - openstack overcloud image upload --arch x86_64 \ - --httpboot /var/lib/ironic/httpboot/x86_64 - openstack overcloud image upload --arch x86_64 --platform SNB \ - --httpboot /var/lib/ironic/httpboot/x86_64-SNB - -.. note:: - - Adding ``--httpboot`` is optional but suggested if you need to ensure that - the ``agent`` images are unique within your environment. - -.. admonition:: Prior to Rocky release - :class: stable - - Before Rocky, the undercloud isn't containerized by default. Hence - you should use the ``/httpboot/*`` paths instead. - -This will create 3 sets of images with in the undercloud image service for later -use in deployment, see :doc:`../environments/baremetal` - -.. _node-registration: - -Register Nodes --------------- - -Register and configure nodes for your deployment with Ironic:: - - openstack overcloud node import instackenv.json - -The file to be imported may be either JSON, YAML or CSV format, and -the type is detected via the file extension (json, yaml, csv). -The file format is documented in :ref:`instackenv`. - -The nodes status will be set to ``manageable`` by default, so that -introspection may later be run. To also run introspection and make the -nodes available for deployment in one step, the following flags can be -used:: - - openstack overcloud node import --introspect --provide instackenv.json - -Starting with the Newton release you can take advantage of the ``enroll`` -provisioning state - see :doc:`../provisioning/node_states` for details. - -If your hardware has several hard drives, it's highly recommended that you -specify the exact device to be used during introspection and deployment -as a root device. Please see :ref:`root_device` for details. - -.. warning:: - If you don't specify the root device explicitly, any device may be picked. - Also the device chosen automatically is **NOT** guaranteed to be the same - across rebuilds. Make sure to wipe the previous installation before - rebuilding in this case. - -If there is information from previous deployments on the nodes' disks, it is -recommended to at least remove the partitions and partition table(s). See -:doc:`../provisioning/cleaning` for information on how to do it. - -Finally, if you want your nodes to boot in the UEFI mode, additional steps may -have to be taken - see :doc:`../provisioning/uefi_boot` for details. - -.. warning:: - It's not recommended to delete nodes and/or rerun this command after - you have proceeded to the next steps. Particularly, if you start introspection - and then re-register nodes, you won't be able to retry introspection until - the previous one times out (1 hour by default). If you are having issues - with nodes after registration, please follow - :ref:`node_registration_problems`. - -Another approach to enrolling node is -:doc:`../provisioning/node_discovery`. - -.. _introspection: - -Introspect Nodes ----------------- - - -.. admonition:: Validations - :class: validations - - Once the undercloud is installed, you can run the - ``pre-introspection`` validations:: - - openstack tripleo validator run --group pre-introspection - - Then verify the results as described in :ref:`running_validation_group`. - -Nodes must be in the ``manageable`` provisioning state in order to run -introspection. Introspect hardware attributes of nodes with:: - - openstack overcloud node introspect --all-manageable - -Nodes can also be specified individually by UUID. The ``--provide`` -flag can be used in order to move the nodes automatically to the -``available`` provisioning state once the introspection is finished, -making the nodes available for deployment. -:: - - openstack overcloud node introspect --all-manageable --provide - -.. note:: **Introspection has to finish without errors.** - The process can take up to 5 minutes for VM / 15 minutes for baremetal. If - the process takes longer, see :ref:`introspection_problems`. - -.. note:: If you need to introspect just a single node, see - :doc:`../provisioning/introspect_single_node` - -Provide Nodes -------------- - -Only nodes in the ``available`` provisioning state can be deployed to -(see :doc:`../provisioning/node_states` for details). To move -nodes from ``manageable`` to ``available`` the following command can be -used:: - - openstack overcloud node provide --all-manageable - -Flavor Details --------------- - -The undercloud will have a number of default flavors created at install time. -In most cases these flavors do not need to be modified, but they can be if -desired. By default, all overcloud instances will be booted with the -``baremetal`` flavor, so all baremetal nodes must have at least as much -memory, disk, and cpu as that flavor. - -In addition, there are profile-specific flavors created which can be used with -the profile-matching feature. For more details on deploying with profiles, -see :doc:`../provisioning/profile_matching`. - -.. _basic-deployment-cli-configure-namserver: - -Configure a nameserver for the Overcloud ----------------------------------------- - -Overcloud nodes can have a nameserver configured in order to resolve -hostnames via DNS. The nameserver is defined in the undercloud's neutron -subnet. If needed, define the nameserver to be used for the environment:: - - # List the available subnets - openstack subnet list - openstack subnet set --dns-nameserver - -.. admonition:: Stable Branch - :class: stable - - For Mitaka release and older, the subnet commands are executed within the - `neutron` command:: - - neutron subnet-list - neutron subnet-update --dns-nameserver - -.. note:: - A public DNS server, such as 8.8.8.8 or the undercloud DNS name server - can be used if there is no internal DNS server. - -.. admonition:: Virtual - :class: virtual - - In virtual environments, the libvirt default network DHCP server address, - typically 192.168.122.1, can be used as the overcloud nameserver. - -.. _deploy-the-overcloud: - -Deploy the Overcloud --------------------- - -.. admonition:: Validations - :class: validations - - Before you start the deployment, you may want to run the - ``pre-deployment`` validations:: - - openstack tripleo validator run --group pre-deployment - - Then verify the results as described in :ref:`running_validation_group`. - - -By default 1 compute and 1 control node will be deployed, with networking -configured for the virtual environment. To customize this, see the output of:: - - openstack help overcloud deploy - -.. admonition:: Swap - :class: optional - - Swap files or partitions can be installed as part of an Overcloud deployment. - For adding swap files there is no restriction besides having - 4GB available on / (by default). When using a swap partition, - the partition must exist and be tagged as `swap1` (by default). - To deploy a swap file or partition in each Overcloud node use one - of the following arguments when deploying:: - - -e /usr/share/openstack-tripleo-heat-templates/environments/enable-swap-partition.yaml - -e /usr/share/openstack-tripleo-heat-templates/environments/enable-swap.yaml - -.. admonition:: Ceph - :class: ceph - - When deploying Ceph with dedicated CephStorage nodes to host the CephOSD - service it is necessary to specify the number of CephStorage nodes - to be deployed and to provide some additional parameters to enable usage - of Ceph for Glance, Cinder, Nova or all of them. To do so, use the - following arguments when deploying:: - - --ceph-storage-scale -e /usr/share/openstack-tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml - - When deploying Ceph without dedicated CephStorage nodes, opting for an HCI - architecture instead, where the CephOSD service is colocated with the - NovaCompute service on the Compute nodes, use the following arguments:: - - -e /usr/share/openstack-tripleo-heat-templates/environments/hyperconverged-ceph.yaml -e /usr/share/openstack-tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml - - The `hyperconverged-ceph.yaml` environment file will also enable a port on the - `StorageMgmt` network for the Compute nodes. This will be the Ceph private - network and the Compute NIC templates have to be configured to use that, see - :doc:`../features/network_isolation` for more details on how to do - it. - -.. admonition:: RHEL Satellite Registration - :class: satellite - - To register the Overcloud nodes to a Satellite add the following flags - to the deploy command:: - - --rhel-reg --reg-method satellite --reg-org --reg-sat-url --reg-activation-key - - .. note:: - - Only using an activation key is supported when registering to - Satellite, username/password is not supported for security reasons. - The activation key must enable the following repos: - - rhel-7-server-rpms - - rhel-7-server-optional-rpms - - rhel-7-server-extras-rpms - - rhel-7-server-openstack-6.0-rpms - -.. admonition:: SSL - :class: optional - - To deploy an overcloud with SSL, see :doc:`../features/ssl`. - -Run the deploy command, including any additional parameters as necessary:: - - openstack overcloud deploy --templates [additional parameters] - -.. note:: - - When deploying a new stack or updating a preexisting deployment, it is - important to avoid using component cli along side the unified cli. This - will lead to unexpected results. - - Example: - - The following will present a behavior where the my_roles_data will persist, - due to the location of the custom roles data, which is stored in swift:: - - openstack overcloud deploy --templates -r my_roles_data.yaml - heat stack-delete overcloud - - Allow the stack to be deleted then continue:: - - openstack overcloud deploy --templates - - The execution of the above will still reference my_roles_data as the - unified command line client will perform a look up against the swift - storage. The reason for the unexpected behavior is due to the heatclient - lack of awareness of the swift storage. - - The correct course of action should be as followed:: - - openstack overcloud deploy --templates -r my_roles_data.yaml - openstack overcloud delete - - Allow the stack to be deleted then continue:: - - openstack overcloud deploy --templates - -To deploy an overcloud with multiple controllers and achieve HA, -follow :doc:`../features/high_availability`. - -.. admonition:: Virtual - :class: virtual - - When deploying the Compute node in a virtual machine - without nested guest support, add ``--libvirt-type qemu`` - or launching instances on the deployed overcloud will fail. - -.. note:: - - To deploy the overcloud with network isolation, bonds, and/or custom - network interface configurations, instead follow the workflow here to - deploy: :doc:`../features/network_isolation` - -.. note:: - - Previous versions of the client had many parameters defaulted. Some of these - parameters are now pulling defaults directly from the Heat templates. In - order to override these parameters, one should use an environment file to - specify these overrides, via 'parameter_defaults'. - - The parameters that controlled these parameters will be deprecated in the - client, and eventually removed in favor of using environment files. - - -Post-Deployment ---------------- - -.. admonition:: Validations - :class: validations - - After the deployment finishes, you can run the ``post-deployment`` - validations:: - - openstack tripleo validator run --group post-deployment - - Then verify the results as described in :ref:`running_validation_group`. - -Deployment artifacts -^^^^^^^^^^^^^^^^^^^^ - -Artifacts from the deployment, including log files, rendered -templates, and generated environment files are saved under the working -directory which can be specified with the ``--work-dir`` argument to -``openstack overcloud deploy``. By default, the location is -``~/overcloud-deploy/``. - -Access the Overcloud -^^^^^^^^^^^^^^^^^^^^ - -``openstack overcloud deploy`` generates an overcloudrc file appropriate for -interacting with the deployed overcloud in the current user's home directory. -To use it, simply source the file:: - - source ~/overcloudrc - -To return to working with the undercloud, source the ``stackrc`` file again:: - - source ~/stackrc - - -Add entries to /etc/hosts -^^^^^^^^^^^^^^^^^^^^^^^^^ - -In cases where the overcloud hostnames are not already resolvable with DNS, -entries can be added to /etc/hosts to make them resolvable. This is -particularly convenient on the undercloud. The Heat stack provides an output -value that can be appended to /etc/hosts easily. Run the following command to -get the output value and add it to /etc/hosts wherever the hostnames should -be resolvable:: - - openstack stack output show overcloud HostsEntry -f value -c output_value - - -Setup the Overcloud network -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Initial networks in Neutron in the overcloud need to be created for tenant -instances. The following are example commands to create the initial networks. -Edit the address ranges, or use the necessary ``neutron`` commands to match the -environment appropriately. This assumes a dedicated interface or native VLAN:: - - openstack network create public --external --provider-network-type flat \ - --provider-physical-network datacentre - openstack subnet create --allocation-pool start=172.16.23.140,end=172.16.23.240 \ - --network public --gateway 172.16.23.251 --no-dhcp --subnet-range \ - 172.16.23.128/25 public - -The example shows naming the network "public" because that will allow tempest -tests to pass, based on the default floating pool name set in ``nova.conf``. -You can confirm that the network was created with:: - - openstack network list - -Sample output of the command:: - - +--------------------------------------+----------+--------------------------------------+ - | ID | Name | Subnets | - +--------------------------------------+----------+--------------------------------------+ - | 4db8dd5d-fab5-4ea9-83e5-bdedbf3e9ee6 | public | 7a315c5e-f8e2-495b-95e2-48af9442af01 | - +--------------------------------------+----------+--------------------------------------+ - -To use a VLAN, the following example should work. Customize the address ranges -and VLAN id based on the environment:: - - openstack network create public --external --provider-network-type vlan \ - --provider-physical-network datacentre --provider-segment 195 - openstack subnet create --allocation-pool start=172.16.23.140,end=172.16.23.240 \ - --network public --no-dhcp --gateway 172.16.23.251 \ - --subnet-range 172.16.23.128/25 public - - -Validate the Overcloud -^^^^^^^^^^^^^^^^^^^^^^ - -Check the `Tempest`_ documentation on how to run tempest. - -.. _tempest: ../post_deployment/tempest/tempest.html - -Redeploy the Overcloud -^^^^^^^^^^^^^^^^^^^^^^ - -The overcloud can be redeployed when desired. - -#. First, delete any existing Overcloud:: - - openstack overcloud delete overcloud - -#. Confirm the Overcloud has deleted. It may take a few minutes to delete:: - - # This command should show no stack once the Delete has completed - openstack stack list - -#. It is recommended that you delete existing partitions from all nodes before - redeploying, see :doc:`../provisioning/cleaning` for details. - -#. Deploy the Overcloud again:: - - openstack overcloud deploy --templates diff --git a/deploy-guide/source/deployment/install_undercloud.rst b/deploy-guide/source/deployment/install_undercloud.rst deleted file mode 100644 index 1f0bf687..00000000 --- a/deploy-guide/source/deployment/install_undercloud.rst +++ /dev/null @@ -1,325 +0,0 @@ -Undercloud Installation -======================= - -This section contains instructions on how to install the undercloud. For update -or upgrade to a deployed undercloud see undercloud_upgrade_. - -.. _undercloud_upgrade: ../post_deployment/upgrade/undercloud.html - - -.. _install_undercloud: - -Installing the Undercloud --------------------------- - -.. note:: - Instack-undercloud was deprecated in Rocky cycle. Containerized undercloud - should be installed instead. See :doc:`undercloud` - for backward compatibility related information. - -.. note:: - Please ensure all your nodes (undercloud, compute, controllers, etc) have - their internal clock set to UTC in order to prevent any issue with possible - file future-dated timestamp if hwclock is synced before any timezone offset - is applied. - - -#. Log in to your machine (baremetal or VM) where you want to install the - undercloud as a non-root user (such as the stack user):: - - ssh @ - - .. note:: - If you don't have a non-root user created yet, log in as root and create - one with following commands:: - - sudo useradd stack - sudo passwd stack # specify a password - - echo "stack ALL=(root) NOPASSWD:ALL" | sudo tee -a /etc/sudoers.d/stack - sudo chmod 0440 /etc/sudoers.d/stack - - su - stack - - .. note:: - The undercloud is intended to work correctly with SELinux enforcing. - Installations with the permissive/disabled SELinux are not recommended. - The ``undercloud_enable_selinux`` config option controls that setting. - - .. note:: - vlan tagged interfaces must follow the if_name.vlan_id convention, like for - example: eth0.vlan100 or bond0.vlan120. - - .. admonition:: Baremetal - :class: baremetal - - Ensure that there is a FQDN hostname set and that the $HOSTNAME environment - variable matches that value. The easiest way to do this is to set the - ``undercloud_hostname`` option in undercloud.conf before running the - install. This will allow the installer to configure all of the hostname- - related settings appropriately. - - Alternatively the hostname settings can be configured manually, but - this is strongly discouraged. The manual steps are as follows:: - - sudo hostnamectl set-hostname myhost.mydomain - sudo hostnamectl set-hostname --transient myhost.mydomain - - An entry for the system's FQDN hostname is also needed in /etc/hosts. For - example, if the system is named *myhost.mydomain*, /etc/hosts should have - an entry like:: - - 127.0.0.1 myhost.mydomain myhost - - -#. Enable needed repositories: - - .. admonition:: RHEL - :class: rhel - - Enable optional repo for RHEL7:: - - sudo yum install -y yum-utils - sudo yum-config-manager --enable rhelosp-rhel-7-server-opt - - .. include:: ../repositories.rst - - -#. Install the TripleO CLI, which will pull in all other necessary packages as dependencies:: - - sudo dnf install -y python*-tripleoclient - - .. admonition:: RHEL7 / CentOS - - For RHEL or CentOS 7 the command would be:: - - sudo yum install -y python-tripleoclient - - - .. admonition:: Ceph - :class: ceph - - If you intend to deploy Ceph in the overcloud, or configure the overcloud to use an external Ceph cluster, and are running Pike or newer, then install ceph-ansible on the undercloud:: - - sudo dnf install -y ceph-ansible - - .. admonition:: TLS - :class: tls - - If you intend to deploy *TLS-everywhere* in the overcloud and are - deploying Train with python3 or Ussuri+, install the following packages:: - - sudo yum install -y python3-ipalib python3-ipaclient krb5-devel - - If you're deploying Train with python2, install the corresponding python2 - version of the above packages:: - - sudo yum install -y python-ipalib python-ipaclient krb5-devel - - if you intend to use Novajoin to implement *TLS-everywhere* install the - following package:: - - sudo yum install -y python-novajoin - - You can find more information about deploying with TLS in the - :doc:`../features/tls-introduction` documentation. - - -#. Prepare the configuration file:: - - cp /usr/share/python-tripleoclient/undercloud.conf.sample ~/undercloud.conf - - It is backwards compatible with non-containerized instack underclouds. - - .. admonition:: Stable Branch - :class: stable - - For a non-containerized undercloud, copy in the sample configuration - file and edit it to reflect your environment:: - - cp /usr/share/instack-undercloud/undercloud.conf.sample ~/undercloud.conf - - .. note:: There is a tool available that can help with writing a basic - ``undercloud.conf``: - `Undercloud Configuration Wizard `_ - It takes some basic information about the intended overcloud - environment and generates sane values for a number of the important - options. - -#. (OPTIONAL) Generate configuration for preparing container images - - As part of the undercloud install, an image registry is configured on port - `8787`. This is used to increase reliability of overcloud image pulls, and - minimise overall network transfers. The undercloud registry will be - populated with images required by the undercloud by generating the following - `containers-prepare-parameter.yaml` file and including it in - ``undercloud.conf: - container_images_file=$HOME/containers-prepare-parameter.yaml``:: - - openstack tripleo container image prepare default \ - --local-push-destination \ - --output-env-file ~/containers-prepare-parameter.yaml - - .. note:: - This command is available since Rocky. - - See :ref:`prepare-environment-containers` for details on using - `containers-prepare-parameter.yaml` to control what can be done - during the container images prepare phase of an undercloud install. - - Additionally, ``docker_insecure_registries`` and ``docker_registry_mirror`` - parameters allow to customize container registries via the - ``undercloud.conf`` file. - -#. (OPTIONAL) Override heat parameters and environment files used for undercloud - deployment. - - Similarly to overcloud deployments, see :ref:`override-heat-templates` and - :ref:`custom-template-location`, the ``undercloud.conf: custom_env_files`` - and ``undercloud.conf: templates`` configuration parameters allow to - use a custom heat templates location and override or specify additional - information for Heat resources used for undercloud deployment. - - Additionally, the ``undercloud.conf: roles_file`` parameter brings in the - ultimate flexibility of :ref:`custom_roles` and :ref:`composable_services`. - This allows you to deploy an undercloud composed of highly customized - containerized services, with the same workflow that TripleO uses for - overcloud deployments. - - .. note:: The CLI and configuration interface used to deploy a containerized - undercloud is the same as that used by 'legacy' non-containerized - underclouds. As noted above however mechanism by which the undercloud is - actually deployed is completely changed and what is more, for the first - time aligns with the overcloud deployment. See the command - ``openstack tripleo deploy --standalone`` help for details. - It normally should not be used directly for undercloud installations. - -#. Run the command to install the undercloud: - - .. admonition:: SSL - :class: optional - - To deploy an undercloud with SSL, see :doc:`../features/ssl`. - - .. admonition:: Validations - :class: validations - - :doc:`../post_deployment/validations/index` will be installed and - configured during undercloud installation. You can set - ``enable_validations = false`` in ``undercloud.conf`` to prevent - that. - - To deploy an undercloud:: - - openstack undercloud install - -.. note:: - The undercloud is containerized by default as of Rocky. - -.. note:: - It's possible to enable verbose logging with ``--verbose`` option. - -.. note:: - To install a deprecated instack undercloud, you'll need to deploy - with ``--use-heat=False`` option. - -Since Rocky, we will run all the OpenStack services in a moby container runtime -unless the default settings are overwritten. -This command requires 2 services to be running at all times. The first one is a -basic keystone service, which is currently executed by `tripleoclient` itself, the -second one is `heat-all` which executes the templates and installs the services. -The latter can be run on baremetal or in a container (tripleoclient will run it -in a container by default). - -Once the install has completed, you should take note of the files ``stackrc`` and -``undercloud-passwords.conf``. You can source ``stackrc`` to interact with the -undercloud via the OpenStack command-line client. The ``undercloud-passwords.conf`` -file contains the passwords used for each service in the undercloud. These passwords -will be automatically reused if the undercloud is reinstalled on the same system, -so it is not necessary to copy them to ``undercloud.conf``. - -.. note:: Heat installer configuration, logs and state is ephemeral for - undercloud deployments. Generated artifacts for consequent deployments get - overwritten or removed (when ``undercloud.conf: cleanup = true``). - Although, you can still find them stored in compressed files. - -Miscellaneous undercloud deployment artifacts, like processed heat templates and -compressed files, can be found in ``undercloud.conf: output_dir`` locations -like ``~/tripleo-heat-installer-templates``. - -There is also a compressed file created and placed into the output dir, named as -``undercloud-install-.tar.bzip2``, where TS represents a timestamp. - -Downloaded ansible playbooks and inventory files (see :ref:`config_download`) -used for undercloud deployment are stored in the tempdir -``~/undercloud-ansible-`` by default. - -.. note:: - In order to obtain the ansible command used for the installation of the - Undercloud in the artifacts directory, it is necessary to pass the option - ``--reproduce-command`` in the Undercloud deployment command. - -.. note:: - Any passwords set in ``undercloud.conf`` will take precedence over the ones in - ``undercloud-passwords.conf``. - -.. note:: - The undercloud installation command can be rerun to reapply changes from - ``undercloud.conf`` to the undercloud. Note that this should be done with - caution if an overcloud has already been deployed or is in progress as some - configuration changes could affect the overcloud. These changes include but - are not limited to: - - #. Package repository changes on the undercloud, followed by running the - installation command could update the undercloud such that further - management operations are not possible on the overcloud until the - overcloud update or upgrade procedure is followed. - #. Reconfiguration of the undercloud container registry if the - overcloud is using the undercloud as the source for container images. - #. Networking configuration changes on the undercloud which may affect - the overcloud's ability to connect to the undercloud for - instance metadata services. - - -.. note:: - If running ``docker`` commands as a stack user after an undercloud install fail - with a permission error, log out and log in again. The stack user does get added - to the docker group during install, but that change gets reflected only after a - new login. - -Cleaning the Undercloud ------------------------ - -This procedure isn't cleaning everything that TripleO generates, but enough -so an Undercloud could be re-deployed. - -.. note:: - This procedure has been tested on Train and onward. There is no guarantee - that it works before this version, due to container commands and - new directories. - -#. Log in to your machine (baremetal or VM) where you want to cleanup the - undercloud as a non-root user (such as the stack user):: - - ssh @ - -#. Cleanup the containers and their images:: - - sudo podman rm -af - sudo podman rmi -af - -#. Remove directories generated by TripleO:: - - sudo rm -rf \ - /var/lib/tripleo-config \ - /var/lib/config-data \ - /var/lib/container-config-scripts \ - /var/lib/container-puppet \ - /var/lib/heat-config \ - /var/lib/image-service \ - /var/lib/mysql - -#. Cleanup systemd:: - - sudo rm -rf /etc/systemd/system/tripleo* - sudo systemctl daemon-reload diff --git a/deploy-guide/source/deployment/network_v2.rst b/deploy-guide/source/deployment/network_v2.rst deleted file mode 100644 index ac03387b..00000000 --- a/deploy-guide/source/deployment/network_v2.rst +++ /dev/null @@ -1,485 +0,0 @@ -.. _network_v2: - -Networking Version 2 (Two) -========================== - -Introduction ------------- - -In the Wallaby cycle TripleO Networking has been refactored so that no -OS::Neutron heat resources are used. This was a pre-requisite for -:doc:`./ephemeral_heat`. Managing non-ephemeral neutron resources with an -ephemeral heat stack is not feasible, so the management of neutron resources -has been externalized from the overcloud heat stack. - -High level overview of the changes -.................................. - -* NIC config templates was migrated to ansible j2 templates during the - Victoria release. Replacing the heat templates previously used for NIC - configuration. Sample ansible j2 templates are available in the - `tripleo-ansible `_ - git repository as well as in - ``/usr/share/ansible/roles/tripleo_network_config/templates/`` on a deployed - undercloud. - - Please refer to :ref:`creating_custom_interface_templates` on the - :ref:`network_isolation` documentation page for further details on writing - custom Ansible j2 NIC config templates. - -* A new schema for the network definitions used for Jinja2 rendering of the - ``tripleo-heat-templates`` was introduced, in addition to tripleoclient - commands to provision networks using the new network definitions schema. - -* A new schema for network Virtual IPs was introduced in conjunction with - tripleoclient commands to provision the Virtual IPs. - -* Service Virtual IPs (redis and ovsdb) was refactored so that the neutron - resources are created by the deploy-steps playbook post-stack create/update. - -* The baremetal provisioning schema was extended to include advanced network - layouts. The ``overcloud node provision`` command was extended so that it - also provision neutron port resources for all networks defined for instances/ - roles in the baremetal provisioning definition. - -* The tool (``tripleo-ansible-inventory``) used to generate the ansible - inventory was extended to use neutron as a source for the inventory in - addition to the overcloud heat stack outputs. - -* With the TripleO ansible inventory's support to use neutron resources as a - data source, the baremetal provisioning schema and ``overcloud node - provision`` command was extended to allow arbitrary playbook - execute against the provisioned nodes, as well as applying node network - configuration utilizing the ``tripleo_network_config`` ansible role and the - ansible j2 NIC config templates. - -With all of the above in place the ``overcloud deploy`` command was extended so -that it can run all the steps: - -#. Create Networks - - Run the ``cli-overcloud-network-provision.yaml`` ansible playbook using the - network definitions provided via the ``--network-file`` argument. This - playbook creates/updates the neutron networks on the undercloud and - generates the ``networks-deployed.yaml`` environment file which is included - as a user-environment when creating the overcloud heat stack. - -#. Create Virtual IPs - - Run the ``cli-overcloud-network-vip-provision.yaml`` ansible playbook using - the Virtual IP definitions provided via the ``--vip-file`` argument. This - playbook creates/updates the Virtual IP port resources in neutron on the - undercloud and generates the ``virtual-ips-deployed.yaml`` environment file - which is included as a user-environment when creating the overcloud heat - stack. - -#. Provision Baremetal Instances - - Run the ``cli-overcloud-node-provision.yaml`` ansible playbook using the - baremetal instance definitions provided via the ``--baremetal-deployment`` - argument in combination with the ``--network-config`` argument so that - baremetal nodes are provisioned and network port resources are created. Also - run any arbitrary Ansible playbooks provided by the user on the provisioned - nodes before finally configured overcloud node networking using the - ``tripleo_network_config`` ansible role. - -#. Create the overcloud Ephemeral Heat stack - - The environment files with the parameters and resource registry overrides - required is automatically included when the ``overcloud deploy`` command is - run with the arguments: ``--vip-file``, ``--baremetal-deployment`` and - ``--network-config``. - -#. Run Config-Download and the deploy-steps playbook - - As an external deploy step the neutron ports for Service Virtual IPs are - created, and the properties of the Virtual IPs are included in hieradata. - - .. admonition:: Ceph - :class: ceph - - Optionally Ceph may be deployed after the baremetal instances - are provisioned but before the ephemeral Heat stack is created - as described in :doc:`../features/deployed_ceph`. - -Using ------ - -Pre-Provision networks -...................... - -The command to pre-provision networks for one or more overcloud stack(s) is -``openstack overcloud network provision``. The command takes a network-v2 -version networks definitions YAML file as input, and writes a heat environment -file to the file specified using the ``--output`` argument. - -Please refer to the :ref:`network_definition_opts` reference section on the -:ref:`custom_networks` document page for a reference on available options in -the network data YAML schema. - -Sample network definition YAML files can be located in the -`tripleo-heat-templates git repository -`_, -or in the ``/usr/share/openstack-tripleo-heat-templates/network-data-samples`` -directory on the undercloud. - - -**Example**: Networks definition YAML file defining the external network. - -.. code-block:: yaml - - - name: External - name_lower: external - vip: true - mtu: 1500 - subnets: - external_subnet: - ip_subnet: 10.0.0.0/24 - allocation_pools: - - start: 10.0.0.4 - end: 10.0.0.250 - gateway_ip: 10.0.0.1 - vlan: 10 - -**Example**: Create or update networks - -.. code-block:: bash - - $ openstack overcloud network provision \ - --output ~/overcloud-networks-deployed.yaml \ - ~/network_data_v2.yaml - -When deploying the overcloud include the environment file generated by the -``overcloud network provision`` command. - -.. code-block:: bash - - $ openstack overcloud deploy --templates \ - -e ~/overcloud-networks-deployed.yaml - -Pre-Provision network Virtual IPs -................................. - -The command to pre-provision Virtual IPs for an overcloud stack is: -``openstack overcloud network vip provision``. The command takes a Virtual IPs -definitions YAML file as input, and writes a heat environment file to the file -specified using the ``--output`` argument. The ``--stack`` argument defines the -name of the overcloud stack for which Virtual IPs will be provisioned. - -Please refer to the :ref:`virtual_ips_definition_opts` reference section on the -:ref:`custom_networks` document page for a reference on available options in -the Virtual IPs YAML schema. - -Sample network definition YAML files can be located in the -`tripleo-heat-templates git repository -`_, -or in the ``/usr/share/openstack-tripleo-heat-templates/network-data-samples`` -directory on the undercloud. - -**Example**: Virtual IPs definition YAML file defining the ctlplane and the -external network Virtual IPs. - -.. code-block:: yaml - - - network: ctlplane - dns_name: overcloud - - network: external - dns_name: overcloud - -**Example**: Create or update Virtual IPs - -.. code-block:: bash - - $ openstack overcloud network vip provision \ - --stack overcloud \ - --output ~/overcloud-vip-deployed.yaml \ - ~/vip_data.yaml - -When deploying the overcloud include the environment file generated by the -``overcloud network provision`` command. For example: - -.. code-block:: bash - - $ openstack overcloud deploy --templates \ - -e ~/overcloud-vip-deployed.yaml - - -Service Virtual IPs -................... - -Service Virtual IPs are created as needed when the service is enabled. To -configure the subnet to use the existing ``ServiceVipMap`` heat parameter. -For a fixed IP allocation the existing heat parameters ``RedisVirtualFixedIPs`` -and/or ``OVNDBsVirtualFixedIPs`` can be used. - -**Example**: Setting fixed ips: - -.. code-block:: yaml - - parameter_defaults: - RedisVirtualFixedIPs: [{'ip_address': '172.20.0.11'}] - OVNDBsVirtualFixedIPs: [{'ip_address': '172.20.0.12'}] - -**Example**: Setting fixed IP address and not creating a neutron resource: - -.. code-block:: yaml - - parameter_defaults: - RedisVirtualFixedIPs: [{'ip_address': '172.20.0.11', 'use_neutron': false}] - OVNDBsVirtualFixedIPs: [{'ip_address': '172.20.0.12', 'use_neutron': false}] - -.. note:: Overriding the Service Virtual IPs using the resource registry - entries ``OS::TripleO::Network::Ports::RedisVipPort`` and - ``OS::TripleO::Network::Ports::OVNDBsVipPort`` is no longer - supported. - - -Provision Baremetal Instances -............................. - -Pre provisioning baremetal instances using Metalsmith has been supported for a -while. The TripleO Network v2 work extended the workflow that provision -baremetal instances to also provision the neutron network port resources and -added the interface to run arbitrary Ansible playbooks after node provisioning. - -Please refer to the :ref:`baremetal_provision` document page for a reference on -available options in the Baremetal Deployment YAML schema. - -**Example**: Baremetal Deployment YAML set up for default the default -network-isolation scenario, including one pre-network config Ansible playbook -that will be run against the nodes in each role. - -.. code-block:: yaml - - - name: Controller - count: 1 - hostname_format: controller-%index% - ansible_playbooks: - - playbook: bm-deploy-playbook.yaml - defaults: - profile: control - networks: - - network: external - subnet: external_subnet - - network: internal_api - subnet: internal_api_subnet01 - - network: storage - subnet: storage_subnet01 - - network: storage_mgmt - subnet: storage_mgmt_subnet01 - - network: tenant - subnet: tenant_subnet01 - network_config: - template: templates/multiple_nics/multiple_nics_dvr.j2 - default_route_network: - - external - - name: Compute - count: 1 - hostname_format: compute-%index% - ansible_playbooks: - - playbook: bm-deploy-playbook.yaml - defaults: - profile: compute-leaf2 - networks: - - network: internal_api - subnet: internal_api_subnet02 - - network: tenant - subnet: tenant_subnet02 - - network: storage - subnet: storage_subnet02 - network_config: - template: templates/multiple_nics/multiple_nics_dvr.j2 - -**Example**: Arbitrary Ansible playbook example bm-deploy-playbook.yaml - -.. code-block:: yaml - - - name: Overcloud Node Network Config - hosts: allovercloud - any_errors_fatal: true - gather_facts: false - tasks: - - name: A task - debug: - msg: "A message" - -To provision baremetal nodes, create neutron port resource and apply network -configuration as defined in the above definition run the ``openstack overcloud -node provision`` command including the ``--network-config`` argument as shown -in the below example: - -.. code-block:: bash - - $ openstack overcloud node provision \ - --stack overcloud \ - --network-config \ - --output ~/overcloud-baremetal-deployed.yaml \ - ~/baremetal_deployment.yaml - -When deploying the overcloud include the environment file generated by the -``overcloud node provision`` command and enable the ``--deployed-server`` -argument. - -.. code-block:: bash - - $ openstack overcloud deploy --templates \ - --deployed-server \ - -e ~/overcloud-baremetal-deployed.yaml - -The *All-in-One* alternative using overcloud deploy command -............................................................. - -It is possible to instruct the ``openstack overcloud deploy`` command to do all -of the above steps in one go. The same YAML definitions can be used and the -environment files will be automatically included. - -**Example**: Use the **All-in-One** deploy command: - -.. code-block:: bash - - $ openstack overcloud deploy \ - --templates \ - --stack overcloud \ - --network-config \ - --deployed-server \ - --roles-file ~/my_roles_data.yaml \ - --networks-file ~/network_data_v2.yaml \ - --vip-file ~/vip_data.yaml \ - --baremetal-deployment ~/baremetal_deployment.yaml - - -Managing Multiple Overclouds -............................ - -When managing multiple overclouds using a single undercloud one would have to -use a different ``--stack`` name and ``--output`` as well as per-overcloud -YAML definitions for provisioning Virtual IPs and baremetal nodes. - -Networks can be shared, or separate for each overcloud stack. If they are -shared, use the same network definition YAML and deployed network environment -for all stacks. In the case where networks are not shared, a separate network -definitions YAML and a separate deployed network environment file must be used -by each stack. - -.. note:: The ``ctlplane`` provisioning network will always be shared. - - -Migrating existing deployments ------------------------------- - -To facilitate the migration for deployed overclouds tripleoclient commands to -extract information from deployed overcloud stacks has been added. During the -upgrade to Wallaby these tools will be executed as part of the undercloud -upgrade, placing the generated YAML definition files in the working directory -(Defaults to: ``~/overcloud-deploy/$STACK_NAME/``). Below each export command -is described, and examples to use them manually with the intent for developers -and operators to be able to better understand what happens "under the hood" -during the undercloud upgrade. - -There is also a tool ``convert_heat_nic_config_to_ansible_j2.py`` that can be -used to convert heat template NIC config to Ansible j2 templates. - -.. warning:: If migrating to use Networking v2 while using the non-Ephemeral - heat i.e ``--heat-type installed``, the existing overcloud stack - must **first** be updated to set the ``deletion_policy`` for - ``OS::Nova`` and ``OS::Neutron`` resources. This can be done - using a ``--stack-only`` update, including an environment file - setting the following tripleo-heat-templates parameters - ``NetworkDeletionPolicy``, ``PortDeletionPolicy`` and - ``ServerDeletionPolicy`` to ``retain``. - - If the deletion policy is not set to ``retain`` the - orchestration service will **delete** the existing resources - when an update using the Networking v2 environments is - performed. - -Conflicting legacy environment files -.................................... - -The heat environment files created by the Networking v2 commands uses resource -registry overrides to replace the existing resources with *pre-deployed* -resource types. These resource registry entries was also used by legacy -environment files, such as ``network-isolation.yaml``. The legacy files should -no longer be used, as they will nullify the new overrides. - -It is recommended to compare the generated environment files with existing -environment files used with the overcloud deployment prior to the migration and -remove all settings that overlap with the settings in the generated environment -files. - -Convert NIC configs -................... - -In the tripleo-heat-templates ``tools`` directory there is a script -``convert_heat_nic_config_to_ansible_j2.py`` that can be used to convert heat -NIC config templates to Ansible j2 NIC config templates. - -**Example**: Convert the compute.yaml heat NIC config template to Ansible j2. - -.. code-block:: bash - - $ /usr/share/openstack-tripleo-heat-templates/convert_heat_nic_config_to_ansible_j2.py \ - --stack overcloud \ - --networks-file network_data.yaml \ - ~/nic-configs/compute.yaml - -.. warning:: The tool does a best-effort to fully automate the conversion. The - new Ansible j2 template files should be inspected, there may be - a need to manually edit the new Ansible j2 template. The tool will - try to highlight any issues that need manual intervention by - adding comments in the Ansible j2 file. - -The :ref:`migrating_existing_network_interface_templates` section on the -:ref:`network_isolation` documentation page provides a guide for manual -migration. - -Generate Network YAML -..................... - -The command ``openstack overcloud network extract`` can be used to generate -a Network definition YAML file from a deployed overcloud stack. The YAML -definition file can then be used with ``openstack overcloud network provision`` -and the ``openstack overcloud deploy`` command. - -**Example**: Generate a Network definition YAML for the ``overcloud`` stack: - -.. code-block:: bash - - $ openstack overcloud network extract \ - --stack overcloud \ - --output ~/network_data_v2.yaml - -Generate Virtual IPs YAML -......................... - -The command ``openstack overcloud network vip extract`` can be used to generate -a Virtual IPs definition YAML file from a deployed overcloud stack. The YAML -definition file can then be used with ``openstack overcloud network vip -provision`` command and/or the ``openstack overcloud deploy`` command. - -**Example**: Generate a Virtual IPs definition YAML for the ``overcloud`` -stack: - -.. code-block:: bash - - $ openstack overcloud network vip extract \ - --stack overcloud \ - --output /home/centos/overcloud/network_vips_data.yaml - -Generate Baremetal Provision YAML -................................. - -The command ``openstack overcloud node extract provisioned`` can be used to -generate a Baremetal Provision definition YAML file from a deployed overcloud -stack. The YAML definition file can then be used with ``openstack overcloud -node provision`` command and/or the ``openstack overcloud deploy`` command. - -**Example**: Export deployed overcloud nodes to Baremetal Deployment YAML -definition - -.. code-block:: bash - - $ openstack overcloud node extract provisioned \ - --stack overcloud \ - --roles-file ~/tht_roles_data.yaml \ - --output ~/baremetal_deployment.yaml diff --git a/deploy-guide/source/deployment/overcloud.rst b/deploy-guide/source/deployment/overcloud.rst deleted file mode 100644 index 9113e276..00000000 --- a/deploy-guide/source/deployment/overcloud.rst +++ /dev/null @@ -1,84 +0,0 @@ -Containers based Overcloud Deployment -====================================== - -This documentation explains how to deploy a fully containerized overcloud -utilizing Podman which is the default since the Stein release. - -The requirements for a containerized overcloud are the same as for any other -overcloud deployment. The real difference is in where the overcloud services -will be deployed (containers vs base OS). - -Architecture ------------- - -The container-based overcloud architecture is not very different from the -baremetal/VM based one. The services deployed in the traditional baremetal -overcloud are also deployed in the docker-based one. - -One obvious difference between these two types of deployments is that the -Openstack services are deployed as containers in a container runtime rather -than directly on the host operating system. This reduces the required packages -in the host to the bare minimum for running the container runtime and managing -the base network layer. - - -Manual overcloud deployment ----------------------------- - -This section explains how to deploy a containerized overcloud manually. For an -automated overcloud deployment, please follow the steps in the -`Using TripleO Quickstart`_ section below. - -Preparing overcloud images -.......................... - -As part of the undercloud install, an image registry is configured on port -`8787`. This is used to increase reliability of overcloud image pulls, and -minimise overall network transfers. The undercloud registry will be populated -with images required by the overcloud deploy by generating the following -`containers-prepare-parameter.yaml` file and using that for the prepare call:: - - openstack tripleo container image prepare default \ - --local-push-destination \ - --output-env-file containers-prepare-parameter.yaml - -.. note:: The file `containers-prepare-parameter.yaml` may have already been - created during :ref:`install_undercloud`. It is - encouraged to share the same `containers-prepare-parameter.yaml` file - for undercloud install and overcloud deploy. - -See :ref:`prepare-environment-containers` for details on using -`containers-prepare-parameter.yaml` to control what can be done -with image preparation during overcloud deployment. - -.. _overcloud-prepare-container-images: - -Deploying the containerized Overcloud -------------------------------------- - -A containerized overcloud deployment follows all the steps described in the -baremetal :ref:`deploy-the-overcloud` documentation with the exception that it -requires an extra environment file to be added to the ``openstack overcloud -deploy`` command:: - - -e ~/containers-prepare-parameter.yaml - -If deploying with highly available controller nodes, include the -following extra environment file in addition to the above and in place -of the `environments/puppet-pacemaker.yaml` file:: - - -e /usr/share/openstack-tripleo-heat-templates/environments/docker-ha.yaml - -Using TripleO Quickstart ------------------------- - -.. note:: Please refer to the `TripleO Quickstart`_ docs for more info about - quickstart, the minimum requirements, the setup process and the - available plugins. - - -The command below will deploy a containerized overcloud on top of a baremetal undercloud:: - - bash quickstart.sh --config=~/.quickstart/config/general_config/containers_minimal.yml $VIRTHOST - -.. _TripleO Quickstart: https://docs.openstack.org/tripleo-quickstart/ diff --git a/deploy-guide/source/deployment/repositories.rst b/deploy-guide/source/deployment/repositories.rst deleted file mode 100644 index 4e5c6488..00000000 --- a/deploy-guide/source/deployment/repositories.rst +++ /dev/null @@ -1,6 +0,0 @@ -:orphan: - -Repository Enablement -===================== - -.. include:: ../repositories.rst diff --git a/deploy-guide/source/deployment/standalone.rst b/deploy-guide/source/deployment/standalone.rst deleted file mode 100644 index 9f18ba9f..00000000 --- a/deploy-guide/source/deployment/standalone.rst +++ /dev/null @@ -1,1132 +0,0 @@ -.. _standalone: - -Standalone Containers based Deployment -====================================== - -This documentation explains how the underlying framework used by the -Containerized Undercloud deployment mechanism can be reused to deploy a -single node capable of running OpenStack services for development. Optional -instructions for installing Ceph are included as well. - -System Requirements for a Standalone Deployment ------------------------------------------------ - - .. include:: ../environments/standalone.rst - :start-after: .. include_after_header - -Deploying a Standalone OpenStack node -------------------------------------- - -#. Copy your SSH key to a non-root user on your machine (baremetal or VM) - where you want to install the standalone services.:: - - ssh-copy-id -i ~/.ssh/ @ - -#. Connect to your machine as the non-root user.:: - - ssh @ - -#. Ensure a fully qualified hostname has been configured on the host being - deployed on. For example:: - - sudo hostnamectl set-hostname standalone.localdomain - sudo hostnamectl set-hostname standalone.localdomain --transient - -#. Enable needed repositories: - - .. include:: ../repositories.rst - -#. Install the TripleO CLI, which will pull in all other necessary packages as dependencies:: - - sudo dnf install -y python3-tripleoclient - - .. admonition:: Ceph - :class: ceph - - Install the packages necessary to deploy Ceph. - - .. code-block:: bash - - sudo dnf install -y util-linux lvm2 cephadm - -#. Generate a file with the default ContainerImagePrepare value:: - - openstack tripleo container image prepare default \ - --output-env-file $HOME/containers-prepare-parameters.yaml - - .. note:: - Update containers-prepare-parameters.yaml for your own needs. - See :ref:`prepare-environment-containers` for more details. - - .. admonition:: Ceph - :class: ceph - - Create a block device with logical volumes to be used as an OSD. - - .. code-block:: bash - - sudo dd if=/dev/zero of=/var/lib/ceph-osd.img bs=1 count=0 seek=7G - sudo losetup /dev/loop3 /var/lib/ceph-osd.img - sudo pvcreate /dev/loop3 - sudo vgcreate vg2 /dev/loop3 - sudo lvcreate -n data-lv2 -l +100%FREE vg2 - - Create a systemd service that restores the device on startup. - - .. code-block:: bash - - cat < /tmp/ceph-osd-losetup.service - [Unit] - Description=Ceph OSD losetup - After=syslog.target - - [Service] - Type=oneshot - ExecStart=/bin/bash -c '/sbin/losetup /dev/loop3 || \ - /sbin/losetup /dev/loop3 /var/lib/ceph-osd.img ; partprobe /dev/loop3' - ExecStop=/sbin/losetup -d /dev/loop3 - RemainAfterExit=yes - - [Install] - WantedBy=multi-user.target - EOF - - sudo mv /tmp/ceph-osd-losetup.service /etc/systemd/system/ - sudo systemctl enable ceph-osd-losetup.service - -#. Configure basic standalone parameters which include network configuration - and some deployment options. - - .. warning:: - The standalone deployment requires one network interface on the deployment - machine and **that interface will be reconfigured as per the parameters - you specify below**. The interface you want to use is specified by name - in the $INTERFACE parameter below and passed as the NeutronPublicInterface - in the standalone_parameters.yaml. If you only have one interface on your - machine be advised that it will be reconfigured to have the IP address - specified in $IP. If that is a remote box you may lose connectivity to it. - Any other network interfaces are left untouched. - - For the standalone deployment we use a single NIC on the target machine - which is reconfigured and set as a member of an ovs bridge, **br-ctlplane**. Two - examples follow which can be copy/pasted as is - depending on your setup. - You should only have to change the name of the interface to match whatever - it is called on your system. Ideally you will have two network interfaces, - so that one is used for the standalone deployment, whilst the other will be - left untouched. This can be especially important if you are deploying on a - remote box (e.g. via ssh). - - The following configuration can be used for a system with 2 network - interfaces. This configuration assumes the first interface is used for - management and we will only configure the second interface. The deployment - assumes the second interface has a "public" /24 network which will be used - for the cloud endpoints and public VM connectivity. - - In addition to the IPs used on eth1, a virtual IP will be added and managed - by pacemaker. This must be a different address to the other IP as one will - be bound to by haproxy while the other by backend services on the same. - - .. Note: The following example utilizes 2 interfaces. NIC1 which will serve as - the management interface. It can have any address and will be left untouched. - NIC2 will serve as the OpenStack & Provider network NIC. The following - exports should be configured for your network and interface. - - .. code-block:: bash - - export IP=192.168.24.2 - export VIP=192.168.24.3 - export NETMASK=24 - export INTERFACE=eth1 - - You will now create the standalone_parameters.yaml. The $IP, $VIP, $NETMASK, - and $INTERFACE will be replaced with the values from the export commands. - - .. code-block:: bash - - cat < $HOME/standalone_parameters.yaml - parameter_defaults: - CloudName: $IP - ControlPlaneStaticRoutes: [] - Debug: true - DeploymentUser: $USER - DnsServers: - - 1.1.1.1 - - 8.8.8.8 - DockerInsecureRegistryAddress: - - $IP:8787 - NeutronPublicInterface: $INTERFACE - # domain name used by the host - CloudDomain: localdomain - NeutronDnsDomain: localdomain - # re-use ctlplane bridge for public net, defined in the standalone - # net config (do not change unless you know what you're doing) - NeutronBridgeMappings: datacentre:br-ctlplane - NeutronPhysicalBridge: br-ctlplane - # enable to force metadata for public net - #NeutronEnableForceMetadata: true - StandaloneEnableRoutedNetworks: false - StandaloneHomeDir: $HOME - InterfaceLocalMtu: 1500 - # Needed if running in a VM, not needed if on baremetal - NovaComputeLibvirtType: qemu - EOF - - The following configuration can be used for a system with a single network - interface. This configuration assumes that the interface is shared for - management and cloud functions. This configuration requires there be at - least 3 ip addresses available for configuration. 1 ip is used for the - cloud endpoints, 1 is used for an internal router and 1 is used as a - floating IP. - - .. Note: NIC1 will serve as the management, OpenStack and Provider network - interface. The exports should be configured for your network and interface. - - .. code-block:: bash - - export IP=192.168.24.2 - export VIP=192.168.24.3 - export NETMASK=24 - export GATEWAY=192.168.24.1 - export INTERFACE=eth0 - - You will now create the standalone_parameters.yaml. The $IP, $NETMASK, - $GATEWAY, and $INTERFACE will be replaced with the values from the export - commands. - - .. code-block:: bash - - cat < $HOME/standalone_parameters.yaml - parameter_defaults: - CloudName: $IP - # default gateway - ControlPlaneStaticRoutes: - - ip_netmask: 0.0.0.0/0 - next_hop: $GATEWAY - default: true - Debug: true - DeploymentUser: $USER - DnsServers: - - 1.1.1.1 - - 8.8.8.8 - # needed for vip & pacemaker - KernelIpNonLocalBind: 1 - DockerInsecureRegistryAddress: - - $IP:8787 - NeutronPublicInterface: $INTERFACE - # domain name used by the host - CloudDomain: localdomain - NeutronDnsDomain: localdomain - # re-use ctlplane bridge for public net, defined in the standalone - # net config (do not change unless you know what you're doing) - NeutronBridgeMappings: datacentre:br-ctlplane - NeutronPhysicalBridge: br-ctlplane - # enable to force metadata for public net - #NeutronEnableForceMetadata: true - StandaloneEnableRoutedNetworks: false - StandaloneHomeDir: $HOME - InterfaceLocalMtu: 1500 - # Needed if running in a VM, not needed if on baremetal - NovaComputeLibvirtType: qemu - EOF - - .. admonition:: Ceph - :class: ceph - - Establish an IP address on which Ceph will listen. Because the - 192.168.24.0/24 network containing the cloud IP and VIP defined - earlier is not configured until `openstack tripleo deploy` is - run, we need Ceph to run on a different network if we're going - to deploy Ceph before the overcloud as described in - :doc:`../features/deployed_ceph`. Any IP on the VM may be used - including the IP on the default libvirt network - 192.168.122.0/24. For example: - - .. code-block:: bash - - export CEPH_IP=192.168.122.252 - - Create an OSD spec file which references the block device with - the logical volumes created earlier. - - .. code-block:: bash - - cat < $HOME/osd_spec.yaml - data_devices: - paths: - - /dev/vg2/data-lv2 - EOF - - Use the Ceph IP and OSD spec file to create a Ceph spec file - which will describe the Ceph cluster in a format `cephadm` can - parse. The `--standalone` option covers a special case for this - scenario because 'openstack overcloud node provision' is not - used. - - .. code-block:: bash - - sudo openstack overcloud ceph spec \ - --standalone \ - --mon-ip $CEPH_IP \ - --osd-spec $HOME/osd_spec.yaml \ - --output $HOME/ceph_spec.yaml - - Create the ceph-admin user by passing the Ceph spec created - earlier and use the `--standalone` option. - - .. code-block:: bash - - sudo openstack overcloud ceph user enable \ - --standalone \ - $HOME/ceph_spec.yaml \ - - Though Ceph will be configured to run on a single host via the - `--single-host-defaults` option, this deployment only has a - single OSD so it cannot replicate data even on the same host. - Create an initial Ceph configuration to disable replication: - - .. code-block:: bash - - cat < $HOME/initial_ceph.conf - [global] - osd pool default size = 1 - [mon] - mon_warn_on_pool_no_redundancy = false - EOF - - Additional Ceph daemons can be added to the Ceph cluster, but only Ceph - mds and nfs daemons are supported. Create a Ceph_daemon spec definition, - and add the required information for each daemon: - - .. code-block:: bash - - cat < $HOME/ceph_daemon.yaml - ceph_nfs: - cephfs_data: 'manila_data' - cephfs_metadata: 'manila_metadata' - EOF - - Deploy Ceph by passing the IP, Ceph spec, Ceph conf and Ceph daemon - definition created above. Use the options `--standalone`, - `--single-host-defaults`, `--skip-hosts-config` and - `--skip-container-registry-config`. Use `openstack overcloud ceph deploy - --help` for details on what these options do. User creation is skipped - via `--skip-user-create` because it was handled in the previous step. - Specify what the output deployed Ceph file should be called. The - CephIngress deployment can be skipped in a standalone environment if - there is no network isolation and the CephNFS daemon already has a stable - floating ip. - - .. code-block:: bash - - sudo openstack overcloud ceph deploy \ - --mon-ip $CEPH_IP \ - --ceph-spec $HOME/ceph_spec.yaml \ - --config $HOME/initial_ceph.conf \ - --daemon $HOME/ceph_daemon.yaml \ - --standalone \ - --single-host-defaults \ - --skip-hosts-config \ - --skip-container-registry-config \ - --skip-user-create \ - --output $HOME/deployed_ceph.yaml - - A Ceph RBD cluster should now be deployed and `sudo cephadm - shell -- ceph -s` may be used to check its status. The - `deployed_ceph.yaml` file is a Heat environment file describing - the deployed Ceph cluster and should be used during overcloud - deployment. - - -#. Run the deploy command: - - .. code-block:: bash - - sudo openstack tripleo deploy \ - --templates \ - --local-ip=$IP/$NETMASK \ - --control-virtual-ip $VIP \ - -e /usr/share/openstack-tripleo-heat-templates/environments/standalone/standalone-tripleo.yaml \ - -r /usr/share/openstack-tripleo-heat-templates/roles/Standalone.yaml \ - -e $HOME/containers-prepare-parameters.yaml \ - -e $HOME/standalone_parameters.yaml \ - --output-dir $HOME - - .. admonition:: Ceph - :class: ceph - - Include the Ceph environment files in the deploy command: - - .. code-block:: bash - - sudo openstack tripleo deploy \ - --templates \ - --local-ip=$IP/$NETMASK \ - --control-virtual-ip $VIP \ - -e /usr/share/openstack-tripleo-heat-templates/environments/standalone/standalone-tripleo.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm.yaml \ - -r /usr/share/openstack-tripleo-heat-templates/roles/Standalone.yaml \ - -e $HOME/containers-prepare-parameters.yaml \ - -e $HOME/standalone_parameters.yaml \ - -e $HOME/deployed_ceph.yaml \ - --output-dir $HOME - - -#. Check the deployed OpenStack Services - - At the end of the deployment, a clouds.yaml configuration file is placed in - the /root/.config/openstack folder. This can be used with the openstack - client to query the OpenStack services. - - .. code-block:: bash - - export OS_CLOUD=standalone - openstack endpoint list - -#. Cleanup a deployment - - If you want to remove the services and files installed by Standalone after - a deployment failure, or just to re-deploy from scratch, you can run the - following script: - - .. code-block:: bash - - #!/bin/bash - echo "Tearing down TripleO environment" - if type pcs &> /dev/null; then - sudo pcs cluster destroy - fi - if type podman &> /dev/null; then - echo "Removing podman containers and images (takes times...)" - sudo podman rm -af - sudo podman rmi -af - fi - sudo rm -rf \ - /var/lib/tripleo-config \ - /var/lib/config-data /var/lib/container-config-scripts \ - /var/lib/container-puppet \ - /var/lib/heat-config \ - /var/lib/image-serve \ - /var/lib/containers \ - /etc/systemd/system/tripleo* \ - /var/lib/mysql/* \ - /etc/openstack - rm -rf ~/.config/openstack - sudo systemctl daemon-reload - - .. admonition:: Ceph - :class: ceph - - To remove Ceph and its block device run the following. - - .. code-block:: bash - - FSID=$(sudo ls /var/lib/ceph) - sudo cephadm rm-cluster --force --fsid $FSID - - sudo systemctl stop ceph-osd-losetup.service - sudo systemctl disable ceph-osd-losetup.service - sudo lvremove --force /dev/vg2/data-lv2 - sudo vgremove --force vg2 - sudo pvremove --force /dev/loop3 - sudo losetup -d /dev/loop3 - sudo rm -f /var/lib/ceph-osd.img - sudo partprobe - -Manual deployments with ansible -------------------------------- - -With the ``--output-only`` option enabled, the installation stops before Ansible -playbooks would be normally executed. Instead, it only creates a Heat stack, -then downloads the ansible deployment data and playbooks to ``--output-dir`` for -the manual execution. - -.. note:: - When updating the existing standalone installation, keep in mind the - special cases described in :ref:`notes-for-stack-updates`. There is an - additional case for the ``--force-stack-update`` flag that might need to be - used, when in the ``--output-only`` mode. That is when you cannot know the - results of the actual deployment before ansible has started. - -Example: 1 NIC, Using Compute with Tenant and Provider Networks ---------------------------------------------------------------- - -The following example is based on the single NIC configuration and assumes that -the environment had at least 3 total IP addresses available to it. The IPs are -used for the following: - -- 1 IP address for the OpenStack services (this is the ``--local-ip`` from the - deploy command) -- 1 IP used as a Virtual Router to provide connectivity to the Tenant network - is used for the OpenStack services (is automatically assigned in this example) -- The remaining IP addresses (at least 1) are used for Floating IPs on the - provider network. - -The following is an example post deployment launching of a VM using the -private tenant network and the provider network. - -#. Create helper variables for the configuration:: - - # standalone with tenant networking and provider networking - export OS_CLOUD=standalone - export GATEWAY=192.168.24.1 - export STANDALONE_HOST=192.168.24.2 - export PUBLIC_NETWORK_CIDR=192.168.24.0/24 - export PRIVATE_NETWORK_CIDR=192.168.100.0/24 - export PUBLIC_NET_START=192.168.24.4 - export PUBLIC_NET_END=192.168.24.5 - export DNS_SERVER=1.1.1.1 - -#. Initial Nova and Glance setup:: - - # nova flavor - openstack flavor create --ram 512 --disk 1 --vcpu 1 --public tiny - # basic cirros image - wget https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img - openstack image create cirros --container-format bare --disk-format qcow2 --public --file cirros-0.4.0-x86_64-disk.img - # nova keypair for ssh - ssh-keygen - openstack keypair create --public-key ~/.ssh/id_rsa.pub default - -#. Setup a simple network security group:: - - # create basic security group to allow ssh/ping/dns - openstack security group create basic - # allow ssh - openstack security group rule create basic --protocol tcp --dst-port 22:22 --remote-ip 0.0.0.0/0 - # allow ping - openstack security group rule create --protocol icmp basic - # allow DNS - openstack security group rule create --protocol udp --dst-port 53:53 basic - -#. Create Neutron Networks:: - - openstack network create --external --provider-physical-network datacentre --provider-network-type flat public - openstack network create --internal private - openstack subnet create public-net \ - --subnet-range $PUBLIC_NETWORK_CIDR \ - --no-dhcp \ - --gateway $GATEWAY \ - --allocation-pool start=$PUBLIC_NET_START,end=$PUBLIC_NET_END \ - --network public - openstack subnet create private-net \ - --subnet-range $PRIVATE_NETWORK_CIDR \ - --network private - -#. Create Virtual Router:: - - # create router - # NOTE(aschultz): In this case an IP will be automatically assigned - # out of the allocation pool for the subnet. - openstack router create vrouter - openstack router set vrouter --external-gateway public - openstack router add subnet vrouter private-net - -#. Create floating IP:: - - # create floating ip - openstack floating ip create public - -#. Launch Instance:: - - # launch instance - openstack server create --flavor tiny --image cirros --key-name default --network private --security-group basic myserver - -#. Assign Floating IP:: - - openstack server add floating ip myserver - -#. Test SSH:: - - # login to vm - ssh cirros@ - - -Networking Details -~~~~~~~~~~~~~~~~~~ - -Here's a basic diagram of where the connections occur in the system for this -example:: - - +-------------------------------------------------------+ - |Standalone Host | - | | - | +----------------------------+ | - | | vrouter | | - | | | | - | +------------+ +-------------+ | - | |192.168.24.4| | | | - | |192.168.24.3| |192.168.100.1| | - | +---------+------+-----------+ | - | +-------------+ | | | - | | myserver | | | | - | |192.168.100.2| | | | - | +-------+-----+ | +-+ | - | | | | | - | | | | | - | ++---------+----+-+ +-----------------+ | - | | br-int +---+ br-ctlplane | | - | | | | 192.168.24.2 | | - | +------+----------+ +--------+--------+ | - | | | | - | +------+----------+ | | - | | br-tun | | | - | | | | | - | +-----------------+ +----+---+ | - | | eth0 | | - +---------------------------------------+----+---+------+ - | - | - +-------+-----+ - | switch | - +-------------+ - -Example: 1 NIC, Using Compute with Provider Network ---------------------------------------------------- - -The following example is based on the single NIC configuration and assumes that -the environment had at least 4 total IP addresses available to it. The IPs are -used for the following: - -- 1 IP address for the OpenStack services (this is the ``--local-ip`` from the - deploy command) -- 1 IP used as a Virtual Router to provide connectivity to the Tenant network - is used for the OpenStack services -- 1 IP used for DHCP on the provider network -- The remaining IP addresses (at least 1) are used for Floating IPs on the - provider network. - -The following is an example post deployment launching of a VM using the -private tenant network and the provider network. - -#. Create helper variables for the configuration:: - - # standalone with provider networking - export OS_CLOUD=standalone - export GATEWAY=192.168.24.1 - export STANDALONE_HOST=192.168.24.2 - export VROUTER_IP=192.168.24.3 - export PUBLIC_NETWORK_CIDR=192.168.24.0/24 - export PUBLIC_NET_START=192.168.24.4 - export PUBLIC_NET_END=192.168.24.5 - export DNS_SERVER=1.1.1.1 - -#. Initial Nova and Glance setup:: - - # nova flavor - openstack flavor create --ram 512 --disk 1 --vcpu 1 --public tiny - # basic cirros image - wget https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img - openstack image create cirros --container-format bare --disk-format qcow2 --public --file cirros-0.4.0-x86_64-disk.img - # nova keypair for ssh - ssh-keygen - openstack keypair create --public-key ~/.ssh/id_rsa.pub default - -#. Setup a simple network security group:: - - # create basic security group to allow ssh/ping/dns - openstack security group create basic - # allow ssh - openstack security group rule create basic --protocol tcp --dst-port 22:22 --remote-ip 0.0.0.0/0 - # allow ping - openstack security group rule create --protocol icmp basic - # allow DNS - openstack security group rule create --protocol udp --dst-port 53:53 basic - -#. Create Neutron Networks:: - - openstack network create --external --provider-physical-network datacentre --provider-network-type flat public - openstack subnet create public-net \ - --subnet-range $PUBLIC_NETWORK_CIDR \ - --gateway $GATEWAY \ - --allocation-pool start=$PUBLIC_NET_START,end=$PUBLIC_NET_END \ - --network public \ - --host-route destination=169.254.169.254/32,gateway=$VROUTER_IP \ - --host-route destination=0.0.0.0/0,gateway=$GATEWAY \ - --dns-nameserver $DNS_SERVER - -#. Create Virtual Router:: - - # vrouter needed for metadata route - # NOTE(aschultz): In this case we're creating a fixed IP because we need - # to create a manual route in the subnet for the metadata service - openstack router create vrouter - openstack port create --network public --fixed-ip subnet=public-net,ip-address=$VROUTER_IP vrouter-port - openstack router add port vrouter vrouter-port - -#. Launch Instance:: - - # launch instance - openstack server create --flavor tiny --image cirros --key-name default --network public --security-group basic myserver - -#. Test SSH:: - - # login to vm - ssh cirros@ - -Networking Details -~~~~~~~~~~~~~~~~~~ - -Here's a basic diagram of where the connections occur in the system for this -example:: - - +----------------------------------------------------+ - |Standalone Host | - | | - | +------------+ +------------+ | - | | myserver | | vrouter | | - | |192.168.24.4| |192.168.24.3| | - | +---------+--+ +-+----------+ | - | | | | - | +---+--------+----+ +-----------------+ | - | | br-int +---+ br-ctlplane | | - | | | | 192.168.24.2 | | - | +------+----------+ +--------+--------+ | - | | | | - | +------+----------+ | | - | | br-tun | | | - | | | | | - | +-----------------+ +----+---+ | - | | eth0 | | - +------------------------------------+----+---+------+ - | - | - +-------+-----+ - | switch | - +-------------+ - -Example: 2 NIC, Using Compute with Tenant and Provider Networks ---------------------------------------------------------------- - -The following example is based on the dual NIC configuration and assumes that -the environment has an entire IP range available to it on the provider network. -We are assuming the following would be reserved on the provider network: - -- 1 IP address for a gateway on the provider network -- 1 IP address for OpenStack Endpoints -- 1 IP used as a Virtual Router to provide connectivity to the Tenant network - is used for the OpenStack services (is automatically assigned in this example) -- The remaining IP addresses (at least 1) are used for Floating IPs on the - provider network. - -The following is an example post deployment launching of a VM using the -private tenant network and the provider network. - -#. Create helper variables for the configuration:: - - # standalone with tenant networking and provider networking - export OS_CLOUD=standalone - export GATEWAY=192.168.24.1 - export STANDALONE_HOST=192.168.0.2 - export PUBLIC_NETWORK_CIDR=192.168.24.0/24 - export PRIVATE_NETWORK_CIDR=192.168.100.0/24 - export PUBLIC_NET_START=192.168.0.3 - export PUBLIC_NET_END=192.168.24.254 - export DNS_SERVER=1.1.1.1 - -#. Initial Nova and Glance setup:: - - # nova flavor - openstack flavor create --ram 512 --disk 1 --vcpu 1 --public tiny - # basic cirros image - wget https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img - openstack image create cirros --container-format bare --disk-format qcow2 --public --file cirros-0.4.0-x86_64-disk.img - # nova keypair for ssh - ssh-keygen - openstack keypair create --public-key ~/.ssh/id_rsa.pub default - -#. Setup a simple network security group:: - - # create basic security group to allow ssh/ping/dns - openstack security group create basic - # allow ssh - openstack security group rule create basic --protocol tcp --dst-port 22:22 --remote-ip 0.0.0.0/0 - # allow ping - openstack security group rule create --protocol icmp basic - # allow DNS - openstack security group rule create --protocol udp --dst-port 53:53 basic - -#. Create Neutron Networks:: - - openstack network create --external --provider-physical-network datacentre --provider-network-type flat public - openstack network create --internal private - openstack subnet create public-net \ - --subnet-range $PUBLIC_NETWORK_CIDR \ - --no-dhcp \ - --gateway $GATEWAY \ - --allocation-pool start=$PUBLIC_NET_START,end=$PUBLIC_NET_END \ - --network public - openstack subnet create private-net \ - --subnet-range $PRIVATE_NETWORK_CIDR \ - --network private - -#. Create Virtual Router:: - - # create router - # NOTE(aschultz): In this case an IP will be automatically assigned - # out of the allocation pool for the subnet. - openstack router create vrouter - openstack router set vrouter --external-gateway public - openstack router add subnet vrouter private-net - -#. Create floating IP:: - - # create floating ip - openstack floating ip create public - -#. Launch Instance:: - - # launch instance - openstack server create --flavor tiny --image cirros --key-name default --network private --security-group basic myserver - -#. Assign Floating IP:: - - openstack server add floating ip myserver - -#. Test SSH:: - - # login to vm - ssh cirros@ - -Networking Details -~~~~~~~~~~~~~~~~~~ - -Here's a basic diagram of where the connections occur in the system for this -example:: - - +---------------------------------------------------------------------+ - |Standalone Host | - | | - | +----------------------------+ | - | | vrouter | | - | | | | - | +------------+ +-------------+ | - | |192.168.24.4| | | | - | |192.168.24.3| |192.168.100.1| | - | +---------+------+-----------+ | - | +-------------+ | | | - | | myserver | | | | - | |192.168.100.2| | | | - | +-------+-----+ | +-+ | - | | | | | - | ++---------+----+-+ +-----------------+ | - | | br-int +---+ br-ctlplane | | - | | | | 192.168.24.2 | | - | +------+----------+ +------------+----+ | - | | | | - | +------+----------+ | | - | | br-tun | | | - | | | | | - | +-----------------+ | +----------+ | - | +-----+---+ | eth0 | | - | | eth1 | | 10.0.1.4 | | - +----------------------------------------+-----+---+---+-----+----+---+ - | | - | | - +------+------+ | - | switch +------+ - +-------------+ - -Example: 2 nodes, 2 NIC, Using remote Compute with Tenant and Provider Networks -------------------------------------------------------------------------------- - -The following example uses two nodes and the split control plane -method to simulate a distributed edge computing deployment. The first -Heat stack deploys a controller node which could run in a Centralized -Data Center. The second Heat stack deploys a second node which could -run at another location on the Aggregation Edge Layer. The second node -runs the nova-compute service, Ceph, and the cinder-volume service. -Both nodes use the networking configuration found in the 2 NIC, Using -Compute with Tenant and Provider Network example. - -Deploy the central controller node -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To deploy the first node, follow the Deploying a Standalone OpenStack -node section described earlier in the document but also include the -following parameters: - -.. code-block:: yaml - - parameter_defaults: - GlanceBackend: swift - StandaloneExtraConfig: - oslo_messaging_notify_use_ssl: false - oslo_messaging_rpc_use_ssl: false - -The above configures the Swift backend for Glance so that images are -pulled by the remote compute node over HTTP and ensures that Oslo -messaging does not use SSL for RPC and notifications. Note that in a -production deployment this will result in sending unencrypted traffic -over WAN connections. - -When configuring the network keep in mind that it will be necessary -for both standalone systems to be able to communicate with each -other. E.g. the $IP for the first node will be in the endpoint map -that later will be extracted from the first node and passed as a -parameter to the second node for it to access its endpoints. In this -standalone example both servers share an L2 network. In a production -edge deployment it may be necessary instead to route. - -When deploying the first node with ``openstack tripleo deploy``, pass -the ``--keep-running`` option so the Heat processes continue to run. - -Extract deployment information from the controller node -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The Heat processes were kept running in the previous step because -this allows the Heat stack to be queried after the deployment in order -to extract parameters that the second node's deployment will need as -input. To extract these parameters into separate files in a directory, -(e.g. `DIR=export_control_plane`), which may then be exported to the -second node, run the following: - -.. code-block:: bash - - unset OS_CLOUD - export OS_AUTH_TYPE=none - export OS_ENDPOINT=http://127.0.0.1:8006/v1/admin - - openstack stack output show standalone EndpointMap --format json \ - | jq '{"parameter_defaults": {"EndpointMapOverride": .output_value}}' \ - > $DIR/endpoint-map.json - - openstack stack output show standalone HostsEntry -f json \ - | jq -r '{"parameter_defaults":{"ExtraHostFileEntries": .output_value}}' \ - > $DIR/extra-host-file-entries.json - -In addition to the above create a file in the same directory, -e.g. `$DIR/oslo.yaml`, containing Oslo overrides for the second -compute node: - -.. code-block:: yaml - - parameter_defaults: - StandaloneExtraConfig: - oslo_messaging_notify_use_ssl: false - oslo_messaging_rpc_use_ssl: false - -In addition to the parameters above, add the -`oslo_messaging_notify_password` and `oslo_messaging_rpc_password` -parameters. Their values may be extracted from -`/etc/puppet/hieradata/service_configs.json` on the first node. The -following command will do this for you: - -.. code-block:: bash - - sudo egrep "oslo.*password" /etc/puppet/hieradata/service_configs.json \ - | sed -e s/\"//g -e s/,//g >> $DIR/oslo.yaml - -In addition to the above, you need to create $DIR/$HOME/export_control_plane/all-nodes-extra-map-data.json -which will contain the following AllNodesExtraMapData. You first need to locate the -group_vars generated by tripleo-ansible, located in the config-download directory. - -Then you can generate the correct Heat environment with the following command: - -.. code-block:: bash - - STANDALONE_LATEST=$(find $HOME/standalone-ansible-* -type d -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1) - python3 -c "import json; t = {'parameter_defaults': {'AllNodesExtraMapData': json.loads(open('$HOME/$STANDALONE_LATEST/group_vars/overcloud.json').read()) }}; print(t)" > $DIR/all-nodes-extra-map-data.json - -Set a copy of the first node's passwords aside for the second node: - -.. code-block:: bash - - cp $HOME/tripleo-standalone-passwords.yaml $DIR/passwords.yaml - -Put a copy of the directory containing the extracted information, -e.g. `$DIR`, on the second node to be deployed. - -Deploy the remote compute node -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -On a second node, follow the procedure at the beginning of this -document to deploy a standalone OpenStack node with Ceph up to the -point where you have the following files: - -- `$HOME/standalone_parameters.yaml` -- `$HOME/containers-prepare-parameters.yaml` -- `$HOME/deployed_ceph.yaml` - -When setting the `$IP` of the second node, keep in mind that it should -have a way to reach the endpoints of the first node as found in the -endpoint-map.json, which was extracted from the first node. - -Create an environment file, e.g. `$HOME/standalone_edge.yaml`, with the -following content: - -.. code-block:: yaml - - resource_registry: - OS::TripleO::Services::CACerts: OS::Heat::None - OS::TripleO::Services::CinderApi: OS::Heat::None - OS::TripleO::Services::CinderScheduler: OS::Heat::None - OS::TripleO::Services::Clustercheck: OS::Heat::None - OS::TripleO::Services::HAproxy: OS::Heat::None - OS::TripleO::Services::Horizon: OS::Heat::None - OS::TripleO::Services::Keystone: OS::Heat::None - OS::TripleO::Services::Memcached: OS::Heat::None - OS::TripleO::Services::MySQL: OS::Heat::None - OS::TripleO::Services::NeutronApi: OS::Heat::None - OS::TripleO::Services::NeutronDhcpAgent: OS::Heat::None - OS::TripleO::Services::NovaApi: OS::Heat::None - OS::TripleO::Services::NovaConductor: OS::Heat::None - OS::TripleO::Services::NovaConsoleauth: OS::Heat::None - OS::TripleO::Services::NovaIronic: OS::Heat::None - OS::TripleO::Services::NovaMetadata: OS::Heat::None - OS::TripleO::Services::NovaPlacement: OS::Heat::None - OS::TripleO::Services::NovaScheduler: OS::Heat::None - OS::TripleO::Services::NovaVncProxy: OS::Heat::None - OS::TripleO::Services::OsloMessagingNotify: OS::Heat::None - OS::TripleO::Services::OsloMessagingRpc: OS::Heat::None - OS::TripleO::Services::Redis: OS::Heat::None - OS::TripleO::Services::SwiftProxy: OS::Heat::None - OS::TripleO::Services::SwiftStorage: OS::Heat::None - OS::TripleO::Services::SwiftRingBuilder: OS::Heat::None - - parameter_defaults: - CinderRbdAvailabilityZone: edge1 - GlanceBackend: swift - GlanceCacheEnabled: true - -The above file disables additional resources which -`/usr/share/openstack-tripleo-heat-templates/environments/standalone/standalone-tripleo.yaml` -does not disable since it represents a compute node which will consume -those resources from the earlier deployed controller node. It also -sets the Glance blackened to Swift and enables Glance caching so that -after images are pulled from the central node once, they do not need -to be pulled again. Finally the above sets the Cinder RBD availability -zone a separate availability zone for the remote compute and cinder -volume service. - -Deploy the second node with the following: - -.. code-block:: bash - - sudo openstack tripleo deploy \ - --templates \ - --local-ip=$IP/$NETMASK \ - -r /usr/share/openstack-tripleo-heat-templates/roles/Standalone.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/standalone/standalone-tripleo.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm-rbd-only.yaml \ - -e $HOME/containers-prepare-parameters.yaml \ - -e $HOME/standalone_parameters.yaml \ - -e $HOME/deployed_ceph.yaml \ - -e $HOME/standalone_edge.yaml \ - -e $HOME/export_control_plane/passwords.yaml \ - -e $HOME/export_control_plane/endpoint-map.json \ - -e $HOME/export_control_plane/all-nodes-extra-map-data.json \ - -e $HOME/export_control_plane/extra-host-file-entries.json \ - -e $HOME/export_control_plane/oslo.yaml \ - --output-dir $HOME - -The example above assumes that ``export_control_plane`` is the name -of the directory which contains the content extracted from the -controller node. - -Discover the remote compute node from the central controller node -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -After completing the prior steps, the `openstack` command will only -work on the central node because of how the ``OS_CLOUD`` environment -variable works with that nodes /root/.config/openstack folder, which -in turn assumes that keystone is running the central node and not -the edge nodes. To run `openstack` commands on edge nodes, override -the auth URL to point to keystone on the central node. - -On the central controller node run the following command to discover -the new compute node: - -.. code-block:: bash - - sudo docker exec -it nova_api nova-manage cell_v2 discover_hosts --verbose - -List the available zones, hosts, and hypervisors and look for the new node: - -.. code-block:: bash - - export OS_CLOUD=standalone - openstack availability zone list - openstack host list - openstack hypervisor list - -Take note of the zone and host list so that you can use that -information to schedule an instance on the new compute node. The -following example shows the result of deploying two new external -compute nodes:: - - [root@overcloud0 ~]# sudo docker exec -it nova_api nova-manage cell_v2 discover_hosts --verbose - Found 2 cell mappings. - Skipping cell0 since it does not contain hosts. - Getting computes from cell 'default': 631301c8-1744-4beb-8aa0-6a90aef6cd2d - Checking host mapping for compute host 'overcloud0.localdomain': 0884a9fc-9ef6-451c-ab22-06f825484e5e - Checking host mapping for compute host 'overcloud1.localdomain': 00fb920d-ef12-4a2a-9aa4-ba987d8a5e17 - Creating host mapping for compute host 'overcloud1.localdomain': 00fb920d-ef12-4a2a-9aa4-ba987d8a5e17 - Checking host mapping for compute host 'overcloud2.localdomain': 3e3a3cd4-5959-405a-b632-0b64415c43f2 - Creating host mapping for compute host 'overcloud2.localdomain': 3e3a3cd4-5959-405a-b632-0b64415c43f2 - Found 2 unmapped computes in cell: 631301c8-1744-4beb-8aa0-6a90aef6cd2d - [root@overcloud0 ~]# openstack hypervisor list - +----+------------------------+-----------------+--------------+-------+ - | ID | Hypervisor Hostname | Hypervisor Type | Host IP | State | - +----+------------------------+-----------------+--------------+-------+ - | 1 | overcloud0.example.com | QEMU | 192.168.24.2 | up | - | 2 | overcloud1.example.com | QEMU | 192.168.24.7 | up | - | 3 | overcloud2.example.com | QEMU | 192.168.24.8 | up | - +----+------------------------+-----------------+--------------+-------+ - [root@overcloud0 ~]# - -Note that the hostnames of the hypervisors above were set prior to the -deployment. - -On the central controller node run the following to create a host -aggregate for a remote compute node: - -.. code-block:: bash - - openstack aggregate create HA-edge1 --zone edge1 - openstack aggregate add host HA-edge1 overcloud1.localdomain - -To test, follow the example from "2 NIC, Using remote Compute with -Tenant and Provider Networks", except when creating the instance use -the `--availability-zone` option to schedule the instance on the new -remote compute node: - -.. code-block:: bash - - openstack server create --flavor tiny --image cirros \ - --key-name demokp --network private --security-group basic \ - myserver --availability-zone edge1 - -On the first node, run the following command to create a volume on the -second node: - -.. code-block:: bash - - openstack volume create --size 1 --availability-zone edge1 myvol - -On the second node, verify that the instance is running locally and -and that the Cinder volume was created on the local Ceph server:: - - [root@overcloud1 ~]# docker exec nova_libvirt virsh list - Id Name State - ---------------------------------------------------- - 1 instance-00000001 running - - [root@overcloud1 ~]# docker exec -ti ceph-mon rbd -p volumes ls -l - NAME SIZE PARENT FMT PROT LOCK - volume-f84ae4f5-cc25-4ed4-8a58-8b1408160e03 1GiB 2 - [root@overcloud1 ~]# - -Topology Details -~~~~~~~~~~~~~~~~ - -Here's a basic diagram of where the connections occur in the system for this -example:: - - +-------------------------+ +-------------------------+ - |standalone|compute|edge|1| |standalone|compute|edge|2| - +-----------------------+-+ +-+-----------------------+ - | | - +----+-------------+----------+ - |standalone|controller|central| - +-----------------------------+ - diff --git a/deploy-guide/source/deployment/template_deploy.rst b/deploy-guide/source/deployment/template_deploy.rst deleted file mode 100644 index 5a7c27b7..00000000 --- a/deploy-guide/source/deployment/template_deploy.rst +++ /dev/null @@ -1,85 +0,0 @@ -Deploying with Heat Templates -============================= - -It is possible to use the ``--templates`` and ``--environment-file`` -options to override specific templates or even deploy using a separate -set of templates entirely. - - -Deploying an Overcloud using the default templates --------------------------------------------------- - -The ``--templates`` option without an argument enables deploying using -the packaged Heat templates:: - - openstack overcloud deploy --templates - -.. note:: - - The default location for the templates is - `/usr/share/openstack-tripleo-heat-templates`. - - -.. _override-heat-templates: - -Overriding specific templates with local versions -------------------------------------------------- - -You may use heat environment files (via the ``--environment-file`` or ``-e`` -option), combined with the ``--templates`` option to override specific -templates, e.g to test a bugfix outside of the location of the packaged -templates. - -The mapping between heat resource types and the underlying templates can be -found in -`/usr/share/\ -openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.j2.yaml` - -Here is an example of copying a specific resource template and overriding -so the deployment uses the local version:: - - mkdir local_templates - cp /usr/share/openstack-tripleo-heat-templates/puppet/controller-puppet.yaml local_templates - cat > override_templates.yaml << EOF - resource_registry: - OS::TripleO::Controller: local_templates/controller-puppet.yaml - EOF - openstack overcloud deploy --templates --environment-file override_templates.yaml - -.. note:: - - The ``--environment-file``/``-e`` option may be specified multiple times, - if duplicate keys are specified in the environment files, the last one - takes precedence. - -.. note:: - - You must also pass the environment files (again using the ``-e`` or - ``--environment-file`` option) whenever you make subsequent changes to the - overcloud, such as :doc:`../post_deployment/scale_roles`, - :doc:`../post_deployment/delete_nodes` or - :doc:`../post_deployment/upgrade/minor_update`. - -.. _custom-template-location: - -Using a custom location for all templates ------------------------------------------ - -You may specify a path to the ``--templates`` option, such that the packaged -tree may be copied to another location, which is useful e.g for developer usage -where you wish to check the templates into a revision control system. - -.. note:: - - Use caution when using this approach as you will need to rebase any local - changes on updates to the openstack-tripleo-heat-templates package, and - care will be needed to avoid modifying anything in the tree which the CLI - tools rely on (such as top-level parameters). In many cases using the - :doc:`ExtraConfig <../features/extra_config>` interfaces or specific template overrides - as outlined above may be preferable. - -Here is an example of copying the entire tripleo-heat-templates tree to a -local directory and launching a deployment using the new location:: - - cp -r /usr/share/openstack-tripleo-heat-templates /home/stack/ - openstack overcloud deploy --templates /home/stack/openstack-tripleo-heat-templates diff --git a/deploy-guide/source/deployment/tips_tricks.rst b/deploy-guide/source/deployment/tips_tricks.rst deleted file mode 100644 index d89ab2c2..00000000 --- a/deploy-guide/source/deployment/tips_tricks.rst +++ /dev/null @@ -1,380 +0,0 @@ -Tips and Tricks for containerizing services -=========================================== - -This document contains a list of tips and tricks that are useful when -containerizing an OpenStack service. - -Important Notes ---------------- - -Podman ------- - -Prior to Stein, containerized OpenStack deployments used Docker. - -Starting with the Stein release, Docker is no longer part of OpenStack, -and Podman has taken its place. The notes here are regarding Stein and later. - -Monitoring containers ---------------------- - -It's often useful to monitor the running containers and see what has been -executed and what not. The puppet containers are created and removed -automatically unless they fail. For all the other containers, it's enough to -monitor the output of the command below:: - - $ watch -n 0.5 sudo podman ps -a --filter label=managed_by=tripleo_ansible - -.. admonition:: Train - :class: stable - - :: - - $ watch -n 0.5 sudo podman ps -a --filter label=managed_by=paunch - -.. _debug-containers: - -Viewing container logs ----------------------- - -You can view the output of the main process running in a container by running:: - - $ sudo podman logs $CONTAINER_ID_OR_NAME - -Since the Stein release, standard out and standard error from containers are -captured in `/var/log/containers/stdouts`. - -We export traditional logs from containers into the `/var/log/containers` -directory on the host, where you can look at them. - -systemd and podman ------------------- - -Throughout this document you'll find references to direct podman commands -for things like restarting services. These are valid and supported methods, -but it's worth noting that services are tied into the systemd management -system, which is often the preferred way to operate. - -Restarting nova_scheduler for example:: - - $ sudo systemctl restart tripleo_nova_scheduler - -Stopping a container with systemd:: - - $ sudo systemctl stop tripleo_nova_scheduler - - -.. _toggle_debug: - -Toggle debug ------------- - -For services that support `reloading their configuration at runtime`_:: - - $ sudo podman exec -u root nova_scheduler crudini --set /etc/nova/nova.conf DEFAULT debug true - $ sudo podman kill -s SIGHUP nova_scheduler - -.. _reloading their configuration at runtime: https://storyboard.openstack.org/#!/story/2001545 - -Restart the container to turn back the configuration to normal:: - - $ sudo podman restart nova_scheduler - -Otherwise, if the service does not yet support reloading its configuration, it -is necessary to change the configuration on the host filesystem and restart the -container:: - - $ sudo crudini --set /var/lib/config-data/puppet-generated/nova/etc/nova/nova.conf DEFAULT debug true - $ sudo podman restart nova_scheduler - -Apply the inverse change to restore the default log verbosity:: - - $ sudo crudini --set /var/lib/config-data/puppet-generated/nova/etc/nova/nova.conf DEFAULT debug false - $ sudo podman restart nova_scheduler - -Debugging container failures ----------------------------- - -The following commands are useful for debugging containers. - -* **inspect**: This command allows for inspecting the container's structure and - metadata. It provides info about the bind mounts on the container, the - container's labels, the container's command, etc:: - - $ sudo podman inspect $CONTAINER_ID_OR_NAME - -* **top**: Viewing processes running within a container is trivial with Podman:: - - $ sudo podman top $CONTAINER_ID_OR_NAME - -* **exec**: Running commands on or attaching to a running container is extremely - useful to get a better understanding of what's happening in the container. - It's possible to do so by running the following command:: - - $ sudo podman exec -ti $CONTAINER_ID_OR_NAME /bin/bash - - Replace the `/bin/bash` above with other commands to run oneshot commands. For - example:: - - $ sudo podman exec -ti mysql mysql -u root -p $PASSWORD - - The above will start a mysql shell on the mysql container. - -* **export** When the container fails, it's basically impossible to know what - happened. It's possible to get the logs from docker but those will contain - things that were printed on the stdout by the entrypoint. Exporting the - filesystem structure from the container will allow for checking other logs - files that may not be in the mounted volumes:: - - $ sudo podman export $CONTAINER_ID_OR_NAME -o $CONTAINER_ID_OR_NAME.tar - -Debugging with tripleo_container_manage Ansible role ----------------------------------------------------- - -The debugging manual for tripleo_container_manage is documented in the role_ -directly. - -.. _role: https://docs.openstack.org/tripleo-ansible/latest/roles/role-tripleo_container_manage.html#debug - -Debugging with Paunch ---------------------- - -.. note:: During Ussuri cycle, Paunch has been replaced by the - tripleo_container_manage Ansible role. Therefore, the following block - is deprecated in favor of the new role which contains a Debug manual. - -The ``paunch debug`` command allows you to perform specific actions on a given -container. This can be used to: - -* Run a container with a specific configuration. -* Dump the configuration of a given container in either json or yaml. -* Output the docker command line used to start the container. -* Run a container with any configuration additions you wish such that you can - run it with a shell as any user etc. - -The configuration options you will likely be interested in include: - -:: - - --file YAML or JSON file containing configuration data - --action Action can be one of: "dump-json", "dump-yaml", - "print-cmd", or "run" - --container Name of the container you wish to manipulate - --interactive Run container in interactive mode - modifies config - and execution of container - --shell Similar to interactive but drops you into a shell - --user Start container as the specified user - --overrides JSON configuration information used to override - default config values - --default-runtime Default runtime for containers. Can be docker or - podman. - -``file`` is the name of the configuration file to use -containing the configuration for the container you wish to use. -TripleO creates configuration files for starting containers in -``/var/lib/tripleo-config/container-startup-config``. If you look in this directory -you will see a number of files corresponding with the steps in -TripleO heat templates. Most of the time, you will likely want to use -``/var/lib/tripleo-config/container-startup-config/step_4`` -as it contains most of the final startup configurations for the running -containers. - -``shell``, ``user`` and ``interactive`` are available as shortcuts that -modify the configuration to easily allow you to run an interactive session -in a given container. - -To make sure you get the right container you can use the ``paunch list`` -command to see what containers are running and which config id they -are using. This config id corresponds to which file you will find the -container configuration in. - -TripleO uses ``managed_by`` and ``config_id`` labels to help identify the -containers it is managing. These can be checked by inspecting the labels section -like so: - -:: - - # podman inspect nova_api | jq '.[0].Config.Labels | "managed_by=\(.managed_by) config_id=\(.config_id)"' - "managed_by=tripleo-Controller config_id=tripleo_step4" - -Note that if you wish to replace a currently running container you will -want to ``sudo podman rm -f`` the running container before starting a new one. - -Here is an example of using ``paunch debug`` to start a root shell inside the -heat api container: - -:: - - # paunch debug --file /var/lib/tripleo-config/container-startup-config/step_4 --managed-by=tripleo-Controller --config-id=tripleo_step4 --interactive --shell --user root --container nova_api --action run - -This will drop you into an interactive session inside the heat api container, -starting /bin/bash running as root. - -To see how this container is started by TripleO: - -:: - - # paunch debug --file /var/lib/tripleo-config/container-startup-config/step_4 --managed-by=tripleo-Controller --config-id=tripleo_step4 --container nova_api --action print-cmd - - podman run --name nova_api-1jpm5kyv --label config_id=tripleo_step4 --label container_name=nova_api --label managed_by=tripleo-Controller --label config_data={"environment": {"KOLLA_CONFIG_STRATEGY": "COPY_ALWAYS", "TRIPLEO_CONFIG_HASH": "5cbcd2d39667626874f547214d3980ec"}, "healthcheck": {"test": "/openstack/healthcheck"}, "image": "undercloud-0.ctlplane.redhat.local:8787/rh-osbs/rhosp16-openstack-nova-api:16.1_20210726.1", "net": "host", "privileged": false, "restart": "always", "start_order": 2, "user": "root", "volumes": ["/etc/hosts:/etc/hosts:ro", "/etc/localtime:/etc/localtime:ro", "/etc/pki/ca-trust/extracted:/etc/pki/ca-trust/extracted:ro", "/etc/pki/ca-trust/source/anchors:/etc/pki/ca-trust/source/anchors:ro", "/etc/pki/tls/certs/ca-bundle.crt:/etc/pki/tls/certs/ca-bundle.crt:ro", "/etc/pki/tls/certs/ca-bundle.trust.crt:/etc/pki/tls/certs/ca-bundle.trust.crt:ro", "/etc/pki/tls/cert.pem:/etc/pki/tls/cert.pem:ro", "/dev/log:/dev/log", "/etc/puppet:/etc/puppet:ro", "/var/log/containers/nova:/var/log/nova:z", "/var/log/containers/httpd/nova-api:/var/log/httpd:z", "/var/lib/kolla/config_files/nova_api.json:/var/lib/kolla/config_files/config.json:ro", "/var/lib/config-data/puppet-generated/nova:/var/lib/kolla/config_files/src:ro"]} --conmon-pidfile=/var/run/nova_api-1jpm5kyv.pid --detach=true --env=KOLLA_CONFIG_STRATEGY=COPY_ALWAYS --env=TRIPLEO_CONFIG_HASH=5cbcd2d39667626874f547214d3980ec --net=host --privileged=false --user=root --volume=/etc/hosts:/etc/hosts:ro --volume=/etc/localtime:/etc/localtime:ro --volume=/etc/pki/ca-trust/extracted:/etc/pki/ca-trust/extracted:ro --volume=/etc/pki/ca-trust/source/anchors:/etc/pki/ca-trust/source/anchors:ro --volume=/etc/pki/tls/certs/ca-bundle.crt:/etc/pki/tls/certs/ca-bundle.crt:ro --volume=/etc/pki/tls/certs/ca-bundle.trust.crt:/etc/pki/tls/certs/ca-bundle.trust.crt:ro --volume=/etc/pki/tls/cert.pem:/etc/pki/tls/cert.pem:ro --volume=/dev/log:/dev/log --volume=/etc/puppet:/etc/puppet:ro --volume=/var/log/containers/nova:/var/log/nova:z --volume=/var/log/containers/httpd/nova-api:/var/log/httpd:z --volume=/var/lib/kolla/config_files/nova_api.json:/var/lib/kolla/config_files/config.json:ro --volume=/var/lib/config-data/puppet-generated/nova:/var/lib/kolla/config_files/src:ro undercloud-0.ctlplane.redhat.local:8787/rh-osbs/rhosp16-openstack-nova-api:16.1_20210726.1 - -You can also dump the configuration of a container to a file so you can -edit it and rerun it with different a different configuration: - -:: - - # paunch debug --file /var/lib/tripleo-config/container-startup-config/step_4 --container nova_api --action dump-json > nova_api.json - -You can then use ``nova_api.json`` as your ``--file`` argument after -editing it to your liking. - -To add configuration elements on the command line you can use the -``overrides`` option. In this example I'm adding a health check to -the container: - -:: - - # paunch debug --file nova_api.json --overrides '{"health-cmd": "/usr/bin/curl -f http://localhost:8004/v1/", "health-interval": "30s"}' --container nova_api --managed-by=tripleo-Controller --config-id=tripleo_step4 --action run - f47949a7cb205083a3adaa1530fcdd4ed7dcfa9b9afb4639468357b36786ecf0 - -Debugging container-puppet.py ------------------------------ - -The :ref:`container-puppet.py` script manages the config file generation and -puppet tasks for each service. This also exists in the `common` directory -of tripleo-heat-templates. When writing these tasks, it's useful to be -able to run them manually instead of running them as part of the entire -stack. To do so, one can run the script as shown below:: - - CONFIG=/path/to/task.json /path/to/container-puppet.py - -.. note:: Prior to the Train cycle, container-puppet.py was called - docker-puppet.py which was located in the `docker` directory. - -The json file must follow the following form:: - - [ - { - "config_image": ..., - "config_volume": ..., - "puppet_tags": ..., - "step_config": ... - } - ] - - -Using a more realistic example. Given a `puppet_config` section like this:: - - puppet_config: - config_volume: glance_api - puppet_tags: glance_api_config,glance_api_paste_ini,glance_swift_config,glance_cache_config - step_config: {get_attr: [GlanceApiPuppetBase, role_data, step_config]} - config_image: {get_param: DockerGlanceApiConfigImage} - - -Would generated a json file called `/var/lib/container-puppet/container-puppet-tasks2.json` that looks like:: - - [ - { - "config_image": "tripleomaster/centos-binary-glance-api:latest", - "config_volume": "glance_api", - "puppet_tags": "glance_api_config,glance_api_paste_ini,glance_swift_config,glance_cache_config", - "step_config": "include ::tripleo::profile::base::glance::api\n" - } - ] - - -Setting the path to the above json file as the `CONFIG` environment -variable passed to `container-puppet.py` will create a container using -the `centos-binary-glance-api:latest` image and it and run puppet on a -catalog restricted to the given puppet `puppet_tags`. - -As mentioned above, it's possible to create custom json files and call -`container-puppet.py` manually, which makes developing and debugging puppet -steps easier. - -`container-puppet.py` also supports the environment variable `SHOW_DIFF`, -which causes it to print out a docker diff of the container before and -after the configuration step has occurred. - -By default `container-puppet.py` runs things in parallel. This can make -it hard to see the debug output of a given container so there is a -`PROCESS_COUNT` variable that lets you override this. A typical debug -run for container-puppet might look like:: - - SHOW_DIFF=True PROCESS_COUNT=1 CONFIG=glance_api.json ./container-puppet.py - -Testing a code fix in a container ---------------------------------- -Let's assume that we need to test a code patch or an updated package in a -container. We will look at a few steps that can be taken to test a fix -in a container on an existing deployment. - -For example let's update packages for the mariadb container:: - - (undercloud) [stack@undercloud ~]$ sudo podman images | grep mariadb - 192.168.24.1:8787/tripleomaster/centos-binary-mariadb latest 035a8237c376 2 weeks ago 723.5 MB - -So container image `035a8237c376` is the one we need to base our work on. Since -container images are supposed to be immutable we will base our work off of -`035a8237c376` and create a new one:: - - mkdir -p galera-workaround - cat > galera-workaround/Dockerfile < - - For minimal **HA (high availability)** deployment you need at least 3 Overcloud - Controller machines and 2 Overcloud Compute machines. - -The baremetal machines must meet the following minimum specifications: - -* 8 core CPU -* 12 GB memory -* 60 GB free disk space - -Larger systems are recommended for production deployments, however. - -For instance, the undercloud needs a bit more capacity, especially regarding RAM (minimum of 16G is advised) -and is pretty intense for the I/O - fast disks (SSD, SAS) are strongly advised. - -Please also note the undercloud needs space in order to store twice the "overcloud-full" image (one time -in its glance, one time in /var/lib subdirectories for PXE/TFTP). - -TripleO is supporting only the following operating systems: - -* RHEL 9 (x86_64) -* CentOS Stream 9 (x86_64) - -Please also ensure your node clock is set to UTC in order to prevent any issue -when the OS hwclock syncs to the BIOS clock before applying timezone offset, -causing files to have a future-dated timestamp. - - -Preparing the Baremetal Environment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Networking -^^^^^^^^^^ - -The overcloud nodes will be deployed from the undercloud machine and therefore the machines need to have their network settings modified to allow for the overcloud nodes to be PXE booted using the undercloud machine. As such, the setup requires that: - -* All overcloud machines in the setup must support IPMI -* A management provisioning network is setup for all of the overcloud machines. - One NIC from every machine needs to be in the same broadcast domain of the - provisioning network. In the tested environment, this required setting up a new - VLAN on the switch. Note that you should use the same NIC on each of the - overcloud machines ( for example: use the second NIC on each overcloud - machine). This is because during installation we will need to refer to that NIC - using a single name across all overcloud machines e.g. em2 -* The provisioning network NIC should not be the same NIC that you are using - for remote connectivity to the undercloud machine. During the undercloud - installation, a openvswitch bridge will be created for Neutron and the - provisioning NIC will be bridged to the openvswitch bridge. As such, - connectivity would be lost if the provisioning NIC was also used for remote - connectivity to the undercloud machine. -* The overcloud machines can PXE boot off the NIC that is on the private VLAN. - In the tested environment, this required disabling network booting in the BIOS - for all NICs other than the one we wanted to boot and then ensuring that the - chosen NIC is at the top of the boot order (ahead of the local hard disk drive - and CD/DVD drives). -* For each overcloud machine you have: the MAC address of the NIC that will PXE - boot on the provisioning network the IPMI information for the machine (i.e. IP - address of the IPMI NIC, IPMI username and password) - -Refer to the following diagram for more information - -.. image:: ../_images/TripleO_Network_Diagram_.jpg - -Setting Up The Undercloud Machine -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -#. Select a machine within the baremetal environment on which to install the - undercloud. -#. Install RHEL 9 x86_64 or CentOS Stream 9 x86_64 on this machine. -#. If needed, create a non-root user with sudo access to use for installing the - Undercloud:: - - sudo useradd stack - sudo passwd stack # specify a password - echo "stack ALL=(root) NOPASSWD:ALL" | sudo tee -a /etc/sudoers.d/stack - sudo chmod 0440 /etc/sudoers.d/stack - -.. admonition:: RHEL - :class: rhel - - If using RHEL, register the Undercloud for package installations/updates. - - .. admonition:: RHEL Portal Registration - :class: portal - - Register the host machine using Subscription Management:: - - sudo subscription-manager register --username="[your username]" --password="[your password]" - # Find this with `subscription-manager list --available` - sudo subscription-manager attach --pool="[pool id]" - # Verify repositories are available - sudo subscription-manager repos --list - # Enable repositories needed - sudo subscription-manager repos \ - --enable=rhel-8-for-x86_64-baseos-eus-rpms \ - --enable=rhel-8-for-x86_64-appstream-eus-rpms \ - --enable=rhel-8-for-x86_64-highavailability-eus-rpms \ - --enable=ansible-2.9-for-rhel-8-x86_64-rpms - - .. admonition:: RHEL Satellite Registration - :class: satellite - - To register the host machine to a Satellite, the following repos must - be synchronized on the Satellite and enabled for registered systems:: - - rhel-8-for-x86_64-baseos-eus-rpms - rhel-8-for-x86_64-appstream-eus-rpms - rhel-8-for-x86_64-highavailability-eus-rpms - ansible-2.9-for-rhel-8-x86_64-rpms - - See the `Red Hat Satellite User Guide`_ for how to configure the system to - register with a Satellite server. It is suggested to use an activation - key that automatically enables the above repos for registered systems. - -.. _Red Hat Satellite User Guide: https://access.redhat.com/documentation/en-US/Red_Hat_Satellite/ - - -Validations -^^^^^^^^^^^ - -You can run the ``prep`` validations to verify the hardware. Later in -the process, the validations will be run by the undercloud processes. -Refer to the Ansible section for running directly the validations -over baremetal nodes `validations_no_undercloud`_. - -Configuration Files -^^^^^^^^^^^^^^^^^^^ - -.. _instackenv: - -instackenv.json -^^^^^^^^^^^^^^^ - -Create a JSON file describing your Overcloud baremetal nodes, call it -``instackenv.json`` and place in your home directory. The file should contain -a JSON object with the only field ``nodes`` containing list of node -descriptions. - -Each node description should contains required fields: - -* ``pm_type`` - driver for Ironic nodes, see `Ironic Hardware Types`_ - for details - -* ``pm_addr`` - node BMC IP address (hypervisor address in case of virtual - environment) - -* ``pm_user``, ``pm_password`` - node BMC credentials - -Some fields are optional if you're going to use introspection later: - -* ``ports`` - list of baremetal port objects, a map specifying the following - keys: address, physical_network (optional) and local_link_connection - (optional). Optional for bare metal. Example:: - - "ports": [ - { - "address": "52:54:00:87:c8:2f", - "physical_network": "physical-network", - "local_link_connection": { - "switch_info": "switch", - "port_id": "gi1/0/11", - "switch_id": "a6:18:66:33:cb:48" - } - } - ] - -* ``cpu`` - number of CPU's in system - -* ``arch`` - CPU architecture (common values are ``i386`` and ``x86_64``) - -* ``memory`` - memory size in MiB - -* ``disk`` - hard driver size in GiB - -It is also possible (but optional) to set Ironic node capabilities directly -in the JSON file. This can be useful for assigning node profiles or setting -boot options at registration time: - -* ``capabilities`` - Ironic node capabilities. For example:: - - "capabilities": "profile:compute,boot_option:local" - -There are also two additional and optional fields that can be used to help a -user identifying machines inside ``instackenv.json`` file: - -* ``name`` - name associated to the node, it will appear in the ``Name`` - column while listing nodes - -* ``_comment`` to associate a comment to the node (like position, long - description and so on). Note that this field will not be considered by - Ironic during the import - -Also if you're working in a diverse environment with multiple architectures -and/or platforms within an architecture you may find it necessary to include a -platform field: - -* ``platform`` - String paired with images to fine tune image selection - -For example:: - - { - "nodes": [ - { - "name": "node-a", - "pm_type": "ipmi", - "ports": [ - { - "address": "fa:16:3e:2a:0e:36", - "physical_network": "ctlplane" - } - ], - "cpu": "2", - "memory": "4096", - "disk": "40", - "arch": "x86_64", - "pm_user": "admin", - "pm_password": "password", - "pm_addr": "10.0.0.8", - "_comment": "Room 1 - Rack A - Unit 22/24" - }, - { - "name": "node-b", - "pm_type": "ipmi", - "ports": [ - { - "address": "fa:16:3e:da:39:c9", - "physical_network": "ctlplane" - } - ], - "cpu": "2", - "memory": "4096", - "disk": "40", - "arch": "x86_64", - "pm_user": "admin", - "pm_password": "password", - "pm_addr": "10.0.0.15", - "_comment": "Room 1 - Rack A - Unit 26/28" - }, - { - "name": "node-n", - "pm_type": "ipmi", - "ports": [ - { - "address": "fa:16:3e:51:9b:68", - "physical_network": "leaf1" - } - ], - "cpu": "2", - "memory": "4096", - "disk": "40", - "arch": "x86_64", - "pm_user": "admin", - "pm_password": "password", - "pm_addr": "10.0.0.16", - "_comment": "Room 1 - Rack B - Unit 10/12" - } - ] - } - - -.. note:: - You don't need to create this file, if you plan on using - :doc:`../provisioning/node_discovery`. - -Ironic Hardware Types -^^^^^^^^^^^^^^^^^^^^^ - -Ironic *hardware types* provide various level of support for different -hardware. Hardware types, introduced in the Ocata cycle, are a new generation -of Ironic *drivers*. Previously, the word *drivers* was used to refer to what -is now called *classic drivers*. See `Ironic drivers documentation`_ for a full -explanation of similarities and differences between the two types. - -Hardware types are enabled in the ``undercloud.conf`` using the -``enabled_hardware_types`` configuration option. Classic drivers are enabled -using the ``enabled_drivers`` option. It has been deprecated since the Queens -release and should no longer be used. See the `hardware types migration guide`_ -for information on how to migrate existing nodes. - -Both hardware types and classic drivers can be equally used in the -``pm_addr`` field of the ``instackenv.json``. - -See https://docs.openstack.org/ironic/latest/admin/drivers.html for the most -up-to-date information about Ironic hardware types and hardware -interfaces, but note that this page always targets Ironic git master, not the -release we use. - -Generic Hardware Types -~~~~~~~~~~~~~~~~~~~~~~~ - -* This most generic hardware type is ipmi_. It uses the `ipmitool`_ utility - to manage a bare metal node, and supports a vast variety of hardware. - - .. admonition:: Stable Branch - :class: stable - - This hardware type is supported starting with the Pike release. For older - releases use the functionally equivalent ``pxe_ipmitool`` driver. - - .. admonition:: Virtual - :class: virtual - - This hardware type can be used for developing and testing TripleO in a - :doc:`virtual` as well. - -* Another generic hardware type is redfish_. It provides support for the - quite new `Redfish standard`_, which aims to replace IPMI eventually as - a generic protocol for managing hardware. In addition to the ``pm_*`` fields - mentioned above, this hardware type also requires setting ``pm_system_id`` - to the full identifier of the node in the controller (e.g. - ``/redfish/v1/Systems/42``). - - .. admonition:: Stable Branch - :class: stable - - Redfish support was introduced in the Pike release. - -The following generic hardware types are not enabled by default: - -* The snmp_ hardware type supports controlling PDUs for power management. - It requires boot device to be manually configured on the nodes. - -* Finally, the ``manual-management`` hardware type (not enabled by default) - skips power and boot device management completely. It requires manual power - and boot operations to be done at the right moments, so it's not recommended - for a generic production. - - .. admonition:: Stable Branch - :class: stable - - The functional analog of this hardware type before the Queens release - was the ``fake_pxe`` driver. - -Vendor Hardware Types -~~~~~~~~~~~~~~~~~~~~~ - -TripleO also supports vendor-specific hardware types for some types -of hardware: - -* ilo_ targets HPE Proliant Gen 8 and Gen 9 systems. - - .. admonition:: Stable Branch - :class: stable - - Use the ``pxe_ilo`` classic driver before the Queens release. - -* idrac_ targets DELL 12G and newer systems. - - .. admonition:: Stable Branch - :class: stable - - Use the ``pxe_drac`` classic driver before the Queens release. - -The following hardware types are supported but not enabled by default: - -* irmc_ targets FUJITSU PRIMERGY servers. - -* cisco-ucs-managed_ targets UCS Manager managed Cisco UCS B/C series servers. - -* cisco-ucs-standalone_ targets standalone Cisco UCS C series servers. - -.. note:: - Contact a specific vendor team if you have problems with any of these - drivers, as the TripleO team often cannot assist with them. - -.. _Ironic drivers documentation: https://docs.openstack.org/ironic/latest/install/enabling-drivers.html -.. _hardware types migration guide: https://docs.openstack.org/ironic/latest/admin/upgrade-to-hardware-types.html -.. _ipmitool: http://sourceforge.net/projects/ipmitool/ -.. _Redfish standard: https://www.dmtf.org/standards/redfish -.. _ipmi: https://docs.openstack.org/ironic/latest/admin/drivers/ipmitool.html -.. _redfish: https://docs.openstack.org/ironic/latest/admin/drivers/redfish.html -.. _snmp: https://docs.openstack.org/ironic/latest/admin/drivers/snmp.html -.. _ilo: https://docs.openstack.org/ironic/latest/admin/drivers/ilo.html -.. _idrac: https://docs.openstack.org/ironic/latest/admin/drivers/idrac.html -.. _irmc: https://docs.openstack.org/ironic/latest/admin/drivers/irmc.html -.. _cisco-ucs-managed: https://docs.openstack.org/ironic/latest/admin/drivers/ucs.html -.. _cisco-ucs-standalone: https://docs.openstack.org/ironic/latest/admin/drivers/cimc.html -.. _validations_no_undercloud: ../../validations/ansible.html diff --git a/deploy-guide/source/environments/index.rst b/deploy-guide/source/environments/index.rst deleted file mode 100644 index 44701836..00000000 --- a/deploy-guide/source/environments/index.rst +++ /dev/null @@ -1,12 +0,0 @@ -Environment Setup -================= - -|project| can be used in baremetal as well as in virtual environments. This -section contains instructions on how to setup your environments properly. - -.. toctree:: - :maxdepth: 2 - - standalone - virtual - baremetal diff --git a/deploy-guide/source/environments/standalone.rst b/deploy-guide/source/environments/standalone.rst deleted file mode 100644 index 7ee4a1f3..00000000 --- a/deploy-guide/source/environments/standalone.rst +++ /dev/null @@ -1,12 +0,0 @@ -Standalone Environment ----------------------- -.. include_after_header - -|project| can be used as a standalone environment with all services installed -on a single virtual or baremetal machine. - -The machine you are deploying on must meet the following minimum specifications: - -* 4 core CPU -* 8 GB memory -* 60 GB free disk space diff --git a/deploy-guide/source/environments/virtual.rst b/deploy-guide/source/environments/virtual.rst deleted file mode 100644 index 97678885..00000000 --- a/deploy-guide/source/environments/virtual.rst +++ /dev/null @@ -1,14 +0,0 @@ -Virtual Environment -------------------- - -|project| can be used in a virtual environment using virtual machines instead -of actual baremetal. However, one baremetal machine is still -needed to act as the host for the virtual machines. - -.. warning:: Virtual deployments with TripleO are for development and testing - purposes only. This method cannot be used for production-ready - deployments. - -The tripleo-quickstart project is used for creating virtual environments -for use with TripleO. Please see that documentation at -https://docs.openstack.org/tripleo-quickstart/ diff --git a/deploy-guide/source/features/api_policies.rst b/deploy-guide/source/features/api_policies.rst deleted file mode 100644 index 59483350..00000000 --- a/deploy-guide/source/features/api_policies.rst +++ /dev/null @@ -1,28 +0,0 @@ -Configuring API access policies -=============================== - -Each OpenStack service, has its own role-based access policies. -They determine which user can access which resources in which way, -and are defined in the service’s policy.json file. - -.. Warning:: - - While editing policy.json is supported, modifying the policy can - have unexpected side effects and is not encouraged. - -|project| supports custom API access policies through parameters in -TripleO Heat Templates. -To enable this feature, you need to use some parameters to enable -the custom policies on the services you want. - -Creating an environment file and adding the following arguments to your -``openstack overcloud deploy`` command will do the trick:: - - $ cat ~/nova-policies.yaml - parameter_defaults: - NovaApiPolicies: { nova-context_is_admin: { key: 'compute:get_all', value: '' } } - - -e nova-policies.yaml - -In this example, we allow anyone to list Nova instances, which is very insecure but -can be done with this feature. diff --git a/deploy-guide/source/features/backends.rst b/deploy-guide/source/features/backends.rst deleted file mode 100644 index 4cd7b050..00000000 --- a/deploy-guide/source/features/backends.rst +++ /dev/null @@ -1,16 +0,0 @@ -Backend Configuration -===================== - -Documentation on how to enable and configure various backends available for -OpenStack projects. - - -.. toctree:: - - deploy_manila - cinder_custom_backend - cinder_netapp - deployed_ceph - ceph_external - domain_specific_ldap_backends - swift_external diff --git a/deploy-guide/source/features/baremetal_overcloud.rst b/deploy-guide/source/features/baremetal_overcloud.rst deleted file mode 100644 index b05bd3ff..00000000 --- a/deploy-guide/source/features/baremetal_overcloud.rst +++ /dev/null @@ -1,1169 +0,0 @@ -Bare Metal Instances in Overcloud -================================= - -This documentation explains installing Ironic for providing bare metal -instances in the overcloud to end users. This feature is supported starting -with Newton. - -Architecture and requirements ------------------------------ - -By default, TripleO installs ironic API and conductor services on the -controller nodes. In an HA configuration the 3 conductor services form a hash -ring and balance the nodes across it. For a really big bare metal cloud it's -highly recommended to move ironic-conductor services to separate roles, use -the `IronicConductor role shipped with TripleO`_ as an example. - -.. note:: - Ironic services and API in the overcloud and in the undercloud are - completely independent. - -It is recommended to have at least 12 GiB of RAM on the undercloud and -controllers. The controllers (or separate ironic-conductor roles) should have -enough disk space to keep a cache of user instance images, at least 50 GiB -is recommended. - -It's also highly recommended that you use at least two networks: - -* Undercloud provisioning network (connects undercloud and overcloud nodes) - -* Overcloud provisioning network (connects overcloud nodes and tenant bare - metal instances) - -Preparing undercloud --------------------- - -If you already have an ``instackenv.json`` file with all nodes prepared, you -might want to leave some of the nodes for overcloud instances. E.g. if you have -three nodes in the ``instackenv.json``, you can split them:: - - jq '.nodes[0:2] | {nodes: .}' instackenv.json > undercloud.json - -The format of the remaining nodes is TripleO-specific, so we need -to convert it to something Ironic can understand without using -TripleO workflows. E.g. for node using IPMI:: - - jq '.nodes[2:3] | {nodes: map({driver: .pm_type, name: .name, - driver_info: {ipmi_username: .pm_user, ipmi_address: .pm_addr, - ipmi_password: .pm_password, ipmi_port: .pm_port}, - properties: {cpus: .cpu, cpu_arch: .arch, - local_gb: .disk, memory_mb: .memory}, - ports: .mac | map({address: .})})}' instackenv.json > overcloud-nodes.yaml - -.. note:: - This command intentionally omits the capabilities, as they are often - TripleO-specific, e.g. they force local boot instead of network boot used - by default in Ironic. - -Then enroll only ``undercloud.json`` in your undercloud:: - - source stackrc - openstack overcloud node import --provide undercloud.json - -.. admonition:: Virtual - :class: virtual - - If you used **tripleo-quickstart**, you may have to delete the nodes that - did not end up in undercloud.json. - -Configuring and deploying ironic --------------------------------- - -Ironic can be installed by including one of the environment files shipped with -TripleO, however, in most of the cases you'll want to tweak certain parameters. -This section assumes that a custom environment file called -``ironic-config.yaml`` exists. Please pay particular attention to parameters -described in `Essential configuration`_. - -Essential configuration -~~~~~~~~~~~~~~~~~~~~~~~ - -The following parameters should be configured in advance for overcloud Ironic -in an environment file: - -* ``IronicEnabledHardwareTypes`` configures which hardware types will be - supported in Ironic. - - .. note:: - Hardware types are the new generation of Ironic drivers. For example, - the ``ipmi`` hardware type roughly corresponds to the ``pxe_ipmitool`` - driver. Check `driver configuration guide`_ and `driver-specific - documentation`_ for more details. - - When enabling hardware types, you usually have to enable more hardware - interfaces that these types are compatible with. For example, when enabling - the ``redfish`` hardware type, also enable ``redfish`` power and management - interfaces. For example:: - - parameter_defaults: - IronicEnabledHardwareTypes: - - ipmi - - redfish - IronicEnabledPowerInterfaces: - - ipmitool - - redfish - IronicEnabledManagementInterfaces: - - ipmitool - - redfish - - Some drivers might require additional configuration to work properly. Check - `driver configuration guide`_ and `driver-specific documentation`_ for more - details. - - By default, the ``ipmi`` hardware type is enabled. - - .. admonition:: Stable Branches - :class: stable - - The ``IronicEnabledDrivers`` option can also be used for releases prior - to Queens. It sets the list of enabled classic drivers. The most often used - bare metal driver is ``pxe_ipmitool``. Also enabled by default are - ``pxe_ilo`` and ``pxe_drac`` drivers. - -* ``IronicCleaningDiskErase`` configures erasing hard drives - before the first and after every deployment. There are two recommended - values: ``full`` erases all data and ``metadata`` erases only disk metadata. - The former is more secure, the latter is faster. - - .. admonition:: Virtual - :class: virtual - - It is highly recommended to set this parameter to ``metadata`` - for virtual environments, as full cleaning can be extremely slow there. - -.. admonition:: Stable Branches - :class: stable - - ``NovaSchedulerDefaultFilters`` configures available scheduler filters. - Before the Stein release, the ``AggregateInstanceExtraSpecsFilter`` could be - used to separate flavors targeting virtual and bare metal instances. - Starting with the Stein release, a flavor can only target one of them, so - no additional actions are needed. - -Additional configuration -~~~~~~~~~~~~~~~~~~~~~~~~ - -* ``IronicCleaningNetwork`` sets the name or UUID of the **overcloud** network - to use for node cleaning. Initially is set to ``provisioning`` and should be - set to an actual UUID later when `Configuring networks`_. - - Similarly, there are ``IronicProvisioningNetwork`` and - ``IronicRescuingNetwork``. See `Configuring networks`_ for details. - -* ``IronicDefaultBootOption`` specifies whether the instances will boot from - local disk (``local``) or from PXE or iPXE (``netboot``). This parameter was - introduced in the Pike release with the default value of ``local``. Before - that ``netboot`` was used by default. - - .. note:: - This value can be overridden per node by setting the ``boot_option`` - capability on both the node and a flavor. - -* ``IronicDefaultDeployInterface`` specifies the way a node is deployed, see - the `deploy interfaces documentation`_ for details. The default is ``iscsi``, - starting with the Rocky release the ``direct`` deploy is also configured out - of box. The ``ansible`` deploy interface requires extensive configuration as - described in :doc:`../provisioning/ansible_deploy_interface`. - -* ``IronicDefaultNetworkInterface`` specifies the network management - implementation for bare metal nodes. The default value of ``flat`` means - that the provisioning network is shared between all nodes, and will also be - available to tenants. - - If you configure an ML2 mechanism driver that supports bare metal port - binding (networking-fujitsu, networking-cisco and some others), then you can - use the ``neutron`` implementation. In that case, Ironic and Neutron will - fully manage networking for nodes, including plugging and unplugging - the provision and cleaning network. The ``IronicProvisioningNetwork`` - parameter has to be configured in a similar way to ``IronicCleaningNetwork`` - (and in most cases to the same value). See - `Configuring ml2-ansible for multi-tenant networking`_ for a brief example - and `multi-tenant networking documentation`_ for more details. - - .. note:: - Please check with your switch vendor to learn if your switch and its - ML2 driver support bare metal port binding. - - Alternatively, you can use the networking-ansible_ ML2 plugin, which - supports a large variety of switch vendors and models. It is supported - by TripleO starting with the Rocky release. - -* ``IronicImageDownloadSource`` when using the ``direct`` deploy interface this - option (introduced in the Stein release) specifies what serves as a source - for pulling the image from **ironic-python-agent**: - - * ``swift`` (the default) pulls the image from an Object Storage service - (swift) temporary URL. This requires the Image service (glance) to be - backed by the Object Storage service. If the image is not in the *raw* - format, it will be converted in memory on the target node, so enough RAM - is required. - - * ``http`` makes **ironic-conductor** cache the image on the local HTTP - server (the same as for iPXE) and serve it from there. The image gets - converted to *raw* format by default and thus can be served directly to the - target block device without in-memory conversion. - -Using a Custom Network for Overcloud Provisioning -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The Pike release provided the ability to define a custom network, -this has been further enhanced in Queens to allow for the definition -of a VLAN in the network definition. Using a custom network to provision -Overcloud nodes for Ironic has the advantage of moving all Ironic services -off of the Undercloud Provisioning network (control plane) so that routing or -bridging to the control plane is not necessary. This can increase security, -and isolates tenant bare metal node provisioning from the overcloud node -provisioning done by the undercloud. - -Follow the instructions in :doc:`custom_networks` to add an additional network, -in this example called OcProvisioning, to ``network_data.yaml``:: - - # custom network for Overcloud provisioning - - name: OcProvisioning - name_lower: oc_provisioning - vip: true - vlan: 205 - ip_subnet: '172.23.3.0/24' - allocation_pools: [{'start': '172.23.3.10', 'end': '172.23.3.200'}] - -The ServiceNetMap can be updated in ``network-environment.yaml`` to move the -Ironic services used for Overcloud provisioning to the new network:: - - ServiceNetMap: - IronicApiNetwork: oc_provisioning # changed from ctlplane - IronicNetwork: oc_provisioning # changed from ctlplane - -Add the new network to the roles file ``roles_data.yaml`` for -controller:: - - networks: - - External - - InternalApi - - Storage - - StorageMgmt - - Tenant - - OcProvisioning - -Add the new network to the NIC config controller.yaml file. Starting in Queens, -the example NIC config files will automatically populated with this new network -when it is in ``network_data.yaml`` and ``roles_data.yaml`` so this step is -not necessary:: - - - type: vlan - vlan_id: - get_param: OcProvisioningNetworkVlanID - addresses: - - ip_netmask: - get_param: OcProvisioningIpSubnet - -.. note:: - The baremetal nodes will send and received untagged VLAN traffic - in order to properly run DHCP and PXE boot. - -Deployment -~~~~~~~~~~ - -Add the ironic environment file when deploying:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/services/ironic-overcloud.yaml \ - -e ironic-config.yaml - -To deploy Ironic in containers for Pike-Rocky releases please, use -``/usr/share/openstack-tripleo-heat-templates/environments/services-docker/ironic.yaml`` -instead. - -.. note:: - We don't require any virtual compute nodes for the bare metal only case, - so feel free to set ``ComputeCount: 0`` in your environment file, if you - don't need them. - -If using a custom network in Pike or later, include the ``network_data.yaml`` -and ``roles_data.yaml`` files in the deployment:: - - -n /home/stack/network_data.yaml \ - -r /home/stack/roles_data.yaml \ - -In addition, if ``network-environment.yaml`` was updated to include the -ServiceNetMap changes, include the updated and generated -``network-environment.yaml`` files:: - - -e /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml \ - -e /home/stack/templates/environments/network-environment.yaml \ - -Validation -~~~~~~~~~~ - -Check that Ironic works by connecting to the overcloud and trying to list the -nodes (you should see an empty response, but not an error):: - - source overcloudrc - baremetal node list - -You can also check the enabled driver list:: - - $ baremetal driver list - +---------------------+-------------------------+ - | Supported driver(s) | Active host(s) | - +---------------------+-------------------------+ - | ipmi | overcloud-controller-0. | - | pxe_drac | overcloud-controller-0. | - | pxe_ilo | overcloud-controller-0. | - | pxe_ipmitool | overcloud-controller-0. | - | redfish | overcloud-controller-0. | - +---------------------+-------------------------+ - -.. note:: - This commands shows both hardware types and classic drivers combined. - -For HA configuration you should see all three controllers:: - - $ baremetal driver list - +---------------------+------------------------------------------------------------------------------------------------------------+ - | Supported driver(s) | Active host(s) | - +---------------------+------------------------------------------------------------------------------------------------------------+ - | ipmi | overcloud-controller-0.localdomain, overcloud-controller-1.localdomain, overcloud-controller-2.localdomain | - | pxe_drac | overcloud-controller-0.localdomain, overcloud-controller-1.localdomain, overcloud-controller-2.localdomain | - | pxe_ilo | overcloud-controller-0.localdomain, overcloud-controller-1.localdomain, overcloud-controller-2.localdomain | - | pxe_ipmitool | overcloud-controller-0.localdomain, overcloud-controller-1.localdomain, overcloud-controller-2.localdomain | - | redfish | overcloud-controller-0.localdomain, overcloud-controller-1.localdomain, overcloud-controller-2.localdomain | - +---------------------+------------------------------------------------------------------------------------------------------------+ - -If this list is empty or does not show any of the controllers, then the -``openstack-ironic-conductor`` service on this controller failed to start. -The likely cause is missing dependencies for vendor drivers. - -Finally, check that Nova recognizes both virtual and bare metal compute -services. In HA case there should be at least 4 services in total:: - - $ openstack compute service list --service nova-compute - +----+--------------+-------------------------------------+------+---------+-------+----------------------------+ - | ID | Binary | Host | Zone | Status | State | Updated At | - +----+--------------+-------------------------------------+------+---------+-------+----------------------------+ - | 21 | nova-compute | overcloud-novacompute-0.localdomain | nova | enabled | up | 2017-10-11T13:57:21.000000 | - | 30 | nova-compute | overcloud-controller-2.localdomain | nova | enabled | up | 2017-10-11T13:57:16.000000 | - | 33 | nova-compute | overcloud-controller-1.localdomain | nova | enabled | up | 2017-10-11T13:57:16.000000 | - | 54 | nova-compute | overcloud-controller-0.localdomain | nova | enabled | up | 2017-10-11T13:57:14.000000 | - +----+--------------+-------------------------------------+------+---------+-------+----------------------------+ - -Post-deployment configuration ------------------------------ - -In this section we configure OpenStack for both bare metal and virtual -machines provisioning. - -You need at least 3 nodes to use bare metal provisioning: one for the -undercloud, one for the controller and one for the actual instance. -This guide assumes using both virtual and bare metal computes, so to follow it -you need at least one more node, 4 in total for a non-HA configuration or 6 -for HA. - -This guide uses one network for simplicity. If you encounter weird DHCP, PXE -or networking issues with such a single-network configuration, try shutting -down the introspection DHCP server on the undercloud after the initial -introspection is finished:: - - sudo systemctl stop openstack-ironic-inspector-dnsmasq - -Resource classes -~~~~~~~~~~~~~~~~ - -Starting with the Pike release, bare metal instances are scheduled based on -*custom resource classes*. In case of Ironic, a resource class will correspond -to a flavor. When planning your bare metal cloud, think of a way to split all -nodes into classes, and create flavors accordingly. See `bare metal flavor -documentation`_ for more details. - -Preparing networking -~~~~~~~~~~~~~~~~~~~~ - -Next, we need to create at least one network for nodes to use. By default -Ironic uses the tenant network for the provisioning process, and the same -network is often configured for cleaning. - -As already mentioned, this guide assumes only one physical network shared -between undercloud and overcloud. In this case the subnet address must match -the one on the undercloud, but the allocation pools must not overlap (including -the pool used by undercloud introspection). - -For example, the following commands will work with the default undercloud -parameters:: - - source overcloudrc - openstack network create --share --provider-network-type flat \ - --provider-physical-network datacentre --external provisioning - openstack subnet create --network provisioning \ - --subnet-range 192.168.24.0/24 --gateway 192.168.24.40 \ - --allocation-pool start=192.168.24.41,end=192.168.24.100 provisioning-subnet - openstack router create default-router - openstack router add subnet default-router provisioning-subnet - -We will use this network for bare metal instances (both for provisioning and -as a tenant network), as well as an external network for virtual instances. -In a real situation you will only use it as provisioning, and create a separate -physical network as external. - -Now you can create a regular tenant network to use for virtual instances -and use the ``default-router`` to link the provisioning and tenant networks:: - - openstack network create tenant-net - openstack subnet create --network tenant-net --subnet-range 192.0.3.0/24 \ - --allocation-pool start=192.0.3.10,end=192.0.3.20 tenant-subnet - openstack router add subnet default-router tenant-subnet - -Networking using a custom network -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If using a custom network for overcloud provisioning, create a network of -type ``vlan`` with VlanID matching the ``OcProvisioning`` network created -during deployment:: - - openstack network create --share --provider-network-type vlan \ - --provider-physical-network datacentre --provider-segment 205 provisioning - -Use a subnet range outside of the ``allocation_pool`` defined in -``network_data.yaml``, for example:: - - openstack subnet create --network provisioning --subnet-range \ - 172.21.2.0/24 --gateway 172.21.2.1 --allocation-pool \ - start=172.21.2.201,end=172.21.2.250 provisioning-subnet - -As defined in ``Preparing networking``, you can create a tenant network along -with a ``default-router`` to link the provisioning and tenant networks. - -Configuring networks -~~~~~~~~~~~~~~~~~~~~ - -Ironic has to be configured to use three networks for its internal purposes: - -* *Cleaning* network is used during cleaning and is mandatory to configure. - - This network can be configured to a name or UUID during deployment via - the ``IronicCleaningNetwork`` parameter. - -* *Provisioning* network is used during deployment if the *network interface* - is set to ``neutron`` (either explicitly or via setting - ``IronicDefaultNetworkInterface`` during installation). - - This network is supported by TripleO starting with the Pike release and - can be configured to a name or UUID during deployment via - the ``IronicProvisioningNetwork`` parameter. - -* *Rescuing* network is used when starting the *rescue* process - repairing - broken instances through a special ramdisk. - - This network is supported by TripleO starting wince the Rocky release and - can be configured to a name or UUID during deployment via - the ``IronicRescuingNetwork`` parameter. - -Starting with the Ocata release, Ironic is configured to use network called -``provisioning`` for all three networks by default. However, network names are -not unique. A user creating another network with the same name will break bare -metal provisioning. Thus, it's highly recommended to update the deployment, -providing the provider network UUID. - -Use the following command to get the UUID:: - - openstack network show provisioning -f value -c id - -Configuring networks on deployment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To update the whole deployment update the environment file you've created, -setting ``IronicCleaningNetwork`` to the this UUID, for example:: - - parameter_defaults: - IronicCleaningNetwork: c71f4bfe-409b-4292-818f-21cdf910ee06 - -In the Pike release or newer, also set the provisioning network. You can use -the same network or create a new one:: - - parameter_defaults: - IronicCleaningNetwork: c71f4bfe-409b-4292-818f-21cdf910ee06 - IronicProvisioningNetwork: c71f4bfe-409b-4292-818f-21cdf910ee06 - -In the Rocky release or newer, also set the rescuing network. You can use -the same network or create a new one:: - - parameter_defaults: - IronicCleaningNetwork: c71f4bfe-409b-4292-818f-21cdf910ee06 - IronicProvisioningNetwork: c71f4bfe-409b-4292-818f-21cdf910ee06 - IronicRescuingNetwork: c71f4bfe-409b-4292-818f-21cdf910ee06 - -Finally, run the deploy command with exactly the same arguments as before -(don't forget to include the environment file if it was not included -previously). - -Configuring networks per node -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Alternatively, you can set the networks per node starting with the Queens -release. - -When enrolling nodes, add ``cleaning_network``, ``provisioning_network`` -and/or ``rescuing_network`` to the ``driver_info`` dictionary when -`Preparing inventory`_. - -After enrolling nodes, you can update each of them with the following -command (adjusting it for your release):: - - baremetal node set \ - --driver-info cleaning_network= \ - --driver-info provisioning_network= \ - --driver-info rescuing_network= - -Adding deployment images -~~~~~~~~~~~~~~~~~~~~~~~~ - -Ironic requires the ironic-python-agent image stored in Glance. -You can use the same images you already have on the undercloud:: - - source overcloudrc - openstack image create --public --container-format aki \ - --disk-format aki --file ~/ironic-python-agent.kernel deploy-kernel - openstack image create --public --container-format ari \ - --disk-format ari --file ~/ironic-python-agent.initramfs deploy-ramdisk - -.. note:: - These commands assume that the images are in the home directory, which is - often the case for TripleO. - -Creating flavors -~~~~~~~~~~~~~~~~ - -As usual with OpenStack, you need to create at least one flavor to be used -during deployment. As bare metal resources are inherently not divisible, -the flavor will set minimum requirements (CPU count, RAM and disk sizes) that -a node must fulfil, see `bare metal flavor documentation`_ for details. - -Creating a single flavor is sufficient for the simplest case:: - - source overcloudrc - openstack flavor create --ram 1024 --disk 20 --vcpus 1 baremetal - -.. note:: - The ``disk`` argument will be used to determine the size of the root - partition. The ``ram`` and ``vcpus`` arguments are ignored for bare metal, - starting with the Pike release, if the flavor is configured as explained - below. - -Starting with the Pike release, switch to scheduling based on resource -classes, as explained in the `bare metal flavor documentation`_:: - - openstack flavor set baremetal --property resources:CUSTOM_BAREMETAL=1 - openstack flavor set baremetal --property resources:VCPU=0 - openstack flavor set baremetal --property resources:MEMORY_MB=0 - openstack flavor set baremetal --property resources:DISK_GB=0 - -Creating host aggregates -~~~~~~~~~~~~~~~~~~~~~~~~ - -.. note:: - If you don't plan on using virtual instances, you can skip this step. - It also won't be required in the Stein release, after bare metal nodes - stopped report CPU, memory and disk properties. - -.. admonition:: Stable Branches - :class: stable - - For a hybrid bare metal and virtual environment before the Pike release - you have to set up *host aggregates* for virtual and bare metal hosts. You - can also optionally follow this procedure until the Stein release. We will - use a property called ``baremetal`` to link flavors to host aggregates:: - - openstack aggregate create --property baremetal=true baremetal-hosts - openstack aggregate create --property baremetal=false virtual-hosts - openstack flavor set baremetal --property baremetal=true - - .. warning:: - This association won't work without ``AggregateInstanceExtraSpecsFilter`` - enabled as described in `Essential configuration`_. - - .. warning:: - Any property you set on flavors has to be duplicated on aggregates, - otherwise scheduling will fail. - - Then for all flavors you've created for virtual instances set the same - ``baremetal`` property to ``false``, for example:: - - openstack flavor create --ram 1024 --disk 20 --vcpus 1 virtual - openstack flavor set virtual --property baremetal=false - -Creating instance images -~~~~~~~~~~~~~~~~~~~~~~~~ - -You can build your images using ``diskimage-builder`` tool already available -on the undercloud, for example:: - - disk-image-create centos7 baremetal dhcp-all-interfaces grub2 -o centos-image - -.. note:: - The following elements are actually optional: - - * ``dhcp-all-interfaces`` makes the resulting instance get IP addresses for - all NICs via DHCP. - - * ``grub2`` installs the grub bootloader on the image, so that local boot - can be used in additional to PXE booting. - -This command creates a so called *partition image*, i.e. an image containing -only root partition. Ironic also supports *whole disk images*, i.e. images -with the whole partition table embedded. This may be the only option when -running non-Linux images. Please check the `images documentation`_ -for more details on building and using images. - -Three components are created for every partition image: the main image with -``qcow2`` extension, the kernel with ``vmlinuz`` extension and the initrd -image with ``initrd`` extension. - -Upload them with the following command:: - - source overcloudrc - KERNEL_ID=$(openstack image create --file centos-image.vmlinuz --public \ - --container-format aki --disk-format aki -f value -c id \ - centos-image.vmlinuz) - RAMDISK_ID=$(openstack image create --file centos-image.initrd --public \ - --container-format ari --disk-format ari -f value -c id \ - centos-image.initrd) - openstack image create --file centos-image.qcow2 --public \ - --container-format bare --disk-format qcow2 \ - --property kernel_id=$KERNEL_ID --property ramdisk_id=$RAMDISK_ID \ - centos-image - -.. note:: - A whole disk image will only have one component - the image itself with - ``qcow2`` extension. Do not set ``kernel_id`` and ``ramdisk_id`` - properties for such images. - -Enrolling nodes ---------------- - -For all nodes you're enrolling you need to know: - -* BMC (IPMI, iDRAC, iLO, etc) address and credentials, - -* MAC address of the PXE booting NIC, - -* CPU count and architecture, memory size in MiB and root disk size in GiB, - -* Serial number or WWN of the root device, if the node has several hard drives. - -In the future some of this data will be provided by the introspection process, -which is not currently available in the overcloud. - -This guide uses inventory files to enroll nodes. Alternatively, you can enroll -nodes directly from CLI, see the `enrollment documentation`_ for details. - -Preparing inventory -~~~~~~~~~~~~~~~~~~~ - -Your inventory file (e.g. ``overcloud-nodes.yaml`` from `Preparing -undercloud`_) should be in the following format: - -.. code-block:: yaml - - nodes: - - name: node-0 - driver: ipmi - driver_info: - ipmi_address: - ipmi_username: - ipmi_password: - ipmi_port: - resource_class: baremetal - properties: - cpu_arch: - local_gb: - root_device: - serial: - ports: - - address: - pxe_enabled: true - local_link_connection: - switch_id: - switch_info: - port_id: - -* The ``driver`` field must be one of ``IronicEnabledDrivers`` or - ``IronicEnabledHardwareTypes``, which we set when `Configuring and deploying - ironic`_. - - .. admonition:: Stable Branch - :class: stable - - Hardware types are only available since the Pike release. In the example - above use ``pxe_ipmitool`` instead of ``ipmi`` for older releases. - -* The ``resource_class`` field corresponds to a custom resource - class, as explained in `Resource classes`_. - -* The ``root_device`` property is optional, but it's highly recommended - to set it if the bare metal node has more than one hard drive. - There are several properties that can be used instead of the serial number - to designate the root device, see the `root device hints documentation`_ - for details. - -* The ``local_gb`` field specifies the size (in GiB) of the root device. Its - value must match the size of the device specified by the ``root_device`` - property. However, to allow for partitioning, it's highly recommended to - subtract 1 GiB from it. - -* Exactly one port with ``pxe_enabled`` set to ``true`` must be specified in - the ``ports`` list. It has to match the NIC used for provisioning. - - .. note:: - More ports with ``pxe_enabled=false`` can be specified safely here. They - won't be used for provisioning, but they are used with the ``neutron`` - network interface. - -.. admonition:: Stable Branch - :class: stable - - * The ``memory_mb`` and ``cpus`` properties are mandatory before the Pike - release and can optionally be used before Stein. - - .. warning:: - Do not populate ``memory_mb`` and ``cpus`` before the Stein release if - you do **not** use host aggregates for separating virtual and bare - metal flavors as described in `Creating host aggregates`_. - -* ``local_link_connection`` is required when using the `neutron` network - interface. This information is needed so ironic/neutron can identify which - interfaces on switches corresponding to the ports defined in ironic. - - * ``switch_id`` the ID the switch uses to identify itself over LLDP(usually - the switch MAC). - - * ``switch_info`` the name associated with the switch in ``ML2HostConfigs`` - (see ML2HostConfigs in `ml2-ansible example`_) - - * ``port_id`` the name associated with the interface on the switch. - -Enrolling nodes -~~~~~~~~~~~~~~~ - -The ``overcloud-nodes.yaml`` file prepared in the previous steps can now be -imported in Ironic:: - - source overcloudrc - baremetal create overcloud-nodes.yaml - -.. warning:: - This command is provided by Ironic, not TripleO. It also does not feature - support for updates, so if you need to change something, you have to use - ``baremetal node set`` and similar commands. - -The nodes appear in the ``enroll`` provision state, you need to check their BMC -credentials and make them available:: - - DEPLOY_KERNEL=$(openstack image show deploy-kernel -f value -c id) - DEPLOY_RAMDISK=$(openstack image show deploy-ramdisk -f value -c id) - - for uuid in $(baremetal node list --provision-state enroll -f value -c UUID); - do - baremetal node set $uuid \ - --driver-info deploy_kernel=$DEPLOY_KERNEL \ - --driver-info deploy_ramdisk=$DEPLOY_RAMDISK \ - --driver-info rescue_kernel=$DEPLOY_KERNEL \ - --driver-info rescue_ramdisk=$DEPLOY_RAMDISK - baremetal node manage $uuid --wait && - baremetal node provide $uuid - done - -The deploy kernel and ramdisk were created as part of `Adding deployment -images`_. - -The ``baremetal node provide`` command makes a node go through cleaning -procedure, so it might take some time depending on the configuration. Check -your nodes status with:: - - baremetal node list --fields uuid name provision_state last_error - -Wait for all nodes to reach the ``available`` state. Any failures during -cleaning has to be corrected before proceeding with deployment. - -Populating host aggregates -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. note:: - If you don't plan on using virtual instances, you can skip this step. - It also won't be required in the Stein release, after bare metal nodes - stopped report CPU, memory and disk properties. - -.. admonition:: Stable Branch - :class: stable - - For hybrid bare metal and virtual case you need to specify which host - belongs to which host aggregates (``virtual`` or ``baremetal`` as created in - `Creating host aggregates`_). - - When the default host names are used, we can take advantage of the fact - that every virtual host will have ``compute`` in its name. All bare metal - hypervisors will be assigned to one (non-HA) or three (HA) controller hosts. - So we can do the assignment with the following commands:: - - source overcloudrc - for vm_host in $(openstack hypervisor list -f value -c "Hypervisor Hostname" | grep compute); - do - openstack aggregate add host virtual-hosts $vm_host - done - - openstack aggregate add host baremetal-hosts overcloud-controller-0.localdomain - # Ignore the following two for a non-HA environment - openstack aggregate add host baremetal-hosts overcloud-controller-1.localdomain - openstack aggregate add host baremetal-hosts overcloud-controller-2.localdomain - - .. note:: - Every time you scale out compute nodes, you need to add newly added - hosts to the ``virtual-hosts`` aggregate. - -Checking available resources -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Check that nodes are really enrolled and the power state is reflected correctly -(it may take some time):: - - $ source overcloudrc - $ baremetal node list - +--------------------------------------+------------+---------------+-------------+--------------------+-------------+ - | UUID | Name | Instance UUID | Power State | Provisioning State | Maintenance | - +--------------------------------------+------------+---------------+-------------+--------------------+-------------+ - | a970c5db-67dd-4676-95ba-af1edc74b2ee | instance-0 | None | power off | available | False | - | bd99ec64-4bfc-491b-99e6-49bd384b526d | instance-1 | None | power off | available | False | - +--------------------------------------+------------+---------------+-------------+--------------------+-------------+ - -After a few minutes, new hypervisors should appear in Nova and the stats -should display the sum of bare metal and virtual resources:: - - $ openstack hypervisor list - +----+--------------------------------------+ - | ID | Hypervisor Hostname | - +----+--------------------------------------+ - | 2 | overcloud-novacompute-0.localdomain | - | 17 | bd99ec64-4bfc-491b-99e6-49bd384b526d | - | 20 | a970c5db-67dd-4676-95ba-af1edc74b2ee | - +----+--------------------------------------+ - -.. note:: - Each bare metal node becomes a separate hypervisor in Nova. The hypervisor - host name always matches the associated node UUID. - -Next you can use the Placement API (available only via cURL for the time being) -to check that bare metal resources are properly exposed. Start with checking -that all nodes are recorded:: - - $ token=$(openstack token issue -f value -c id) - $ endpoint=$(openstack endpoint show placement -f value -c publicurl) - $ curl -sH "X-Auth-Token: $token" $endpoint/resource_providers | jq -r '.resource_providers | map({node: .name, uuid})' - [ - { - "uuid": "9dff98a8-6fc9-4a05-8d78-c1d5888d9fde", - "node": "overcloud-novacompute-0.localdomain" - }, - { - "uuid": "61d741b5-33d6-40a1-bcbe-b38ea34ca6c8", - "node": "bd99ec64-4bfc-491b-99e6-49bd384b526d" - }, - { - "uuid": "e22bc261-53be-43b3-848f-e29c728142d3", - "node": "a970c5db-67dd-4676-95ba-af1edc74b2ee" - } - ] - -Then for each of the bare metal resource providers (having node UUIDs as -names) check their inventory:: - - $ curl -sH "X-Auth-Token: $token" $endpoint/resource_providers/e22bc261-53be-43b3-848f-e29c728142d3/inventories | jq .inventories - { - "CUSTOM_BAREMETAL": { - "max_unit": 1, - "min_unit": 1, - "step_size": 1, - "reserved": 0, - "total": 1, - "allocation_ratio": 1 - } - } - -You see the custom ``baremetal`` resource class reported, as well as available -disk space (only before the Queens release). If you see an empty inventory, -nova probably consider the node unavailable. Check :ref:`no-valid-host` for -tips on a potential cause. - -Booting a bare metal instance ------------------------------ - -You will probably want to create a keypair to use for logging into instances. -For example, using SSH public key from undercloud:: - - source overcloudrc - openstack keypair create --public-key ~/.ssh/id_rsa.pub undercloud-key - -Now you're ready to boot your first bare metal instance:: - - openstack server create --image centos-image --flavor baremetal \ - --nic net-id=$(openstack network show provisioning -f value -c id) \ - --key-name undercloud-key instance-0 - -After some time (depending on the image), you will see the prepared instance:: - - $ openstack server list - +--------------------------------------+------------+--------+-----------------------------+ - | ID | Name | Status | Networks | - +--------------------------------------+------------+--------+-----------------------------+ - | 2022d237-e249-44bd-b864-e7f536a8e439 | instance-0 | ACTIVE | provisioning=192.168.24.50 | - +--------------------------------------+------------+--------+-----------------------------+ - -.. note:: - If you encounter *"No valid host found"* error from Nova, make sure to read - the undercloud troubleshooting guide on this topic: :ref:`no-valid-host`. - -Let's check that it actually got scheduled on a bare metal machine:: - - $ openstack server show instance-0 -c "OS-EXT-SRV-ATTR:host" -c "OS-EXT-SRV-ATTR:hypervisor_hostname" - +-------------------------------------+--------------------------------------+ - | Field | Value | - +-------------------------------------+--------------------------------------+ - | OS-EXT-SRV-ATTR:host | overcloud-controller-0.localdomain | - | OS-EXT-SRV-ATTR:hypervisor_hostname | bd99ec64-4bfc-491b-99e6-49bd384b526d | - +-------------------------------------+--------------------------------------+ - -You can now log into it:: - - $ ssh centos@192.168.24.50 - The authenticity of host '192.168.24.50 (192.168.24.50)' can't be established. - ECDSA key fingerprint is eb:35:45:c5:ed:d9:8a:e8:4b:20:db:06:10:6f:05:74. - Are you sure you want to continue connecting (yes/no)? yes - Warning: Permanently added '192.168.24.50' (ECDSA) to the list of known hosts. - [centos@instance-0 ~]$ - -Now let's try the same with a virtual instance:: - - openstack server create --image centos-image --flavor virtual \ - --nic net-id=$(openstack network show tenant-net -f value -c id) \ - --key-name undercloud-key instance-1 - -This instance gets scheduled on a virtual host:: - - $ openstack server show instance-1 -c "OS-EXT-SRV-ATTR:host" -c "OS-EXT-SRV-ATTR:hypervisor_hostname" - +-------------------------------------+-------------------------------------+ - | Field | Value | - +-------------------------------------+-------------------------------------+ - | OS-EXT-SRV-ATTR:host | overcloud-novacompute-0.localdomain | - | OS-EXT-SRV-ATTR:hypervisor_hostname | overcloud-novacompute-0.localdomain | - +-------------------------------------+-------------------------------------+ - -Booting a bare metal instance from a cinder volume --------------------------------------------------- - -Cinder volumes can be used to back a baremetal node over iSCSI, in order to -do this each baremetal node must first be configured to boot from a volume. -The connector ID for each node should be unique, below we achieve this by -incrementing the value of :: - - $ baremetal node set --property capabilities=iscsi_boot:true --storage-interface cinder - $ baremetal volume connector create --node --type iqn --connector-id iqn.2010-10.org.openstack.node - -The image used should be configured to boot from a iSCSI root disk, on Centos -7 this is achieved by ensuring that the `iscsi` module is added to the ramdisk -and passing `rd.iscsi.firmware=1` to the kernel in the grub config:: - - $ mkdir /tmp/mountpoint - $ guestmount -i -a /tmp/CentOS-7-x86_64-GenericCloud.qcow2 /tmp/mountpoint - $ mount -o bind /dev /tmp/mountpoint/dev - $ chroot /tmp/mountpoint /bin/bash - chroot> mv /etc/resolv.conf /etc/resolv.conf_ - chroot> echo "nameserver 8.8.8.8" > /etc/resolv.conf - chroot> yum install -y iscsi-initiator-utils - chroot> mv /etc/resolv.conf_ /etc/resolv.conf - # Be careful here to update the correct ramdisk (check/boot/grub2/grub.cfg) - chroot> dracut --force --add "network iscsi" /boot/initramfs-3.10.0-693.5.2.el7.x86_64.img 3.10.0-693.5.2.el7.x86_64 - # Edit the file /etc/default/grub and add rd.iscsi.firmware=1 to GRUB_CMDLINE_LINUX=... - chroot> vi /etc/default/grub - chroot> exit - $ umount /tmp/mountpoint/dev - $ guestunmount /tmp/mountpoint - $ guestfish -a /tmp/CentOS-7-x86_64-GenericCloud.qcow2 -m /dev/sda1 sh "/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg" - -.. note:: - This image can no longer be used to do regular local boot, a situation - that should be fixed in future versions. - -This image can then be added to glance and a volume created from it:: - - $ openstack image create --disk-format qcow2 --container-format bare --file /tmp/CentOS-7-x86_64-GenericCloud.qcow2 centos-bfv - $ openstack volume create --size 10 --image centos-bfv --bootable centos-test-volume - -Finally this volume can be used to back a baremetal instance:: - - $ openstack server create --flavor baremetal --volume centos-test-volume --key default centos-test - -Configuring ml2-ansible for multi-tenant networking ---------------------------------------------------- - -Ironic can be configured to use a neutron ML2 mechanism driver for baremetal -port binding. In this example we use the ml2-ansible plugin to configure -ports on a Juniper switch (the plugin supports multiple switch types) to ensure -baremetal networks are isolated from each other. - -ml2-ansible configuration -~~~~~~~~~~~~~~~~~~~~~~~~~ - -The following parameters must be configured in an environment file and used -when deploying the overcloud: - -* ``ML2HostConfigs:`` this mapping contains a entry for each switch netansible - will configure, for each switch there should be a key(where the key is used - to identify the switch) and a mapping containing details specific to the - switch, the following details should be provided - - * ``ansible_network_os``: network platform the switch corresponds to. - * ``ansible_host``: switch IP - * ``ansible_user``: user to connect to the switch as - * ``ansible_ssh_pass``: (optional, alternatively use a private key) password - * ``ansible_ssh_private_key_file``: (optional, alternatively use a password) private key - * ``manage_vlans``: (optional, boolean) - If the vlan networks have not been defined on - your switch and the ansible_user has permission to create them, this should be left as - ``true``. If not then you need to set to ``false`` and ensure they are created by a user - with the appropriate permissions. - * ``mac``: (optional) - Chassis MAC ID of the switch - -* ``IronicDefaultNetworkInterface`` set the default network type for nodes being - deployed. In most cases when using multi-tenant networking you'll want to set - this to ``neutron``. If the default isn't set to ``neutron`` here then the - ``network-interface`` needs to be set on a per node bases. This can be done with - the ``--network-interface`` parameter to either the ``node create`` or ``node set`` - command. - -The overcloud deploy command must also include -``-e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ml2-ansible.yaml`` -in order to set ``OS::TripleO::Services::NeutronCorePlugin`` and ``NeutronMechanismDrivers``. - -ml2-ansible example -~~~~~~~~~~~~~~~~~~~ - -In this minimalistic example we have a baremetal node (ironic-0) being -controlled by ironic in the overcloud. This node is connected to a juniper -switch with ironic/neutron controlling the vlan id for the switch:: - - - +-------------------------------+ - | xe-0/0/7+-+ - | switch1 | | - |xe-0/0/1 | | - +-------------------------------+ | - | | - | | - +---------------+ +-----------------+ - | | | | | - | br-baremetal | | | - | | | | - | | | | - | | | | - | Overcloud | | Ironic-0 | - | | | | - | | | | - | | | | - | | | | - | | | | - | | | | - +---------------+ +-----------------+ - -Switch config for xe-0/0/7 should be removed before deployment, and -xe-0/0/1 should be a member of the vlan range 1200-1299:: - - xe-0/0/1 { - native-vlan-id XXX; - unit 0 { - family ethernet-switching { - interface-mode trunk; - vlan { - members [ XXX 1200-1299 ]; - } - } - } - } - -We first need to deploy ironic in the overcloud and include the following -configuration:: - - parameter_defaults: - IronicProvisioningNetwork: baremetal - IronicCleaningNetwork: baremetal - IronicDefaultNetworkInterface: neutron - NeutronMechanismDrivers: openvswitch,ansible - NeutronNetworkVLANRanges: baremetal:1200:1299 - NeutronFlatNetworks: datacentre,baremetal - NeutronBridgeMappings: datacentre:br-ex,baremetal:br-baremetal - ML2HostConfigs: - switch1: - ansible_network_os: junos - ansible_host: 10.9.95.25 - ansible_user: ansible - ansible_ssh_pass: ansible_password - manage_vlans: false - - -Once the overcloud is deployed, we need to create a network that will be used -as a provisioning (and cleaning) network:: - - openstack network create --provider-network-type vlan --provider-physical-network baremetal \ - --provider-segment 1200 baremetal - openstack subnet create --network baremetal --subnet-range 192.168.25.0/24 --ip-version 4 \ - --allocation-pool start=192.168.25.30,end=192.168.25.50 baremetal-subnet - -.. note:: - This network should be routed to the ctlplane network on the overcloud (while - on this network the ironic-0 will need access to the TFTP/HTTP and the ironic - API), one way to achieve this would be to set up a network representing the - ctlplane network and add a router between them:: - - openstack network create --provider-network-type flat --provider-physical-network \ - baremetal ctlplane - openstack subnet create --network ctlplane --subnet-range 192.168.24.0/24 \ - --ip-version 4 --gateway 192.168.24.254 --no-dhcp ctlplane-subnet - openstack router create provisionrouter - openstack router add subnet provisionrouter baremetal-subnet - openstack router add subnet provisionrouter ctlplane-subnet - - Each overcloud controller will also need a route added to route traffic - bound for 192.168.25.0/24 via 192.168.24.254, this can be done in the - network template when deploying the overcloud. - -If not already provided in ``overcloud-nodes.yaml`` above, the -local-link-connection values for `switch_info`, `port_id` and `switch_id` -can be provided here:: - - baremetal port set --local-link-connection switch_info=switch1 \ - --local-link-connection port_id=xe-0/0/7 \ - --local-link-connection switch_id=00:00:00:00:00:00 - -The node can now be registered with ironic and cleaned in the usual way, -once the node is available it can be used by another tenant in a regular -VLAN network:: - - openstack network create tenant-net - openstack subnet create --network tenant-net --subnet-range 192.168.3.0/24 \ - --allocation-pool start=192.168.3.10,end=192.168.3.20 tenant-subnet - openstack server create --flavor baremetal --image overcloud-full \ - --key default --network tenant-net test1 - -Assuming an external network is available the server can then be allocated a floating ip:: - - openstack router create external - openstack router add subnet external tenant-subnet - openstack router set --external-gateway external external - openstack floating ip create external - openstack server add floating ip test1 - - -.. _IronicConductor role shipped with TripleO: https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/roles/IronicConductor.yaml -.. _driver configuration guide: https://docs.openstack.org/ironic/latest/install/enabling-drivers.html -.. _driver-specific documentation: https://docs.openstack.org/ironic/latest/admin/drivers.html -.. _bare metal flavor documentation: https://docs.openstack.org/ironic/latest/install/configure-nova-flavors.html -.. _enrollment documentation: https://docs.openstack.org/ironic/latest/install/enrollment.html -.. _root device hints documentation: https://docs.openstack.org/ironic/latest/install/advanced.html#specifying-the-disk-for-deployment-root-device-hints -.. _images documentation: https://docs.openstack.org/ironic/latest/install/configure-glance-images.html -.. _multi-tenant networking documentation: https://docs.openstack.org/ironic/latest/admin/multitenancy.html -.. _networking-ansible: https://github.com/openstack/networking-ansible -.. _deploy interfaces documentation: https://docs.openstack.org/ironic/latest/admin/interfaces/deploy.html diff --git a/deploy-guide/source/features/ceph_external.rst b/deploy-guide/source/features/ceph_external.rst deleted file mode 100644 index 0523b5cd..00000000 --- a/deploy-guide/source/features/ceph_external.rst +++ /dev/null @@ -1,394 +0,0 @@ -Use an external Ceph cluster with the Overcloud -=============================================== - -|project| supports use of an external Ceph cluster for certain services deployed -in the Overcloud. - -Deploying Cinder, Glance, Nova, Gnocchi with an external Ceph RBD service -------------------------------------------------------------------------- - -The overcloud may be configured to use an external Ceph RBD service by -enabling a particular environment file when deploying the -Overcloud. For Wallaby and newer include -`environments/external-ceph.yaml`. - -For Ocata and earlier use -`environments/puppet-ceph-external.yaml`. For Pike through Victoria -use `environments/ceph-ansible/ceph-ansible-external.yaml` and install -ceph-ansible on the Undercloud as described in -:doc:`../deployment/index`. For Pike through Victoria a Ceph container -is downloaded and executed on Overcloud nodes to use Ceph binaries -only available within the container. These binaries are used to create -the CephX client keyrings on the overcloud. Thus, between Pike and -Victoria it was necessary when preparing to deploy a containerized -overcloud, as described in -:doc:`../deployment/container_image_prepare`, to include the Ceph -container even if that overcloud will only connect to an external Ceph -cluster. Starting in Wallaby neither ceph-ansible or cephadm configure -Ceph clients and instead the tripleo-ansible role tripleo_ceph_client -is used. Thus, it is not necessary to install ceph-ansible nor prepare -a Ceph container when configuring external Ceph in Wallaby and -newer. Simply include `environments/external-ceph.yaml` in the -deployment. All parameters described below remain consistent -regardless of external Ceph configuration method. - -Some of the parameters in the above environment files can be overridden:: - - parameter_defaults: - # Enable use of RBD backend in nova-compute - NovaEnableRbdBackend: true - # Enable use of RBD backend in cinder-volume - CinderEnableRbdBackend: true - # Backend to use for cinder-backup - CinderBackupBackend: ceph - # Backend to use for glance - GlanceBackend: rbd - # Backend to use for gnocchi-metricsd - GnocchiBackend: rbd - # Name of the Ceph pool hosting Nova ephemeral images - NovaRbdPoolName: vms - # Name of the Ceph pool hosting Cinder volumes - CinderRbdPoolName: volumes - # Name of the Ceph pool hosting Cinder backups - CinderBackupRbdPoolName: backups - # Name of the Ceph pool hosting Glance images - GlanceRbdPoolName: images - # Name of the Ceph pool hosting Gnocchi metrics - GnocchiRbdPoolName: metrics - # Name of the user to authenticate with the external Ceph cluster - CephClientUserName: openstack - -The pools and the CephX user **must** be created on the external Ceph cluster -before deploying the Overcloud. TripleO expects a single user, configured via -CephClientUserName, to have the capabilities to use all the OpenStack pools; -the user could be created with a command like this:: - - ceph auth add client.openstack mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rwx pool=images, allow rwx pool=backups, allow rwx pool=metrics' - -In addition to the above customizations, the deployer **needs** to provide -at least three required parameters related to the external Ceph cluster:: - - parameter_defaults: - # The cluster FSID - CephClusterFSID: '4b5c8c0a-ff60-454b-a1b4-9747aa737d19' - # The CephX user auth key - CephClientKey: 'AQDLOh1VgEp6FRAAFzT7Zw+Y9V6JJExQAsRnRQ==' - # The list of Ceph monitors - CephExternalMonHost: '172.16.1.7, 172.16.1.8, 172.16.1.9' - -The above parameters will result in TripleO creating a Ceph -configuration file and cephx keyring in /etc/ceph on every -node which needs to connect to Ceph to use the RBD service. - -Configuring Ceph Clients for Multiple External Ceph RBD Services ----------------------------------------------------------------- - -In Train and newer it's possible to use TripleO to deploy an -overcloud which is capable of using the RBD services of multiple -external Ceph clusters. A separate keyring and Ceph configuration file -is created for each external Ceph cluster in /etc/ceph on every -overcloud node which needs to connect to Ceph. This functionality is -provided by the `CephExternalMultiConfig` parameter. - -Do not use `CephExternalMultiConfig` when configuring an overcloud to -use only one external Ceph cluster. Instead follow the example in the -previous section. The example in the previous section and the method -of deploying an internal Ceph cluster documented in -:doc:`deployed_ceph` are mutually exclusive per Heat stack. The -following scenarios are the only supported ones in which -`CephExternalMultiConfig` may be used per Heat stack: - -* One external Ceph cluster configured, as described in previous - section, in addition to multiple external Ceph clusters configured - via `CephExternalMultiConfig`. - -* One internal Ceph cluster, as described in :doc:`deployed_ceph` in - addition to multiple external ceph clusters configured via - `CephExternalMultiConfig`. - -The `CephExternalMultiConfig` parameter is used like this:: - - CephExternalMultiConfig: - - cluster: 'ceph2' - fsid: 'af25554b-42f6-4d2b-9b9b-d08a1132d3e8' - external_cluster_mon_ips: '172.18.0.5,172.18.0.6,172.18.0.7' - keys: - - name: "client.openstack" - caps: - mgr: "allow *" - mon: "profile rbd" - osd: "profile rbd pool=volumes, profile rbd pool=backups, profile rbd pool=vms, profile rbd pool=images" - key: "AQCwmeRcAAAAABAA6SQU/bGqFjlfLro5KxrB1Q==" - mode: "0600" - dashboard_enabled: false - - cluster: 'ceph3' - fsid: 'e2cba068-5f14-4b0f-b047-acf375c0004a' - external_cluster_mon_ips: '172.18.0.8,172.18.0.9,172.18.0.10' - keys: - - name: "client.openstack" - caps: - mgr: "allow *" - mon: "profile rbd" - osd: "profile rbd pool=volumes, profile rbd pool=backups, profile rbd pool=vms, profile rbd pool=images" - key: "AQCwmeRcAAAAABAA6SQU/bGqFjlfLro5KxrB2Q==" - mode: "0600" - dashboard_enabled: false - -The above, in addition to the parameters from the previous section, -will result in an overcloud with the following files in /etc/ceph: - -* ceph.client.openstack.keyring -* ceph.conf -* ceph2.client.openstack.keyring -* ceph2.conf -* ceph3.client.openstack.keyring -* ceph3.conf - -The first two files which start with `ceph` will be created based on -the parameters discussed in the previous section. The next two files -which start with `ceph2` will be created based on the parameters from -the first list item within the `CephExternalMultiConfig` parameter -(e.g. `cluster: ceph2`). The last two files which start with `ceph3` -will be created based on the parameters from the last list item within -the `CephExternalMultiConfig` parameter (e.g. `cluster: ceph3`). - -The last four files in the list which start with `ceph2` or `ceph3` -will also contain parameters found in the first two files which -start with `ceph` except where those parameters intersect. When -there's an intersection those parameters will be overridden with the -values from the `CephExternalMultiConfig` parameter. For example there -will only be one FSID in each Ceph configuration file with the -following values per file: - -* ceph.conf will have `fsid = 4b5c8c0a-ff60-454b-a1b4-9747aa737d19` - (as seen in the previous section) -* ceph2.conf will have `fsid = af25554b-42f6-4d2b-9b9b-d08a1132d3e8` -* ceph3.conf will have `fsid = e2cba068-5f14-4b0f-b047-acf375c0004a` - -However, if the `external_cluster_mon_ips` key was not set within -the `CephExternalMultiConfig` parameter, then all three Ceph -configuration files would contain `mon host = 172.16.1.7, 172.16.1.8, -172.16.1.9`, as seen in the previous section. Thus, it is necessary to -override the `external_cluster_mon_ips` key within each list item of -the `CephExternalMultiConfig` parameter because each external Ceph -cluster will have its own set of unique monitor IPs. - -The `CephExternalMultiConfig` and `external_cluster_mon_ips` keys map -one to one but have different names because each element of the -`CephExternalMultiConfig` list should contain a map of keys and values -directly supported by ceph-ansible. See `ceph-ansible/group_vars`_ for -an example of all possible keys. - -The following parameters are the minimum necessary to configure an -overcloud to connect to an external ceph cluster: - -* cluster: The name of the configuration file and key name prefix. - This name defaults to "ceph" so if this parameter is not overridden - there will be a name collision. It is not relevant if the - external ceph cluster's name is already "ceph". For client role - configuration this parameter is only used for setting a unique name - for the configuration and key files. -* fsid: The FSID of the external ceph cluster. -* external_cluster_mon_ips: The list of monitor IPs of the external - ceph cluster as a single string where each IP is comma delimited. - If the external Ceph cluster is using both the v1 and v2 MSGR - protocol this value may look like '[v2:10.0.0.1:3300, - v1:10.0.0.1:6789], [v2:10.0.0.2:3300, v1:10.0.0.2:6789], - [v2:10.0.0.3:3300, v1:10.0.0.3:6789]'. -* dashboard_enabled: Always set this value to false when using - `CephExternalMultiConfig`. It ensures that the Ceph Dashboard is not - installed. It is not supported to use ceph-ansible dashboard roles - to communicate with an external Ceph cluster so not passing this - parameter with a value of false within `CephExternalMultiConfig` - will result in a failed deployment because the default value of true - will be used. -* keys: This is a list of maps where each map defines CephX keys which - OpenStack clients will use to connect to an external Ceph cluster. - As stated in the previous section, the pools and the CephX user must - be created on the external Ceph cluster before deploying the - overcloud. The format of each map is the same as found in - ceph-ansible. Thus, if the external Ceph cluster was deployed by - ceph-ansible, then the deployer of that cluster could share that map - with the TripleO deployer so that it could be used as a list item of - `CephExternalMultiConfig`. Similarly, the `CephExtraKeys` parameter, - described in the :doc:`deployed_ceph` documentation, has the same - syntax. - -Deploying Manila with an External CephFS Service ------------------------------------------------- - -If choosing to configure Manila with Ganesha as NFS gateway for CephFS, -with an external Ceph cluster, then add `environments/manila-cephfsganesha-config.yaml` -to the list of environment files used to deploy the overcloud and also -configure the following parameters:: - - parameter_defaults: - ManilaCephFSDataPoolName: manila_data - ManilaCephFSMetadataPoolName: manila_metadata - ManilaCephFSCephFSAuthId: 'manila' - CephManilaClientKey: 'AQDLOh1VgEp6FRAAFzT7Zw+Y9V6JJExQAsRnRQ==' - -Which represent the data and metadata pools in use by the MDS for -the CephFS filesystems, the CephX keyring to use and its secret. - -Like for the other services, the pools and keyring must be created on the -external Ceph cluster before attempting the deployment of the overcloud. -The keyring should look like the following:: - - ceph auth add client.manila mgr "allow *" mon "allow r, allow command 'auth del', allow command 'auth caps', allow command 'auth get', allow command 'auth get-or-create'" mds "allow *" osd "allow rw" - -Compatibility Options ---------------------- - -As of the Train release TripleO will install Ceph Nautilus. If the -external Ceph cluster uses the Hammer release instead, pass the -following parameters to enable backward compatibility features:: - - parameter_defaults: - ExtraConfig: - ceph::profile::params::rbd_default_features: '1' - -Deployment of an Overcloud with External Ceph ---------------------------------------------- - -Finally add the above environment files to the deploy commandline. For -Wallaby and newer use:: - - openstack overcloud deploy --templates -e /usr/share/openstack-tripleo-heat-templates/environments/external-ceph.yaml -e ~/my-additional-ceph-settings.yaml - -For Train use:: - - openstack overcloud deploy --templates -e /usr/share/openstack-tripleo-heat-templates/environments/ceph-ansible/ceph-ansible-external.yaml -e ~/my-additional-ceph-settings.yaml - -Standalone Ansible Roles for External Ceph ------------------------------------------- - -To configure an overcloud to use an external Ceph cluster, a directory -(e.g. /etc/ceph) in the overcloud containers should be populated with -Ceph configuration files and overcloud services (e.g. Nova) should be -configured to use those files. Tripleo provides Ansible roles to do -this standalone without tripleo-heat-templates or config-download. - -Single Ceph Cluster -^^^^^^^^^^^^^^^^^^^ - -The `tripleo_ceph_client_files` Ansible role copies files from a -source directory (`tripleo_ceph_client_files_source`) on the host -where Ansible is run to a destination directory -(`tripleo_ceph_client_config_home`) on the overcloud nodes. -The user must create and populate the -`tripleo_ceph_client_files_source` directory with actual Ceph -configuration and cephx key files before running the role. For -example:: - - $ ls -l /home/stack/ceph_files/ - total 16 - -rw-r--r--. 1 stack stack 245 Nov 14 13:40 ceph.client.openstack.keyring - -rw-r--r--. 1 stack stack 173 Nov 14 13:40 ceph.conf - -If the above directory exists on the host where the `ansible-playbook` -command is run, then the `tripleo_ceph_client_files_source` parameter -should be set to `/home/stack/ceph_files/`. The optional parameter -`tripleo_ceph_client_config_home` defaults to -`/var/lib/tripleo-config/ceph` since OpenStack containers will bind -mount this directory to `/etc/ceph`. The `tripleo_nova_libvirt` -Ansible role will add a secret key to libvirt so that it uses the -cephx key put in place by the `tripleo_ceph_client_files` role; it -does this if either `tripleo_nova_libvirt_enable_rbd_backend` or -`tripleo_cinder_enable_rbd_backend` are true. When these roles -are used to configure a compute node the following `group_vars` should -be set:: - - tripleo_ceph_client_files_source: /home/stack/ceph_files - tripleo_ceph_client_config_home: /var/lib/tripleo-config/ceph - tripleo_nova_libvirt_enable_rbd_backend: true - tripleo_cinder_enable_rbd_backend: true - -The `tripleo_ceph_client_files` role may then be included in a -playbook as follows in order to configure a standalone compute node to -use a single Ceph cluster:: - - - name: configure ceph client - import_role: - name: tripleo_ceph_client_files - -In order for Nova to use the Ceph cluster, the `libvirt` section of -the `nova.conf` file should be configured. The `tripleo_nova_compute` -role `tripleo_nova_compute_config_overrides` variable may be set as -follows in the inventory to set the `libvirt` values along with -others:: - - Compute: - vars: - tripleo_nova_compute_config_overrides: - libvirt: - images_rbd_ceph_conf: /etc/ceph/ceph.conf - images_rbd_glance_copy_poll_interval: '15' - images_rbd_glance_copy_timeout: '600' - images_rbd_glance_store_name: default_backend - images_rbd_pool: vms - images_type: rbd - rbd_secret_uuid: 604c9994-1d82-11ed-8ae5-5254003d6107 - rbd_user: openstack - -TripleO's convention is to set the `rbd_secret_uuid` to the FSID of -the Ceph cluster. The FSID should be in the ceph.conf file. The -`tripleo_nova_libvirt` role will use `virsh secret-*` commands so that -libvirt can retrieve the cephx secret using the FSID as a key. This -can be confirmed after running Ansible with `podman exec -nova_virtsecretd virsh secret-get-value $FSID`. - -The `tripleo_ceph_client_files` role only supports the _configure_ -aspect of the standalone tripleo-ansible roles because it just -configures one or more pairs of files on its target nodes. Thus, the -`import_role` example above could be placed in a playbook file like -`deploy-tripleo-openstack-configure.yml`, before the roles for -`tripleo_nova_libvirt` and `tripleo_nova_compute` are imported. - -Multiple Ceph Clusters -^^^^^^^^^^^^^^^^^^^^^^ - -To configure more than one Ceph backend include the -`tripleo_ceph_client_files` role from the single cluster example -above. Populate the `tripleo_ceph_client_files_source` directory with -all of the ceph configuration and cephx key files For example:: - - $ ls -l /home/stack/ceph_files/ - total 16 - -rw-r--r--. 1 stack stack 213 Nov 14 13:41 ceph2.client.openstack.keyring - -rw-r--r--. 1 stack stack 228 Nov 14 13:41 ceph2.conf - -rw-r--r--. 1 stack stack 245 Nov 14 13:40 ceph.client.openstack.keyring - -rw-r--r--. 1 stack stack 173 Nov 14 13:40 ceph.conf - -For multiple Ceph clusters, the `tripleo_nova_libvirt` role expects a -`tripleo_cinder_rbd_multi_config` Ansible variable like this:: - - tripleo_cinder_rbd_multi_config: - ceph2: - CephClusterName: ceph2 - CephClientUserName: openstack - -It is not necessary to put the default Ceph cluster (named "ceph" from -the single node example) in `tripleo_cinder_rbd_multi_config`. Only -the additional clusters (e.g. ceph2) and name their keys so they -match the `CephClusterName`. In the above example, the -`CephClusterName` value "ceph2" matches the "ceph2.conf" and -"ceph2.client.openstack.keyring". Also, the `CephClientUserName` value -"openstack" matches "ceph2.client.openstack.keyring". The -`tripleo_nova_libvirt` Ansible role uses the -`tripleo_cinder_rbd_multi_config` map as a guide to know which libvirt -secrets to create and which cephx keys to make available within the -Nova containers. - -If the combined examples above from the single cluster section for -the primary cluster "ceph" and this section for the seconary Ceph -cluster "ceph2" are used, then the directory defined by -`tripleo_ceph_client_config_home` will be populated with four files: -`ceph.conf`, `ceph2.conf`, `ceph.client.openstack.keyring` and -`ceph2.client.openstack.keyring`, which will be mounted into the Nova -containers and two libvirt secrets will be created for each cephx -key. To add more Ceph clusters, extend the list -`tripleo_cinder_rbd_multi_config` and populate -`tripleo_ceph_client_files_source` with additional files. - -.. _`ceph-ansible/group_vars`: https://github.com/ceph/ceph-ansible/tree/master/group_vars diff --git a/deploy-guide/source/features/cinder_custom_backend.rst b/deploy-guide/source/features/cinder_custom_backend.rst deleted file mode 100644 index 04b79fa6..00000000 --- a/deploy-guide/source/features/cinder_custom_backend.rst +++ /dev/null @@ -1,69 +0,0 @@ -Configuring Cinder with a Custom Unmanaged Backend -================================================== - -This guide assumes that your undercloud is already installed and ready to -deploy an overcloud. - -Adding a custom backend to Cinder ---------------------------------- - -It is possible to provide the config settings to add an arbitrary and -unmanaged backend to Cinder at deployment time via Heat environment files. - -Each backend is represented in `cinder.conf` with a ``stanza`` and a -reference to it from the `enabled_backends` key. The keys valid in the -backend ``stanza`` are dependent on the actual backend driver and -unknown to Cinder. - -For example, to provision in Cinder two additional backends one could -create a Heat environment file with the following contents:: - - parameter_defaults: - ExtraConfig: - cinder::config::cinder_config: - netapp1/volume_driver: - value: cinder.volume.drivers.netapp.common.NetAppDriver - netapp1/netapp_storage_family: - value: ontap_7mode - netapp1/netapp_storage_protocol: - value: iscsi - netapp1/netapp_server_hostname: - value: 1.1.1.1 - netapp1/netapp_server_port: - value: 80 - netapp1/netapp_login: - value: root - netapp1/netapp_password: - value: 123456 - netapp1/volume_backend_name: - value: netapp_1 - netapp2/volume_driver: - value: cinder.volume.drivers.netapp.common.NetAppDriver - netapp2/netapp_storage_family: - value: ontap_7mode - netapp2/netapp_storage_protocol: - value: iscsi - netapp2/netapp_server_hostname: - value: 2.2.2.2 - netapp2/netapp_server_port: - value: 80 - netapp2/netapp_login: - value: root - netapp2/netapp_password: - value: 123456 - netapp2/volume_backend_name: - value: netapp_2 - cinder_user_enabled_backends: ['netapp1','netapp2'] - -This will not interfere with the deployment of the other backends managed by -TripleO, like Ceph or NFS and will just add these two to the list of the -backends enabled in Cinder. - -Remember to add such an environment file to the deploy commandline:: - - openstack overcloud deploy [other overcloud deploy options] -e ~/my-backends.yaml - -.. note:: - - The :doc:`extra_config` doc has more details on the usage of the different - ExtraConfig interfaces. diff --git a/deploy-guide/source/features/cinder_netapp.rst b/deploy-guide/source/features/cinder_netapp.rst deleted file mode 100644 index c0bb3d11..00000000 --- a/deploy-guide/source/features/cinder_netapp.rst +++ /dev/null @@ -1,60 +0,0 @@ -Configuring Cinder with a NetApp Backend -======================================== - -This guide assumes that your undercloud is already installed and ready to -deploy an overcloud. - -Deploying the Overcloud ------------------------ -.. note:: - - The :doc:`../deployment/template_deploy` doc has a more detailed explanation of the - following steps. - -#. Copy the NetApp configuration file to your home directory:: - - sudo cp /usr/share/openstack-tripleo-heat-templates/environments/cinder-netapp-config.yaml ~ - -#. Edit the permissions (user is typically ``stack``):: - - sudo chown $USER ~/cinder-netapp-config.yaml - sudo chmod 755 ~/cinder-netapp-config.yaml - - -#. Edit the parameters in this file to fit your requirements. Ensure that the following line is changed:: - - OS::TripleO::ControllerExtraConfigPre: /usr/share/openstack-tripleo-heat-templates/puppet/extraconfig/pre_deploy/controller/cinder-netapp.yaml - - -#. Continue following the TripleO instructions for deploying an overcloud. - Before entering the command to deploy the overcloud, add the environment - file that you just configured as an argument:: - - openstack overcloud deploy --templates -e ~/cinder-netapp-config.yaml - -#. Wait for the completion of the overcloud deployment process. - - -Creating a NetApp Volume ------------------------- - -.. note:: - - The following steps will refer to running commands as an admin user or a - tenant user. Sourcing the ``overcloudrc`` file will authenticate you as - the admin user. You can then create a tenant user and use environment - files to switch between them. - -#. Create a new volume type that maps to the new NetApp backend [admin]:: - - cinder type-create [name] - cinder type-key [name] set volume_backend_name=tripleo_netapp - -#. Create the volume [admin]:: - - cinder create --volume-type [type name] [size of volume] - -#. Attach the volume to a server:: - - nova volume-attach - diff --git a/deploy-guide/source/features/composable_services.rst b/deploy-guide/source/features/composable_services.rst deleted file mode 100644 index 13296376..00000000 --- a/deploy-guide/source/features/composable_services.rst +++ /dev/null @@ -1,58 +0,0 @@ -.. _composable_services: - -Deploying with Composable Services -================================== - -TripleO offers the option of deploying with a user-defined list of services -per role (where "role" means group of nodes, e.g "Controller", and "service" -refers to the individual services or configurations e.g "Nova API"). - - -Deploying with custom service lists ------------------------------------ - -Each role to be used in the deployment is defined in a `roles_data.yaml` file. -There is a sample file in `/usr/share/openstack-tripleo-heat-templates`, or the -tripleo-heat-templates_ git repository. Additional example roles are located in -the `/usr/share/openstack-tripleo-heat-templates/roles` directory and can be used -to create a custom `roles_data.yaml` file. See :doc:`custom_roles` for additional -usage details. - -The data in `roles_data.yaml` is used to set the defaults for per-role parameters -e.g `ControllerServices`. These defaults can be overridden via environment -files, e.g:: - - cat > keystone_only_params.yaml << EOF - - parameter_defaults: - ControllerServices: - - OS::TripleO::Services::Keystone - - OS::TripleO::Services::RabbitMQ - - OS::TripleO::Services::HAproxy - - OS::TripleO::Services::MySQL - - OS::TripleO::Services::Keepalived - ComputeCount: 0 - EOF - -The example above overrides the default list of services, and instead deploys -Keystone and the services it requires. It also sets the ComputeCount to zero -to enable a minimal "keystone only" deployment on a single node. - -You can then pass the environment file on deployment as follows:: - - openstack overcloud deploy -e keystone_only_params.yaml - -The same approach can be used for any role. - -.. warning:: - While considerable flexibility is available regarding service placement with - these interfaces, the flexible placement of pacemaker managed services is only - available since the Ocata release. - -.. warning:: - In general moving control-plane services to the Compute role is not - recommended, as the compute nodes require a different upgrade lifecycle - and thus control-plane services on this role may present problems during - major upgrades between releases. - -.. _tripleo-heat-templates: https://opendev.org/openstack/tripleo-heat-templates diff --git a/deploy-guide/source/features/compute_nvdimm.rst b/deploy-guide/source/features/compute_nvdimm.rst deleted file mode 100644 index 8c277817..00000000 --- a/deploy-guide/source/features/compute_nvdimm.rst +++ /dev/null @@ -1,83 +0,0 @@ -Manage Virtual Persistent Memory (vPMEM) -===================================================== -Virtual Persistent Memory (vPMEM) is a Nova feature that allows to expose -Persistent Memory (PMEM) namespaces to guests using libvirt compute driver. -This guide show how the vPMEM feature is supported in TripleO deployment -framework. For in-depth description of Nova's vPMEM feature check Nova -documentation: `Attaching virtual persistent memory to guests -`_ - -.. warning:: - - vPMEM feature is only available in Train(20.0.0) or later releases. - -.. contents:: - :depth: 3 - :backlinks: none - -Prerequisite ------------- -Operators needs to properly configured PMEM Hardware before deploying Overcloud -with vPMEM support. Example of such a hardware is Intel Optane DC Persistent Memory. -Intel provides tool (`ipmctl `_) -to configure the PMEM hardware. - -Operators need to configure the hardware in such a way to enable TripleO to create -`PMEM namespaces `_ in **devdax** mode. -TripleO currently support one backend NVDIMM region, so in case of multiple NVDIMMs -Interleaved Region needs to be configured. - -TripleO vPMEM parameters ------------------------- - -Following parameter are used within TripleO to configure vPMEM: - - .. code:: - - NovaPMEMMappings: - type: string - description: > - PMEM namespace mappings as backend for vPMEM feature. This parameter - sets Nova's `pmem_namespaces` configuration options. PMEM namespaces - needs to be create manually or with conjunction with `NovaPMEMNamespaces` - parameter. - Requires format: $LABEL:$NSNAME[|$NSNAME][,$LABEL:$NSNAME[|$NSNAME]]. - default: "" - tags: - - role_specific - NovaPMEMNamespaces: - type: string - description: > - Creates PMEM namespaces on the host server using `ndctl` tool - through Ansible. - Requires format: $SIZE:$NSNAME[,$SIZE:$NSNAME...]. - $SIZE supports the suffixes "k" or "K" for KiB, "m" or "M" for MiB, "g" - or "G" for GiB and "t" or "T" for TiB. - NOTE: This requires properly configured NVDIMM regions and enough space - for requested namespaces. - default: "" - tags: - - role_specific - -Both parameters are role specific and should be used with custom role. Please check documentation on -how to use `Role-Specific Parameters `_. - -Examples --------- - .. code:: - - parameter_defaults: - ComputePMEMParameters: - NovaPMEMMappings: "6GB:ns0|ns1|ns2,LARGE:ns3" - NovaPMEMNamespaces: "6G:ns1,6G:ns1,6G:ns2,100G:ns3" - - -The following example will perform following steps: -* ensure **ndctl** tool is installed on hosts with role **ComputePMEM** -* create PMEM namespaces as specified in the **NovaPMEMNamespaces** parameter. -- ns0, ns1, ns2 with size 6GiB -- ns3 with size 100GiB -* set Nova parameter **pmem_namespaces** in nova.conf to map create namespaces to vPMEM as specified in **NovaPMEMMappings**. -In this example the label '6GB' will map to one of ns0, ns1 or ns2 namespace and the label 'LARGE' will map to ns3 namespace. - -After deployment you need to configure flavors as described in documentation `Nova: Configure a flavor `_ diff --git a/deploy-guide/source/features/custom_networks.rst b/deploy-guide/source/features/custom_networks.rst deleted file mode 100644 index 27220832..00000000 --- a/deploy-guide/source/features/custom_networks.rst +++ /dev/null @@ -1,579 +0,0 @@ -.. _custom_networks: - -Deploying with Custom Networks -============================== - -TripleO offers the option of deploying with a user-defined list of networks, -where each network can be enabled (or not) for each role (group of servers) in -the deployment. - -Default networks ----------------- - -TripleO offers a default network topology when deploying with network isolation -enabled, and this is reflected in the default-network-isolation_ file in -tripleo-heat-templates_. - -.. admonition:: Victoria and prior releases - - In Victoria and prior releases the default network topology is reflected in - the network_data.yaml_ file in tripleo-heat-templates_. - -These default networks are as follows: - -* ``External`` - External network traffic (disabled by default for - Compute/Storage nodes) - -* ``InternalApi`` - Internal API traffic, most intra-service traffic uses this - network by default - -* ``Storage`` - Storage traffic - -* ``StorageMgmt`` - Storage management traffic (such as replication traffic - between storage nodes) - -* ``Tenant`` - Tenant networks for compute workloads running on the cloud - -Deploying with custom networks ------------------------------- - -Each network is defined in the ``network_data`` YAML file. There are sample -files in ``/usr/share/openstack-tripleo-heat-templates/network-data-samples``, -or the tripleo-heat-templates_ git repository which can be copied and modified -as needed. - -The ``network_data`` YAML file contains a list of networks, with definitions -like: - -.. code-block:: yaml - - - name: CustomNetwork - vip: false - name_lower: custom_network - subnets: - custom_network_subnet: - ip_subnet: 172.16.6.0/24 - allocation_pools: - - start: 172.16.6.4 - - end: 172.16.6.250 - gateway_ip: 172.16.6.1 - -.. admonition:: Victoria and prior releases - - Victoria and releases prior to it used a slightly different ``network_data`` - YAML. - - .. code-block:: yaml - - - name: CustomNetwork - vip: false - name_lower: custom_network - ip_subnet: '172.16.6.0/24' - allocation_pools: [{'start': '172.16.6.4', 'end': '172.16.6.250'}] - gateway_ip: '172.16.6.1' - -The data in the ``network_data`` YAML definition is used to create and update -the network and subnet API resources in Neutron on the undercloud. It is also -used to perform templating with jinja2_ such that arbitrary user-defined -networks may be added, and the default networks may be modified or removed. - -The steps to define your custom networks are: - -#. Copy one of the sample ``network_data`` YAML definitions provided by - tripleo-heat-templates_, for example:: - - cp /usr/share/openstack-tripleo-heat-templates/network-data-samples/default-network-isolation.yaml \ - custom_network_data.yaml - - - .. admonition:: Victoria and prior releases - - In Victoria and earlier releases the sample network data YAML was in a - different location. - - :: - - cp /usr/share/openstack-tripleo-heat-templates/network_data.yaml custom_network_data.yaml - -#. Modify the ``custom_network_data.yaml`` file as required. The network data - is a list of networks, where each network contains at least the - following items: - - :name: Name of the network (mandatory) - :vip: Enable creation of a virtual IP on this network - :subnets: Dictionary's, one or more subnet definition items keyed by the - subnet name. - - :subnet_name: Name of the subnet - - :ip_subnet: IP/CIDR, e.g. ``'10.0.0.0/24'`` - - :allocation_pools: IP range list, e.g. ``[{'start':'10.0.0.4', 'end':'10.0.0.250'}]`` - - :gateway_ip: Gateway for the network - - :vlan: Vlan ID for this network. (supported in Queens and later) - - See `Network data YAML options`_ for a list of all documented options for - the ``network_data`` YAML network definition. - - .. admonition:: Victoria and prior releases - - Victoria and earlier releases requires the first subnet definition **not** - to be in the *subnets* dictionary. - - :name: Name of the network (mandatory) - :vip: Enable creation of a virtual IP on this network - :vlan: Vlan ID for this network. (supported in Queens and later) - :ip_subnet: IP/CIDR, e.g. ``'10.0.0.0/24'`` - :allocation_pools: IP range list, e.g. ``[{'start':'10.0.0.4', 'end':'10.0.0.250'}]`` - :gateway_ip: Gateway for the network - - Other options are supported, see the documentation in the default - network_data.yaml_ for details. - - .. warning:: - Currently there is no validation of the network subnet and - allocation_pools, so care must be take to ensure these are consistent, - and do not conflict with any existing networks, otherwise your deployment - may fail or result in unexpected results. - -#. Copy one of the sample ``vip_data`` YAML definitions provided by - tripleo-heat-templates_, for example:: - - cp /usr/share/openstack-tripleo-heat-templates/network-data-samples/vip-data-default-network-isolation.yaml \ - custom_vip_data.yaml - - .. admonition:: Victoria and prior releases - - For Victoria and prior releases the Virtual IP resources are created as - part of the overcloud heat stack. This step is not valid for these - releases. - -#. Modify the ``custom_vip_data.yaml`` file as required. The Virtual IP data - is a list of Virtual IP address definitions, each containing at a minimum - the name of the network where the IP address should be allocated. - - See `Network Virtual IPs data YAML options`_ for a list of all documented - options for the ``vip_data`` YAML network Virtual IPs definition. - - .. admonition:: Victoria and prior releases - - For Victoria and prior releases the Virtual IP resources are created as - part of the overcloud heat stack. This step is not valid for these - releases. - -#. Copy network configuration templates, add new networks. - - Prior to Victoria, Heat templates were used to define nic configuration - templates. With the Victoria release, Ansible jinja2_ templates were - introduced, and replaced the heat templates. - - The nic configuration examples in tripleo-heat-templates_ was ported to - Ansible jinja2_ templates located in the tripleo_network_config role in - tripleo-ansible_. - - If one of the shipped examples match, use it! If not, be inspired by the - shipped examples and create a set of custom Ansible jinja2 templates. Please - refer to the :ref:`creating_custom_interface_templates` documentation page - which provide a detailed guide on how to create custom Ansible jinja2 - nic config templates. - - For example, copy a sample template to a custom location:: - - cp -r /usr/share/ansible/roles/tripleo_network_config/templates/single_nic_vlans custom-single-nic-vlans - - Modify the templates in custom-single-nic-vlans to match your needs. - - .. admonition:: Ussuri and prior releases - - Prior to Queens, the nic config templates were not dynamically generated, - so it was necessary to copy those that were in use, and add parameters for - any additional networks, for example:: - - cp -r /usr/share/openstack-tripleo-heat-templates/network/config/single-nic-vlans custom-single-nic-vlans - - Each file in ``single-nic-vlans`` will require updating to add - parameters for each custom network. Copy those that exist for the - default networks, and rename to match the *name* field in - ``custom_network_data.yaml``. - - .. note:: - Since Queens, the NIC config templates are dynamically - generated so this step is only necessary when creating custom NIC - config templates, not when just adding a custom network. - - -#. Set your environment overrides to enable your nic config templates. - - Create or update an existing environment file and set the parameter values - to enable your custom nic config templates, for example create a file - ``custom-net-single-nic-with-vlans.yaml`` with these parameter settings:: - - parameter_defaults: - ControllerNetworkConfigTemplate: '/path/to/custom-single-nic-vlans/single_nic_vlans.j2' - CephStorageNetworkConfigTemplate: '/path/to/custom-single-nic-vlans/single_nic_vlans_storage.j2' - ComputeNetworkConfigTemplate: '/path/to/custom-single-nic-vlans/single_nic_vlans.j2' - -#. Create the networks on the undercloud and generate the - ``networks-deployed-environment.yaml`` which will be used as an environment - file when deploying the overcloud. - - :: - - openstack overcloud network provision \ - --output networks-deployed-environment.yaml \ - custom_network_data.yaml - - .. admonition:: Victoria and prior releases - - For Victoria and earlier releases *skip* this step. - - There was no command ``openstack overcloud network provision`` in these - releases. Network resources was created as part of the overcloud heat - stack. - - .. note:: This step is optional when using the ``--baremetal-deployment`` - and ``--vip-data`` options with the ``overcloud deploy`` command. - The deploy command will detect the new format of the network data - YAML definition, run the workflow to create the networks and - include the ``networks-deployed-environment.yaml`` automatically. - -#. Create the overcloud network Virtual IPs and generate the - ``vip-deployed-environment.yaml`` which will be used as an environment file - when deploying the overcloud. - - .. code-block:: bash - - $ openstack overcloud network vip provision \ - --output ~/templates/vip-deployed-environment.yaml \ - ~/templates/custom_vip_data.yaml - - .. note:: This step is optional if using the ``--vip-data`` options with the - ``overcloud deploy`` command. In that case workflow to create the - Virtual IPs and including the environment is automated. - -#. To deploy you pass the ``custom_network_data.yaml`` file via the ``-n`` - option to the overcloud deploy, for example: - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -n custom_network_data.yaml \ - -e baremetal-deployed-environment.yaml \ - -e networks-deployed-environment.yaml \ - -e vip-deployed-environment.yaml \ - -e custom-net-single-nic-with-vlans.yaml - - .. note:: baremetal-deployed-environment.yaml refers to baremetal which - **has already been** deployed as described - :doc:`../provisioning/baremetal_provision` - - Alternatively include the network, Virtual IPs and baremetal provisioning - in the ``overcloud deploy`` command to do it all in one: - - .. code-block:: bash - - openstack overcloud deploy --templates \ - --networks-file custom_network_data.yaml \ - --vip-file custom_vip_data.yaml \ - --baremetal-deployment baremetal_deployment.yaml \ - --network-config \ - -e custom-net-single-nic-with-vlans.yaml - - .. note:: ``baremetal_deployment.yaml`` refers to baremetal which **will - be** deployed by the above command. Please refer to - :doc:`../provisioning/baremetal_provision` for a reference on the - ``baremetal_deployment.yaml`` used in the above example. - - - .. admonition:: Victoria and prior releases - - :: - - openstack overcloud deploy --templates \ - -n custom_network_data.yaml \ - -e custom-net-single-nic-with-vlans.yaml - - .. note:: - It is also possible to copy the entire tripleo-heat-templates tree, and - modify the ``network_data.yaml`` file in place, then deploy via - ``--templates ``. - - -.. _network_definition_opts: - -Network data YAML options -------------------------- - -:name: - Name of the network - - type: *string* - -:name_lower: - *(optional)* Lower case name of the network - - type: *string* - - default: *name.lower()* - -:dns_domain: - *(optional)* Dns domain name for the network - - type: *string* - -:mtu: - *(optional)* Set the maximum transmission unit (MTU) that is guaranteed to - pass through the data path of the segments in the network. - - type: *number* - - default: 1600 - -:service_net_map_replace: - *(optional)* if name_lower is set to a custom name this should be set to - original default (optional). This field is only necessary when changing the - default network names, not when adding a new custom network. - - type: *string* - - .. warning:: Please avoid using this option, the correct solution when - changing a *name_lower* of one of the default networks is to - also update the ``ServiceNetMap`` parameter to use the same - custom *name_lower*. - -:ipv6: - *(optional)* - - type: *boolean* - - default: *false* - -:vip: - *(optional)* Enable creation of a virtual IP on this network - - type: *boolean* - - default: *false* - -:subnets: - A map of subnets for the network. The collection should contain keys which - define the subnet name. The value for each item is a subnet definition. - - Example: - - .. code-block:: yaml - - subnets: - subnet_name_a: - ip_subnet: 192.0.2.0/24 - allocation_pools: - - start: 192.0.2.50 - end: 192.0.2.99 - gateway_ip: 192.0.2.1 - vlan: 102 - subnet_name_b: - ip_subnet: 198.51.100.0/24 - allocation_pools: - - start: 198.51.100.50 - end: 198.51.100.99 - gateway_ip: 198.51.100.1 - vlan: 101 - - See `Options for network data YAML subnet definitions`_ for a list of all - documented sub-options for the subnet definitions. - - type: *dictionary* - - -Options for network data YAML subnet definitions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -:ip_subnet: - IPv4 CIDR block notation for this subnet. For example: ``192.0.2.0/24`` - - type: *string* - - .. note:: Optional if ``ipv6_subnet`` is specified. - -:ipv6_subnet: - IPv6 CIDR block notation for this subnet. For example: - ``2001:db8:fd00:1000::/64`` - - type: *string* - - .. note:: Optional if ``ip_subnet`` is specified. - -:gateway_ip: - *(optional)* The gateway IPv4 address - - type: *string* - -:gateway_ipv6: - *(optional)* The gateway IPv6 address - -:allocation_pools: - *(optional)* The start and end addresses for the subnets IPv4 allocation - pools. - - type: *list* - - elements: *dictionary* - - :suboptions: - - :start: Start address for the allocation pool. - - type: *string* - - :end: End address for the allocation pool. - - type: *string* - - Example: - - .. code-block:: yaml - - allocation_pools: - - start: 192.0.2.50 - end: 192.0.2.99 - - start: 192.0.2.150 - end: 192.0.2.199 - -:ipv6_allocation_pools: - *(optional)* The start and end addresses for the subnets IPv6 allocation - pools. - - type: *list* - - elements: *dictionary* - - :suboptions: - - :start: Start address for the allocation pool. - - type: *string* - - :end: End address for the allocation pool. - - type: *string* - - Example: - - .. code-block:: yaml - - allocation_pools: - - start: 2001:db8:fd00:1000:100::1 - end: 2001:db8:fd00:1000:199::1 - - start: 2001:db8:fd00:1000:300::1 - end: 2001:db8:fd00:1000:399::1 - -:routes: - *(optional)* List of networks that should be routed via network gateway. A - single /16 supernet route could be used for 255 smaller /24 subnets. - - type: *list* - - elements: *dictionary* - - :suboptions: - - :destination: Destination network, - for example: ``198.51.100.0/24`` - - type: *string* - - :nexthop: IP address of the router to use for the destination network, - for example: ``192.0.2.1`` - - type: *string* - - Example: - - .. code-block:: yaml - - routes: - - destination: 198.51.100.0/24 - nexthop: 192.0.2.1 - - destination: 203.0.113.0/24 - nexthost: 192.0.2.1 - -:routes_ipv6: - *(optional)* List of IPv6 networks that should be routed via network gateway. - - type: *list* - - elements: *dictionary* - - :suboptions: - - :destination: Destination network, - for example: ``2001:db8:fd00:2000::/64`` - - type: *string* - - :nexthop: IP address of the router to use for the destination network, - for example: ``2001:db8:fd00:1000::1`` - - type: *string* - - Example: - - .. code-block:: yaml - - routes: - - destination: 2001:db8:fd00:2000::/64 - nexthop: 2001:db8:fd00:1000:100::1 - - destination: 2001:db8:fd00:3000::/64 - nexthost: 2001:db8:fd00:1000:100::1 - -:vlan: - *(optional)* vlan ID for the network - - type: *number* - - -.. _virtual_ips_definition_opts: - -Network Virtual IPs data YAML options -------------------------------------- - -:network: - Neutron Network name - - type: *string* - -:ip_address: - *(optional)* IP address, a pre-defined fixed IP address. - - type: *string* - -:subnet: - *(optional)* Neutron Subnet name, used to specify the subnet to use when - creating the Virtual IP neutron port. - - This is required for deployments using routed networks, to ensure the Virtual - IP is allocated on the subnet where controller nodes are attached. - - type: *string* - -:dns_name: - *(optional)* Dns Name, the hostname part of the FQDN (Fully Qualified Domain - Name) - - type: *string* - - default: overcloud - -:name: - *(optional)* Virtual IP name - - type: *string* - default: $network_name_virtual_ip - -.. _tripleo-heat-templates: https://opendev.org/openstack/tripleo-heat-templates -.. _default-network-isolation: https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/network-data-samples/default-network-isolation.yaml -.. _network_data.yaml: https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/network_data.yaml -.. _jinja2: http://jinja.pocoo.org/docs/dev/ -.. _tripleo-ansible: https://opendev.org/openstack/tripleo-ansible/src/branch/master/tripleo_ansible/roles/tripleo_network_config/templates diff --git a/deploy-guide/source/features/custom_roles.rst b/deploy-guide/source/features/custom_roles.rst deleted file mode 100644 index ee406436..00000000 --- a/deploy-guide/source/features/custom_roles.rst +++ /dev/null @@ -1,141 +0,0 @@ -.. _custom_roles: - -Deploying with Custom Roles -=========================== - -TripleO offers the option of deploying with a user-defined list of roles, -each running a user defined list of services (where "role" means group of -nodes, e.g "Controller", and "service" refers to the individual services or -configurations e.g "Nova API"). - -See :doc:`composable_services` if you only wish to modify the default list of -deployed services, or see below if you wish to modify the deployed roles. - - -Provided example roles ----------------------- - -TripleO offers examples roles provided in `openstack-tripleo-heat-templates`. -These roles can be listed using the `tripleoclient` by running:: - - openstack overcloud role list - -With these provided roles, the user deploying the overcloud can generate a -`roles_data.yaml` file that contains the roles they would like to use for the -overcloud nodes. Additionally the user can manage their personal custom roles -in a similar manner by storing the individual files in a directory and using -the `tripleoclient` to generate their `roles_data.yaml`. For example, a user -can execute the following to create a `roles_data.yaml` containing only the -`Controller` and `Compute` roles:: - - openstack overcloud roles generate -o ~/roles_data.yaml Controller Compute - -These provided roles can be generated with a different `name` in the -`roles_data.yaml` by using a format like, `Compute:ComputeHardwareA`, which -will add the role `Compute` to `roles_data.yaml` by modifying the `name` of -the role to `ComputeHardwareA`. This helps in associating nodes with a specific -hardware group to a role and target parameters specific to this hardware -group. The example command below generates a `role_data.yaml` with two Compute -roles which can be addressed to specific hardware groups.:: - - openstack overcloud roles generate -o ~/roles_data.yaml Controller \ - Compute:ComputeHardwareA Compute:ComputeHardwareB - - -Deploying with custom roles ---------------------------- - -Each role is defined in the `roles_data.yaml` file. There is a sample file in -`/usr/share/openstack-tripleo-heat-templates`, or the tripleo-heat-templates_ git -repository. - -The data in `roles_data.yaml` is used to perform templating with jinja2_ such -that arbitrary user-defined roles may be added, and the default roles may -be modified or removed. - -The steps to define your custom roles configuration are: - -1. Copy the default roles provided by `tripleo-heat-templates`:: - - mkdir ~/roles - cp /usr/share/openstack-tripleo-heat-templates/roles/* ~/roles - -2. Create a new role file with your custom role. - -Additional details about the format for the roles file can be found in the -`README.rst `_ -in the roles/ directory from `tripleo-heat-templates`. The filename should -match the name of the role. For example if adding a new role named `Galera`, -the role file name should be `Galera.yaml`. The file should at least contain -the following items: - -* name: Name of the role e.g "CustomController", mandatory -* ServicesDefault: List of services, optional, defaults to an empty list - See the default roles_data.yaml or overcloud-resource-registry-puppet.j2.yaml - for the list of supported services. Both files can be found in the top - tripleo-heat-templates folder - -Additional items like the ones below should be included as well: - -* CountDefault: Default number of nodes, defaults to zero -* HostnameFormatDefault: Format string for hostname, optional -* Description: A few sentences describing the role and information - pertaining to the usage of the role. - -The role file format is a basic yaml structure. The expectation is that there -is a single role per file. See the roles `README.rst` for additional details. For -example the following role might be used to deploy a pacemaker managed galera -cluster:: - - - name: Galera - HostnameFormatDefault: '%stackname%-galera-%index%' - ServicesDefault: - - OS::TripleO::Services::CACerts - - OS::TripleO::Services::Timezone - - OS::TripleO::Services::Timesync - - OS::TripleO::Services::Snmp - - OS::TripleO::Services::Kernel - - OS::TripleO::Services::Pacemaker - - OS::TripleO::Services::MySQL - - OS::TripleO::Services::TripleoPackages - - OS::TripleO::Services::TripleoFirewall - - OS::TripleO::Services::SensuClient - - OS::TripleO::Services::FluentdClient - -.. note:: - In the example above, if you wanted to deploy the Galera role on specific nodes - you would either use predictable placement :doc:`../provisioning/node_placement` or add a custom - parameter called OvercloudGaleraFlavor:: - - - parameter_defaults: - OvercloudGaleraFlavor: oooq_galera - -.. warning:: - When scaling your deployment out, you need as well set the role counts in the - "parameter_defaults" section. The ``--control-scale`` and ``--compute-scale`` - CLI args are hardcoded to the "Control" and "Compute" role names, so they're in - fact ignored when using custom roles. - -3. Create a `roles_data.yaml` file that contains the custom role in addition - to the other roles that will be deployed. For example:: - - openstack overcloud roles generate --roles-path ~/roles -o ~/my_roles_data.yaml Controller Compute Galera - -4. Pass the modified roles_data on deployment as follows:: - - openstack overcloud deploy --templates -r ~/my_roles_data.yaml - -.. note:: - It is also possible to copy the entire tripleo-heat-templates tree, and modify - the roles_data.yaml file in place, then deploy via ``--templates `` - -.. warning:: - Note that in your custom roles you may not use any already predefined name - So in practice you may not override the following roles: Controller, Compute, - BlockStorage, SwiftStorage and CephStorage. You need to use different names - instead. - - -.. _tripleo-heat-templates: https://opendev.org/openstack/tripleo-heat-templates -.. _jinja2: http://jinja.pocoo.org/docs/dev/ diff --git a/deploy-guide/source/features/deploy_cellv2.rst b/deploy-guide/source/features/deploy_cellv2.rst deleted file mode 100644 index fd0e1cc9..00000000 --- a/deploy-guide/source/features/deploy_cellv2.rst +++ /dev/null @@ -1,30 +0,0 @@ -Deploy an additional nova cell v2 -================================= - -.. warning:: - Multi cell support is only supported in Stein and later versions. - -The different sections in this guide assume that you are ready to deploy a new -overcloud, or already have installed an overcloud (min Stein release). - -.. note:: - - Starting with CentOS 8 and the TripleO Stein release, podman is the CONTAINERCLI - to be used in the following steps. - -The minimum requirement for having multiple cells is to have a central OpenStack -controller cluster running all controller services. Additional cells will -have cell controllers running the cell DB, cell MQ and a nova cell conductor -service. In addition there are 1..n compute nodes. The central nova conductor -service acts as a super conductor of the whole environment. - -For more details on the cells v2 layout check `Cells Layout (v2) -`_ - -.. toctree:: - - deploy_cellv2_basic.rst - deploy_cellv2_advanced.rst - deploy_cellv2_routed.rst - deploy_cellv2_additional.rst - deploy_cellv2_manage_cell.rst diff --git a/deploy-guide/source/features/deploy_cellv2_additional.rst b/deploy-guide/source/features/deploy_cellv2_additional.rst deleted file mode 100644 index 0d655d14..00000000 --- a/deploy-guide/source/features/deploy_cellv2_additional.rst +++ /dev/null @@ -1,155 +0,0 @@ -Additional cell considerations and features -=========================================== - -.. warning:: - Multi cell support is only supported in Stein or later versions. - -.. contents:: - :depth: 3 - :backlinks: none - -.. _cell_availability_zone: - -Availability Zones (AZ) ------------------------ -A nova AZ must be configured for each cell to make sure instances stay in the -cell when performing migration and to be able to target a cell when an instance -gets created. The central cell must also be configured as a specific AZs -(or multiple AZs) rather than the default. - -Configuring AZs for Nova (compute) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -It's also possible to configure the AZ for a compute node by adding it to a -host aggregate after the deployment is completed. The following commands show -creating a host aggregate, an associated AZ, and adding compute nodes to a -`cell-1` AZ: - -.. code-block:: bash - - source overcloudrc - openstack aggregate create cell1 --zone cell1 - openstack aggregate add host cell1 hostA - openstack aggregate add host cell1 hostB - -.. note:: - - Right now we can not use `OS::TripleO::Services::NovaAZConfig` to auto - create the AZ during the deployment as at this stage the initial cell - creation is not complete. Further work is needed to fully automate the - post cell creation steps before `OS::TripleO::Services::NovaAZConfig` - can be used. - - -Routed networks ---------------- - -A routed spine and leaf networking layout can be used to deploy the additional -cell nodes in a distributed nature. Not all nodes need to be co-located at the -same physical location or datacenter. See :ref:`routed_spine_leaf_network` for -more details. - -Reusing networks from an already deployed stack ------------------------------------------------ -When deploying separate stacks it may be necessary to reuse networks, subnets, -and VIP resources between stacks if desired. Only a single Heat stack can own a -resource and be responsible for its creation and deletion, however the -resources can be reused in other stacks. - -Usually the internal api network in case of split cell controller and cell -compute stacks are shared. - -To reuse network related resources between stacks, the following parameters -have been added to the network definitions in the `network_data.yaml` file -format: - -.. code-block:: bash - - external_resource_network_id: Existing Network UUID - external_resource_subnet_id: Existing Subnet UUID - external_resource_segment_id: Existing Segment UUID - external_resource_vip_id: Existing VIP UUID - -These parameters can be set on each network definition in the -`network_data.yaml` file used for the deployment of the separate stack. - -Not all networks need to be reused or shared across stacks. The -`external_resource_*` parameters can be set for only the networks that are -meant to be shared, while the other networks can be newly created and managed. - -For example, to reuse the `internal_api` network from the cell controller stack -in the compute stack, run the following commands to show the UUIDs for the -related network resources: - -.. code-block:: bash - - openstack network show internal_api -c id -f value - openstack subnet show internal_api_subnet -c id -f value - openstack port show internal_api_virtual_ip -c id -f value - -Save the values shown in the output of the above commands and add them to the -network definition for the `internal_api` network in the `network_data.yaml` -file for the separate stack. - -In case the overcloud and the cell controller stack uses the same internal -api network there are two ports with the name `internal_api_virtual_ip`. -In this case it is required to identify the correct port and use the id -instead of the name in the `openstack port show` command. - -An example network definition would look like: - -.. code-block:: bash - - - name: InternalApi - external_resource_network_id: 93861871-7814-4dbc-9e6c-7f51496b43af - external_resource_subnet_id: c85c8670-51c1-4b17-a580-1cfb4344de27 - external_resource_vip_id: 8bb9d96f-72bf-4964-a05c-5d3fed203eb7 - name_lower: internal_api - vip: true - ip_subnet: '172.16.2.0/24' - allocation_pools: [{'start': '172.16.2.4', 'end': '172.16.2.250'}] - ipv6_subnet: 'fd00:fd00:fd00:2000::/64' - ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:2000::10', 'end': 'fd00:fd00:fd00:2000:ffff:ffff:ffff:fffe'}] - mtu: 1400 - -.. note:: - - When *not* sharing networks between stacks, each network defined in - `network_data.yaml` must have a unique name across all deployed stacks. - This requirement is necessary since regardless of the stack, all networks are - created in the same tenant in Neutron on the undercloud. - - For example, the network name `internal_api` can't be reused between - stacks, unless the intent is to share the network between the stacks. - The network would need to be given a different `name` and `name_lower` - property such as `InternalApiCompute0` and `internal_api_compute_0`. - -Configuring nova-metadata API per-cell --------------------------------------- - -.. note:: - Deploying nova-metadata API per-cell is only supported in Train - and later. - -.. note:: - - NovaLocalMetadataPerCell is only tested with ovn metadata agent to - automatically forward requests to the nova metadata api. - -It is possible to configure the nova-metadata API service local per-cell. -In this situation the cell controllers also host the nova-metadata API -service. The `NovaLocalMetadataPerCell` parameter, which defaults to -`false` need to be set to `true`. -Using nova-metadata API service per-cell can have better performance and -data isolation in a multi-cell deployment. Users should consider the use -of this configuration depending on how neutron is setup. If networks span -cells, you might need to run nova-metadata API service centrally. -If your networks are segmented along cell boundaries, then you can -run nova-metadata API service per cell. - -.. code-block:: yaml - - parameter_defaults: - NovaLocalMetadataPerCell: True - -See also information on running nova-metadata API per cell as explained -in the cells v2 layout section `Local per cell `_ diff --git a/deploy-guide/source/features/deploy_cellv2_advanced.rst b/deploy-guide/source/features/deploy_cellv2_advanced.rst deleted file mode 100644 index d158d7f9..00000000 --- a/deploy-guide/source/features/deploy_cellv2_advanced.rst +++ /dev/null @@ -1,247 +0,0 @@ -Example 2. - Split Cell controller/compute Architecture in Train release -======================================================================== - -.. warning:: - Multi cell support is only supported in Stein or later versions. - This guide addresses Train release and later! - -.. contents:: - :depth: 3 - :backlinks: none - -This guide assumes that you are ready to deploy a new overcloud, or have -already installed an overcloud (min Train release). - -.. note:: - - Starting with CentOS 8 and the TripleO Stein release, podman is the CONTAINERCLI - to be used in the following steps. - -.. _advanced_cell_arch: - -In this scenario the cell computes get split off in its own stack, e.g. to -manage computes from each edge site in its own stack. - -This section only explains the differences to the :doc:`deploy_cellv2_basic`. - -Like before the following example uses six nodes and the split control plane method -to deploy a distributed cell deployment. The first Heat stack deploys the controller -cluster. The second Heat stack deploys the cell controller. The computes will then -again be split off in its own stack. - -.. _cell_export_cell_controller_info: - -Extract deployment information from the overcloud stack -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Again like in :ref:`cell_export_overcloud_info` information from the control -plane stack needs to be exported: - -.. code-block:: bash - - source stackrc - mkdir cell1 - export DIR=cell1 - - openstack overcloud cell export cell1-ctrl -o cell1/cell1-ctrl-input.yaml - - -Create roles file for the cell stack -____________________________________ - -The same roles get exported as in :ref:`cell_create_roles_file`. - -Create cell parameter file for additional customization (e.g. cell1/cell1.yaml) -_______________________________________________________________________________ - -The cell parameter file remains the same as in :ref:`cell_parameter_file` with -the only difference that the `ComputeCount` gets set to 0. This is required as -we use the roles file contain both `CellController` and `Compute` role and the -default count for the `Compute` role is 1 (e.g. `cell1/cell1.yaml`): - -.. code-block:: yaml - - parameter_defaults: - ... - # number of controllers/computes in the cell - CellControllerCount: 1 - ComputeCount: 0 - ... - -Create the network configuration for `cellcontroller` and add to environment file -_________________________________________________________________________________ -Depending on the network configuration of the used hardware and network -architecture it is required to register a resource for the `CellController` -role. - -.. code-block:: yaml - - resource_registry: - OS::TripleO::CellController::Net::SoftwareConfig: single-nic-vlans/controller.yaml - -.. note:: - - For details on network configuration consult :ref:`network_isolation` guide, chapter *Customizing the Interface Templates*. - -Deploy the cell -^^^^^^^^^^^^^^^ - -Create new flavor used to tag the cell controller -_________________________________________________ - -Follow the instructions in :ref:`cell_create_flavor_and_tag` on how to create -a new flavor and tag the cell controller. - -Run cell deployment -___________________ -To deploy the cell controller stack we use the same `overcloud deploy` -command as it was used to deploy the `overcloud` stack and add the created -export environment files: - -.. code-block:: bash - - openstack overcloud deploy \ - --templates /usr/share/openstack-tripleo-heat-templates \ - -e ... additional environment files used for overcloud stack, like container - prepare parameters, or other specific parameters for the cell - ... -     --stack cell1-ctrl \ -     -r $HOME/$DIR/cell_roles_data.yaml \ -     -e $HOME/$DIR/cell1-ctrl-input.yaml \ -     -e $HOME/$DIR/cell1.yaml - -Wait for the deployment to finish: - -.. code-block:: bash - - openstack stack list - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - | 890e4764-1606-4dab-9c2f-6ed853e3fed8 | cell1-ctrl | 2b303a97f4664a69ba2dbcfd723e76a4 | CREATE_COMPLETE | 2019-02-12T08:35:32Z | None | - | 09531653-1074-4568-b50a-48a7b3cc15a6 | overcloud | 2b303a97f4664a69ba2dbcfd723e76a4 | UPDATE_COMPLETE | 2019-02-09T09:52:56Z | 2019-02-11T08:33:37Z | - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - -Create the cell -^^^^^^^^^^^^^^^ -As in :ref:`cell_create_cell` create the cell, but we can skip the final host -discovery step as the computes are note yet deployed. - -Extract deployment information from the cell controller stack -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The cell compute stack again requires input information from both the control -plane stack (`overcloud`) and the cell controller stack (`cell1-ctrl`): - -.. code-block:: bash - - source stackrc - export DIR=cell1 - -Export EndpointMap, HostsEntry, AllNodesConfig, GlobalConfig and passwords information -______________________________________________________________________________________ -As before the `openstack overcloud cell export` functionality of the tripleo-client -is used to export the required data from the cell controller stack. - -.. code-block:: bash - - openstack overcloud cell export cell1-cmp -o cell1/cell1-cmp-input.yaml -e cell1-ctrl - -`cell1-cmp` is the chosen name for the new compute stack. This parameter is used to -set the default export file name, which is then stored on the current directory. -In this case a dedicated export file was set via `-o`. -In addition it is required to use the `--cell-stack ` or `-e ` -parameter to point the export command to the cell controller stack and indicate -that this is a compute child stack. This is required as the input information for -the cell controller and cell compute stack is not the same. - -.. note:: - - If the export file already exists it can be forced to be overwritten using - `--force-overwrite` or `-f`. - -.. note:: - - The services from the cell stacks use the same passwords services as the - control plane services. - -Create cell compute parameter file for additional customization -_______________________________________________________________ -A new parameter file is used to overwrite, or customize settings which are -different from the cell controller stack. Add the following content into -a parameter file for the cell compute stack, e.g. `cell1/cell1-cmp.yaml`: - -.. code-block:: yaml - - resource_registry: - # Since the compute stack deploys only compute nodes ExternalVIPPorts - # are not required. - OS::TripleO::Network::Ports::ExternalVipPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml - - parameter_defaults: - # number of controllers/computes in the cell - CellControllerCount: 0 - ComputeCount: 1 - -The above file overwrites the values from `cell1/cell1.yaml` to not deploy -a controller in the cell compute stack. Since the cell compute stack uses -the same role file the default `CellControllerCount` is 1. -If there are other differences, like network config, parameters, ... for -the computes, add them here. - -Deploy the cell computes -^^^^^^^^^^^^^^^^^^^^^^^^ - -Run cell deployment -___________________ -To deploy the overcloud we can use the same `overcloud deploy` command as -it was used to deploy the `cell1-ctrl` stack and add the created export -environment files: - -.. code-block:: bash - - openstack overcloud deploy \ - --templates /usr/share/openstack-tripleo-heat-templates \ - -e ... additional environment files used for overcloud stack, like container - prepare parameters, or other specific parameters for the cell - ... -     --stack cell1-cmp \ - -n $HOME/$DIR/cell1-cmp/network_data.yaml \ -     -r $HOME/$DIR/cell_roles_data.yaml \ -     -e $HOME/$DIR/cell1-ctrl-input.yaml \ -     -e $HOME/$DIR/cell1-cmp-input.yaml \ -     -e $HOME/$DIR/cell1.yaml \ -     -e $HOME/$DIR/cell1-cmp.yaml - -Wait for the deployment to finish: - -.. code-block:: bash - - openstack stack list - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - | 790e4764-2345-4dab-7c2f-7ed853e7e778 | cell1-cmp | 2b303a97f4664a69ba2dbcfd723e76a4 | CREATE_COMPLETE | 2019-02-12T08:35:32Z | None | - | 890e4764-1606-4dab-9c2f-6ed853e3fed8 | cell1-ctrl | 2b303a97f4664a69ba2dbcfd723e76a4 | CREATE_COMPLETE | 2019-02-12T08:35:32Z | None | - | 09531653-1074-4568-b50a-48a7b3cc15a6 | overcloud | 2b303a97f4664a69ba2dbcfd723e76a4 | UPDATE_COMPLETE | 2019-02-09T09:52:56Z | 2019-02-11T08:33:37Z | - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - -Perform cell host discovery -___________________________ -The final step is to discover the computes deployed in the cell. Run the host discovery -as explained in :ref:`cell_host_discovery`. - -Create and add the node to an Availability Zone -_______________________________________________ -After a cell got provisioned, it is required to create an availability zone for the -compute stack, it is not enough to just create an availability zone for the complete -cell. In this used case we want to make sure an instance created in the compute group, -stays in it when performing a migration. Check :ref:`cell_availability_zone` on more -about how to create an availability zone and add the node. - -After that the cell is deployed and can be used. - -.. note:: - - Migrating instances between cells is not supported. To move an instance to - a different cell it needs to be re-created in the new target cell. - diff --git a/deploy-guide/source/features/deploy_cellv2_basic.rst b/deploy-guide/source/features/deploy_cellv2_basic.rst deleted file mode 100644 index 94bc1017..00000000 --- a/deploy-guide/source/features/deploy_cellv2_basic.rst +++ /dev/null @@ -1,416 +0,0 @@ -Example 1. - Basic Cell Architecture in Train release -===================================================== - -.. warning:: - Multi cell support is only supported in Stein or later versions. - This guide addresses Train release and later! - -.. contents:: - :depth: 3 - :backlinks: none - -This guide assumes that you are ready to deploy a new overcloud, or have -already installed an overcloud (min Train release). - -.. note:: - - Starting with CentOS 8 and the TripleO Stein release, podman is the CONTAINERCLI - to be used in the following steps. - -.. _basic_cell_arch: - -The following example uses six nodes and the split control plane method to -deploy a distributed cell deployment. The first Heat stack deploys a controller -cluster and a compute. The second Heat stack deploys a cell controller and a -compute node: - -.. code-block:: bash - - openstack overcloud status - +-----------+---------------------+---------------------+-------------------+ - | Plan Name | Created | Updated | Deployment Status | - +-----------+---------------------+---------------------+-------------------+ - | overcloud | 2019-02-12 09:00:27 | 2019-02-12 09:00:27 | DEPLOY_SUCCESS | - +-----------+---------------------+---------------------+-------------------+ - - openstack server list -c Name -c Status -c Networks - +----------------------------+--------+------------------------+ - | Name | Status | Networks | - +----------------------------+--------+------------------------+ - | overcloud-controller-1 | ACTIVE | ctlplane=192.168.24.19 | - | overcloud-controller-2 | ACTIVE | ctlplane=192.168.24.11 | - | overcloud-controller-0 | ACTIVE | ctlplane=192.168.24.29 | - | overcloud-novacompute-0 | ACTIVE | ctlplane=192.168.24.15 | - +----------------------------+--------+------------------------+ - -The above deployed overcloud shows the nodes from the first stack. - -.. note:: - - In this example the default cell and the additional cell uses the - same network, When configuring another network scenario keep in - mind that it will be necessary for the systems to be able to - communicate with each other. - -Extract deployment information from the overcloud stack -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Any additional cell stack requires information from the overcloud Heat stack -where the central OpenStack services are located. The extracted parameters are -needed as input for additional cell stacks. To extract these parameters -into separate files in a directory (e.g. DIR=cell1) run the following: - -.. code-block:: bash - - source stackrc - mkdir cell1 - export DIR=cell1 - -.. _cell_export_overcloud_info: - -Export EndpointMap, HostsEntry, AllNodesConfig, GlobalConfig and passwords information -______________________________________________________________________________________ -The tripleo-client in Train provides an `openstack overcloud cell export` -functionality to export the required data from the control plane stack which -then is used as an environment file passed to the cell stack. - -.. code-block:: bash - - openstack overcloud cell export cell1 -o cell1/cell1-cell-input.yaml - -`cell1` is the chosen name for the new cell. This parameter is used to -set the default export file name, which is then stored on the current -directory. -In this case a dedicated export file was set via `-o`. - -.. note:: - - If the export file already exists it can be forced to be overwritten using - `--force-overwrite` or `-f`. - -.. note:: - - The services from the cell stacks use the same passwords services as the - control plane services. - -.. _cell_create_roles_file: - -Create roles file for the cell stack -____________________________________ -Different roles are provided within tripleo-heat-templates, depending on -the configuration and desired services to be deployed. - -The default compute role at roles/Compute.yaml can be used for cell computes -if that is sufficient for the use case. - -A dedicated role, `roles/CellController.yaml` is provided. This role includes -the necessary roles for the cell controller, where the main services are -galera database, rabbitmq, nova-conductor, nova novnc proxy and nova metadata -in case `NovaLocalMetadataPerCell` is enabled. - -Create the roles file for the cell: - -.. code-block:: bash - - openstack overcloud roles generate --roles-path \ - /usr/share/openstack-tripleo-heat-templates/roles \ - -o $DIR/cell_roles_data.yaml Compute CellController - -.. _cell_parameter_file: - -Create cell parameter file for additional customization (e.g. cell1/cell1.yaml) -_______________________________________________________________________________ -Each cell has some mandatory parameters which need to be set using an -environment file. -Add the following content into a parameter file for the cell, e.g. `cell1/cell1.yaml`: - -.. code-block:: - - resource_registry: - OS::TripleO::Network::Ports::OVNDBsVipPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml - OS::TripleO::Network::Ports::RedisVipPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml - - parameter_defaults: - # since the same networks are used in this example, the - # creation of the different networks is omitted - ManageNetworks: false - - # CELL Parameter to reflect that this is an additional CELL - NovaAdditionalCell: True - - # The DNS names for the VIPs for the cell - CloudName: cell1.ooo.test - CloudNameInternal: cell1.internalapi.ooo.test - CloudNameStorage: cell1.storage.ooo.test - CloudNameStorageManagement: cell1.storagemgmt.ooo.test - CloudNameCtlplane: cell1.ctlplane.ooo.test - - # Flavors used for the cell controller and computes - OvercloudCellControllerFlavor: cellcontroller - OvercloudComputeFlavor: compute - - # Number of controllers/computes in the cell - CellControllerCount: 1 - ComputeCount: 1 - -   # Compute names need to be uniq across cells. Make sure to have a uniq - # hostname format for cell nodes -   ComputeHostnameFormat: 'cell1-compute-%index%' - - # default gateway - ControlPlaneStaticRoutes: - - ip_netmask: 0.0.0.0/0 - next_hop: 192.168.24.1 - default: true - DnsServers: - - x.x.x.x - -The above file disables creating networks by setting ``ManageNetworks`` parameter -to ``false`` so that the same ``network_data.yaml`` file from the overcloud stack -can be used. When ``ManageNetworks`` is set to false, ports will be created for -the nodes in the separate stacks on the existing networks that were already created -in the ``overcloud`` stack. - -It also specifies that this will be an additional cell using parameter -`NovaAdditionalCell`. - -.. note:: - - Compute hostnames need to be uniq across cells. Make sure to use - `ComputeHostnameFormat` to have uniq hostnames. - - -Create the network configuration for `cellcontroller` and add to environment file -_________________________________________________________________________________ -Depending on the network configuration of the used hardware and network -architecture it is required to register a resource for the `CellController` -role. - -.. code-block:: yaml - - resource_registry: - OS::TripleO::CellController::Net::SoftwareConfig: single-nic-vlans/controller.yaml - OS::TripleO::Compute::Net::SoftwareConfig: single-nic-vlans/compute.yaml - -.. note:: - - This example just reused the exiting network configs as it is a shared L2 - network. For details on network configuration consult :ref:`network_isolation` guide, - chapter *Customizing the Interface Templates*. - -Deploy the cell -^^^^^^^^^^^^^^^ - -.. _cell_create_flavor_and_tag: - -Create new flavor used to tag the cell controller -_________________________________________________ -Depending on the hardware create a flavor and tag the node to be used. - -.. code-block:: bash - - openstack flavor create --id auto --ram 4096 --disk 40 --vcpus 1 cellcontroller - openstack flavor set --property "cpu_arch"="x86_64" \ - --property "capabilities:boot_option"="local" \ - --property "capabilities:profile"="cellcontroller" \ - --property "resources:CUSTOM_BAREMETAL=1" \ - --property "resources:DISK_GB=0" \ - --property "resources:MEMORY_MB=0" \ - --property "resources:VCPU=0" \ - cellcontroller - -The properties need to be modified to the needs of the environment. - -Tag node into the new flavor using the following command - - -.. code-block:: bash - - baremetal node set --property \ - capabilities='profile:cellcontroller,boot_option:local' - -Verify the tagged cellcontroller: - -.. code-block:: bash - - openstack overcloud profiles list - -Run cell deployment -___________________ -To deploy the overcloud we can use the same `overcloud deploy` command as -it was used to deploy the `overcloud` stack and add the created export -environment files: - -.. code-block:: bash - - openstack overcloud deploy \ - --templates /usr/share/openstack-tripleo-heat-templates \ - -e ... additional environment files used for overcloud stack, like container - prepare parameters, or other specific parameters for the cell - ... -     --stack cell1 \ -     -r $HOME/$DIR/cell_roles_data.yaml \ -     -e $HOME/$DIR/cell1-cell-input.yaml \ -     -e $HOME/$DIR/cell1.yaml - -Wait for the deployment to finish: - -.. code-block:: bash - - openstack stack list - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - | 890e4764-1606-4dab-9c2f-6ed853e3fed8 | cell1 | 2b303a97f4664a69ba2dbcfd723e76a4 | CREATE_COMPLETE | 2019-02-12T08:35:32Z | None | - | 09531653-1074-4568-b50a-48a7b3cc15a6 | overcloud | 2b303a97f4664a69ba2dbcfd723e76a4 | UPDATE_COMPLETE | 2019-02-09T09:52:56Z | 2019-02-11T08:33:37Z | - +--------------------------------------+--------------+----------------------------------+-----------------+----------------------+----------------------+ - -.. _cell_create_cell: - -Create the cell and discover compute nodes (ansible playbook) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -An ansible role and playbook is available to automate the one time tasks -to create a cell after the deployment steps finished successfully. In -addition :ref:`cell_create_cell_manual` explains the tasks being automated -by this ansible way. - -.. note:: - - When using multiple additional cells, don't place all inventories of the cells - in one directory. The current version of the `create-nova-cell-v2.yaml` playbook - uses `CellController[0]` to get the `database_connection` and `transport_url` - to create the new cell. When all cell inventories get added to the same directory - `CellController[0]` might not be the correct cell controller for the new cell. - -.. code-block:: bash - - export CONTAINERCLI=podman #choose appropriate container cli here - source stackrc - mkdir inventories - for i in overcloud cell1; do \ - /usr/bin/tripleo-ansible-inventory \ - --static-yaml-inventory inventories/${i}.yaml --stack ${i}; \ - done - - ANSIBLE_HOST_KEY_CHECKING=False ANSIBLE_SSH_RETRIES=3 ansible-playbook -i inventories \ - /usr/share/ansible/tripleo-playbooks/create-nova-cell-v2.yaml \ - -e tripleo_cellv2_cell_name=cell1 \ - -e tripleo_cellv2_containercli=${CONTAINERCLI} - -The playbook requires two parameters `tripleo_cellv2_cell_name` to provide -the name of the new cell and until docker got dropped `tripleo_cellv2_containercli` -to specify either if podman or docker is used. - -.. _cell_create_cell_manual: - -Create the cell and discover compute nodes (manual way) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The following describes the manual needed steps to finalize the cell -deployment of a new cell. These are the steps automated in the ansible -playbook mentioned in :ref:`cell_create_cell`. - -Get control plane and cell controller IPs: - -.. code-block:: bash - - CTRL_IP=$(openstack server list -f value -c Networks --name overcloud-controller-0 | sed 's/ctlplane=//') - CELL_CTRL_IP=$(openstack server list -f value -c Networks --name cell1-cellcontrol-0 | sed 's/ctlplane=//') - -Add cell information to overcloud controllers -_____________________________________________ -On all central controllers add information on how to reach the cell controller -endpoint (usually internalapi) to `/etc/hosts`, from the undercloud: - -.. code-block:: bash - - CELL_INTERNALAPI_INFO=$(ssh heat-admin@${CELL_CTRL_IP} egrep \ - cell1.*\.internalapi /etc/hosts) - ansible -i /usr/bin/tripleo-ansible-inventory Controller -b \ - -m lineinfile -a "dest=/etc/hosts line=\"$CELL_INTERNALAPI_INFO\"" - -.. note:: - - Do this outside the `HEAT_HOSTS_START` .. `HEAT_HOSTS_END` block, or - add it to an `ExtraHostFileEntries` section of an environment file for the - central overcloud controller. Add the environment file to the next - `overcloud deploy` run. - -Extract transport_url and database connection -_____________________________________________ -Get the `transport_url` and database `connection` endpoint information -from the cell controller. This information is used to create the cell in the -next step: - -.. code-block:: bash - - CELL_TRANSPORT_URL=$(ssh heat-admin@${CELL_CTRL_IP} sudo \ - crudini --get /var/lib/config-data/nova/etc/nova/nova.conf DEFAULT transport_url) - CELL_MYSQL_VIP=$(ssh heat-admin@${CELL_CTRL_IP} sudo \ - crudini --get /var/lib/config-data/nova/etc/nova/nova.conf database connection \ - | awk -F[@/] '{print $4}' - -Create the cell -_______________ -Login to one of the central controllers create the cell with reference to -the IP of the cell controller in the `database_connection` and the -`transport_url` extracted from previous step, like: - -.. code-block:: bash - - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 create_cell --name computecell1 \ - --database_connection "{scheme}://{username}:{password}@$CELL_MYSQL_VIP/nova?{query}" \ - --transport-url "$CELL_TRANSPORT_URL" - -.. note:: - - Templated transport cells URLs could be used if the same amount of controllers - are in the default and add on cell. For further information about templated - URLs for cell mappings check: `Template URLs in Cell Mappings - `_ - -.. code-block:: bash - - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 list_cells --verbose - -After the cell got created the nova services on all central controllers need to -be restarted. - -Docker: - -.. code-block:: bash - - ansible -i /usr/bin/tripleo-ansible-inventory Controller -b -a \ - "docker restart nova_api nova_scheduler nova_conductor" - -Podman: - -.. code-block:: bash - - ansible -i /usr/bin/tripleo-ansible-inventory Controller -b -a \ - "systemctl restart tripleo_nova_api tripleo_nova_conductor tripleo_nova_scheduler" - -We now see the cell controller services registered: - -.. code-block:: bash - - (overcloud) [stack@undercloud ~]$ nova service-list - -Perform cell host discovery -___________________________ -The final step is to discover the computes deployed in the cell. Run the host discovery -as explained in :ref:`cell_host_discovery`. - -Create and add the node to an Availability Zone -_______________________________________________ -After a cell got provisioned, it is required to create an availability zone for the -cell to make sure an instance created in the cell, stays in the cell when performing -a migration. Check :ref:`cell_availability_zone` on more about how to create an -availability zone and add the node. - -After that the cell is deployed and can be used. - -.. note:: - - Migrating instances between cells is not supported. To move an instance to - a different cell it needs to be re-created in the new target cell. diff --git a/deploy-guide/source/features/deploy_cellv2_manage_cell.rst b/deploy-guide/source/features/deploy_cellv2_manage_cell.rst deleted file mode 100644 index 0033558e..00000000 --- a/deploy-guide/source/features/deploy_cellv2_manage_cell.rst +++ /dev/null @@ -1,189 +0,0 @@ -Managing the cell ------------------ - -.. _cell_host_discovery: - -Add a compute to a cell -~~~~~~~~~~~~~~~~~~~~~~~ - -To increase resource capacity of a running cell, you can start more servers of -a selected role. For more details on how to add nodes see :doc:`../post_deployment/scale_roles`. - -After the node got deployed, login to one of the overcloud controllers and run -the cell host discovery: - -.. code-block:: bash - - CTRL=overcloud-controller-0 - CTRL_IP=$(openstack server list -f value -c Networks --name $CTRL | sed 's/ctlplane=//') - - # CONTAINERCLI can be either docker or podman - export CONTAINERCLI='docker' - - # run cell host discovery - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 discover_hosts --by-service --verbose - - # verify the cell hosts - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 list_hosts - - # add new node to the availability zone - source overcloudrc - (overcloud) $ openstack aggregate add host - -.. note:: - - Optionally the cell uuid can be specified to the `discover_hosts` and - `list_hosts` command to only target against a specific cell. - -Delete a compute from a cell -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -* As initial step migrate all instances off the compute. - -* From one of the overcloud controllers, delete the computes from the cell: - - .. code-block:: bash - - source stackrc - CTRL=overcloud-controller-0 - CTRL_IP=$(openstack server list -f value -c Networks --name $CTRL | sed 's/ctlplane=//') - - # CONTAINERCLI can be either docker or podman - export CONTAINERCLI='docker' - - # list the cell hosts - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 list_hosts - - # delete a node from a cell - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 delete_host --cell_uuid --host - -* Delete the node from the cell stack - - See :doc:`../post_deployment/delete_nodes`. - -* Delete the resource providers from placement - - This step is required as otherwise adding a compute node with the same hostname - will make it to fail to register and update the resources with the placement - service.: - - .. code-block:: bash - - sudo dnf install python3-osc-placement - source overcloudrc - openstack resource provider list - +--------------------------------------+---------------------------------------+------------+ - | uuid | name | generation | - +--------------------------------------+---------------------------------------+------------+ - | 9cd04a8b-5e6c-428e-a643-397c9bebcc16 | computecell1-novacompute-0.site1.test | 11 | - +--------------------------------------+---------------------------------------+------------+ - - openstack resource provider delete 9cd04a8b-5e6c-428e-a643-397c9bebcc16 - -Delete a cell -~~~~~~~~~~~~~ - -* As initial step delete all instances from the cell. - -* From one of the overcloud controllers, delete all computes from the cell: - - .. code-block:: bash - - CTRL=overcloud-controller-0 - CTRL_IP=$(openstack server list -f value -c Networks --name $CTRL | sed 's/ctlplane=//') - - # CONTAINERCLI can be either docker or podman - export CONTAINERCLI='docker' - - # list the cell hosts - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 list_hosts - - # delete a node from a cell - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 delete_host --cell_uuid --host - -* On the cell controller delete all deleted instances from the database: - - .. code-block:: bash - - CELL_CTRL=cell1-cellcontrol-0 - CELL_CTRL_IP=$(openstack server list -f value -c Networks --name $CELL_CTRL | sed 's/ctlplane=//') - - # CONTAINERCLI can be either docker or podman - export CONTAINERCLI='docker' - - ssh heat-admin@${CELL_CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_conductor \ - nova-manage db archive_deleted_rows --until-complete --verbose - -* From one of the overcloud controllers, delete the cell: - - .. code-block:: bash - - CTRL=overcloud-controller-0 - CTRL_IP=$(openstack server list -f value -c Networks --name $CTRL | sed 's/ctlplane=//') - - # CONTAINERCLI can be either docker or podman - export CONTAINERCLI='docker' - - # list the cells - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 list_cells - - # delete the cell - ssh heat-admin@${CTRL_IP} sudo ${CONTAINERCLI} exec -i -u root nova_api \ - nova-manage cell_v2 delete_cell --cell_uuid - -* Delete the cell stack: - - .. code-block:: bash - - openstack stack delete --wait --yes && openstack overcloud plan delete - - .. note:: - - If the cell consist of a controller and compute stack, delete as a first step the - compute stack and then the controller stack. - -* From a system which can reach the placement endpoint, delete the resource providers from placement - - This step is required as otherwise adding a compute node with the same hostname - will make it to fail to register as a resource with the placement service. - - .. code-block:: bash - - sudo dnf install python3-osc-placement - source overcloudrc - openstack resource provider list - +--------------------------------------+---------------------------------------+------------+ - | uuid | name | generation | - +--------------------------------------+---------------------------------------+------------+ - | 9cd04a8b-5e6c-428e-a643-397c9bebcc16 | computecell1-novacompute-0.site1.test | 11 | - +--------------------------------------+---------------------------------------+------------+ - - openstack resource provider delete 9cd04a8b-5e6c-428e-a643-397c9bebcc16 - -Updating a cell -~~~~~~~~~~~~~~~ -Each stack in a multi-stack cell deployment must be updated to perform a full minor -update across the entire deployment. - -Cells can be updated just like the overcloud nodes following update procedure described -in :ref:`package_update` and using appropriate stack name for update commands. - -The control plane and cell controller stack should be updated first by completing all -the steps from the minor update procedure. - -Once the control plane stack is updated, re-run the export command to recreate the -required input files for each separate cell stack. - -.. note:: - - Before re-running the export command, backup the previously used input file so that - the previous versions are not overwritten. In the event that a separate cell stack - needs a stack update operation performed prior to the minor update procedure, the - previous versions of the exported files should be used. diff --git a/deploy-guide/source/features/deploy_cellv2_routed.rst b/deploy-guide/source/features/deploy_cellv2_routed.rst deleted file mode 100644 index bf31df2d..00000000 --- a/deploy-guide/source/features/deploy_cellv2_routed.rst +++ /dev/null @@ -1,718 +0,0 @@ -Example 3. - Advanced example using split cell controller/compute architecture and routed networks in Train release -=================================================================================================================== - -.. warning:: - Multi cell support is only supported in Stein or later versions. - This guide addresses Train release and later! - -.. contents:: - :depth: 3 - :backlinks: none - -This guide assumes that you are ready to deploy a new overcloud, or have -already installed an overcloud (min Train release). - -.. note:: - - Starting with CentOS 8 and the TripleO Stein release, podman is the CONTAINERCLI - to be used in the following steps. - -In this example we use the :doc:`deploy_cellv2_advanced` using a routed spine and -leaf networking layout to deploy an additional cell. Not all nodes need -to be co-located at the same physical location or datacenter. See -:ref:`routed_spine_leaf_network` for more details. - -The nodes deployed to the control plane, which are part of the overcloud stack, -use different networks then the cell stacks which are separated in a cell -controller stack and a cell compute stack. The cell controller and cell compute -stack use the same networks, - -.. note:: - - In this example the routing for the different VLAN subnets is done by - the undercloud, which must _NOT_ be done in a production environment - as it is a single point of failure! - -Used networks -^^^^^^^^^^^^^ -The following provides and overview of the used networks and subnet -details for this example: - -.. code-block:: yaml - - InternalApi - internal_api_subnet - vlan: 20 - net: 172.16.2.0/24 - route: 172.17.2.0/24 gw: 172.16.2.254 - internal_api_cell1 - vlan: 21 - net: 172.17.2.0/24 - gateway: 172.17.2.254 - Storage - storage_subnet - vlan: 30 - net: 172.16.1.0/24 - route: 172.17.1.0/24 gw: 172.16.1.254 - storage_cell1 - vlan: 31 - net: 172.17.1.0/24 - gateway: 172.17.1.254 - StorageMgmt - storage_mgmt_subnet - vlan: 40 - net: 172.16.3.0/24 - route: 172.17.3.0/24 gw: 172.16.3.254 - storage_mgmt_cell1 - vlan: 41 - net: 172.17.3.0/24 - gateway: 172.17.3.254 - Tenant - tenant_subnet - vlan: 50 - net: 172.16.0.0/24 - External - external_subnet - vlan: 10 - net: 10.0.0.0/24 - external_cell1 - vlan: 11 - net: 10.0.1.0/24 - gateway: 10.0.1.254 - -Prepare control plane for cell network routing -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: bash - - openstack overcloud status - +-----------+-------------------+ - | Plan Name | Deployment Status | - +-----------+-------------------+ - | overcloud | DEPLOY_SUCCESS | - +-----------+-------------------+ - - openstack server list -c Name -c Status -c Networks - +-------------------------+--------+------------------------+ - | Name | Status | Networks | - +-------------------------+--------+------------------------+ - | overcloud-controller-2 | ACTIVE | ctlplane=192.168.24.29 | - | overcloud-controller-0 | ACTIVE | ctlplane=192.168.24.18 | - | overcloud-controller-1 | ACTIVE | ctlplane=192.168.24.20 | - | overcloud-novacompute-0 | ACTIVE | ctlplane=192.168.24.16 | - +-------------------------+--------+------------------------+ - -Overcloud stack for the control planed deployed using a `routes.yaml` -environment file to add the routing information for the new cell -subnets. - -.. code-block:: yaml - - parameter_defaults: - InternalApiInterfaceRoutes: - - destination: 172.17.2.0/24 - nexthop: 172.16.2.254 - StorageInterfaceRoutes: - - destination: 172.17.1.0/24 - nexthop: 172.16.1.254 - StorageMgmtInterfaceRoutes: - - destination: 172.17.3.0/24 - nexthop: 172.16.3.254 - -Reuse networks and adding cell subnets -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To prepare the `network_data` parameter file for the cell controller stack -the file from the control plane is used as base: - -.. code-block:: bash - - cp /usr/share/openstack-tripleo-heat-templates/network_data.yaml cell1/network_data-ctrl.yaml - -When deploying a cell in separate stacks it may be necessary to reuse networks, -subnets, segments, and VIP resources between stacks. Only a single Heat stack -can own a resource and be responsible for its creation and deletion, however -the resources can be reused in other stacks. - -To reuse network related resources between stacks, the following parameters have -been added to the network definitions in the network_data.yaml file format: - -.. code-block:: yaml - - external_resource_network_id: Existing Network UUID - external_resource_subnet_id: Existing Subnet UUID - external_resource_segment_id: Existing Segment UUID - external_resource_vip_id: Existing VIP UUID - -.. note: - - The cell controllers use virtual IPs, therefore the existing VIPs from the - central overcloud stack should not be referenced. In case cell controllers - and cell computes get split into separate stacks, the cell compute stack - network_data file need an external_resource_vip_id reference to the cell - controllers VIP resource. - -These parameters can be set on each network definition in the `network_data-ctrl.yaml` -file used for the deployment of the separate stack. - -Not all networks need to be reused or shared across stacks. The `external_resource_*` -parameters can be set for only the networks that are meant to be shared, while -the other networks can be newly created and managed. - -In this example we reuse all networks, except the management network as it is -not being used at all. - -The resulting storage network here looks like this: - -.. code-block:: - - - name: Storage -   external_resource_network_id: 30e9d52d-1929-47ed-884b-7c6d65fa2e00 -   external_resource_subnet_id: 11a3777a-8c42-4314-a47f-72c86e9e6ad4 -   vip: true -   vlan: 30 -   name_lower: storage -   ip_subnet: '172.16.1.0/24' -   allocation_pools: [{'start': '172.16.1.4', 'end': '172.16.1.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:3000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:3000::10', 'end': 'fd00:fd00:fd00:3000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 -   subnets: -     storage_cell1: -       vlan: 31 -       ip_subnet: '172.17.1.0/24' -       allocation_pools: [{'start': '172.17.1.10', 'end': '172.17.1.250'}] -       gateway_ip: '172.17.1.254' - -We added the `external_resource_network_id` and `external_resource_subnet_id` of -the control plane stack as we want to reuse those resources: - -.. code-block:: bash - - openstack network show storage -c id -f value - openstack subnet show storage_subnet -c id -f value - -In addition a new `storage_cell1` subnet is now added to the `subnets` section -to get it created in the cell controller stack for cell1: - -.. code-block:: - - subnets: - storage_cell1: - vlan: 31 - ip_subnet: '172.17.1.0/24' - allocation_pools: [{'start': '172.17.1.10', 'end': '172.17.1.250'}] - gateway_ip: '172.17.1.254' - -.. note:: - - In this example no Management network is used, therefore it was removed. - -Full networks data example: - -.. code-block:: - - - name: Storage - external_resource_network_id: 30e9d52d-1929-47ed-884b-7c6d65fa2e00 -   external_resource_subnet_id: 11a3777a-8c42-4314-a47f-72c86e9e6ad4 -   vip: true -   vlan: 30 -   name_lower: storage -   ip_subnet: '172.16.1.0/24' -   allocation_pools: [{'start': '172.16.1.4', 'end': '172.16.1.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:3000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:3000::10', 'end': 'fd00:fd00:fd00:3000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 -   subnets: -     storage_cell1: -       vlan: 31 -       ip_subnet: '172.17.1.0/24' -       allocation_pools: [{'start': '172.17.1.10', 'end': '172.17.1.250'}] -       gateway_ip: '172.17.1.254' - - name: StorageMgmt -   name_lower: storage_mgmt -   external_resource_network_id: 29e85314-2177-4cbd-aac8-6faf2a3f7031 -   external_resource_subnet_id: 01c0a75e-e62f-445d-97ad-b98a141d6082 -   vip: true -   vlan: 40 -   ip_subnet: '172.16.3.0/24' -   allocation_pools: [{'start': '172.16.3.4', 'end': '172.16.3.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:4000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:4000::10', 'end': 'fd00:fd00:fd00:4000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 -   subnets: -     storage_mgmt_cell1: -       vlan: 41 -       ip_subnet: '172.17.3.0/24' -       allocation_pools: [{'start': '172.17.3.10', 'end': '172.17.3.250'}] -       gateway_ip: '172.17.3.254' - - name: InternalApi -   name_lower: internal_api -   external_resource_network_id: 5eb79743-7ff4-4f68-9904-6e9c36fbaaa6 -   external_resource_subnet_id: dbc24086-0aa7-421d-857d-4e3956adec10 -   vip: true -   vlan: 20 -   ip_subnet: '172.16.2.0/24' -   allocation_pools: [{'start': '172.16.2.4', 'end': '172.16.2.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:2000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:2000::10', 'end': 'fd00:fd00:fd00:2000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 -   subnets: -     internal_api_cell1: -       vlan: 21 -       ip_subnet: '172.17.2.0/24' -       allocation_pools: [{'start': '172.17.2.10', 'end': '172.17.2.250'}] -       gateway_ip: '172.17.2.254' - - name: Tenant -   external_resource_network_id: ee83d0fb-3bf1-47f2-a02b-ef5dc277afae -   external_resource_subnet_id: 0b6030ae-8445-4480-ab17-dd4c7c8fa64b -   vip: false  # Tenant network does not use VIPs -   name_lower: tenant -   vlan: 50 -   ip_subnet: '172.16.0.0/24' -   allocation_pools: [{'start': '172.16.0.4', 'end': '172.16.0.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:5000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:5000::10', 'end': 'fd00:fd00:fd00:5000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 - - name: External -   external_resource_network_id: 89b7b481-f609-45e7-ad5e-e006553c1d3a -   external_resource_subnet_id: dd84112d-2129-430c-a8c2-77d2dee05af2 -   vip: true -   name_lower: external -   vlan: 10 -   ip_subnet: '10.0.0.0/24' -   allocation_pools: [{'start': '10.0.0.4', 'end': '10.0.0.250'}] -   gateway_ip: '10.0.0.1' -   ipv6_subnet: '2001:db8:fd00:1000::/64' -   ipv6_allocation_pools: [{'start': '2001:db8:fd00:1000::10', 'end': '2001:db8:fd00:1000:ffff:ffff:ffff:fffe'}] -   gateway_ipv6: '2001:db8:fd00:1000::1' -   mtu: 1500 -   subnets: -     external_cell1: -       vlan: 11 -       ip_subnet: '10.0.1.0/24' -       allocation_pools: [{'start': '10.0.1.10', 'end': '10.0.1.250'}] -       gateway_ip: '10.0.1.254' - -.. note: - - When not sharing networks between stacks, each network defined in `network_data*.yaml` - must have a unique name across all deployed stacks. This requirement is necessary - since regardless of the stack, all networks are created in the same tenant in - Neutron on the undercloud. - -Export EndpointMap, HostsEntry, AllNodesConfig, GlobalConfig and passwords information -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Follow the steps as explained in :ref:`cell_export_overcloud_info` on how to -export the required data from the overcloud stack. - -Cell roles -^^^^^^^^^^ -Modify the cell roles file to use new subnets for `InternalApi`, `Storage`, -`StorageMgmt` and `External` for cell controller and compute: - -.. code-block:: bash - - openstack overcloud roles generate --roles-path \ - /usr/share/openstack-tripleo-heat-templates/roles \ - -o $DIR/cell_roles_data.yaml Compute CellController - -For each role modify the subnets to match what got defined in the previous step -in `cell1/network_data-ctrl.yaml`: - -.. code-block:: - - - name: Compute -   description: | -     Basic Compute Node role -   CountDefault: 1 -   # Create external Neutron bridge (unset if using ML2/OVS without DVR) -   tags: -     - external_bridge -   networks: -     InternalApi: -       subnet: internal_api_cell1 -     Tenant: -       subnet: tenant_subnet -     Storage: -       subnet: storage_cell1 - ... - - name: CellController -   description: | -     CellController role for the nova cell_v2 controller services -   CountDefault: 1 -   tags: -     - primary -     - controller -   networks: -     External: -       subnet: external_cell1 -     InternalApi: -       subnet: internal_api_cell1 -     Storage: -       subnet: storage_cell1 -     StorageMgmt: -       subnet: storage_mgmt_cell1 -     Tenant: -       subnet: tenant_subnet - -Create the cell parameter file -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Each cell has some mandatory parameters which need to be set using an -environment file. -Add the following content into a parameter file for the cell, e.g. `cell1/cell1.yaml`: - -.. code-block:: yaml - - parameter_defaults: - # new CELL Parameter to reflect that this is an additional CELL - NovaAdditionalCell: True - - # The DNS names for the VIPs for the cell - CloudName: cell1.ooo.test - CloudNameInternal: cell1.internalapi.ooo.test - CloudNameStorage: cell1.storage.ooo.test - CloudNameStorageManagement: cell1.storagemgmt.ooo.test - CloudNameCtlplane: cell1.ctlplane.ooo.test - - # Flavors used for the cell controller and computes - OvercloudCellControllerFlavor: cellcontroller - OvercloudComputeFlavor: compute - - # number of controllers/computes in the cell - CellControllerCount: 3 - ComputeCount: 0 - - # Compute names need to be unique, make sure to have a unique - # hostname format for cell nodes - ComputeHostnameFormat: 'cell1-compute-%index%' - - # default gateway - ControlPlaneStaticRoutes: - - ip_netmask: 0.0.0.0/0 - next_hop: 192.168.24.1 - default: true - DnsServers: - - x.x.x.x - -Virtual IP addresses -^^^^^^^^^^^^^^^^^^^^ -The cell controller is hosting VIP’s (Virtual IP addresses) and is not using -the base subnet of one or more networks, therefore additional overrides to the -`VipSubnetMap` are required to ensure VIP’s are created on the subnet associated -with the L2 network segment the controller nodes is connected to. - -Add a `VipSubnetMap` to the `cell1/cell1.yaml` or a new parameter file to -point the VIPs to the correct subnet: - -.. code-block:: yaml - - parameter_defaults: - VipSubnetMap: - InternalApi: internal_api_cell1 - Storage: storage_cell1 - StorageMgmt: storage_mgmt_cell1 - External: external_cell1 - -Create the network configuration for `cellcontroller` and add to environment file -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Depending on the network configuration of the used hardware and network -architecture it is required to register a resource for the `CellController` -role in `cell1/cell1.yaml`. - -.. code-block:: yaml - - resource_registry: - OS::TripleO::CellController::Net::SoftwareConfig: cell1/single-nic-vlans/controller.yaml - OS::TripleO::Compute::Net::SoftwareConfig: cell1/single-nic-vlans/compute.yaml - -.. note:: - - For details on network configuration consult :ref:`network_isolation` guide, chapter *Customizing the Interface Templates*. - -Deploy the cell controllers -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Create new flavor used to tag the cell controller -_________________________________________________ -Follow the instructions in :ref:`cell_create_flavor_and_tag` on how to create -a new flavor and tag the cell controller. - -Run cell deployment -___________________ -To deploy the overcloud we can use the same `overcloud deploy` command as -it was used to deploy the `overcloud` stack and add the created export -environment files: - -.. code-block:: bash - - openstack overcloud deploy \ - --templates /usr/share/openstack-tripleo-heat-templates \ - -e ... additional environment files used for overcloud stack, like container - prepare parameters, or other specific parameters for the cell - ... - --stack cell1-ctrl \ -   -n $HOME/$DIR/network_data-ctrl.yaml \ -   -r $HOME/$DIR/cell_roles_data.yaml \ - -e $HOME/$DIR/cell1-ctrl-input.yaml \ - -e $HOME/$DIR/cell1.yaml - -Wait for the deployment to finish: - -.. code-block:: bash - - openstack stack list - - +--------------------------------------+------------+----------------------------------+-----------------+----------------------+----------------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+------------+----------------------------------+-----------------+----------------------+----------------------+ - | 6403ed94-7c8f-47eb-bdb8-388a5ac7cb20 | cell1-ctrl | f7736589861c47d8bbf1ecd29f02823d | CREATE_COMPLETE | 2019-08-15T14:46:32Z | None | - | 925a2875-fbbb-41fd-bb06-bf19cded2510 | overcloud | f7736589861c47d8bbf1ecd29f02823d | UPDATE_COMPLETE | 2019-08-13T10:43:20Z | 2019-08-15T10:13:41Z | - +--------------------------------------+------------+----------------------------------+-----------------+----------------------+----------------------+ - -Create the cell -^^^^^^^^^^^^^^^ -As in :ref:`cell_create_cell` create the cell, but we can skip the final host -discovery step as the computes are note yet deployed. - - -Extract deployment information from the cell controller stack -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Follow the steps explained in :ref:`cell_export_cell_controller_info` on -how to export the required input data from the cell controller stack. - -Create cell compute parameter file for additional customization -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Create the `cell1/cell1-cmp.yaml` parameter file to overwrite settings -which are different from the cell controller stack. - -.. code-block:: yaml - - parameter_defaults: - # number of controllers/computes in the cell - CellControllerCount: 0 - ComputeCount: 1 - -The above file overwrites the values from `cell1/cell1.yaml` to not deploy -a controller in the cell compute stack. Since the cell compute stack uses -the same role file the default `CellControllerCount` is 1. - -Reusing networks from control plane and cell controller stack -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -For the cell compute stack we reuse the networks from the control plane -stack and the subnet from the cell controller stack. Therefore references -to the external resources for network, subnet, segment and vip are required: - -.. code-block:: bash - - cp cell1/network_data-ctrl.yaml cell1/network_data-cmp.yaml - -The storage network definition in `cell1/network_data-cmp.yaml` looks -like this: - -.. code-block:: - - - name: Storage -   external_resource_network_id: 30e9d52d-1929-47ed-884b-7c6d65fa2e00 -   external_resource_subnet_id: 11a3777a-8c42-4314-a47f-72c86e9e6ad4 -   external_resource_vip_id: 4ed73ea9-4cf6-42c1-96a5-e32b415c738f -   vip: true -   vlan: 30 -   name_lower: storage -   ip_subnet: '172.16.1.0/24' -   allocation_pools: [{'start': '172.16.1.4', 'end': '172.16.1.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:3000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:3000::10', 'end': 'fd00:fd00:fd00:3000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 -   subnets: -     storage_cell1: -       vlan: 31 -       ip_subnet: '172.17.1.0/24' -       allocation_pools: [{'start': '172.17.1.10', 'end': '172.17.1.250'}] -       gateway_ip: '172.17.1.254' -       external_resource_subnet_id: 7930635d-d1d5-4699-b318-00233c73ed6b -       external_resource_segment_id: 730769f8-e78f-42a3-9dd4-367a212e49ff - -Previously we already added the `external_resource_network_id` and `external_resource_subnet_id` -for the network in the upper level hierarchy. - -In addition we add the `external_resource_vip_id` of the VIP of the stack which -should be reused for this network (Storage). - -Important is that the `external_resource_vip_id` for the InternalApi points -the VIP of the cell controller stack! - -.. code-block:: bash - - openstack port show -c id -f value - -In the `storage_cell1` subnet section we add the `external_resource_subnet_id` -and `external_resource_segment_id` of the cell controller stack: - -.. code-block:: yaml - - storage_cell1: - vlan: 31 - ip_subnet: '172.17.1.0/24' - allocation_pools: [{'start': '172.17.1.10', 'end': '172.17.1.250'}] - gateway_ip: '172.17.1.254' - external_resource_subnet_id: 7930635d-d1d5-4699-b318-00233c73ed6b - external_resource_segment_id: 730769f8-e78f-42a3-9dd4-367a212e49ff - -.. code-block:: bash - - openstack subnet show storage_cell1 -c id -f value - openstack network segment show storage_storage_cell1 -c id -f value - -Full networks data example for the compute stack: - -.. code-block:: - - - name: Storage -   external_resource_network_id: 30e9d52d-1929-47ed-884b-7c6d65fa2e00 -   external_resource_subnet_id: 11a3777a-8c42-4314-a47f-72c86e9e6ad4 -   external_resource_vip_id: 4ed73ea9-4cf6-42c1-96a5-e32b415c738f -   vip: true -   vlan: 30 -   name_lower: storage -   ip_subnet: '172.16.1.0/24' -   allocation_pools: [{'start': '172.16.1.4', 'end': '172.16.1.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:3000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:3000::10', 'end': 'fd00:fd00:fd00:3000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 -   subnets: -     storage_cell1: -       vlan: 31 -       ip_subnet: '172.17.1.0/24' -       allocation_pools: [{'start': '172.17.1.10', 'end': '172.17.1.250'}] -       gateway_ip: '172.17.1.254' -       external_resource_subnet_id: 7930635d-d1d5-4699-b318-00233c73ed6b -       external_resource_segment_id: 730769f8-e78f-42a3-9dd4-367a212e49ff - - name: StorageMgmt -   name_lower: storage_mgmt -   external_resource_network_id: 29e85314-2177-4cbd-aac8-6faf2a3f7031 -   external_resource_subnet_id: 01c0a75e-e62f-445d-97ad-b98a141d6082 -   external_resource_segment_id: 4b4f6f83-f031-4495-84c5-7422db1729d5 -   vip: true -   vlan: 40 -   ip_subnet: '172.16.3.0/24' -   allocation_pools: [{'start': '172.16.3.4', 'end': '172.16.3.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:4000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:4000::10', 'end': 'fd00:fd00:fd00:4000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 -   subnets: -     storage_mgmt_cell1: -       vlan: 41 -       ip_subnet: '172.17.3.0/24' -       allocation_pools: [{'start': '172.17.3.10', 'end': '172.17.3.250'}] -       gateway_ip: '172.17.3.254' -       external_resource_subnet_id: de9233d4-53a3-485d-8433-995a9057383f -       external_resource_segment_id: 2400718d-7fbd-4227-8318-245747495241 - - name: InternalApi -   name_lower: internal_api -   external_resource_network_id: 5eb79743-7ff4-4f68-9904-6e9c36fbaaa6 -   external_resource_subnet_id: dbc24086-0aa7-421d-857d-4e3956adec10 -   external_resource_vip_id: 1a287ad7-e574-483a-8288-e7c385ee88a0 -   vip: true -   vlan: 20 -   ip_subnet: '172.16.2.0/24' -   allocation_pools: [{'start': '172.16.2.4', 'end': '172.16.2.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:2000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:2000::10', 'end': 'fd00:fd00:fd00:2000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 -   subnets: -     internal_api_cell1: -       external_resource_subnet_id: 16b8cf48-6ca1-4117-ad90-3273396cb41d -       external_resource_segment_id: b310daec-7811-46be-a958-a05a5b0569ef -       vlan: 21 -       ip_subnet: '172.17.2.0/24' -       allocation_pools: [{'start': '172.17.2.10', 'end': '172.17.2.250'}] -       gateway_ip: '172.17.2.254' - - name: Tenant -   external_resource_network_id: ee83d0fb-3bf1-47f2-a02b-ef5dc277afae -   external_resource_subnet_id: 0b6030ae-8445-4480-ab17-dd4c7c8fa64b -   vip: false  # Tenant network does not use VIPs -   name_lower: tenant -   vlan: 50 -   ip_subnet: '172.16.0.0/24' -   allocation_pools: [{'start': '172.16.0.4', 'end': '172.16.0.250'}] -   ipv6_subnet: 'fd00:fd00:fd00:5000::/64' -   ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:5000::10', 'end': 'fd00:fd00:fd00:5000:ffff:ffff:ffff:fffe'}] -   mtu: 1500 - - name: External -   external_resource_network_id: 89b7b481-f609-45e7-ad5e-e006553c1d3a -   external_resource_subnet_id: dd84112d-2129-430c-a8c2-77d2dee05af2 -   external_resource_vip_id: b7a0606d-f598-4dc6-9e85-e023c64fd20b -   vip: true -   name_lower: external -   vlan: 10 -   ip_subnet: '10.0.0.0/24' -   allocation_pools: [{'start': '10.0.0.4', 'end': '10.0.0.250'}] -   gateway_ip: '10.0.0.1' -   ipv6_subnet: '2001:db8:fd00:1000::/64' -   ipv6_allocation_pools: [{'start': '2001:db8:fd00:1000::10', 'end': '2001:db8:fd00:1000:ffff:ffff:ffff:fffe'}] -   gateway_ipv6: '2001:db8:fd00:1000::1' -   mtu: 1500 -   subnets: -     external_cell1: -       vlan: 11 -       ip_subnet: '10.0.1.0/24' -       allocation_pools: [{'start': '10.0.1.10', 'end': '10.0.1.250'}] -       gateway_ip: '10.0.1.254' -       external_resource_subnet_id: 81ac9bc2-4fbe-40be-ac0e-9aa425799626 -       external_resource_segment_id: 8a877c1f-cb47-40dd-a906-6731f042e544 - -Deploy the cell computes -^^^^^^^^^^^^^^^^^^^^^^^^ - -Run cell deployment -___________________ -To deploy the overcloud we can use the same `overcloud deploy` command as -it was used to deploy the `cell1-ctrl` stack and add the created export -environment files: - -.. code-block:: bash - - openstack overcloud deploy \ - --templates /usr/share/openstack-tripleo-heat-templates \ - -e ... additional environment files used for overcloud stack, like container - prepare parameters, or other specific parameters for the cell - ... - --stack cell1-cmp \ - -r $HOME/$DIR/cell_roles_data.yaml \ - -n $HOME/$DIR/network_data-cmp.yaml \ - -e $HOME/$DIR/cell1-ctrl-input.yaml \ - -e $HOME/$DIR/cell1-cmp-input.yaml \ - -e $HOME/$DIR/cell1.yaml \ - -e $HOME/$DIR/cell1-cmp.yaml - -Wait for the deployment to finish: - -.. code-block:: bash - - openstack stack list - +--------------------------------------+------------+----------------------------------+--------------------+----------------------+----------------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+------------+----------------------------------+--------------------+----------------------+----------------------+ - | 12e86ea6-3725-482a-9b05-b283378dcf30 | cell1-cmp | f7736589861c47d8bbf1ecd29f02823d | CREATE_COMPLETE | 2019-08-15T15:57:19Z | None | - | 6403ed94-7c8f-47eb-bdb8-388a5ac7cb20 | cell1-ctrl | f7736589861c47d8bbf1ecd29f02823d | CREATE_COMPLETE | 2019-08-15T14:46:32Z | None | - | 925a2875-fbbb-41fd-bb06-bf19cded2510 | overcloud | f7736589861c47d8bbf1ecd29f02823d | UPDATE_COMPLETE | 2019-08-13T10:43:20Z | 2019-08-15T10:13:41Z | - +--------------------------------------+------------+----------------------------------+--------------------+----------------------+----------------------+ - -Perform cell host discovery -___________________________ -The final step is to discover the computes deployed in the cell. Run the host discovery -as explained in :ref:`cell_host_discovery`. - -Create and add the node to an Availability Zone -_______________________________________________ -After a cell got provisioned, it is required to create an availability zone for the -compute stack, it is not enough to just create an availability zone for the complete -cell. In this used case we want to make sure an instance created in the compute group, -stays in it when performing a migration. Check :ref:`cell_availability_zone` on more -about how to create an availability zone and add the node. - -After that the cell is deployed and can be used. - -.. note:: - - Migrating instances between cells is not supported. To move an instance to - a different cell it needs to be re-created in the new target cell. diff --git a/deploy-guide/source/features/deploy_manila.rst b/deploy-guide/source/features/deploy_manila.rst deleted file mode 100644 index bf3a8318..00000000 --- a/deploy-guide/source/features/deploy_manila.rst +++ /dev/null @@ -1,349 +0,0 @@ -Deploying Manila in the Overcloud -================================= - -This guide assumes that your undercloud is already installed and ready to -deploy an overcloud with Manila enabled. - -Deploying the Overcloud with the Internal Ceph Backend ------------------------------------------------------- -Ceph deployed by TripleO can be used as a Manila share backend. Make sure that -Ceph, Ceph MDS and Manila Ceph environment files are included when deploying the -Overcloud:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/ceph-mds.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/manila-cephfsnative-config.yaml - -.. note:: - These and any other environment files or options passed to the overcloud - deploy command, are referenced below as the "full environment". We assumed - the ``--plan`` flag is not what we want to use for this example. - -Network Isolation -~~~~~~~~~~~~~~~~~ -When mounting a ceph share from a user instance, the user instance needs access -to the Ceph public network. When mounting a ceph share from a user instance, -the user instance needs access to the Ceph public network, which in TripleO -maps to the Overcloud storage network. In an Overcloud which uses isolated -networks the tenant network and storage network are isolated from one another -so user instances cannot reach the Ceph public network unless the cloud -administrator creates a provider network in neutron that maps to the storage -network and exposes access to it. - -Before deploying Overcloud make sure that there is a bridge for storage network -interface. If single NIC with VLANs network configuration is used (as in -``/usr/share/openstack-tripleo-heat-templates/network/config/single-nic-vlans/``) -then by default ``br-ex`` bridge is used for storage network and no additional -customization is required for Overcloud deployment. If a dedicated interface is -used for storage network (as in -``/usr/share/openstack-tripleo-heat-templates/network/config/multiple-nics/``) -then update storage interface for each node type (controller, compute, ceph) to -use bridge. The following interface definition:: - - - type: interface - name: nic2 - use_dhcp: false - addresses: - - ip_netmask: - get_param: StorageIpSubnet - -should be replaced with:: - - - type: ovs_bridge - name: br-storage - use_dhcp: false - addresses: - - ip_netmask: - get_param: StorageIpSubnet - members: - - type: interface - name: nic2 - use_dhcp: false - primary: true - -And pass following parameters when deploying Overcloud to allow Neutron to map -provider networks to the storage bridge:: - - parameter_defaults: - NeutronBridgeMappings: datacentre:br-ex,storage:br-storage - NeutronFlatNetworks: datacentre,storage - -If the storage network uses VLAN, include storage network in -``NeutronNetworkVLANRanges`` parameter. For example:: - - NeutronNetworkVLANRanges: 'datacentre:100:1000,storage:30:30' - -.. warning:: - If network isolation is used, make sure that storage provider network - subnet doesn't overlap with IP allocation pool used for Overcloud storage - nodes (controlled by ``StorageAllocationPools`` heat parameter). - ``StorageAllocationPools`` is by default set to - ``[{'start': '172.16.1.4', 'end': '172.16.1.250'}]``. It may be necessary - to shrink this pool, for example:: - - StorageAllocationPools: [{'start': '172.16.1.4', 'end': '172.16.1.99'}] - -When Overcloud is deployed, create a provider network which can be used to -access storage network. - -* If single NIC with VLANs is used, then the provider network is mapped - to the default datacentre network:: - - neutron net-create storage --shared --provider:physical_network \ - datacentre --provider:network_type vlan --provider:segmentation_id 30 - - neutron subnet-create --name storage-subnet \ - --allocation-pool start=172.16.1.100,end=172.16.1.120 \ - --enable-dhcp storage 172.16.1.0/24 - -* If a custom bridge was used for storage network interface (``br-storage`` in - the example above) then provider network is mapped to the network specified - by ``NeutronBridgeMappings`` parameter (``storage`` network in the example - above):: - - neutron net-create storage --shared --provider:physical_network storage \ - --provider:network_type flat - - neutron subnet-create --name storage-subnet \ - --allocation-pool start=172.16.1.200,end=172.16.1.220 --enable-dhcp \ - storage 172.16.1.0/24 --no-gateway - -.. note:: - Allocation pool should not overlap with storage network - pool used for storage nodes (``StorageAllocationPools`` parameter). - You may also need to shrink storage nodes pool size to reserve more IPs - for tenants using the provider network. - -.. note:: - - Make sure that subnet CIDR matches storage network CIDR (``StorageNetCidr`` - parameter)and - segmentation_id matches VLAN ID for the storage network traffic - (``StorageNetworkVlanID`` parameter). - -Then Ceph shares can be accessed from a user instance by adding the provider -network to the instance. - -.. note:: - - Cloud-init by default configures only first network interface to use DHCP - which means that user instances will not have network interface for storage - network autoconfigured. You can configure it manually or use - `dhcp-all-interfaces `_. - - -Deploying Manila in the overcloud with CephFS through NFS and a composable network ----------------------------------------------------------------------------------- - -The CephFS through NFS back end is composed of Ceph metadata servers (MDS), -NFS Ganesha (the NFS gateway), and the Ceph cluster service components. -The manila CephFS NFS driver uses NFS-Ganesha gateway to provide NFSv4 protocol -access to CephFS shares. -The Ceph MDS service maps the directories and file names of the file system -to objects that are stored in RADOS clusters. -The NFS-Ganesha service runs on the Controller nodes with the Ceph services. - - -CephFS with NFS-Ganesha deployment -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -CephFS through NFS deployments use an extra isolated network, StorageNFS. -This network is deployed so users can mount shares over NFS on that network -without accessing the Storage or Storage Management networks which are -reserved for infrastructure traffic. - -The ControllerStorageNFS custom role configures the isolated StorageNFS network. -This role is similar to the default `Controller.yaml` role file with the addition -of the StorageNFS network and the CephNfs service, indicated by the `OS::TripleO::Services:CephNfs` -service. - - -#. To create the StorageNFSController role, used later in the process by the - overcloud deploy command, run:: - - openstack overcloud roles generate --roles-path /usr/share/openstack-tripleo-heat-templates/roles \ - -o /home/stack/roles_data.yaml ControllerStorageNfs Compute CephStorage - -#. Run the overcloud deploy command including the new generated `roles_data.yaml` - and the `network_data_ganesha.yaml` file that will trigger the generation of - this new network. The final overcloud command must look like the following:: - - openstack overcloud deploy \ - --templates /usr/share/openstack-tripleo-heat-templates \ - -n /usr/share/openstack-tripleo-heat-templates/network_data_ganesha.yaml \ - -r /home/stack/roles_data.yaml \ - -e /home/stack/containers-default-parameters.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ - -e /home/stack/network-environment.yaml \ - -e/usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/ceph-mds.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/manila-cephfsganesha-config.yaml - - -.. note:: - - The network_data_ganesha.yaml file contains an additional section that defines - the isolated StorageNFS network. Although the default settings work for most - installations, you must edit the YAML file to add your network settings, - including the VLAN ID, subnet, and other settings:: - - name: StorageNFS - enabled: true - vip: true - name_lower: storage_nfs - vlan: 70 - ip_subnet: '172.16.4.0/24' - allocation_pools: [{'start': '172.16.4.4', 'end': '172.16.4.149'}] - ipv6_subnet: 'fd00:fd00:fd00:7000::/64' - ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:7000::10', 'end': 'fd00:fd00:fd00:7000:ffff:ffff:ffff:fffe'}] - - -Configure the StorageNFS network -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -After the overcloud deployment is over, create a corresponding `StorageNFSSubnet` on -the neutron-shared provider network. -The subnet is the same as the storage_nfs network definition in the `network_data_ganesha.yml` -and ensure that the allocation range for the StorageNFS subnet and the corresponding -undercloud subnet do not overlap. - -.. note:: - - No gateway is required because the StorageNFS subnet is dedicated to serving NFS shares - -In order to create the storage_nfs subnet, run:: - - openstack subnet create --allocation-pool start=172.16.4.150,end=172.16.4.250 \ - --dhcp --network StorageNFS --subnet-range 172.16.4.0/24 \ - --gateway none StorageNFSSubnet - -#. Replace the `start=172.16.4.150,end=172.16.4.250` IP values with the IP - values for your network. -#. Replace the `172.16.4.0/24` subnet range with the subnet range for your - network. - - -Deploying the Overcloud with an External Backend ------------------------------------------------- -.. note:: - - The :doc:`../deployment/template_deploy` doc has a more detailed explanation of the - following steps. - -#. Copy the Manila driver-specific configuration file to your home directory: - - - Dell-EMC Isilon driver:: - - sudo cp /usr/share/openstack-tripleo-heat-templates/environments/manila-isilon-config.yaml ~ - - - Dell-EMC Unity driver:: - - sudo cp /usr/share/openstack-tripleo-heat-templates/environments/manila-unity-config.yaml ~ - - - Dell-EMC Vmax driver:: - - sudo cp /usr/share/openstack-tripleo-heat-templates/environments/manila-vmax-config.yaml ~ - - - Dell-EMC VNX driver:: - - sudo cp /usr/share/openstack-tripleo-heat-templates/environments/manila-vnx-config.yaml ~ - - - NetApp driver:: - - sudo cp /usr/share/openstack-tripleo-heat-templates/environments/manila-netapp-config.yaml ~ - -#. Edit the permissions (user is typically ``stack``):: - - sudo chown $USER ~/manila-*-config.yaml - sudo chmod 755 ~/manila-*-config.yaml - -#. Edit the parameters in this file to fit your requirements. - - - Fill in or override the values of parameters for your back end. - - - Since you have copied the file out of its original location, - replace relative paths in the resource_registry with absolute paths - based on ``/usr/share/openstack-tripleo-heat-templates``. - -#. Continue following the TripleO instructions for deploying an overcloud. - Before entering the command to deploy the overcloud, add the environment - file that you just configured as an argument. For example:: - - openstack overcloud deploy --templates \ - -e -e ~/manila-[isilon or unity or vmax or vnx or netapp]-config.yaml - -#. Wait for the completion of the overcloud deployment process. - - -Creating the Share ------------------- - -.. note:: - - The following steps will refer to running commands as an admin user or a - tenant user. Sourcing the ``overcloudrc`` file will authenticate you as - the admin user. You can then create a tenant user and use environment - files to switch between them. - -#. Create a share network to host the shares: - - - Create the overcloud networks. The :doc:`../deployment/install_overcloud` - doc has a more detailed explanation about creating the network - and subnet. Note that you may also need to perform the following - steps to get Manila working:: - - neutron router-create router1 - neutron router-interface-add router1 [subnet id] - - - List the networks and subnets [tenant]:: - - neutron net-list && neutron subnet-list - - - Create a share network (typically using the private default-net net/subnet) - [tenant]:: - - manila share-network-create --neutron-net-id [net] --neutron-subnet-id [subnet] - -#. Create a new share type (yes/no is for specifying if the driver handles - share servers) [admin]:: - - manila type-create [name] [yes/no] - -#. Create the share [tenant]:: - - manila create --share-network [share net ID] --share-type [type name] [nfs/cifs] [size of share] - - -Accessing the Share -------------------- - -#. To access the share, create a new VM on the same Neutron network that was - used to create the share network:: - - nova boot --image [image ID] --flavor [flavor ID] --nic net-id=[network ID] [name] - -#. Allow access to the VM you just created:: - - manila access-allow [share ID] ip [IP address of VM] - -#. Run ``manila list`` and ensure that the share is available. - -#. Log into the VM:: - - ssh [user]@[IP] - -.. note:: - - You may need to configure Neutron security rules to access the - VM. That is not in the scope of this document, so it will not be covered - here. - -5. In the VM, execute:: - - sudo mount [export location] [folder to mount to] - -6. Ensure the share is mounted by looking at the bottom of the output of the - ``mount`` command. - -7. That's it - you're ready to start using Manila! diff --git a/deploy-guide/source/features/deploy_swift.rst b/deploy-guide/source/features/deploy_swift.rst deleted file mode 100644 index 4b89c17a..00000000 --- a/deploy-guide/source/features/deploy_swift.rst +++ /dev/null @@ -1,116 +0,0 @@ -Deploy and Scale Swift in the Overcloud -======================================= - -This guide assumes that you are ready to deploy a new overcloud. To ensure -that Swift nodes are all using the same Ring, some manual steps are required. - -Initial Deploy --------------- - -To correctly deploy Swift, we need to manually manage the Swift Rings. This -can be achieved by disabling the Ring building process in TripleO by setting -the ``SwiftRingBuild`` and ``RingBuild`` parameters both to ``false``. For -example:: - - parameter_defaults: - SwiftRingBuild: false - RingBuild: false - -.. note:: - - If this is saved in a file named ``deploy-parameters.yaml`` then it can - be deployed with ``openstack overcloud deploy --templates -e - deploy-parameters.yaml``. - -After the deploy is completed, you will need to ssh onto the overcloud node as -the ``heat-admin`` user and switch to the root user with ``sudo -i``. The IP -addresses is available in the output of ``openstack server list``. Once -connected, in the ``/etc/swift/`` directory follow the instructions in the -`Swift documentation `_ to create the Rings. - -After this is completed you will need to copy the ``/etc/swift/*.ring.gz`` and -``/etc/swift/*.builder`` files from the controller to all other controllers and -Swift storage nodes. These files will also be used when adding additional Swift -nodes. You should have six files:: - - /etc/swift/account.builder - /etc/swift/account.ring.gz - /etc/swift/container.builder - /etc/swift/container.ring.gz - /etc/swift/object.builder - /etc/swift/object.ring.gz - -.. note:: - - These files will be updated each time a new node is added with - swift-ring-builder. - - -Scaling Swift -------------- - -TripleO doesn't currently automatically update and scale Swift Rings. This -needs to be done manually, with similar steps to the above initial -deployment. First we need to define how many dedicated Swift nodes we want to -deploy with the ``ObjectStorageCount`` parameter. In this example we are -adding two Swift nodes:: - - parameter_defaults: - SwiftRingBuild: false - RingBuild: false - ObjectStorageCount: 2 - -After we have deployed again with this new environment we will have two Swift -nodes that need to be added to the ring we created during the initial -deployment. Follow the instructions on `Managing the Rings -`_ -to add the new devices to the rings and copy the new rings to *all* nodes in -the Swift cluster. - -.. note:: - - Also read the section on `Scripting ring creation - `_ - to automate this process of scaling the Swift cluster. - - -Viewing the Ring ----------------- - -The swift ring can be viewed on each node with the ``swift-ring-builder`` -command. It can be executed against all of the ``*.builder`` files. Its -output will display all the nodes in the Ring like this:: - - $ swift-ring-builder /etc/swift/object.builder - /etc/swift/object.builder, build version 4 - 1024 partitions, 3.000000 replicas, 1 regions, 1 zones, 3 devices, 0.00 balance, 0.00 dispersion - The minimum number of hours before a partition can be reassigned is 1 - The overload factor is 0.00% (0.000000) - Devices: id region zone ip address port replication ip replication port name weight partitions balance meta - 0 1 1 192.168.24.22 6000 192.168.24.22 6000 d1 100.00 1024 0.00 - 1 1 1 192.168.24.24 6000 192.168.24.24 6000 d1 100.00 1024 0.00 - 2 1 1 192.168.24.6 6000 192.168.24.6 6000 d1 100.00 1024 0.00 - -Ring configuration be verified by checking the hash of the ``*.ring.gz`` -files. It should be the same on all nodes in the ring.:: - - $ sha1sum /etc/swift/*.ring.gz - d41c1b4f93a98a693a6ede074a1b78585af2dc89 /etc/swift/account.ring.gz - 1d10d8cb826308a058c7089fdedfeca122426da9 /etc/swift/container.ring.gz - f26639938660ee0111e4e7bc1b45f28a0b9f6079 /etc/swift/object.ring.gz - -You can also check this by using the ``swift-recon`` command on one of the -overcloud nodes. It will query all other servers and compare all checksums and -a summary like this:: - - [root@overcloud-controller-0 ~]# swift-recon --md5 - =============================================================================== - --> Starting reconnaissance on 3 hosts (object) - =============================================================================== - [2016-10-14 12:37:11] Checking ring md5sums - 3/3 hosts matched, 0 error[s] while checking hosts. - =============================================================================== - [2016-10-14 12:37:11] Checking swift.conf md5sum - 3/3 hosts matched, 0 error[s] while checking hosts. - =============================================================================== diff --git a/deploy-guide/source/features/deployed_ceph.rst b/deploy-guide/source/features/deployed_ceph.rst deleted file mode 100644 index eadc2d32..00000000 --- a/deploy-guide/source/features/deployed_ceph.rst +++ /dev/null @@ -1,1968 +0,0 @@ -Deploying Ceph with TripleO -=========================== - -In Wallaby and newer it is possible to have TripleO provision hardware -and deploy Ceph before deploying the overcloud on the same hardware. - -Deployed Ceph Workflow ----------------------- - -As described in the :doc:`../deployment/network_v2` the ``openstack -overcloud`` command was extended so that it can run all of the -following as separate steps: - -#. Create Networks -#. Create Virtual IPs -#. Provision Baremetal Instances -#. Deploy Ceph -#. Create the overcloud Ephemeral Heat stack -#. Run Config-Download and the deploy-steps playbook - -This document covers the "Deploy Ceph" step above. It also covers how -to configure the overcloud deployed in the subsequent steps to use the -Ceph cluster. For details on the earlier steps see -:doc:`../deployment/network_v2`. - -The "Provision Baremetal Instances" step outputs a YAML file -describing the deployed baremetal, for example:: - - openstack overcloud node provision \ - -o ~/deployed_metal.yaml \ - ... - -The deployed_metal.yaml file can be passed as input to the ``openstack -overcloud ceph deploy`` command, which in turn outputs a YAML file -describing the deployed Ceph cluster, for example:: - - openstack overcloud ceph deploy \ - ~/deployed_metal.yaml \ - -o ~/deployed_ceph.yaml \ - ... - -Both the deployed_metal.yaml and deployed_ceph.yaml files may then be -passed as input to the step to "Create the overcloud Ephemeral Heat -stack", for example:: - - openstack overcloud deploy --templates \ - -e ~/deployed_metal.yaml \ - -e ~/deployed_ceph.yaml \ - ... - -While the overcloud is being deployed the data in the -deployed_ceph.yaml file will be used to configure the OpenStack -clients to connect to the Ceph cluster as well as configure the Ceph -cluster to host OpenStack. - -The above workflow is called "Deployed Ceph" because Ceph is already -deployed when the overcloud is configured. - -Deployed Ceph Scope -------------------- - -The "Deployed Ceph" feature deploys a Ceph cluster ready to serve RBD -and CephFS by calling TripleO Ansible roles which execute the -`cephadm` command. When the "Deployed Ceph" process is over you should -expect to find the following: - -- The CephMon, CephMgr and CephOSD services are running on all nodes - which should have those services as defined by the - :doc:`composable_services` interface -- If desired, the CephMds and CephNFS service will also be deployed - and running (this feature is not available in Wallaby however). -- It's possible to SSH into a node with the CephMon service and run - `sudo cephadm shell` -- All OSDs should be running unless there were environmental issues - (e.g. disks were not cleaned) -- A ceph configuration file and client admin keyring file in /etc/ceph - of overcloud nodes with the CephMon service -- The Ceph cluster is ready to serve RBD - -You should not expect the following after "Deployed Ceph" has run: - -- No pools or cephx keys for OpenStack will be created yet -- No CephDashboard or CephRGW services will be running yet - -The above will be configured during overcloud deployment by the -`openstack overcloud deploy` command as they were prior to the -"Deployed Ceph" feature. The reasons for this are the following: - -- The Dashboard and RGW services need to integrate with haproxy which - is deployed with the overcloud -- The list of pools to create and their respective cephx keys are a - function of which OpenStack clients (e.g. Nova, Cinder, etc) will be - used so they must be in the overcloud definition. Thus, they are - created during overcloud deployment - -During the overcloud deployment, the above resources will be created -in Ceph using the client admin keyring file and the -``~/deployed_ceph.yaml`` file output by `openstack overcloud ceph -deploy`. Because these resources are created directly on the Ceph -cluster with admin level access, "Deployed Ceph" is different from -the "External Ceph" feature described in :doc:`ceph_external`. - -The main benefits of using "Deployed Ceph" are the following: - -- Use cephadm to deploy Ceph on the hardware managed by TripleO - without having to write your own cephadm spec file (though you may - provide your own if you wish) -- Focus on debugging the basic Ceph deployment without debugging the - overcloud deployment at the same time -- Fix any Ceph deployment problems directly using either Ansible or - the Ceph orchestrator tools before starting the overcloud deployment -- Have the benefits above while maintaining hyperconverged support by - using a tested workflow - -In summary, `openstack overcloud ceph deploy` deploys the Ceph cluster -while `openstack overcloud deploy` (and the commands that follow) -deploy OpenStack and configure that Ceph cluster to be used by -OpenStack. - -Multiple Ceph clusters per deployment -------------------------------------- - -TripleO can only deploy one Ceph cluster in the overcloud per Heat -stack. However, within that Heat stack it's possible to configure -an overcloud to communicate with multiple Ceph clusters which are -external to the overcloud. To do this, follow this document to -configure the "internal" Ceph cluster which is part of the overcloud -and also use the `CephExternalMultiConfig` parameter described in the -:doc:`ceph_external` documentation. - -Prerequisite: Ensure the Ceph container is available ----------------------------------------------------- - -Before deploying Ceph follow the -:ref:`prepare-environment-containers` documentation so -the appropriate Ceph container image is used. -The output of the `openstack tripleo container image prepare` -command should contain a line like the following:: - - ContainerCephDaemonImage: undercloud.ctlplane.mydomain.tld:8787/ceph-ci/daemon:v6.0.0-stable-6.0-pacific-centos-8-x86_64 - -See "Container Options" options below for more details. - -Prerequisite: Ensure the cephadm package is installed ------------------------------------------------------ - -The `cephadm` package needs to be installed on at least one node in -the overcloud in order to bootstrap the first node of the Ceph -cluster. - -The `cephadm` package is pre-built into the overcloud-full image. -The `tripleo_cephadm` role will also use Ansible's package module -to ensure it is present. If `tripleo-repos` is passed the `ceph` -argument for Wallaby or newer, then the CentOS SIG Ceph repository -will be enabled with the appropriate version containing the `cephadm` -package, e.g. for Wallaby the ceph-pacific repository is enabled. - -Prerequisite: Ensure Disks are Clean ------------------------------------- - -cephadm does not reformat the OSD disks and expect them to be clean to -complete successfully. Consequently, when reusing the same nodes (or -disks) for new deployments, it is necessary to clean the disks before -every new attempt. One option is to enable the automated cleanup -functionality in Ironic, which will zap the disks every time that a -node is released. The same process can be executed manually or only -for some target nodes, see `cleaning instructions in the Ironic documentation`_. - - -Deployed Ceph Command Line Interface ------------------------------------- - -The command line interface supports the following options:: - - $ openstack overcloud ceph deploy --help - usage: openstack overcloud ceph deploy [-h] -o [-y] - [--skip-user-create] - [--skip-hosts-config] - [--skip-container-registry-config] - [--skip-ntp] - [--cephadm-ssh-user CEPHADM_SSH_USER] - [--stack STACK] - [--working-dir WORKING_DIR] - [--roles-data ROLES_DATA] - [--network-data NETWORK_DATA] - [--public-network-name PUBLIC_NETWORK_NAME] - [--cluster-network-name CLUSTER_NETWORK_NAME] - [--cluster CLUSTER] [--mon-ip MON_IP] - [--config CONFIG] - [--cephadm-extra-args CEPHADM_EXTRA_ARGS] - [--force] - [--ansible-extra-vars ANSIBLE_EXTRA_VARS] - [--ceph-client-username CEPH_CLIENT_USERNAME] - [--ceph-client-key CEPH_CLIENT_KEY] - [--skip-cephx-keys] - [--ceph-vip CEPH_VIP] - [--daemons DAEMONS] - [--single-host-defaults] - [--ntp-server NTP_SERVER] - [--ntp-heat-env-file NTP_HEAT_ENV_FILE] - [--ceph-spec CEPH_SPEC | --osd-spec OSD_SPEC] - [--crush-hierarchy CRUSH_HIERARCHY] - [--standalone] - [--tld] - [--container-image-prepare CONTAINER_IMAGE_PREPARE] - [--cephadm-default-container] - [--container-namespace CONTAINER_NAMESPACE] - [--container-image CONTAINER_IMAGE] - [--container-tag CONTAINER_TAG] - [--registry-url REGISTRY_URL] - [--registry-username REGISTRY_USERNAME] - [--registry-password REGISTRY_PASSWORD] - [] - - positional arguments: - - Path to the environment file output from "openstack - overcloud node provision". This argument may be - excluded only if --ceph-spec is used. - - optional arguments: - -h, --help show this help message and exit - -o , --output - The path to the output environment file describing the - Ceph deployment to pass to the overcloud deployment. - -y, --yes Skip yes/no prompt before overwriting an existing - output file (assume yes). - --skip-user-create Do not create the cephadm SSH user. This user is - necessary to deploy but may be created in a separate - step via 'openstack overcloud ceph user enable'. - --skip-hosts-config Do not update /etc/hosts on deployed servers. By - default this is configured so overcloud nodes can - reach each other and the undercloud by name. - --skip-ntp Do not install/enable ntp chronyd service. By default - time synchronization service chronyd is installed and - enabled later by tripleo. - --skip-container-registry-config - Do not update /etc/containers/registries.conf on - deployed servers. By default this is configured so - overcloud nodes can pull containers from the - undercloud registry. - --cephadm-ssh-user CEPHADM_SSH_USER - Name of the SSH user used by cephadm. Warning: if this - option is used, it must be used consistently for every - 'openstack overcloud ceph' call. Defaults to 'ceph- - admin'. (default=Env: CEPHADM_SSH_USER) - --stack STACK Name or ID of heat stack (default=Env: - OVERCLOUD_STACK_NAME) - --working-dir WORKING_DIR - The working directory for the deployment where all - input, output, and generated files will be stored. - Defaults to "$HOME/overcloud-deploy/" - --roles-data ROLES_DATA - Path to an alternative roles_data.yaml. Used to decide - which node gets which Ceph mon, mgr, or osd service - based on the node's role in . - --network-data NETWORK_DATA - Path to an alternative network_data.yaml. Used to - define Ceph public_network and cluster_network. This - file is searched for networks with name_lower values - of storage and storage_mgmt. If none found, then - search repeats but with service_net_map_replace in - place of name_lower. Use --public-network-name or - --cluster-network-name options to override name of the - searched for network from storage or storage_mgmt to a - customized name. If network_data has no storage - networks, both default to ctlplane. If found network - has >1 subnet, they are all combined (for routed - traffic). If a network has ipv6 true, then the - ipv6_subnet is retrieved instead of the ip_subnet, and - the Ceph global ms_bind_ipv4 is set false and the - ms_bind_ipv6 is set true. Use --config to override - these defaults if desired. - --public-network-name PUBLIC_NETWORK_NAME - Name of the network defined in network_data.yaml which - should be used for the Ceph public_network. Defaults - to 'storage'. - --cluster-network-name CLUSTER_NETWORK_NAME - Name of the network defined in network_data.yaml which - should be used for the Ceph cluster_network. Defaults - to 'storage_mgmt'. - --cluster CLUSTER Name of the Ceph cluster. If set to 'foo', then the - files /etc/ceph//foo.conf and - /etc/ceph//foo.client.admin.keyring will be - created. Otherwise these files will use the name - 'ceph'. Changing this means changing command line - calls too, e.g. 'ceph health' will become 'ceph - --cluster foo health' unless export CEPH_ARGS='-- - cluster foo' is used. - --mon-ip MON_IP IP address of the first Ceph monitor. If not set, an - IP from the Ceph public_network of a server with the - mon label from the Ceph spec is used. IP must already - be active on server. - --config CONFIG Path to an existing ceph.conf with settings to be - assimilated by the new cluster via 'cephadm bootstrap - --config' - --cephadm-extra-args CEPHADM_EXTRA_ARGS - String of extra parameters to pass cephadm. E.g. if - --cephadm-extra-args '--log-to-file --skip-prepare- - host', then cephadm boostrap will use those options. - Warning: requires --force as not all possible options - ensure a functional deployment. - --force Run command regardless of consequences. - --ansible-extra-vars ANSIBLE_EXTRA_VARS - Path to an existing Ansible vars file which can - override any variable in tripleo-ansible. If '-- - ansible-extra-vars vars.yaml' is passed, then - 'ansible-playbook -e @vars.yaml ...' is used to call - tripleo-ansible Ceph roles. Warning: requires --force - as not all possible options ensure a functional - deployment. - --ceph-client-username CEPH_CLIENT_USERNAME - Name of the cephx user. E.g. if 'openstack' is used, - then 'ceph auth get client.openstack' will return a - working user with key and capabilities on the deployed - Ceph cluster. Ignored unless tripleo_cephadm_pools is - set via --ansible-extra-vars. If this parameter is not - set and tripleo_cephadm_keys is set via --ansible- - extra-vars, then 'openstack' will be used. Used to set - CephClientUserName in --output. - --ceph-client-key CEPH_CLIENT_KEY - Value of the cephx key. E.g. - 'AQC+vYNXgDAgAhAAc8UoYt+OTz5uhV7ItLdwUw=='. Ignored - unless tripleo_cephadm_pools is set via --ansible- - extra-vars. If this parameter is not set and - tripleo_cephadm_keys is set via --ansible-extra-vars, - then a random key will be generated. Used to set - CephClientKey in --output. - --skip-cephx-keys Do not create cephx keys even if tripleo_cephadm_pools - is set via --ansible-extra-vars. If this option is - used, then even the defaults of --ceph-client-key and - --ceph-client-username are ignored, but the pools - defined via --ansible-extra-vars are still be created. - --ceph-vip CEPH_VIP Path to an existing Ceph services/network mapping - file. - --daemons DAEMONS Path to an existing Ceph daemon options definition. - --single-host-defaults - Adjust configuration defaults to suit a single-host - Ceph cluster. - --ntp-server NTP_SERVER - NTP Servers to be used while configuring chronyd - service. e.g. --ntp-server '0.pool.ntp.org, - 1.pool.ntp.org,2.pool.ntp.org' - --ntp-heat-env-file NTP_HEAT_ENV_FILE - Path to existing heat environment file with NTP - servers to be used while configuring chronyd service. - NTP servers are extracted from 'NtpServer' key. - --ceph-spec CEPH_SPEC - Path to an existing Ceph spec file. If not provided a - spec will be generated automatically based on --roles- - data and . The - parameter is optional only - if --ceph-spec is used. - --osd-spec OSD_SPEC Path to an existing OSD spec file. Mutually exclusive - with --ceph-spec. If the Ceph spec file is generated - automatically, then the OSD spec in the Ceph spec file - defaults to {data_devices: {all: true}} for all - service_type osd. Use --osd-spec to override the - data_devices value inside the Ceph spec file. - --crush-hierarchy CRUSH_HIERARCHY - Path to an existing crush hierarchy spec file. - --standalone Use single host Ansible inventory. Used only for - development or testing environments. - --tld Top Level Domain suffix to be added to the short - hostname to represent the fully qualified - domain name. - --container-image-prepare CONTAINER_IMAGE_PREPARE - Path to an alternative - container_image_prepare_defaults.yaml. Used to control - which Ceph container is pulled by cephadm via the - ceph_namespace, ceph_image, and ceph_tag variables in - addition to registry authentication via - ContainerImageRegistryCredentials. - --cephadm-default-container - Use the default container defined in cephadm instead of - container_image_prepare_defaults.yaml. If this is - used, 'cephadm bootstrap' is not passed the --image - parameter. - - container-image-prepare overrides: - The following options may be used to override individual values set via - --container-image-prepare. If the example variables below were set the - image would be concatenated into quay.io/ceph/ceph:latest and a custom - registry login would be used. - - --container-namespace CONTAINER_NAMESPACE - e.g. quay.io/ceph - --container-image CONTAINER_IMAGE - e.g. ceph - --container-tag CONTAINER_TAG - e.g. latest - --registry-url REGISTRY_URL - --registry-username REGISTRY_USERNAME - --registry-password REGISTRY_PASSWORD - - This command is provided by the python-tripleoclient plugin. - $ - -Run `openstack overcloud ceph deploy --help` in your own environment -to see the latest options which you have available. - - -Ceph Configuration Options --------------------------- - -Any initial Ceph configuration options may be passed to a new cluster -by putting them in a standard ini-style configuration file and using -`cephadm bootstrap --config` option. The exact same option is passed -through to cephadm with `openstack overcloud ceph deploy --config`:: - - $ cat < initial-ceph.conf - [global] - ms_cluster_mode: secure - ms_service_mode: secure - ms_client_mode: secure - EOF - $ openstack overcloud ceph deploy --config initial-ceph.conf ... - -The above example shows how to configure the messenger v2 protocol to -use a secure mode that encrypts all data passing over the network. - -The `deployed_ceph.yaml` Heat environment file output by `openstack -overcloud ceph deploy` has `ApplyCephConfigOverridesOnUpdate` set to -true. This means that services not covered by deployed ceph, e.g. RGW, -can have the configuration changes that they need applied during -overcloud deployment. After the deployed ceph process has run and -then after the overcloud is deployed, it is recommended to update the -`deployed_ceph.yaml` Heat environment file, or similar, to set -`ApplyCephConfigOverridesOnUpdate` to false. Any subsequent Ceph -configuration changes should then be made by the `ceph config -command`_. - -It is supported to pass through the `cephadm --single-host-defaults` -option, which configures a Ceph cluster to run on a single host:: - - openstack overcloud ceph deploy --single-host-defaults - -Any option available from running `cephadm bootstrap --help` may be -passed through `openstack overcloud ceph deploy` with the -`--cephadm-extra-args` argument. For example:: - - openstack overcloud ceph deploy --force \ - --cephadm-extra-args '--log-to-file --skip-prepare-host' \ - ... - -When the above is run the following will be run on the cephadm -bootstrap node (the first controller node by default) on the -overcloud:: - - cephadm bootstrap --log-to-file --skip-prepare-host ... - -The `--force` option is required when using `--cephadm-extra-args` -because not all possible options ensure a functional deployment. - -Placement Groups (PGs) ----------------------- - -When Ceph is initially deployed with `openstack overcloud ceph deploy` -the PG and replica count settings are not changed from Ceph's own -defaults unless their parameters (osd_pool_default_size, -osd_pool_default_pg_num, osd_pool_default_pgp_num) are included in an -initial Ceph configuration file which can be passed with the --config -option. These settings may also be modified after `openstack overcloud -ceph deploy`. - -The deprecated Heat parameters `CephPoolDefaultSize` and -`CephPoolDefaultPgNum` no longer have any effect as these -configurations are not made during overcloud deployment. -However, during overcloud deployment pools are created and -both the target_size_ratio or pg_num per pool may be set at that -point. See the "Ceph Pool Options" section for more details. - -Ceph Name Options ------------------ - -To deploy with a different cluster name than the default of "ceph" use -the ``--cluster`` option:: - - openstack overcloud ceph deploy \ - --cluster central \ - ... - -The above will result in keyrings and Ceph configuration files being -created with the name passed to cluster, for example:: - - [root@oc0-controller-0 ~]# ls -l /etc/ceph/ - total 16 - -rw-------. 1 root root 63 Mar 26 21:49 central.client.admin.keyring - -rw-------. 1 167 167 201 Mar 26 22:17 central.client.openstack.keyring - -rw-------. 1 167 167 134 Mar 26 22:17 central.client.radosgw.keyring - -rw-r--r--. 1 root root 177 Mar 26 21:49 central.conf - [root@oc0-controller-0 ~]# - -When `cephadm shell` is run on an overcloud node like the above, Ceph -commands might return the error ``monclient: get_monmap_and_config -cannot identify monitors to contact`` because the default "ceph" name -is not used. Thus, if the ``--cluster`` is used when deploying Ceph, -then use options like the following to run `cephadm shell` after -deployment:: - - cephadm shell --config /etc/ceph/central.conf \ - --keyring /etc/ceph/central.client.admin.keyring - -Another solution is to use the following before running ceph commands:: - - cephadm shell --mount /etc/ceph:/etc/ceph - export CEPH_ARGS='--cluster central' - -After using either of the above standard Ceph commands should work -within the cephadm shell container. - -Ceph Spec Options ------------------ - -The roles file, described in the next section, and the output of -`openstack overcloud node provision` are passed to the -`ceph_spec_bootstrap`_ Ansible module to create a `Ceph Service -Specification`_. The `openstack overcloud ceph deploy` command does -this automatically so that a spec does not usually need to be -generated separately. However, it is possible to generate a ceph spec -before deployment with the following command:: - - $ openstack overcloud ceph spec --help - usage: openstack overcloud ceph spec [-h] -o [-y] - [--stack STACK] - [--working-dir WORKING_DIR] - [--roles-data ROLES_DATA] - [--mon-ip MON_IP] [--standalone] - [--osd-spec OSD_SPEC | --crush-hierarchy CRUSH_HIERARCHY] - [] - - positional arguments: - - Path to the environment file output from "openstack - overcloud node provision". This argument may be - excluded only if --standalone is used. - - optional arguments: - -h, --help show this help message and exit - -o , --output - The path to the output cephadm spec file to pass to - the "openstack overcloud ceph deploy --ceph-spec - " command. - -y, --yes Skip yes/no prompt before overwriting an existing - output file (assume yes). - --stack STACK - Name or ID of heat stack (default=Env: - OVERCLOUD_STACK_NAME) - --working-dir WORKING_DIR - The working directory for the deployment where all - input, output, and generated files will be stored. - Defaults to "$HOME/overcloud-deploy/" - --roles-data ROLES_DATA - Path to an alternative roles_data.yaml. Used to decide - which node gets which Ceph mon, mgr, or osd service - based on the node's role in . - --mon-ip MON_IP - IP address of the first Ceph monitor. Only available - with --standalone. - --standalone Create a spec file for a standalone deployment. Used - for single server development or testing environments. - --tld Top Level Domain suffix to be added to the short - hostname to represent the fully qualified - domain name. - --osd-spec OSD_SPEC - Path to an existing OSD spec file. When the Ceph spec - file is generated its OSD spec defaults to - {data_devices: {all: true}} for all service_type osd. - Use --osd-spec to override the data_devices value - inside the Ceph spec file. - --crush-hierarchy CRUSH_HIERARCHY - Path to an existing crush hierarchy spec file. - $ - -The spec file may then be edited if desired and passed directly like -this:: - - openstack overcloud ceph deploy \ - deployed_metal.yaml \ - -o deployed_ceph.yaml \ - --ceph-spec ~/ceph_spec.yaml - -Overriding which disks should be OSDs -------------------------------------- - -The `Advanced OSD Service Specifications`_ should be used to define -how disks are used as OSDs. - -By default all available disks (excluding the disk where the operating -system is installed) are used as OSDs. This is because the default -spec has the following:: - - data_devices: - all: true - -In the above example, the `data_devices` key is valid for any `Ceph -Service Specification`_ whose `service_type` is "osd". Other OSD -service types, as found in the `Advanced OSD Service -Specifications`_, may be set by using the ``--osd-spec`` option. - -If the file ``osd_spec.yaml`` contains the following:: - - data_devices: - rotational: 1 - db_devices: - rotational: 0 - -and the following command is run:: - - openstack overcloud ceph deploy \ - deployed_metal.yaml \ - -o deployed_ceph.yaml \ - --osd-spec osd_spec.yaml - -Then all rotating devices will be data devices and all non-rotating -devices will be used as shared devices (wal, db). This is because when -the dynamic Ceph service specification is built, whatever is in the -file referenced by ``--osd-spec`` will be appended to the section of -the specification if the `service_type` is "osd". The same -``--osd-spec`` is available to the `openstack overcloud ceph spec` -command. - -Another possible variation of the ``osd_spec.yaml`` file is the -following:: - - data_devices: - model: 'SAMSUNG' - osds_per_device: 2 - -In the above example we use the `model` under `data_devices` to only -create OSDs on that model of device and we configure two OSDs per -device. Note that `osds_per_device` does not go under `data_devices` -but on the same level. The above was created after using the following -command on an already running system to find a way to refer only to a -particular device. In this case the ATA_INTEL devices are not -configured as OSDs but the three SAMSUNG devices are configured as -OSDs:: - - [ceph: root@controller-0 /]# ceph orch device ls | grep cephstorage-2 - cephstorage-2 /dev/nvme0n1 ssd SAMSUNG MZ1LW960HMJP-00003_S2X6NY0KB00178 960G Insufficient space (<10 extents) on vgs, LVM detected, locked - cephstorage-2 /dev/nvme1n1 ssd SAMSUNG MZQLB960HAJR-00007_S437NA0N506009 960G Insufficient space (<10 extents) on vgs, LVM detected, locked - cephstorage-2 /dev/nvme2n1 ssd SAMSUNG MZQLB960HAJR-00007_S437NA0N506027 960G Yes - cephstorage-2 /dev/sdb ssd ATA_INTEL_SSDSC2KB960G8_PHYF039400YC960CGN 960G Yes - cephstorage-2 /dev/sdc ssd ATA_INTEL_SSDSC2KB960G8_PHYF039402F2960CGN 960G Yes - [ceph: root@controller-0 /]# - -The :doc:`node_specific_hieradata` feature is not supported by the -cephadm integration but the `Advanced OSD Service Specifications`_ has -a `host_pattern` parameter which specifies which host to target for -certain `data_devices` definitions, so the equivalent functionality is -available but with the new syntax. - -Service Placement Options -------------------------- - -The Ceph services defined in the roles_data.yaml file as described in -:doc:`composable_services` determine which baremetal node runs which -service. By default the Controller role has the CephMon and CephMgr -service while the CephStorage role has the CephOSD service. Most -composable services require Heat output in order to determine how -services are configured, but not the Ceph services. Thus, the -roles_data.yaml file remains authoritative for Ceph service placement -even though the "Deployed Ceph" process happens before Heat is run. - -It is only necessary to use the `--roles-file` option if the default -roles_data.yaml file is not being used. For example if you intend to -deploy hyperconverged nodes, then you want the predeployed compute -nodes to be in the ceph spec with the "osd" label and for the -`service_type` "osd" to have a placement list containing a list of the -compute nodes. To do this generate a custom roles file as described in -:doc:`composable_services` like this:: - - openstack overcloud roles generate Controller ComputeHCI > custom_roles.yaml - -and then pass that roles file like this:: - - openstack overcloud ceph deploy \ - deployed_metal.yaml \ - -o deployed_ceph.yaml \ - --roles-data custom_roles.yaml - -After running the above the compute nodes should have running OSD -containers and when the overcloud is deployed Nova compute services -will then be set up on the same hosts. - -If you wish to generate the ceph spec with the modified placement -described above before the ceph deployment, then the same roles -file may be passed to the 'openstack overcloud ceph spec' command:: - - openstack overcloud ceph spec \ - --stack overcloud \ - --roles-data custom_roles.yaml \ - --output ceph_spec.yaml \ - deployed_metal.yaml - -In the above example the `--stack` is used in order to find the -working directory containing the Ansible inventory which was created -when `openstack overcloud node provision` was run. - -Ceph VIP Options ----------------- - -The `--ceph-vip` option may be used to reserve a VIP for each Ceph service -specified by the 'service/network' mapping defined as input. -A generic ceph service mapping can be something like the following:: - - --- - ceph_services: - - service: ceph_nfs - network: storage_cloud_0 - - service: ceph_rgw - network: storage_cloud_0 - -For each service added to the list above, a virtual IP on the specified -network is created to be used as `frontend_vip` of the ingress daemon. -When no subnet is specified, a default `_subnet` pattern is used. -If the subnet does not follow the `_subnet` pattern, a subnet for -the VIP may be specified per service:: - - --- - ceph_services: - - service: ceph_nfs - network: storage_cloud_0 - - service: ceph_rgw - network: storage_cloud_0 - subnet: storage_leafX - -When the `subnet` parameter is provided, it will be used by the -`tripleo_service_vip` Ansible module, otherwise the default pattern is followed. -This feature also supports the fixed_ips mode. When fixed IPs are defined, the -module is able to use that input to reserve the VIP on that network. A valid -input can be something like the following:: - - --- - fixed: true - ceph_services: - - service: ceph_nfs - network: storage_cloud_0 - ip_address: 172.16.11.159 - - service: ceph_rgw - network: storage_cloud_0 - ip_address: 172.16.11.160 - -When the boolean `fixed` is set to True, the subnet pattern is ignored, and -a sanity check on the user input is performed, looking for the `ip_address` -keys associated to the specified services. If the `fixed` keyword is missing, -the subnet pattern is followed. When the environment file containing the -'ceph service/network' mapping described above is created, it can be passed -to the ceph deploy command via the `--ceph-vip` option:: - - openstack overcloud ceph deploy \ - deployed_metal.yaml \ - -o deployed_ceph.yaml \ - --ceph-vip ~/ceph_services.yaml - - -Deploy additional daemons -------------------------- -A new option `--daemons` for the `openstack overcloud ceph deploy` command has -been added and may be used to define additional Ceph daemons that are deployed -during the Ceph provisioning process. -This option requires a data structure which defines the services to be -deployed:: - - ceph_nfs: - cephfs_data: 'manila_data' - cephfs_metadata: 'manila_metadata' - ceph_rgw: {} - ceph_ingress: - tripleo_cephadm_haproxy_container_image: undercloud.ctlplane.mydomain.tld:8787/ceph/haproxy:2.3 - tripleo_cephadm_keepalived_container_image: undercloud.ctlplane.mydomain.tld:8787/ceph/keepalived:2.5.1 - -For each service added to the data structure above, additional options can be -defined and passed as extra_vars to the tripleo-ansible flow. If no option is -specified, the default values provided by the cephadm tripleo-ansible role will -be used. - - -Example: deploy HA Ceph NFS daemon ----------------------------------- -Cephadm is able to deploy and manage the lifecycle of a highly available -ceph-nfs daemon, called `CephIngress`_, which uses haproxy and keepalived. The -`--daemon` option described in the previous section, provides: - -#. a stable, VIP managed by keepalived used to access the NFS service -#. fail-over between hosts in case of failure -#. load distribution across multiple NFS gateways through Haproxy - -To deploy a cephadm managed ceph-nfs daemon with the related ingress service, -create a `ceph_daemons.yaml` spec file with the following definition:: - - ceph_nfs: - cephfs_data: 'manila_data' - cephfs_metadata: 'manila_metadata' - ceph_ingress: - tripleo_cephadm_haproxy_container_image: undercloud.ctlplane.mydomain.tld:8787/ceph/haproxy:2.3 - tripleo_cephadm_keepalived_container_image: undercloud.ctlplane.mydomain.tld:8787/ceph/keepalived:2.5.1 - -When the environment file containing the services definition described above is -created, it can be passed to the ceph deploy command via the `--daemon` -option:: - - openstack overcloud ceph deploy \ - deployed_metal.yaml \ - -o deployed_ceph.yaml \ - --ceph-vip ~/ceph_services.yaml \ - --daemon ~/ceph_daemons.yaml - -.. note:: - A VIP must be reserved for the ceph_nfs service and passed to the command - above. For further information on reserving a VIP for a Ceph service, see - `Ceph VIP Options`_. - - -Crush Hierarchy Options ------------------------ - -The `ceph_spec_bootstrap`_ Ansible module is used to generate the Ceph -related spec file which is applied using the Ceph orchestrator tool. -During the Ceph OSDs deployment, a custom crush hierarchy can be defined -and passed using the ``--crush-hierarchy`` option. -As per `Ceph Host Management`_, by doing this the `location` attribute is -added to the Hosts spec. -The location attribute will only affect the initial CRUSH location -Subsequent changes of the location property will be ignored. Also, removing -a host will not remove any CRUSH generated bucket. - -Example: Apply a custom crush hierarchy to the deployed OSDs -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If the file ``crush_hierarchy.yaml`` contains something like the following:: - - --- - ceph-0: - root: default - rack: r0 - ceph-1: - root: default - rack: r1 - ceph-2: - root: default - rack: r2 - -and the following command is run:: - - openstack overcloud ceph deploy \ - deployed_metal.yaml \ - -o deployed_ceph.yaml \ - --osd-spec osd_spec.yaml \ - --crush-hierarchy crush_hierarchy.yaml - -Then the Ceph cluster will bootstrap with the following Ceph OSD layout:: - - - [ceph: root@ceph-0 /]# ceph osd tree - ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF - -1 0.02939 root default - -3 0.00980 rack r0 - -2 0.00980 host ceph-node-00 - 0 hdd 0.00980 osd.0 up 1.00000 1.00000 - -5 0.00980 rack r1 - -4 0.00980 host ceph-node-01 - 1 hdd 0.00980 osd.1 up 1.00000 1.00000 - -7 0.00980 rack r2 - -6 0.00980 host ceph-node-02 - 2 hdd 0.00980 osd.2 up 1.00000 1.00000 - - -.. note:: - - Device classes are automatically detected by Ceph, but crush rules - are associated to pools and they still be defined using the - CephCrushRules parameter during the overcloud deployment. Additional - details can be found in the "Overriding CRUSH rules" section below. - -TLD option ----------- -During ceph spec generation, if ``--tld`` is passed to `ceph_spec_bootstrap`_ -ansible module, generated spec will have the hostnames appended with tld. - -This ``--tld`` option is available in `openstack overcloud ceph deploy` and - `openstack overcloud ceph spec` commands. - -for example:: - - openstack overcloud ceph deploy \ - --tld "redhat.local" - -During `openstack overcloud ceph deploy` , even the hostnames of all overcloud -nodes are appended with ``--tld`` option, which makes it a Fully qualified -Domain name (canonical name) suitable for TLS-e configuration. - -Network Options ---------------- - -The storage networks defined in the network_data.yaml file as -described in :doc:`custom_networks` determine which networks -Ceph is configured to use. When using network isolation, the -standard is for TripleO to deploy two storage networks which -map to the two Ceph networks in the following way: - -* ``storage`` - Storage traffic, the Ceph ``public_network``, - e.g. Nova compute nodes use this network for RBD traffic to the Ceph - cluster. - -* ``storage_mgmt`` - Storage management traffic (such as replication - traffic between storage nodes), the Ceph ``cluster_network``, - e.g. Ceph OSDs use this network to replicate data. - -``openstack overcloud ceph deploy`` will use the network_data.yaml -file specified by the ``--network-data`` option to determine which -networks should be used for the ``public_network`` and -``cluster_network``. It assumes these networks are named ``storage`` -and ``storage_mgmt`` in the network_data.yaml file unless a different -name should be used as indicated by the ``--public-network-name`` and -``--cluster-network-name`` options. - -It is necessary to use the ``--network-data`` option when deploying -with network isolation. Otherwise the default network, i.e. the -ctlplane network on the undercloud (192.168.24.0/24), will be used for -both the ``public_network`` and ``cluster_network``. - - -Example: Multiple subnets with custom network names -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If network_data.yaml contains the following:: - - - name: StorageMgmtCloud0 - name_lower: storage_mgmt_cloud_0 - service_net_map_replace: storage_mgmt - subnets: - storage_mgmt_cloud_0_subnet12: - ip_subnet: '172.16.12.0/24' - storage_mgmt_cloud_0_subnet13: - ip_subnet: '172.16.13.0/24' - - name: StorageCloud0 - name_lower: storage_cloud_0 - service_net_map_replace: storage - subnets: - storage_cloud_0_subnet14: - ip_subnet: '172.16.14.0/24' - storage_cloud_0_subnet15: - ip_subnet: '172.16.15.0/24' - -Then the Ceph cluster will have the following parameters set:: - - [global] - public_network = '172.16.14.0/24,172.16.15.0/24' - cluster_network = '172.16.12.0/24,172.16.13.0/24' - ms_bind_ipv4 = True - ms_bind_ipv6 = False - -This is because the TripleO client will see that though the -``name_lower`` value does not match ``storage`` or ``storage_mgmt`` -(they match the custom names ``storage_cloud_0`` and -``storage_mgmt_cloud_0`` instead), those names do match the -``service_net_map_replace`` values. If ``service_net_map_replace`` -is in the network_data.yaml, then it is not necessary to use the -``--public-network-name`` and ``--cluster-network-name`` -options. Alternatively the ``service_net_map_replace`` key could have -been left out and the ``--public-network-name`` and -``--cluster-network-name`` options could have been used instead. Also, -because multiple subnets are used they are concatenated and it is -assumed that there is routing between the subnets. If there was no -``subnets`` key, in the network_data.yaml file, then the client would -have looked instead for the single ``ip_subnet`` key for each network. - -By default the Ceph global `ms_bind_ipv4` is set `true` and -`ms_bind_ipv6` is set `false`. - -Example: IPv6 -^^^^^^^^^^^^^ - -If network_data.yaml contains the following:: - - - name: Storage - ipv6: true - ipv6_subnet: fd00:fd00:fd00:3000::/64 - name_lower: storage - - name: StorageMgmt - ipv6: true - ipv6_subnet: fd00:fd00:fd00:4000::/64 - name_lower: storage_mgmt - -Then the Ceph cluster will have the following parameters set:: - - [global] - public_network = fd00:fd00:fd00:3000::/64 - cluster_network = fd00:fd00:fd00:4000::/64 - ms_bind_ipv4 = False - ms_bind_ipv6 = True - -Because the storage networks in network_data.yaml contain `ipv6: -true`, the ipv6_subset values are extracted and the Ceph globals -`ms_bind_ipv4` is set `false` and `ms_bind_ipv6` is set `true`. -It is not supported to have the ``public_network`` use IPv4 and -the ``cluster_network`` use IPv6 or vice versa. - -Example: Directly setting network and ms_bind options -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If the examples above are not sufficient for your Ceph network needs, -then it's possible to create an initial-ceph.conf with the four -parameters ``public_network``, ``cluster_network``, ``ms_bind_ipv4``, -and ``ms_bind_ipv6`` options set to whatever values are desired. - -When using the ``--config`` option it is still important to ensure the -TripleO ``storage`` and ``storage_mgmt`` network names map to the -correct ``public_network`` and ``cluster_network`` so that the rest of -the deployment is consistent. - -The four parameters, ``public_network``, ``cluster_network``, -``ms_bind_ipv4``, and ``ms_bind_ipv6``, are always set in the Ceph -cluster (with `ceph config set global`) from the ``--network-data`` -file unless those parameters are explicitly set in the ``--config`` -file. In that case the values in the ``--network-data`` file are not -set directly in the Ceph cluster though other aspects of the overcloud -deployment treat the ``--network-data`` file as authoritative -(e.g. when Ceph RGW is set) so both sources should be consistent if -the ``--config`` file has any of these four parameters. - -An example of setting the four parameters in the initial Ceph -configuration is below:: - - $ cat < initial-ceph.conf - [global] - public_network = 'fd00:fd00:fd00:3000::/64,172.16.14.0/24' - cluster_network = 'fd00:fd00:fd00:4000::/64,172.16.12.0/24' - ms_bind_ipv4 = true - ms_bind_ipv6 = true - EOF - $ openstack overcloud ceph deploy \ - --config initial-ceph.conf --network-data network_data.yaml - -The above assumes that network_data.yaml contains the following:: - - - name: Storage - ipv6_subnet: fd00:fd00:fd00:3000::/64 - ip_subnet: 172.16.14.0/24 - name_lower: storage - - name: StorageMgmt - ipv6_subnet: fd00:fd00:fd00:4000::/64 - ip_subnet: 172.16.12.0/24 - name_lower: storage_mgmt - -The above settings, which mix IPv4 and IPv6, are experimental and -untested. - -SSH User Options ----------------- - -Cephadm must use SSH to connect to all remote Ceph hosts that it -manages. The "Deployed Ceph" feature creates an account and SSH key -pair on all Ceph nodes in the overcloud and passes this information -to cephadm so that it uses this account instead of creating its own. -The `openstack overcloud ceph deploy` command will automatically -create this user and distribute their SSH keys. It's also possible -to create this user and distribute the associated keys in a separate -step by running `openstack overcloud ceph user enable` and then when -calling `openstack overcloud ceph deploy` with the -`--skip-user-create` option. By default the user is called -`ceph-admin` though both commands support the `--cephadm-ssh-user` -option to set a different name. If this option is used though, it must -be used consistently for every `openstack overcloud ceph` call. - -The `openstack overcloud ceph user disable --fsid ` command -may be run after `openstack overcloud ceph deploy` has been run -to disable cephadm so that it may not be used to administer the -Ceph cluster and no `ceph orch ...` CLI commands will function. -This will also prevent Ceph node overcloud scale operations though -the Ceph cluster will still be able to read and write data. This same -command will also remove the public and private SSH keys of the -cephadm SSH user on overclouds which host Ceph. The "ceph user enable" -option may then be used to re-distribute the public and private SSH -keys of the cephadm SSH user and re-enable the cephadm mgr module. -`openstack overcloud ceph user enable` will only re-enable the cephadm -mgr module if it is passed the FSID with the `--fsid ` option. -The FSID may be found in the deployed_ceph.yaml Heat environment file -which is generated by the `openstack overcloud ceph deploy -o -deployed_ceph.yaml` command. - -.. warning:: - Disabling cephadm will disable all Ceph management features - described in this document. The `openstack overcloud ceph user - disable` command is not recommended unless you have a good reason - to disable cephadm. - -Both the `openstack overcloud ceph user enable` and `openstack -overcloud ceph user disable` commands require the path to an existing -Ceph spec file to be passed as an argument. This is necessary in order -to determine which hosts require the cephadm SSH user and which of -those hosts require the private SSH key. Only hosts with the _admin -label get the private SSH since they need to be able to SSH into other -Ceph hosts. In the average deployment with three monitor nodes this is -three hosts. All other Ceph hosts only get the public key added to the -users authorized_keys file. - -See the "Ceph Spec Options" options of this document for where to find -this file or how to automatically generate one before Ceph deployment -if you plan to call `openstack overcloud ceph user enable` before -calling `openstack overcloud ceph deploy`. See `openstack overcloud -ceph user enable --help` and `openstack overcloud ceph user disable ---help` for more information. - -Container Options ------------------ - -As described in :doc:`../deployment/container_image_prepare` the -undercloud may be used as a container registry for ceph containers -and there is a supported syntax to download containers from -authenticated registries. - -By default `openstack overcloud ceph deploy` will pull the Ceph -container in the default ``container_image_prepare_defaults.yaml`` -file. If a `push_destination` is defined in this file, then the -overcloud will be configured so it can access the local registry in -order to download the Ceph container. This means that `openstack -overcloud ceph deploy` will modify the overcloud's ``/etc/hosts`` -and ``/etc/containers/registries.conf`` files; unless the -`--skip-hosts-config` and `--skip-container-registry-config` options -are used or a `push_destination` is not defined. - -The version of the Ceph used in each OpenStack release changes per -release and can be seen by running a command like this:: - - egrep "ceph_namespace|ceph_image|ceph_tag" \ - /usr/share/tripleo-common/container-images/container_image_prepare_defaults.yaml - -The `--container-image-prepare` option can be used to override which -``container_image_prepare_defaults.yaml`` file is used. If a version -of this file called ``custom_container_image_prepare.yaml`` is -modified to contain syntax like the following:: - - ContainerImageRegistryCredentials: - quay.io/ceph-ci: - quay_username: quay_password - -Then when a command like the following is run:: - - openstack overcloud ceph deploy \ - deployed_metal.yaml \ - -o deployed_ceph.yaml \ - --container-image-prepare custom_container_image_prepare.yaml - -The credentials will be extracted from the file and the tripleo -ansible role to bootstrap Ceph will be executed like this:: - - cephadm bootstrap - --registry-url quay.io/ceph-ci - --registry-username quay_username - --registry-password quay_password - ... - -The syntax of the container image prepare file can also be ignored and -instead the following command line options may be used instead:: - - --container-namespace CONTAINER_NAMESPACE - e.g. quay.io/ceph - --container-image CONTAINER_IMAGE - e.g. ceph - --container-tag CONTAINER_TAG - e.g. latest - --registry-url REGISTRY_URL - --registry-username REGISTRY_USERNAME - --registry-password REGISTRY_PASSWORD - -If a variable above is unused, then it defaults to the ones found in -the default ``container_image_prepare_defaults.yaml`` file. In other -words, the above options are overrides. - - -NTP configuration ------------------ - -To help Ceph monitors to form a quorum, time synchronization is configured -before Ceph deployment. - -By default `openstack overcloud ceph deploy` installs and enables -time synchronization service (chrony) unless `--skip-ntp` is used. - -Chrony uses NTP servers defined in ansible-role-chrony role by default. - -NTP server/s can be configured explicitly by using either -`--ntp-server` or `--ntp-heat-env-file`. - -NTP servers can be passed as a comma-separated string to the deploy command, -for example:: - - openstack overcloud ceph deploy \ - --ntp-server "0.pool.ntp.org,1.pool.ntp.org" - -Alternatively, a heat env file which contains the list of NTP servers -can be used as shown here:: - - openstack overcloud ceph deploy \ - --ntp-heat-env-file "/home/stack/ntp-parameters.yaml" - -where ntp-parameter.yaml should have the NTP servers defined in the parameter -`NtpServer` as shown in the example:: - - parameter_defaults: - NtpServer: 0.pool.ntp.org,1.pool.ntp.org - -Creating Pools and CephX keys before overcloud deployment (Optional) --------------------------------------------------------------------- - -By default `openstack overcloud ceph deploy` does not create Ceph -pools or cephx keys to access those pools. Later during overcloud -deployment the pools and cephx keys are created based on which Heat -environment files are passed. For most cases only pools for Cinder -(volumes), Nova (vms), and Glance (images) are created but if the -Heat environment file to configure additional services are passed, -e.g. cinder-backup, then the required pools are created. This is -covered in more detail in the next section of this document. - -It is not necessary to create pools and cephx keys before overcloud -deployment but it is possible. The Ceph pools can be created when -`openstack overcloud ceph deploy` is run by using the option ---ansible-extra-vars to set the tripleo_cephadm_pools variable used -by tripleo-ansible's tripleo_cephadm role. - -Create an Ansible extra vars file defining the desired pools:: - - cat < tripleo_cephadm_ansible_extra_vars.yaml - --- - tripleo_cephadm_pools: - - name: vms - pg_autoscale_mode: True - target_size_ratio: 0.3 - application: rbd - - name: volumes - pg_autoscale_mode: True - target_size_ratio: 0.5 - application: rbd - - name: images - target_size_ratio: 0.2 - pg_autoscale_mode: True - application: rbd - tripleo_ceph_client_vars: /home/stack/overcloud-deploy/overcloud/cephadm/ceph_client.yml - EOF - -The pool names 'vms', 'volumes', and 'images' used above are -recommended since those are the default names that the overcloud -deployment will use when "openstack overcloud deploy" is run, unless -the Heat parameters NovaRbdPoolName, CinderRbdPoolName, and -GlanceRbdPoolName are overridden respectively. - -In the above example, tripleo_ceph_client_vars is used to direct Ansible -to save the generated ceph_client.yml file in a cephadm subdirectory of -the working directory. The tripleo_cephadm role will ensure this directory -exists before creating the file. If `openstack overcloud export ceph` is -going to be used, it will expect the Ceph client file to be in this location, -based on the stack name (e.g. overcloud). - -Deploy the Ceph cluster with Ansible extra vars:: - - openstack overcloud ceph deploy \ - deployed-metal-overcloud.yaml \ - -y -o deployed-ceph-overcloud.yaml \ - --force \ - --ansible-extra-vars tripleo_cephadm_ansible_extra_vars.yaml - -After Ceph is deployed, the pools should be created and an openstack cephx -key will also be created to access all of those pools. The contents of -deployed-ceph-overcloud.yaml will also have the pool and cephx key -Heat environment parameters set so the overcloud will use the same -values. - -When the tripleo_cephadm_pools variable is set, the Tripleo client will -create a tripleo_cephadm_keys tripleo-ansible variable structure with -the client name "openstack" and a generated cephx key like the following:: - - tripleo_cephadm_keys: - - name: client.openstack - key: AQC+vYNXgDAgAhAAc8UoYt+OTz5uhV7ItLdwUw== - mode: '0600' - caps: - mgr: allow * - mon: profile rbd - osd: profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images - -It is not recommended to define tripleo_cephadm_keys in the Ansible extra vars file. -If you prefer to set the key username to something other than "openstack" or prefer -to pass your own cephx client key (e.g. AQC+vYNXgDAgAhAAc8UoYt+OTz5uhV7ItLdwUw==), -then use following parameters:: - - --ceph-client-username (default: openstack) - --ceph-client-key (default: auto generates a valid cephx key) - -Both of the above parameters are ignored unless tripleo_cephadm_pools is set via ---ansible-extra-vars. If tripleo_cephadm_pools is set then a cephx key to access -all of the pools will always be created unless --skip-cephx-keys is used. - -If you wish to re-run 'openstack overcloud ceph deploy' for any -reason and have created-cephx keys in previous runs, then you may use -the --ceph-client-key parameter from the previous run to prevent a new -key from being generated. The key value can be found in the file which -is output from he previous run (e.g. --output ). - -If any of the above parameters are used, then the generated deployed Ceph output -file (e.g. --output ) will contain the values of the above -variables mapped to their TripleO Heat template environment variables to ensure a -consistent overcloud deployment:: - - CephPools: {{ tripleo_cephadm_pools }} - CephClientConfigVars: {{ tripleo_ceph_client_vars }} - CephClientKey: {{ ceph_client_username }} - CephClientUserName: {{ ceph_client_key }} - -The CephPools Heat parameter above has always supported idempotent -updates. It will be pre-populated with the pools from -tripleo_cephadm_pools after Ceph is deployed. The deployed_ceph.yaml -which is output can also be updated so that additional pools can be -created when the overcloud is deployed. The Heat parameters above are -described in more detail in the rest of this document. - -Environment files to configure Ceph during Overcloud deployment ---------------------------------------------------------------- - -After `openstack overcloud ceph deploy` has run and output the -`deployed_ceph.yaml` file, this file and other Heat environment -files should be passed to the `openstack overcloud deploy` -command:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm.yaml \ - -e deployed_ceph.yaml - -The above will make the following modifications to the Ceph cluster -while the overcloud is being deployed: - -- Execute cephadm to add the Ceph RADOS Gateway (RGW) service -- Configure HAProxy as a front end for RGW -- Configure Keystone so RGW behaves like the OpenStack object service -- Create Pools for both RGW and RBD services -- Create an openstack client cephx keyring for Nova, Cinder, Glance to - access RBD - -The information necessary to configure Ceph clients will then -be extracted to `/home/stack/ceph_client.yml` on the undercloud and -passed to the as input to the tripleo-ansible role tripleo_ceph_client -which will then configure the rest of the overcloud to use the new -Ceph cluster as described in the :doc:`ceph_external` documentation. - -If you only wish to deploy Ceph RBD without RGW then use the following -variation of the above:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm-rbd-only.yaml \ - -e deployed_ceph.yaml - -Do not directly edit the `environments/cephadm/cephadm.yaml` -or `cephadm-rbd-only.yaml` file. If you wish to override the defaults, -as described below in the sections starting with "Overriding", then -place those overrides in a separate `cephadm-overrides.yaml` file and -deploy like this:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm.yaml \ - -e deployed_ceph.yaml \ - -e ceph-overrides.yaml - -Applying Ceph server configuration during overcloud deployment --------------------------------------------------------------- - -The `deployed_ceph.yaml` file output by `openstack overcloud ceph deploy` -has the paramter `ApplyCephConfigOverridesOnUpdate` set to true so -that Ceph services not deployed by `openstack overcloud ceph deploy`, -e.g. RGW, can be configured during initial overcloud deployment. After -both Ceph and the overcloud have been deployed, edit the -`deployed_ceph.yaml` file and set `ApplyCephConfigOverridesOnUpdate` -to false. All Ceph server configuration changes should then be made -using `Ceph Orchestrator`_. - -It is technically possible to set `ApplyCephConfigOverridesOnUpdate` -to true and use `CephConfigOverrides` to override Ceph *server* -configurations during stack updates. When this happens, parameters in -`CephConfigOverrides` are put into a file, e.g. assimilate_ceph.conf, -and a command like `ceph config assimilate-conf -i -assimilate_ceph.conf` is run. - -Regardless of the value of the `ApplyCephConfigOverridesOnUpdate` -boolean, if `openstack overcloud deploy` is re-run in order to update -the stack, the cephadm bootstrap process is not repeated because -that process is only run if `cephadm list` returns an empty list. - -Applying Ceph client configuration during overcloud deployment --------------------------------------------------------------- - -To make a Ceph *client* configuration change, update the parameters in -`CephConfigOverrides` and run a stack update. This will not -change the configuration for the Ceph servers unless -`ApplyCephConfigOverridesOnUpdate` is set to true (as described in the -section above). By default it should only change configurations for -the Ceph clients. Examples of Ceph clients include Nova compute -containers, Cinder volume containers, Glance image containers, etc. - -The `CephConfigOverrides` directive updates all Ceph client -configuration files on the overcloud in the `CephConfigPath` (which -defaults to /var/lib/tripleo-config/ceph). The `CephConfigPath` is -mounted on the client containers as `/etc/ceph`. The name of the -configuration file is `ceph.conf` because the `CephClusterName` -parameter defaults to "ceph". If `CephClusterName` was set to "foo", -then the file would be called `/etc/ceph/foo.conf`. - -Ceph Pool Options ------------------ - -When `openstack overcloud deploy` is run a pool is created for each -OpenStack service depending on if that service is enabled by including -its Heat environment. For example, a command like the following will -result in pools for Nova (vms), Cinder (volumes) and Glance (images) -being created:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm-rbd-only.yaml - -If `-e environments/cinder-backup.yaml` included in the above command -then a pool called backups would also be created. - -By default each pool will have Ceph`s pg_autoscale_mode enabled so it -is not necessary to directly set a PG number per pool. However, even -with this mode enabled it is recommended to set a `target_size_ratio` -(or pg_num) per pool in order to minimize data rebalancing. For more -information on pg_autoscale_mode see `Autoscaling Placement Groups`_. - -To control the target_size_ratio per pool, create a Heat environment -file like pools.yaml with the following content and include it in the -`openstack overcloud deploy` command with a `-e pools.yaml`:: - - CephPools: - - name: volumes - target_size_ratio: 0.4 - application: rbd - - name: images - target_size_ratio: 0.1 - application: rbd - - name: vms - target_size_ratio: 0.3 - application: rbd - -In the above example it is assumed that the percentage of data used -per service will be Cinder volumes 40%, Glance images 10% and Nova vms -30% (with 20% of space free for other pools). It is worthwhile to set -these values based on your expected usage (e.g. maybe 40% is not right -for your usecase). If you do not override the CephPools parameter, -then each pool will have Ceph's default PG number. Though the -autoscaler will adjust this number automatically over time based on -usage, the data will be moved within the cluster as a result which -will use computational resources. - -If you prefer to set a PG number instead of a target size ratio, then -replace `target_size_ratio` in the example above with ‘pg_num’ and -supply a different integer per pool (e.g. 512 for volumes, 128 for -images, etc.) based on your expected usage. - -Overriding CRUSH rules ----------------------- - -To deploy Ceph pools with custom CRUSH Map Rules use the -`CephCrushRules` parameter to define a list of named rules and then -associate the `rule_name` per pool with the `CephPools` parameter:: - - parameter_defaults: - CephCrushRules: - - name: HDD - root: default - type: host - class: hdd - default: true - - name: SSD - root: default - type: host - class: ssd - default: false - CephPools: - - {'name': 'slow_pool', 'rule_name': 'HDD', 'application': 'rbd'} - - {'name': 'fast_pool', 'rule_name': 'SSD', 'application': 'rbd'} - -CRUSH rules may be created during overcloud deployment as documented -above. CRUSH rules may also be created directly via the Ceph command -line tools. - -Overriding CephX Keys ---------------------- - -During overcloud deployment, TripleO will create a Ceph cluster with a -CephX key file for OpenStack RBD client connections that is shared by -the Nova, Cinder, and Glance services to read and write to their -pools. Not only will the keyfile be created but the Ceph cluster will -be configured to accept connections when the key file is used. The -file will be named `ceph.client.openstack.keyring` and it will be -stored in `/etc/ceph` within the containers, but on the container host -it will be stored in a location defined by a TripleO exposed parameter -which defaults to `/var/lib/tripleo-config/ceph`. - -The keyring file is created using the following defaults: - -* CephClusterName: 'ceph' -* CephClientUserName: 'openstack' -* CephClientKey: This value is randomly generated per Heat stack. If - it is overridden the recommendation is to set it to the output of - `ceph-authtool --gen-print-key`. - -If the above values are overridden, the keyring file will have a -different name and different content. E.g. if `CephClusterName` was -set to 'foo' and `CephClientUserName` was set to 'bar', then the -keyring file would be called `foo.client.bar.keyring` and it would -contain the line `[client.bar]`. - -The `CephExtraKeys` parameter may be used to generate additional key -files containing other key values and should contain a list of maps -where each map describes an additional key. The syntax of each -map must conform to what the `ceph-ansible/library/ceph_key.py` -Ansible module accepts. The `CephExtraKeys` parameter should be used -like this:: - - CephExtraKeys: - - name: "client.glance" - caps: - mgr: "allow *" - mon: "profile rbd" - osd: "profile rbd pool=images" - key: "AQBRgQ9eAAAAABAAv84zEilJYZPNuJ0Iwn9Ndg==" - mode: "0600" - -If the above is used, in addition to the -`ceph.client.openstack.keyring` file, an additional file called -`ceph.client.glance.keyring` will be created which contains:: - - [client.glance] - key = AQBRgQ9eAAAAABAAv84zEilJYZPNuJ0Iwn9Ndg== - caps mgr = "allow *" - caps mon = "profile rbd" - caps osd = "profile rbd pool=images" - -The Ceph cluster will also allow the above key file to be used to -connect to the images pool. Ceph RBD clients which are external to the -overcloud could then use this CephX key to connect to the images -pool used by Glance. The default Glance deployment defined in the Heat -stack will continue to use the `ceph.client.openstack.keyring` file -unless that Glance configuration itself is overridden. - -Add the Ceph Dashboard to a Overcloud deployment ------------------------------------------------- - -During the overcloud deployment most of the Ceph daemons can be added and -configured. -To deploy the ceph dashboard include the ceph-dashboard.yaml environment -file as in the following example:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/ceph-dashboard.yaml - -The command above will include the ceph dashboard related services and -generates all the `cephadm` required variables to render the monitoring -stack related spec that can be applied against the deployed Ceph cluster. -When the deployment has been completed the Ceph dashboard containers, -including prometheus and grafana, will be running on the controller nodes -and will be accessible using the port 3100 for grafana and 9092 for prometheus; -since this service is only internal and doesn’t listen on the public vip, users -can reach both grafana and the exposed ceph dashboard using the controller -provisioning network vip on the specified port (8444 is the default for a generic -overcloud deployment). - -The resulting deployment will be composed by an external stack made by grafana, -prometheus, alertmanager, node-exporter containers and the ceph dashboard mgr -module that acts as the backend for this external stack, embedding the grafana -layouts and showing the ceph cluster specific metrics coming from prometheus. -The Ceph Dashboard backend services run on the specified `CephDashboardNetwork` -and `CephGrafanaNetwork`, while the high availability is realized by haproxy and -Pacemaker. - -The Ceph Dashboard frontend is fully integrated with the tls-everywhere framework, -hence providing the tls environments files will trigger the certificate request for -both grafana and the ceph dashboard: the generated crt and key files are then -configured by cephadm, resulting in a key-value pair within the Ceph orchestrator, -which is able to mount the required files to the dashboard related containers. -The Ceph Dashboard admin user role is set to `read-only` mode by default for safe -monitoring of the Ceph cluster. To permit an admin user to have elevated privileges -to alter elements of the Ceph cluster with the Dashboard, the operator can change the -default. - -For this purpose, TripleO exposes a parameter that can be used to change the Ceph -Dashboard admin default mode. - -Log in to the undercloud as `stack` user and create the `ceph_dashboard_admin.yaml` -environment file with the following content:: - - parameter_defaults: - CephDashboardAdminRO: false - -Run the overcloud deploy command to update the existing stack and include the environment -file created with all other environment files that are already part of the existing -deployment:: - - openstack overcloud deploy --templates \ - -e \ - -e ceph_dashboard_admin.yml - -The ceph dashboard will also work with composable networks. -In order to isolate the monitoring access for security purposes, operators can -take advantage of composable networks and access the dashboard through a separate -network vip. By doing this, it's not necessary to access the provisioning network -and separate authorization profiles may be implemented. - -To deploy the overcloud with the ceph dashboard composable network we need first -to generate the controller specific role created for this scenario:: - - openstack overcloud roles generate \ - -o /home/stack/roles_data.yaml \ - ControllerStorageDashboard Compute \ - BlockStorage ObjectStorage CephStorage - -Finally, run the overcloud deploy command including the new generated `roles_data.yaml` -and the `network_data_dashboard.yaml` file that will trigger the generation of this -new network. - -The final overcloud command must look like the following:: - - openstack overcloud deploy --templates \ - -r /home/stack/roles_data.yaml \ - -n /usr/share/openstack-tripleo-heat-templates/network_data_dashboard.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm.yaml \ - -e ~/my-ceph-settings.yaml - -Scenario: Deploy Ceph with TripleO and Metalsmith and then Scale Up -------------------------------------------------------------------- - -Deploy the hardware as described in :doc:`../provisioning/baremetal_provision` -and include nodes with in the `CephStorage` role. For example, the -following could be the content of ~/overcloud_baremetal_deploy.yaml:: - - - name: Controller - count: 3 - instances: - - hostname: controller-0 - name: controller-0 - - hostname: controller-1 - name: controller-1 - - hostname: controller-2 - name: controller-2 - - name: CephStorage - count: 3 - instances: - - hostname: ceph-0 - name: ceph-0 - - hostname: ceph-1 - name: ceph-2 - - hostname: ceph-2 - name: ceph-2 - - name: Compute - count: 1 - instances: - - hostname: compute-0 - name: compute-0 - -which is passed to the following command:: - - openstack overcloud node provision \ - --stack overcloud \ - --output ~/overcloud-baremetal-deployed.yaml \ - ~/overcloud_baremetal_deploy.yaml - -Ceph may then be deployed with `openstack overcloud ceph deploy`. -As described in :doc:`../provisioning/baremetal_provision`, pass -~/overcloud_baremetal_deploy.yaml as input, along with -/usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm.yaml -and any Ceph Overrides described in the rest of this document, to the -`openstack overcloud deploy` command. - -To scale up, modify the ~/overcloud_baremetal_deploy.yaml file -described above to add more CephStorage nodes. In the example below -the number of storage nodes is doubled:: - - - name: CephStorage - count: 6 - instances: - - hostname: ceph-0 - name: ceph-0 - - hostname: ceph-1 - name: ceph-2 - - hostname: ceph-2 - name: ceph-2 - - hostname: ceph-3 - name: ceph-3 - - hostname: ceph-4 - name: ceph-4 - - hostname: ceph-5 - name: ceph-5 - -As described in :doc:`../provisioning/baremetal_provision`, re-run the -same `openstack overcloud node provision` command with the updated -~/overcloud_baremetal_deploy.yaml file. This will result in the three -new storage nodes being provisioned and output an updated copy of -~/overcloud-baremetal-deployed.yaml. The updated copy will have the -`CephStorageCount` changed from 3 to 6 and the `DeployedServerPortMap` -and `HostnameMap` will contain the new storage nodes. - -After the three new storage nodes are deployed run the same -`openstack overcloud deploy` command as described in the previous -section with updated copy of ~/overcloud-baremetal-deployed.yaml. -The additional Ceph Storage nodes will be added to the Ceph and -the increased capacity will available. It is not necessary to run -`openstack overcloud ceph deploy` to scale up. - -In particular, the following will happen as a result of running -`openstack overcloud deploy`: - -- The storage networks and firewall rules will be appropriately - configured on the new CephStorage nodes -- The ceph-admin user will be created on the new CephStorage nodes -- The ceph-admin user's public SSH key will be distributed to the new - CephStorage nodes so that cephadm can use SSH to add extra nodes -- If a new host with the Ceph Mon or Ceph Mgr service is being added, - then the private SSH key will also be added to that node. -- An updated Ceph spec will be generated and installed on the - bootstrap node, i.e. /home/ceph-admin/specs/ceph_spec.yaml on the - bootstrap node will contain new entries for the new CephStorage - nodes. -- The cephadm bootstrap process will be skipped because `cephadm ls` - will indicate that Ceph containers are already running. -- The updated spec will be applied and cephadm will schedule the new - nodes to join the cluster. - -Scenario: Scale Down Ceph with TripleO and Metalsmith ------------------------------------------------------ - -.. warning:: This procedure is only possible if the Ceph cluster has - the capacity to lose OSDs. - -Before using TripleO to remove hardware which is part of a Ceph -cluster, use Ceph orchestrator to deprovision the hardware gracefully. -This example uses commands from the `OSD Service Documentation for -cephadm`_ to remove the OSDs, and their host, before using TripleO -to scale down the Ceph storage nodes. - -Start a Ceph shell and identify the OSDs to be removed by server. In -the following example we will identify the OSDs of the host ceph-2:: - - [root@oc0-controller-0 ~]# cephadm shell - ... - [ceph: root@oc0-controller-0 /]# ceph osd tree - ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF - -1 0.58557 root default - ... - -7 0.19519 host ceph-2 - 5 hdd 0.04880 osd.5 up 1.00000 1.00000 - 7 hdd 0.04880 osd.7 up 1.00000 1.00000 - 9 hdd 0.04880 osd.9 up 1.00000 1.00000 - 11 hdd 0.04880 osd.11 up 1.00000 1.00000 - ... - [ceph: root@oc0-controller-0 /]# - -First we need to update the Ceph spec defined in the server. Otherwise -the Ceph Manager will try to recreate the OSDs when we remove them -with `ceph orch osd rm`. Export the Ceph spec, edit it, and reapply -the modified Ceph spec:: - - [ceph: root@oc0-controller-0 /]# ceph orch ls --export > spec.yml - [ceph: root@oc0-controller-0 /]# vi spec.yml - [ceph: root@oc0-controller-0 /]# ceph orch apply -i spec.yml - [ceph: root@oc0-controller-0 /]# - -In the step where the spec is edited, update the `service_type: osd` -hosts list to remove the "ceph-2" host and remove the `service_type: -host` entry for the "ceph-2" host. - -As per `ceph osd tree`, the ceph-2 host has OSDs 5,7,9,11 which can -be removed by running `ceph orch osd rm 5 7 9 11`. For example:: - - [ceph: root@oc0-controller-0 /]# ceph orch osd rm --zap 5 7 9 11 - Scheduled OSD(s) for removal - [ceph: root@oc0-controller-0 /]# ceph orch osd rm status - OSD_ID HOST STATE PG_COUNT REPLACE FORCE DRAIN_STARTED_AT - 7 ceph-2 draining 27 False False 2021-04-23 21:35:51.215361 - 9 ceph-2 draining 8 False False 2021-04-23 21:35:49.111500 - 11 ceph-2 draining 14 False False 2021-04-23 21:35:50.243762 - [ceph: root@oc0-controller-0 /]# - -The `--zap` option is used to clean the disks so that they can be -easily added back to the ceph cluster if necessary. Use `ceph orch osd -rm status` to check the status:: - - [ceph: root@oc0-controller-0 /]# ceph orch osd rm status - OSD_ID HOST STATE PG_COUNT REPLACE FORCE DRAIN_STARTED_AT - 7 ceph-2 draining 34 False False 2021-04-23 21:35:51.215361 - 11 ceph-2 done, waiting for purge 0 False False 2021-04-23 21:35:50.243762 - [ceph: root@oc0-controller-0 /]# - -Only proceed if `ceph orch osd rm status` returns no output. - -Remove the host with `ceph orch host rm `. For example:: - - [ceph: root@oc0-controller-0 /]# ceph orch host rm ceph-2 - Removed host 'ceph-2' - [ceph: root@oc0-controller-0 /]# - -Now that the host and OSDs have been logically removed from the Ceph -cluster proceed to remove the host from the overcloud as described in -the "Scaling Down" section of :doc:`../provisioning/baremetal_provision`. - -Scenario: Deploy Hyperconverged Ceph ------------------------------------- - -Use a command like the following to create a `roles.yaml` file -containing a standard Controller role and a ComputeHCI role:: - - openstack overcloud roles generate Controller ComputeHCI -o ~/roles.yaml - -The ComputeHCI role is a Compute node which also runs co-located Ceph -OSD daemons. This kind of service co-location is referred to as HCI, -or hyperconverged infrastructure. See the :doc:`composable_services` -documentation for details on roles and services. - -When collocating Nova Compute and Ceph OSD services, boundaries can be -set to reduce contention for CPU and Memory between the two services. -To limit Ceph for HCI, create an initial Ceph configuration file with -the following:: - - $ cat < initial-ceph.conf - [osd] - osd_memory_target_autotune = true - osd_numa_auto_affinity = true - [mgr] - mgr/cephadm/autotune_memory_target_ratio = 0.2 - EOF - $ - -The `osd_memory_target_autotune`_ is set to true so that the OSD -daemons will adjust their memory consumption based on the -`osd_memory_target` config option. The `autotune_memory_target_ratio` -defaults to 0.7. So 70% of the total RAM in the system is the starting -point, from which any memory consumed by non-autotuned Ceph daemons -are subtracted, and then the remaining memory is divided by the OSDs -(assuming all OSDs have `osd_memory_target_autotune` true). For HCI -deployments the `mgr/cephadm/autotune_memory_target_ratio` can be set -to 0.2 so that more memory is available for the Nova Compute -service. This has the same effect as setting the ceph-ansible `is_hci` -parameter to true. - -A two NUMA node system can host a latency sensitive Nova workload on -one NUMA node and a Ceph OSD workload on the other NUMA node. To -configure Ceph OSDs to use a specific NUMA node (and not the one being -used by the Nova Compute workload) use either of the following Ceph -OSD configurations: - -- `osd_numa_node` sets affinity to a numa node (-1 for none) -- `osd_numa_auto_affinity` automatically sets affinity to the NUMA - node where storage and network match - -If there are network interfaces on both NUMA nodes and the disk -controllers are NUMA node 0, then use a network interface on NUMA node -0 for the storage network and host the Ceph OSD workload on NUMA -node 0. Then host the Nova workload on NUMA node 1 and have it use the -network interfaces on NUMA node 1. Setting `osd_numa_auto_affinity`, -to true, as in the `initial-ceph.conf` file above, should result in -this configuration. Alternatively, the `osd_numa_node` could be set -directly to 0 and `osd_numa_auto_affinity` could be unset so that it -will default to false. - -When a hyperconverged cluster backfills as a result of an OSD going -offline, the backfill process can be slowed down. In exchange for a -slower recovery, the backfill activity has less of an impact on -the collocated Compute workload. Ceph Pacific has the following -defaults to control the rate of backfill activity:: - - osd_recovery_op_priority = 3 - osd_max_backfills = 1 - osd_recovery_max_active_hdd = 3 - osd_recovery_max_active_ssd = 10 - -It is not necessary to pass the above in an initial ceph.conf as they -are the default values, but if these values need to be deployed with -different values modify an example like the above and add it to the -initial Ceph configuration file before deployment. If the values need -to be adjusted after the deployment use `ceph config set osd -`. - -To limit Nova resources add parameters to `ceph-overrides.yaml` -like the following but modify the NovaReservedHostMemory to suit your -environment:: - - parameter_defaults: - ComputeHCIParameters: - NovaReservedHostMemory: 75000 - -The `NovaReservedHostMemory` above overrides the default value of -`reserved_host_memory_mb` in /etc/nova/nova.conf. The value may be -set so that the Nova scheduler does not give memory to a virtual -machine that a Ceph OSD on the same server will need. The example -above reserves 5 GB per OSD for 10 OSDs per host in addition to the -default reserved memory for the hypervisor. In an IOPS-optimized -cluster performance can be improved by reserving more memory per OSD. -The 5 GB number is provided as a starting point which can be further -tuned if necessary. - -Deploy Ceph with `openstack overcloud ceph deploy` and be sure to -pass the initial Ceph configuration file with Ceph HCI tunings. Then -deploy the overcloud with `openstack overcloud deploy` and the as -described in "Scenario: Deploy Ceph with TripleO and Metalsmith" but -use the `-r` option to include generated `roles.yaml` file and the -`-e` option with the `ceph-overrides.yaml` file containing the Nova -HCI tunings described above. - -The examples above may be used to tune a hyperconverged system during -deployment. If the values need to be changed after deployment, then -use the `ceph orchestrator` command to set them directly. - -After deployment start a Ceph shell and confirm the above values were -applied. For example, to check that the NUMA and memory target auto -tuning run commands lke this:: - - [ceph: root@oc0-controller-0 /]# ceph config dump | grep numa - osd advanced osd_numa_auto_affinity true - [ceph: root@oc0-controller-0 /]# ceph config dump | grep autotune - osd advanced osd_memory_target_autotune true - [ceph: root@oc0-controller-0 /]# ceph config get mgr mgr/cephadm/autotune_memory_target_ratio - 0.200000 - [ceph: root@oc0-controller-0 /]# - -We can then confirm that a specific OSD, e.g. osd.11, inherited those -values with commands like this:: - - [ceph: root@oc0-controller-0 /]# ceph config get osd.11 osd_memory_target - 4294967296 - [ceph: root@oc0-controller-0 /]# ceph config get osd.11 osd_memory_target_autotune - true - [ceph: root@oc0-controller-0 /]# ceph config get osd.11 osd_numa_auto_affinity - true - [ceph: root@oc0-controller-0 /]# - -To confirm that the default backfill values are set for the same -example OSD, use commands like this:: - - [ceph: root@oc0-controller-0 /]# ceph config get osd.11 osd_recovery_op_priority - 3 - [ceph: root@oc0-controller-0 /]# ceph config get osd.11 osd_max_backfills - 1 - [ceph: root@oc0-controller-0 /]# ceph config get osd.11 osd_recovery_max_active_hdd - 3 - [ceph: root@oc0-controller-0 /]# ceph config get osd.11 osd_recovery_max_active_ssd - 10 - [ceph: root@oc0-controller-0 /]# - -On the compute node, verify that the `reserved_host_memory_mb` was -applied:: - - $ sudo podman exec -ti nova_compute /bin/bash - # grep reserved_host_memory_mb /etc/nova/nova.conf - reserved_host_memory_mb=75000 - # - -.. _`cephadm`: https://docs.ceph.com/en/latest/cephadm/index.html -.. _`cleaning instructions in the Ironic documentation`: https://docs.openstack.org/ironic/latest/admin/cleaning.html -.. _`ceph config command`: https://docs.ceph.com/en/latest/man/8/ceph/#config -.. _`ceph_spec_bootstrap`: https://docs.openstack.org/tripleo-ansible/latest/modules/modules-ceph_spec_bootstrap.html -.. _`Ceph Service Specification`: https://docs.ceph.com/en/octopus/mgr/orchestrator/#orchestrator-cli-service-spec -.. _`Advanced OSD Service Specifications`: https://docs.ceph.com/en/octopus/cephadm/drivegroups/ -.. _`Ceph Host Management`: https://docs.ceph.com/en/latest/cephadm/host-management/#setting-the-initial-crush-location-of-host -.. _`Overriding crush rules`: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/features/cephadm.html#overriding-crush-rules -.. _`CephIngress`: https://docs.ceph.com/en/pacific/cephadm/services/nfs/#high-availability-nfs -.. _`Ceph Orchestrator`: https://docs.ceph.com/en/latest/mgr/orchestrator/ -.. _`Autoscaling Placement Groups`: https://docs.ceph.com/en/latest/rados/operations/placement-groups/ -.. _`OSD Service Documentation for cephadm`: https://docs.ceph.com/en/latest/cephadm/services/osd/ -.. _`osd_memory_target_autotune`: https://docs.ceph.com/en/latest/cephadm/services/osd/#automatically-tuning-osd-memory diff --git a/deploy-guide/source/features/deployed_server.rst b/deploy-guide/source/features/deployed_server.rst deleted file mode 100644 index 79a0bdf1..00000000 --- a/deploy-guide/source/features/deployed_server.rst +++ /dev/null @@ -1,697 +0,0 @@ -.. _deployed_server: - -Using Already Deployed Servers -============================== - -TripleO can be used with servers that have already been deployed and -provisioned with a running operating system. - -In this deployment scenario, Ironic from the Undercloud is not used -to do any server deployment, installation, or power management. An external to -TripleO and already existing provisioning tool is expected to have already -installed an operating system on the servers that are intended to be used as -nodes in the Overcloud. - -Additionally, Neutron can be optionally used or not. - -.. note:: - It's an all or nothing approach when using already deployed servers. Mixing - using deployed servers with servers provisioned with Nova and Ironic is not - currently possible. - -Benefits to using this feature include not requiring a dedicated provisioning -network, and being able to use a custom partitioning scheme on the already -deployed servers. - -Deployed Server Requirements ----------------------------- - -Networking -^^^^^^^^^^ - -Network interfaces -__________________ - -It's recommended that each server have a dedicated management NIC with -externally configured connectivity so that the servers are reachable outside of -any networking configuration done by the OpenStack deployment. - -A separate interface, or set of interfaces should then be used for the -OpenStack deployment itself, configured in the typical fashion with a set of -NIC config templates during the Overcloud deployment. See -:doc:`../features/network_isolation` for more information on configuring networking. - -.. note:: - - When configuring network isolation be sure that the configuration does not - result in a loss of network connectivity from the deployed servers to the - undercloud. The interface(s) that are being used for this connectivity should - be excluded from the NIC config templates so that the configuration does not - unintentionally drop all networking access to the deployed servers. - - -Undercloud -__________ - -Neutron in the Undercloud is not used for providing DHCP services for the -Overcloud nodes, hence a dedicated provisioning network with L2 connectivity is -not a requirement in this scenario. Neutron is however still used for IPAM for -the purposes of assigning IP addresses to the port resources created by -tripleo-heat-templates. - -Network L3 connectivity is still a requirement between the Undercloud and -Overcloud nodes. The undercloud will need to be able to connect over a routable -IP to the overcloud nodes for software configuration with ansible. - -Overcloud -_________ - -Configure the deployed servers that will be used as nodes in the overcloud with -L3 connectivity from the Undercloud as needed. The configuration could be done -via static or DHCP IP assignment. - -Further networking configuration of Overcloud nodes is the same as in a typical -TripleO deployment, except for: - -* Initial configuration of L3 connectivity from the undercloud to the - overcloud. -* No requirement for dedicating a separate L2 network for provisioning - -Testing Connectivity -____________________ - -Test connectivity from the undercloud to the overcloud nodes using SSH over the configured IP -address on the deployed servers. This should be the IP address that is -configured on ``--overcloud-ssh-network`` as passed to the ``openstack overcloud -deploy`` command. The key and user to use with the test should be the same as -used with ``--overcloud-ssh-key`` and ``--overcloud-ssh-user`` with the -deployment command. - -Package repositories -^^^^^^^^^^^^^^^^^^^^ - -The servers will need to already have the appropriately enabled yum repositories -as packages will be installed on the servers during the Overcloud deployment. -The enabling of repositories on the Overcloud nodes is the same as it is for -other areas of TripleO, such as Undercloud installation. See -:doc:`../repositories` for the detailed steps on how to -enable the standard repositories for TripleO. - -Deploying the Overcloud ------------------------ - -Provision networks and ports if using Neutron -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If using Neutron for resource management, Network resources for the deployment -still must be provisioned with the ``openstack overcloud network provision`` -command as documented in :ref:`custom_networks`. - -Port resources for the deployment still must be provisioned with the -``openstack overcloud node provision`` command as documented in -:ref:`baremetal_provision`. - -Set the ``managed`` key to false in either the ``defaults`` dictionary for each -role, or on each instances dictionary in the baremetal provision configuration -file. - -The generated file must then be passed to the ``openstack overcloud deploy`` -command. - -Deployment Command -^^^^^^^^^^^^^^^^^^ - -With generated baremetal and network environments -_________________________________________________ -Include the generated environment files with the deployment command:: - - openstack overcloud deploy \ - --deployed-server \ - -e ~/overcloud-networks-deployed.yaml \ - -e ~/overcloud-baremetal-deployed.yaml \ - - -Without generated environments (no Neutron) -___________________________________________ -The following command would be used when the ``openstack overcloud network -provision`` and ``openstack overcloud node provision`` commands were not used. -Additional environment files need to be passed to the deployment command:: - - openstack overcloud deploy \ - --deployed-server \ - -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-environment.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-networks.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-ports.yaml \ - -e ~/hostnamemap.yaml \ - -e ~/deployed-server-network-environment.yaml \ - - -The environment file ``deployed-server-environment.yaml`` contains the necessary -``resource_registry`` mappings to disable Nova management of overcloud servers -so that deployed servers are used instead. - -``deployed-networks.yaml`` and ``deployed-ports.yaml`` enable the necessary -mappings to disable the Neutron management of network resources. - -``hostnamemap.yaml`` is optional and should define the ``HostnameMap`` -parameter if the actual server hostnames do not match the default role hostname -format. For example:: - - parameter_defaults: - HostnameMap: - overcloud-controller-0: controller-00-rack01 - overcloud-controller-1: controller-01-rack02 - overcloud-controller-2: controller-02-rack03 - overcloud-novacompute-0: compute-00-rack01 - overcloud-novacompute-1: compute-01-rack01 - overcloud-novacompute-2: compute-02-rack01 - -``deployed-server-network-environment.yaml`` should define at a minimum the -following parameters:: - - NodePortMap - DeployedNetworkEnvironment - ControlPlaneVipData - VipPortMap - OVNDBsVirtualFixedIPs - RedisVirtualFixedIPs - EC2MetadataIp - ControlPlaneDefaultRoute - -The following is a sample environment file that shows setting these values - -.. code-block:: yaml - - parameter_defaults: - - NodePortMap: - controller0: - ctlplane: - ip_address: 192.168.100.2 - ip_address_uri: 192.168.100.2 - ip_subnet: 192.168.100.0/24 - external: - ip_address: 10.0.0.10 - ip_address_uri: 10.0.0.10 - ip_subnet: 10.0.0.10/24 - internal_api: - ip_address: 172.16.2.10 - ip_address_uri: 172.16.2.10 - ip_subnet: 172.16.2.10/24 - management: - ip_address: 192.168.1.10 - ip_address_uri: 192.168.1.10 - ip_subnet: 192.168.1.10/24 - storage: - ip_address: 172.16.1.10 - ip_address_uri: 172.16.1.10 - ip_subnet: 172.16.1.10/24 - storage_mgmt: - ip_address: 172.16.3.10 - ip_address_uri: 172.16.3.10 - ip_subnet: 172.16.3.10/24 - tenant: - ip_address: 172.16.0.10 - ip_address_uri: 172.16.0.10 - ip_subnet: 172.16.0.10/24 - - compute0: - ctlplane: - ip_address: 192.168.100.3 - ip_address_uri: 192.168.100.3 - ip_subnet: 192.168.100.0/24 - external: - ip_address: 10.0.0.110 - ip_address_uri: 10.0.0.110 - ip_subnet: 10.0.0.110/24 - internal_api: - ip_address: 172.16.2.110 - ip_address_uri: 172.16.2.110 - ip_subnet: 172.16.2.110/24 - management: - ip_address: 192.168.1.110 - ip_address_uri: 192.168.1.110 - ip_subnet: 192.168.1.110/24 - storage: - ip_address: 172.16.1.110 - ip_address_uri: 172.16.1.110 - ip_subnet: 172.16.1.110/24 - storage_mgmt: - ip_address: 172.16.3.110 - ip_address_uri: 172.16.3.110 - ip_subnet: 172.16.3.110/24 - tenant: - ip_address: 172.16.0.110 - ip_address_uri: 172.16.0.110 - ip_subnet: 172.16.0.110/24 - - ControlPlaneVipData: - fixed_ips: - - ip_address: 192.168.100.1 - name: control_virtual_ip - network: - tags: [] - subnets: - - ip_version: 4 - - VipPortMap: - external: - ip_address: 10.0.0.100 - ip_address_uri: 10.0.0.100 - ip_subnet: 10.0.0.100/24 - internal_api: - ip_address: 172.16.2.100 - ip_address_uri: 172.16.2.100 - ip_subnet: 172.16.2.100/24 - storage: - ip_address: 172.16.1.100 - ip_address_uri: 172.16.1.100 - ip_subnet: 172.16.1.100/24 - storage_mgmt: - ip_address: 172.16.3.100 - ip_address_uri: 172.16.3.100 - ip_subnet: 172.16.3.100/24 - - RedisVirtualFixedIPs: - - ip_address: 192.168.100.10 - use_neutron: false - OVNDBsVirtualFixedIPs: - - ip_address: 192.168.100.11 - use_neutron: false - - DeployedNetworkEnvironment: - net_attributes_map: - external: - network: - dns_domain: external.tripleodomain. - mtu: 1400 - name: external - tags: - - tripleo_network_name=External - - tripleo_net_idx=0 - - tripleo_vip=true - subnets: - external_subnet: - cidr: 10.0.0.0/24 - dns_nameservers: [] - gateway_ip: null - host_routes: [] - ip_version: 4 - name: external_subnet - tags: - - tripleo_vlan_id=10 - internal_api: - network: - dns_domain: internalapi.tripleodomain. - mtu: 1400 - name: internal_api - tags: - - tripleo_net_idx=1 - - tripleo_vip=true - - tripleo_network_name=InternalApi - subnets: - internal_api_subnet: - cidr: 172.16.2.0/24 - dns_nameservers: [] - gateway_ip: null - host_routes: [] - ip_version: 4 - name: internal_api_subnet - tags: - - tripleo_vlan_id=20 - management: - network: - dns_domain: management.tripleodomain. - mtu: 1400 - name: management - tags: - - tripleo_net_idx=5 - - tripleo_network_name=Management - subnets: - management_subnet: - cidr: 192.168.1.0/24 - dns_nameservers: [] - gateway_ip: 192.168.1.1 - host_routes: [] - ip_version: 4 - name: management_subnet - tags: - - tripleo_vlan_id=60 - storage: - network: - dns_domain: storage.tripleodomain. - mtu: 1400 - name: storage - tags: - - tripleo_net_idx=3 - - tripleo_vip=true - - tripleo_network_name=Storage - subnets: - storage_subnet: - cidr: 172.16.1.0/24 - dns_nameservers: [] - gateway_ip: null - host_routes: [] - ip_version: 4 - name: storage_subnet - tags: - - tripleo_vlan_id=30 - storage_mgmt: - network: - dns_domain: storagemgmt.tripleodomain. - mtu: 1400 - name: storage_mgmt - tags: - - tripleo_net_idx=4 - - tripleo_vip=true - - tripleo_network_name=StorageMgmt - subnets: - storage_mgmt_subnet: - cidr: 172.16.3.0/24 - dns_nameservers: [] - gateway_ip: null - host_routes: [] - ip_version: 4 - name: storage_mgmt_subnet - tags: - - tripleo_vlan_id=40 - tenant: - network: - dns_domain: tenant.tripleodomain. - mtu: 1400 - name: tenant - tags: - - tripleo_net_idx=2 - - tripleo_network_name=Tenant - subnets: - tenant_subnet: - cidr: 172.16.0.0/24 - dns_nameservers: [] - gateway_ip: null - host_routes: [] - ip_version: 4 - name: tenant_subnet - tags: - - tripleo_vlan_id=50 - net_cidr_map: - external: - - 10.0.0.0/24 - internal_api: - - 172.16.2.0/24 - management: - - 192.168.1.0/24 - storage: - - 172.16.1.0/24 - storage_mgmt: - - 172.16.3.0/24 - tenant: - - 172.16.0.0/24 - net_ip_version_map: - external: 4 - internal_api: 4 - management: 4 - storage: 4 - storage_mgmt: 4 - tenant: 4 - -.. note:: - - Beginning in Wallaby, the above parameter values from - ``deployed-server-network-environment.yaml`` and the - ``deployed-networks.yaml`` and ``deployed-ports.yaml`` environments replace the use of the - ``DeployedServerPortMap`` parameter, the - ``environments/deployed-server-deployed-neutron-ports.yaml`` environment, and - the ``deployed-neutron-port.yaml`` template. - - The previous parameters and environments can still be used with the - exception that no resources can be mapped to any Neutron native Heat - resources (resources starting with ``OS::Neutron::*``) when using - :doc:`ephemeral Heat <../deployment/ephemeral_heat>` as there is no Heat - and Neutron API communication. - - Note that the following resources may be mapped to ``OS::Neutron::*`` - resources in environment files used prior to Wallaby, and these mappings - should be removed from Wallaby onward:: - - OS::TripleO::Network::Ports::ControlPlaneVipPort - OS::TripleO::Network::Ports::RedisVipPort - OS::TripleO::Network::Ports::OVNDBsVipPort - - .. admonition:: Victoria and prior releases - - The ``DeployedServerPortMap`` parameter can be used to assign fixed IP's - from either the ctlplane network or the IP address range for the - overcloud. - - If the deployed servers were preconfigured with IP addresses from the ctlplane - network for the initial undercloud connectivity, then the same IP addresses can - be reused during the overcloud deployment. Add the following to a new - environment file and specify the environment file as part of the deployment - command:: - - resource_registry: - OS::TripleO::DeployedServer::ControlPlanePort: ../deployed-server/deployed-neutron-port.yaml - parameter_defaults: - DeployedServerPortMap: - controller0-ctlplane: - fixed_ips: - - ip_address: 192.168.24.9 - subnets: - - cidr: 192.168.24.0/24 - network: - tags: - - 192.168.24.0/24 - compute0-ctlplane: - fixed_ips: - - ip_address: 192.168.24.8 - subnets: - - cidr: 192.168.24..0/24 - network: - tags: - - 192.168.24.0/24 - - The value of the DeployedServerPortMap variable is a map. The keys correspond - to the ``-ctlplane`` of the deployed servers. Specify the ip - addresses and subnet CIDR to be assigned under ``fixed_ips``. - - In the case where the ctlplane is not routable from the deployed - servers, the virtual IPs on the ControlPlane, as well as the virtual IPs - for services (Redis and OVNDBs) must be statically assigned. - - Use ``DeployedServerPortMap`` to assign an IP address from any CIDR:: - - resource_registry: - OS::TripleO::DeployedServer::ControlPlanePort: /usr/share/openstack-tripleo-heat-templates/deployed-server/deployed-neutron-port.yaml - OS::TripleO::Network::Ports::ControlPlaneVipPort: /usr/share/openstack-tripleo-heat-templates/deployed-server/deployed-neutron-port.yaml - - # Set VIP's for redis and OVN to noop to default to the ctlplane VIP - # The ctlplane VIP is set with control_virtual_ip in - # DeployedServerPortMap below. - # - # Alternatively, these can be mapped to deployed-neutron-port.yaml as - # well and redis_virtual_ip and ovn_dbs_virtual_ip added to the - # DeployedServerPortMap value to set fixed IP's. - OS::TripleO::Network::Ports::RedisVipPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml - OS::TripleO::Network::Ports::OVNDBsVipPort: /usr/share/openstack-tripleo-heat-templates/network/ports/noop.yaml - - parameter_defaults: - NeutronPublicInterface: eth1 - EC2MetadataIp: 192.168.100.1 - ControlPlaneDefaultRoute: 192.168.100.1 - - DeployedServerPortMap: - control_virtual_ip: - fixed_ips: - - ip_address: 192.168.100.1 - subnets: - - cidr: 192.168.100.0/24 - network: - tags: - - 192.168.100.0/24 - controller0-ctlplane: - fixed_ips: - - ip_address: 192.168.100.2 - subnets: - - cidr: 192.168.100.0/24 - network: - tags: - - 192.168.100.0/24 - compute0-ctlplane: - fixed_ips: - - ip_address: 192.168.100.3 - subnets: - - cidr: 192.168.100.0/24 - network: - tags: - - 192.168.100.0/24 - - In the above example, notice how ``RedisVipPort`` and ``OVNDBsVipPort`` are - mapped to ``network/ports/noop.yaml``. This mapping is due to the fact that - these VIP IP addresses comes from the ctlplane by default, and they will use - the same VIP address that is used for ``ControlPlanePort``. Alternatively - these VIP's can be mapped to their own fixed IP's, in which case a VIP will - be created for each. In this case, the following mappings and values would be - added to the above example:: - - resource_registry: - OS::TripleO::Network::Ports::RedisVipPort: /usr/share/openstack-tripleo-heat-templates/deployed-server/deployed-neutron-port.yaml - OS::TripleO::Network::Ports::OVNDBsVipPort: /usr/share/openstack-tripleo-heat-templates/deployed-server/deployed-neutron-port.yaml - - parameter_defaults: - - DeployedServerPortMap: - redis_virtual_ip: - fixed_ips: - - ip_address: 192.168.100.10 - subnets: - - cidr: 192.168.100.0/24 - network: - tags: - - 192.168.100.0/24 - ovn_dbs_virtual_ip: - fixed_ips: - - ip_address: 192.168.100.11 - subnets: - - cidr: 192.168.100.0/24 - network: - tags: - - 192.168.100.0/24 - - - Use ``DeployedServerPortMap`` to assign an ControlPlane Virtual IP address from - any CIDR, and the ``RedisVirtualFixedIPs`` and ``OVNDBsVirtualFixedIPs`` - parameters to assign the ``RedisVip`` and ``OVNDBsVip``:: - - resource_registry: - OS::TripleO::DeployedServer::ControlPlanePort: /usr/share/openstack-tripleo-heat-templates/deployed-server/deployed-neutron-port.yaml - OS::TripleO::Network::Ports::ControlPlaneVipPort: /usr/share/openstack-tripleo-heat-templates/deployed-server/deployed-neutron-port.yaml - - parameter_defaults: - NeutronPublicInterface: eth1 - EC2MetadataIp: 192.168.100.1 - ControlPlaneDefaultRoute: 192.168.100.1 - - # Set VIP's for redis and OVN - RedisVirtualFixedIPs: - - ip_address: 192.168.100.10 - use_neutron: false - OVNDBsVirtualFixedIPs: - - ip_address: 192.168.100.11 - use_neutron: false - - DeployedServerPortMap: - control_virtual_ip: - fixed_ips: - - ip_address: 192.168.100.1 - subnets: - - cidr: 192.168.100.0/24 - network: - tags: - - 192.168.100.0/24 - controller0-ctlplane: - fixed_ips: - - ip_address: 192.168.100.2 - subnets: - - cidr: 192.168.100.0/24 - network: - tags: - - 192.168.100.0/24 - compute0-ctlplane: - fixed_ips: - - ip_address: 192.168.100.3 - subnets: - - cidr: 192.168.100.0/24 - network: - tags: - - 192.168.100.0/24 - -Scaling the Overcloud ---------------------- - -Scaling Up -^^^^^^^^^^ -When scaling out compute nodes, the steps to be completed by the -user are as follows: - -#. Prepare the new deployed server(s) as shown in `Deployed Server - Requirements`_. -#. Start the scale out command. See :doc:`../post_deployment/scale_roles` for reference. - -Scaling Down -^^^^^^^^^^^^ - - -Starting in Train and onward, `openstack overcloud node delete` can take -a list of server hostnames instead of instance ids. However they can't be -mixed while running the command. Example: if you use hostnames, it would -have to be for all the nodes to delete. - -.. admonition:: Victoria and prior releases - :class: victoria - - The following instructions should be used when the cloud is deployed on - Victoria or a prior release. - - When scaling down the Overcloud, follow the scale down instructions as normal - as shown in :doc:`../post_deployment/delete_nodes`, however use the following - command to get the uuid values to pass to `openstack overcloud node delete` - instead of using `nova list`:: - - openstack stack resource list overcloud -n5 --filter type=OS::TripleO::Server - - Replace `` in the above command with the actual name of the role that - you are scaling down. The `stack_name` column in the command output can be used - to identify the uuid associated with each node. The `stack_name` will include - the integer value of the index of the node in the Heat resource group. For - example, in the following sample output:: - - $ openstack stack resource list overcloud -n5 --filter type=OS::TripleO::ComputeDeployedServerServer - +-----------------------+--------------------------------------+------------------------------------------+-----------------+----------------------+-------------------------------------------------------------+ - | resource_name | physical_resource_id | resource_type | resource_status | updated_time | stack_name | - +-----------------------+--------------------------------------+------------------------------------------+-----------------+----------------------+-------------------------------------------------------------+ - | ComputeDeployedServer | 66b1487c-51ee-4fd0-8d8d-26e9383207f5 | OS::TripleO::ComputeDeployedServerServer | CREATE_COMPLETE | 2017-10-31T23:45:18Z | overcloud-ComputeDeployedServer-myztzg7pn54d-0-pixawichjjl3 | - | ComputeDeployedServer | 01cf59d7-c543-4f50-95df-6562fd2ed7fb | OS::TripleO::ComputeDeployedServerServer | CREATE_COMPLETE | 2017-10-31T23:45:18Z | overcloud-ComputeDeployedServer-myztzg7pn54d-1-ooCahg1vaequ | - | ComputeDeployedServer | 278af32c-c3a4-427e-96d2-3cda7e706c50 | OS::TripleO::ComputeDeployedServerServer | CREATE_COMPLETE | 2017-10-31T23:45:18Z | overcloud-ComputeDeployedServer-myztzg7pn54d-2-xooM5jai2ees | - +-----------------------+--------------------------------------+------------------------------------------+-----------------+----------------------+-------------------------------------------------------------+ - - The index 0, 1, or 2 can be seen in the `stack_name` column. These indices - correspond to the order of the nodes in the Heat resource group. Pass the - corresponding uuid value from the `physical_resource_id` column to `openstack - overcloud node delete` command. - -The physical deployed servers that have been removed from the deployment need -to be powered off. In a deployment not using deployed servers, this would -typically be done with Ironic. When using deployed servers, it must be done -manually, or by whatever existing power management solution is already in -place. If the nodes are not powered down, they will continue to be operational -and could remain functional as part of the deployment, since there are no steps -to unconfigure, uninstall software, or stop services on nodes when scaling -down. - -Once the nodes are powered down and all needed data has been saved from the -nodes, it is recommended that they be reprovisioned back to a base operating -system configuration so that they do not unintentionally join the deployment in -the future if they are powered back on. - -.. note:: - - Do not attempt to reuse nodes that were previously removed from the - deployment without first reprovisioning them using whatever provisioning tool - is in place. - -Deleting the Overcloud ----------------------- - -When deleting the Overcloud, the Overcloud nodes need to be manually powered -off, otherwise, the cloud will still be active and accepting any user requests. - -After archiving important data (log files, saved configurations, database -files), that needs to be saved from the deployment, it is recommended to -reprovision the nodes to a clean base operating system. The reprovision will -ensure that they do not start serving user requests, or interfere with future -deployments in the case where they are powered back on in the future. - -.. note:: - - As with scaling down, do not attempt to reuse nodes that were previously part - of a now deleted deployment in a new deployment without first reprovisioning - them using whatever provisioning tool is in place. diff --git a/deploy-guide/source/features/designate.rst b/deploy-guide/source/features/designate.rst deleted file mode 100644 index fa22bfcd..00000000 --- a/deploy-guide/source/features/designate.rst +++ /dev/null @@ -1,62 +0,0 @@ -Deploying DNSaaS (Designate) -============================ - -Because some aspects of a Designate deployment are specific to the environment -in which it is deployed, there is some additional configuration required -beyond just including an environment file. The following instructions will -explain this configuration. - -First, make a copy of the ``designate-config.yaml`` environment. - -.. note:: For HA deployments, there is a separate ``designate-config-ha.yaml`` - file that should be used instead. - -:: - - cp /usr/share/openstack-tripleo-heat-templates/environments/designate-config.yaml . - -This file contains a sample pool configuration which must be edited to match -the intended environment. Each section has comments that explain how to -configure it. - -.. TODO(bnemec): Include these notes in the sample environments, or figure - out how to pull these values from the Heat stack and populate - the file automatically. - -* ``ns_records``: There should be one of these for each node running designate, - and they should point at the public IP of the node. -* ``nameservers``: There should be one of these for each node running BIND. - The ``host`` value should be the public IP of the node. -* ``targets``: There should be one of these for each node running BIND. Each - target has the following attributes which need to be configured: - - * ``masters``: There should be one of these for each node running - designate-mdns. The ``host`` value should be the public IP of the node. - * ``options``: This specifies where the target BIND instance will be - listening. ``host`` should be the public IP of the node, and - ``rndc_host`` should be the internal_api IP of the node. - -Because this configuration requires the node IPs to be known ahead of time, it -is necessary to use predictable IPs. Full details on configuring those can be -found at :doc:`../provisioning/node_placement`. - -Only the external (public) and internal_api networks need to be predictable -for Designate. The following is an example of the addresses that need to be -set:: - - parameter_defaults: - ControllerIPs: - external: - - 10.0.0.51 - - 10.0.0.52 - - 10.0.0.53 - internal_api: - - 172.17.0.251 - - 172.17.0.252 - - 172.17.0.253 - -Include ``enable-designate.yaml``, ``ips-from-pool.yaml``, and either -``designate-config.yaml`` or ``designate-config-ha.yaml`` in the deploy -command:: - - openstack overcloud deploy --templates -e /usr/share/openstack-tripleo-heat-templates/environments/enable-designate.yaml -e ips-from-pool.yaml -e designate-config.yaml [...] diff --git a/deploy-guide/source/features/disable_telemetry.rst b/deploy-guide/source/features/disable_telemetry.rst deleted file mode 100644 index 22d5dea3..00000000 --- a/deploy-guide/source/features/disable_telemetry.rst +++ /dev/null @@ -1,28 +0,0 @@ -Disable Telemetry -================= - -This guide assumes that your undercloud is already installed and ready to -deploy an overcloud without Telemetry services. - -Deploy your overcloud without Telemetry services ------------------------------------------------- - -If you don't need or don't want Telemetry services (Ceilometer, Gnocchi, -Panko and Aodh), you can disable the services by adding this environment -file when deploying the overcloud:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/disable-telemetry.yaml - -Disabling Notifications -~~~~~~~~~~~~~~~~~~~~~~~ - -When Telemetry is disabled, OpenStack Notifications will be disabled as well, and -the driver will be set to 'noop' for all OpenStack services. -If you would like to restore notifications, you would need to set NotificationDriver to -'messagingv2' in your environment. - -.. Warning:: - - NotificationDriver parameter can only support 'noop' and 'messagingv2' for now. - Also note that 'messaging' driver is obsolete and isn't supported by TripleO. diff --git a/deploy-guide/source/features/distributed_compute_node.rst b/deploy-guide/source/features/distributed_compute_node.rst deleted file mode 100644 index 6ce31001..00000000 --- a/deploy-guide/source/features/distributed_compute_node.rst +++ /dev/null @@ -1,1166 +0,0 @@ -.. _distributed_compute_node: - -Distributed Compute Node deployment -=================================== - -Introduction ------------- -Additional groups of compute nodes can be deployed and integrated with an -existing deployment of a control plane stack. These compute nodes are deployed -in separate stacks from the main control plane (overcloud) stack, and they -consume exported data from the overcloud stack to reuse as -configuration data. - -Deploying these additional nodes in separate stacks provides for separation of -management between the control plane stack and the stacks for additional compute -nodes. The stacks can be managed, scaled, and updated separately. - -Using separate stacks also creates smaller failure domains as there are less -baremetal nodes in each individual stack. A failure in one baremetal node only -requires that management operations to address that failure need only affect -the single stack that contains the failed node. - -A routed spine and leaf networking layout can be used to deploy these -additional groups of compute nodes in a distributed nature. Not all nodes need -to be co-located at the same physical location or datacenter. See -:ref:`routed_spine_leaf_network` for more details. - -Such an architecture is referred to as "Distributed Compute Node" or "DCN" for -short. - -Supported failure modes and High Availability recommendations -------------------------------------------------------------- - -Handling negative scenarios for DCN starts from the deployment planning, like -choosing some particular SDN solution over provider networks to meet the -expected SLA. - -Loss of control plane connectivity -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -A failure of the central control plane affects all DCN edge sites. There is no -autonomous control planes at the edge. No OpenStack control plane API or CLI -operations can be executed locally in that case. For example, you cannot create -a snapshot of a Nova VM, or issue an auth token, nor can you delete an image or -a VM. - -.. note:: A single Controller service failure normally induces - no downtime for edge sites and should be handled as for usual HA deployments. - -Loss of an edge site -^^^^^^^^^^^^^^^^^^^^ - -Running Nova VM instances will keep running. If stopped running, you need the -control plane back to recover the stopped or crashed workloads. If Neutron DHCP -agent is centralized, and we are forwarding DHCP requests to the central site, -any VMs that are trying to renew their IPs will eventually time out and lose -connectivity. - -.. note:: A single Compute service failure normally affects only its edge site - without additional downtime induced for neighbor edge sites or the central - control plane. - -OpenStack infrastructure services, like Nova Compute, will automatically -reconnect to MariaDB database cluster and RabbitMQ broker when the control -plane's uplink is back. No timed out operations can be resumed though and need -to be retried manually. - -It is recommended to maintain each DCN edge site as a separate Availability Zone -(AZ) for Nova/Neutron and Cinder services. - -Improving resiliency for N/S and E/W traffic -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Reliability of the central control plane may be enhanced with L3 HA network, -which only provides North-South routing. The East-West routing effectiveness of -edge networks may be improved by using DVR or highly available Open Virtual -Network (OVN). There is also BGPVPN and its backend specific choices. - -Network recommendations -^^^^^^^^^^^^^^^^^^^^^^^ - -Traditional or external provider networks with backbone routing at the edge may -fulfill or complement a custom distributed routing solution, like L3 Spine-Leaf -topology. - -.. note:: Neutron SDN backends that involve tunnelling may be sub-optimal for - Edge DCN cases because of the known issues 1808594_ and 1808062_. - - .. _1808594: https://bugs.launchpad.net/tripleo/+bug/1808594 - .. _1808062: https://bugs.launchpad.net/tripleo/+bug/1808062 - -For dynamic IPv4 and stateful IPv6 IPAM cases, you will also need DHCP on those -provider networks in order to assign IPs to VM instances. External provider -networks usually require no Neutron DHCP agents and handle IPAM (and -routing) on its own. While for traditional or -`Routed Provider Networks `_, -when there is no L2 connectivity to edge over WAN, and Neutron DHCP agents are -placed on controllers at the central site, you should have a DHCP relay on -every provider network. Alternatively, DHCP agents need to be moved to the edge. -Such setups also require highly reliable links between remote and central sites. - -.. note:: Neither of DHCP relays/agents at compute nodes, nor routed/external - provider networks are tested or automated via TripleO Heat Templates. You would - have to have those configured manually for your DCN environments. - -.. note:: OVN leverages DVR and does not require running Neutron DHCP/L3 agents, - which might as well simplify particular DCN setups. - -That said, when there is a network failure that disconnects the edge off the -central site, there is no SLA for recovery time but only what the provider -networks or a particular SDN choice can guarantee. For switched/routed/MPLS -provider networks, that may span from 10's of ms to a few seconds. With -the outage thresholds are typically considered to be a 15 seconds. These trace -back on various standards that are relevant here. - -Config-drive/cloud-init details -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Config-drive uses virtual media capabilities of the BMC controller, so that no -DHCP is required for VMs to obtain IP addresses at edge sites. This is -the most straightforward solution. This does require that the WAN between the -remote site and central site is live during deployment of a VM, but after that -the VM can run independently without a connection to the central site. - -.. note:: Config-drive may be a tricky for VMs that do not support - cloud-init, like some appliance VMs. It may be that such ones (or other VMs - that do not support config-drive) will have to be configured with a static IP - that matches the Neutron port. - -The simplest solution we recommend for DCN would involve only external provider -networks at the edge. For that case, it is also recommended to use either -config-drive, or IPv6 SLAAC, or another configuration mechanism other than -those requiring a `169.254.169.254/32` route for the provider routers to forward -data to the metadata service. - -IPv6 details -^^^^^^^^^^^^ - -IPv6 for tenants' workloads and infrastructure tunnels interconnecting -the central site and the edge is a viable option as well. IPv6 cannot be used for -provisioning networks though. Key benefits IPv6 may provide for DCN are: - -* SLAAC, which is a EUI-64 form of autoconfig that makes IPv6 addresses - calculated based on MAC addresses and requires no DHCP services placed on the - provider networks. -* Improved mobility for endpoints, like NFV APIs, to roam around different links - and edge sites without losing its connections and IP addresses. -* End-to-end IPv6 has been shown to have better performance by large content - networks. This is largely due to the presence of NAT in most end-to-end IPv4 - connections that slows them down. - -Storage recommendations -^^^^^^^^^^^^^^^^^^^^^^^ - -Prior to Ussuri, DCN was only available with ephemeral storage for -Nova Compute services. Enhanced data availability, locality awareness -and/or replication mechanisms had to be addressed only on the edge -cloud application layer. - -In Ussuri and newer, |project| is able to deploy -:doc:`distributed_multibackend_storage` which may be combined with the -example in this document to add distributed image management and -persistent storage at the edge. - - -Deploying DCN -------------- - -Deploying the DCN architecture requires consideration as it relates to the -undercloud, roles, networks, and availability zones configuration. This section -will document on how to approach the DCN deployment. - -The deployment will make use of specific undercloud configuration, and then -deploying multiple stacks, typically one stack per distributed location, -although this is not a strict requirement. - -At the central site, stack separation can still be used to deploy separate -stacks for control plane and compute services if compute services are desired -at the central site. See deploy_control_plane_ for more information. - -Each distributed site will be a separate stack as well. See deploy_dcn_ for -more information. - -.. _undercloud_dcn: - -Undercloud configuration -^^^^^^^^^^^^^^^^^^^^^^^^ -This section describes the steps required to configure the undercloud for DCN. - -Using direct deploy instead of iSCSI -____________________________________ - -In a default undercloud configuration, ironic deploys nodes using the ``iscsi`` -deploy interface. When using the ``iscsi`` deploy interface, the deploy ramdisk -publishes the node’s disk as an iSCSI target, and the ``ironic-conductor`` -service then copies the image to this target. - -For a DCN deployment, network latency is often a concern between the undercloud -and the distributed compute nodes. Considering the potential for latency, the -distributed compute nodes should be configured to use the ``direct`` deploy -interface in the undercloud. This process is described later in this guide -under :ref:`configure-deploy-interface`. - -When using the ``direct`` deploy interface, the deploy ramdisk will download the -image over HTTP from the undercloud's Swift service, and copy it to the node’s -disk. HTTP is more resilient when dealing with network latency than iSCSI, so -using the ``direct`` deploy interface provides a more stable node deployment -experience for distributed compute nodes. - -Configure the Swift temporary URL key -_____________________________________ - -Images used for overcloud deployment are served by Swift and are made -available to nodes using an HTTP URL, over the ``direct`` deploy -interface. To allow Swift to create temporary URLs, it must be -configured with a temporary URL key. The key value is used for -cryptographic signing and verification of the temporary URLs created -by Swift. - -The following commands demonstrate how to configure the setting. In this -example, ``uuidgen`` is used to randomly create a key value. You should choose a -unique key value that is a difficult to guess value. For example:: - - source ~/stackrc - openstack role add --user admin --project service ResellerAdmin - openstack --os-project-name service object store account set --property Temp-URL-Key=$(uuidgen | sha1sum | awk '{​print $1}') - -.. _configure-deploy-interface: - -Configure nodes to use the deploy interface -___________________________________________ - -This section describes how to configure the deploy interface for new and -existing nodes. - -For new nodes, the deploy interface can be specified directly in the JSON -structure for each node. For example, see the ``“deploy_interface”: “direct”`` -setting below:: - - { - "nodes":[ - { - "mac":[ - "bb:bb:bb:bb:bb:bb" - ], - "name":"node01", - "cpu":"4", - "memory":"6144", - "disk":"40", - "arch":"x86_64", - "pm_type":"ipmi", - "pm_user":"admin", - "pm_password":"p@55w0rd!", - "pm_addr":"192.168.24.205", - “deploy_interface”: “direct” - }, - { - "mac":[ - "cc:cc:cc:cc:cc:cc" - ], - "name":"node02", - "cpu":"4", - "memory":"6144", - "disk":"40", - "arch":"x86_64", - "pm_type":"ipmi", - "pm_user":"admin", - "pm_password":"p@55w0rd!", - "pm_addr":"192.168.24.206" - “deploy_interface”: “direct” - } - ] - } - -Existing nodes can be updated to use the ``direct`` deploy interface. For -example:: - - baremetal node set --deploy-interface direct 4b64a750-afe3-4236-88d1-7bb88c962666 - -.. _deploy_control_plane: - -Deploying the control plane -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The main overcloud control plane stack should be deployed as needed for the -desired cloud architecture layout. This stack contains nodes running the -control plane and infrastructure services needed for the cloud. For the -purposes of this documentation, this stack is referred to as the -``control-plane`` stack. - -No specific changes or deployment configuration is necessary to deploy just the -control plane services. - -It's possible to configure the ``control-plane`` stack to contain -only control plane services, and no compute or storage services. If -compute and storage services are desired at the same geographical site -as the ``control-plane`` stack, then they may be deployed in a -separate stack just like a edge site specific stack, but using nodes -at the same geographical location. In such a scenario, the stack with -compute and storage services could be called ``central`` and deploying -it in a separate stack allows for separation of management and -operations. This scenario may also be implemented with an "external" -Ceph cluster for storage as described in :doc:`ceph_external`. If -however, Glance needs to be configured with multiple stores so that -images may be served to remote sites one ``control-plane`` stack may -be used as described in :doc:`distributed_multibackend_storage`. - -It is suggested to give each stack an explicit name. For example, the control -plane stack could be called ``control-plane`` and set by passing ``--stack -control-plane`` to the ``openstack overcloud deploy`` command. - -.. _deploy_dcn: - -Deploying a DCN site -^^^^^^^^^^^^^^^^^^^^ -Once the control plane is deployed, separate deployments can be done for each -DCN site. This section will document how to perform such a deployment. - -.. _export_dcn: - -Saving configuration from the overcloud -_______________________________________ -Once the overcloud control plane has been deployed, data needs to be retrieved -from the overcloud Heat stack and plan to pass as input values into the -separate DCN deployment. - -Beginning in Wallaby with :ref:`ephemeral_heat`, the export file is created -automatically under the default working directory which defaults to -``$HOME/overcloud-deploy/``. The working directory can also be set with -the ``--working-dir`` cli argument to the ``openstack overcloud deploy`` -command. - -The export file will be automatically created as -``$HOME/overcloud-deploy//-export.yaml``. - -.. admonition:: Victoria and prior releases - - In Victoria and prior releases, the export file must be created by running - the export command. - - Extract the needed data from the control plane stack: - - .. code-block:: bash - - # Pass --help to see a full list of options - openstack overcloud export \ - --stack control-plane \ - --output-file control-plane-export.yaml - -.. note:: - - The generated ``control-plane-export.yaml`` contains sensitive security data - such as passwords and TLS certificates that are used in the overcloud - deployment. Some passwords in the file may be removed if they are not needed - by DCN. For example, the passwords for RabbitMQ, MySQL, Keystone, Nova and - Neutron should be sufficient to launch an instance. When the export common - is run, the Ceph passwords are excluded so that DCN deployments which include - Ceph do not reuse the same Ceph password and instead new ones are generated - per DCN deployment. - - Care should be taken to keep the file as secured as possible. - -.. _reuse_networks_dcn: - -Network resource configuration -______________________________ -Beginning in Wallaby, the Network V2 model is used to provision and manage the -network related resources (networks, subnets, and ports). Specifying a -parameter value for ``ManageNetworks`` or using the external resource UUID's is -deprecated in Wallaby. - -The network resources can either be provisioned and managed with the separate -``openstack overcloud network`` command or as part of the ``openstack overcloud -deploy`` command using the cli args (``--networks-file``, ``--vip-file``, -``--baremetal-deployment``). - -See :ref:`network_v2` for the full details on managing the network resources. - -With Network v2, the Heat stack no longer manages any of the network resources. -As such with using DCN with multi-stack, it is no longer necessary to first -update the central stack to provision new network resources when deploying a -new site. Instead, it is all handled as part of the network provisioning -commands or the overcloud deploy command. - -The same files used with the cli args (``--networks-file``, ``--vip-file``, -``--baremetal-deployment``), should be the same files used across all stacks in -a DCN deployment. - -.. admonition:: Victoria and prior releases - - When deploying separate stacks it may be necessary to reuse networks, subnets, - and VIP resources between stacks if desired. Only a single Heat stack can own a - resource and be responsible for its creation and deletion, however the - resources can be reused in other stacks. - - **ManageNetworks** - - The ``ManageNetworks`` parameter can be set to ``false`` so that the same - ``network_data.yaml`` file can be used across all the stacks. When - ``ManageNetworks`` is set to false, ports will be created for the nodes in the - separate stacks on the existing networks that were already created in the - ``control-plane`` stack. - - When ``ManageNetworks`` is used, it's a global option for the whole stack and - applies to all of the network, subnet, and segment resources. - - To use ``ManageNetworks``, create an environment file which sets the parameter - value to ``false``:: - - parameter_defaults: - ManageNetworks: false - - When using ``ManageNetworks``, all network resources (except for ports) - are managed in the central stack. When the central stack is deployed, - ``ManageNetworks`` should be left unset (or set to True). When a child stack - is deployed, it is then set to false so that the child stack does not attempt - to manage the already existing network resources. - - Additionally, when adding new network resources, such as entire new leaves when - deploying spine/leaf, the central stack must first be updated with the new - ``network_data.yaml`` that contains the new leaf definitions. Even though the - central stack is not directly using the new network resources, it still is - responsible for creating and managing them. Once the new network resources are - made available in the central stack, a child stack (such as a new edge site) - could be deployed using the new networks. - - **External UUID's** - - If more fine grained control over which networks should be reused from the - ``control-plane`` stack is needed, then various ``external_resource_*`` fields - can be added to ``network_data.yaml``. When these fields are present on - network, subnet, segment, or vip resources, Heat will mark the resources in the - separate stack as being externally managed, and it won't try to any create, - update, or delete operations on those resources. - - ``ManageNetworks`` should not be set when when the ``external_resource_*`` - fields are used. - - The external resource fields that can be used in ``network_data.yaml`` are as - follows:: - - external_resource_network_id: Existing Network UUID - external_resource_subnet_id: Existing Subnet UUID - external_resource_segment_id: Existing Segment UUID - external_resource_vip_id: Existing VIP UUID - - These fields can be set on each network definition in the - `network_data.yaml`` file used for the deployment of the separate stack. - - Not all networks need to be reused or shared across stacks. The - `external_resource_*` fields can be set for only the networks that are - meant to be shared, while the other networks can be newly created and managed. - - For example, to reuse the ``internal_api`` network from the control plane stack - in a separate stack, run the following commands to show the UUIDs for the - related network resources: - - .. code-block:: bash - - openstack network show internal_api -c id -f value - openstack subnet show internal_api_subnet -c id -f value - openstack port show internal_api_virtual_ip -c id -f value - - Save the values shown in the output of the above commands and add them to the - network definition for the ``internal_api`` network in the - ``network_data.yaml`` file for the separate stack. An example network - definition would look like: - - .. code-block:: bash - - - name: InternalApi - external_resource_network_id: 93861871-7814-4dbc-9e6c-7f51496b43af - external_resource_subnet_id: c85c8670-51c1-4b17-a580-1cfb4344de27 - external_resource_vip_id: 8bb9d96f-72bf-4964-a05c-5d3fed203eb7 - name_lower: internal_api - vip: true - ip_subnet: '172.16.2.0/24' - allocation_pools: [{'start': '172.16.2.4', 'end': '172.16.2.250'}] - ipv6_subnet: 'fd00:fd00:fd00:2000::/64' - ipv6_allocation_pools: [{'start': 'fd00:fd00:fd00:2000::10', 'end': 'fd00:fd00:fd00:2000:ffff:ffff:ffff:fffe'}] - mtu: 1400 - - .. note:: - - When *not* sharing networks between stacks, each network defined in - ``network_data.yaml`` must have a unique name across all deployed stacks. - This requirement is necessary since regardless of the stack, all networks are - created in the same tenant in Neutron on the undercloud. - - For example, the network name ``internal_api`` can't be reused between - stacks, unless the intent is to share the network between the stacks. - The network would need to be given a different ``name`` and - ``name_lower`` property such as ``InternalApiCompute0`` and - ``internal_api_compute_0``. - - If separate storage and storage management networks are used with - multiple Ceph clusters and Glance servers per site, then a routed - storage network should be shared between sites for image transfer. - The storage management network, which Ceph uses to keep OSDs balanced, - does not need to be shared between sites. - -DCN related roles -_________________ -Different roles are provided within ``tripleo-heat-templates``, depending on the -configuration and desired services to be deployed at each distributed site. - -The default compute role at ``roles/Compute.yaml`` can be used if that is -sufficient for the use case. - -Three additional roles are also available for deploying compute nodes -with co-located persistent storage at the distributed site. - -The first is ``roles/DistributedCompute.yaml``. This role includes the default -compute services, but also includes the cinder volume service. The cinder -volume service would be configured to talk to storage that is local to the -distributed site for persistent storage. - -The second is ``roles/DistributedComputeHCI.yaml``. This role includes the -default computes services, the cinder volume service, and also includes the -Ceph Mon, Mgr, and OSD services for deploying a Ceph cluster at the -distributed site. Using this role, both the compute services and Ceph -services are deployed on the same nodes, enabling a hyperconverged -infrastructure for persistent storage at the distributed site. When -Ceph is used, there must be a minimum of three `DistributedComputeHCI` -nodes. This role also includes a Glance server, provided by the -`GlanceApiEdge` service with in the `DistributedComputeHCI` role. The -Nova compute service of each node in the `DistributedComputeHCI` role -is configured by default to use its local Glance server. - -The third is ``roles/DistributedComputeHCIScaleOut.yaml``. This role is -like the DistributedComputeHCI role but does not run the Ceph Mon and -Mgr service. It offers the Ceph OSD service however, so it may be used -to scale up storage and compute services at each DCN site after the -minimum of three DistributedComputeHCI nodes have been deployed. There -is no `GlanceApiEdge` service in the `DistributedComputeHCIScaleOut` -role but in its place the Nova compute service of the role is -configured by default to connect to a local `HaProxyEdge` service -which in turn proxies image requests to the Glance servers running on -the `DistributedComputeHCI` roles. - -For information on configuring the distributed Glance services see -:doc:`distributed_multibackend_storage`. - -Configuring Availability Zones (AZ) -___________________________________ -Each edge site must be configured as a separate availability zone (AZ). When -you deploy instances to this AZ, you can expect it to run on the remote Compute -node. In addition, the central site must also be within a specific AZ (or -multiple AZs), rather than the default AZ. - -When also deploying persistent storage at each site, the storage backend -availability zone must match the compute availability zone name. - -AZs are configured differently for compute (Nova) and storage (Cinder). -Configuring AZs are documented in the next sections. - -Configuring AZs for Nova (compute) -################################## -The Nova AZ configuration for compute nodes in the stack can be set with the -``NovaComputeAvailabilityZone`` parameter during the deployment. - -The value of the parameter is the name of the AZ where compute nodes in that -stack will be added. - -For example, the following environment file would be used to add compute nodes -in the ``edge-0`` stack to the ``edge-0`` AZ:: - - parameter_defaults: - NovaComputeAvailabilityZone: edge-0 - -Additionally, the ``OS::TripleO::NovaAZConfig`` service must be enabled by -including the following ``resource_registry`` mapping:: - - resource_registry: - OS::TripleO::Services::NovaAZConfig: tripleo-heat-templates/deployment/nova/nova-az-config.yaml - -Or, the following environment can be included which sets the above mapping:: - - environments/nova-az-config.yaml - -It's also possible to configure the AZ for a compute node by adding it to a -host aggregate after the deployment is completed. The following commands show -creating a host aggregate, an associated AZ, and adding compute nodes to a -``edge-0`` AZ:: - - openstack aggregate create edge-0 --zone edge-0 - openstack aggregate add host edge-0 hostA - openstack aggregate add host edge-0 hostB - -.. note:: - - The above commands are run against the deployed overcloud, not the - undercloud. Make sure the correct rc file for the control plane stack of - the overcloud is sourced for the shell before running the commands. - - -Configuring AZs for Cinder (storage) -#################################### -Each site that uses consistent storage is configured with its own cinder -backend(s). Cinder backends are not shared between sites. Each backend is also -configured with an AZ that should match the configured Nova AZ for the compute -nodes that will make use of the storage provided by that backend. - -The ``CinderStorageAvailabilityZone`` parameter can be used to configure the AZ -for a given backend. Parameters are also available for different backend types, -such as ``CinderISCSIAvailabilityZone``, ``CinderRbdAvailabilityZone``, and -``CinderNfsAvailabilityZone``. When set, the backend type specific parameter -will take precedence over ``CinderStorageAvailabilityZone``. - -This example shows an environment file setting the AZ for the backend in the -``central`` site:: - - parameter_defaults: - CinderStorageAvailabilityZone: central - -This example shows an environment file setting the AZ for the backend in the -``edge0`` site:: - - parameter_defaults: - CinderStorageAvailabilityZone: edge0 - -Deploying Ceph with HCI -####################### -When deploying Ceph while using the ``DistributedComputeHCI`` and -``DistributedComputeHCIScaleOut`` roles, the following environment file -should be used to enable Ceph:: - - environments/ceph-ansible/ceph-ansible.yaml - -Sample environments -################### - -There are sample environments that are included in ``tripleo-heat-templates`` -for setting many of the parameter values and ``resource_registry`` mappings. These -environments are located within the ``tripleo-heat-templates`` directory at:: - - environments/dcn.yaml - environments/dcn-storage.yaml - -The environments are not all-inclusive and do not set all needed values and -mappings, but can be used as a guide when deploying DCN. - -Example: DCN deployment with pre-provisioned nodes, shared networks, and multiple stacks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This example shows the deployment commands and associated environment files -of a example of a DCN deployment. The deployment uses pre-provisioned nodes. -All networks are shared between the multiple stacks. The example illustrates -the deployment workflow of deploying multiple stacks for a real -world DCN deployment. - -Four stacks are deployed: - -control-plane - All control plane services. Shares the same geographical location as the - central stack. -central - Compute, Cinder, Ceph deployment. Shares the same geographical location as - the control-plane stack. -edge0 - Compute, Cinder, Ceph deployment. Separate geographical location from any - other stack. -edge1 - Compute, Cinder, Ceph deployment. Separate geographical location from any - other stack. - -Notice how the ``central`` stack will contain only compute and storage -services. It is really just another instance of an edge site, but just happens -to be deployed at the same geographical location as the ``control-plane`` -stack. ``control-plane`` and ``central`` could instead be deployed in the same -stack, however for easier manageability and separation, they are deployed in -separate stacks. - -This example also uses pre-provisioned nodes as documented at -:ref:`deployed_server`. - -Undercloud -__________ -Since this example uses pre-provisioned nodes, no additional undercloud -configuration is needed. The steps in undercloud_dcn_ are not specifically -applicable when using pre-provisioned nodes. - -Deploy the control-plane stack -______________________________ -The ``control-plane`` stack is deployed with the following command:: - - openstack overcloud deploy \ - --verbose \ - --stack control-plane \ - --disable-validations \ - --templates /home/centos/tripleo-heat-templates \ - -r roles-data.yaml \ - -e role-counts.yaml \ - --networks-file network_data_v2.yaml \ - --vip-file vip_data.yaml \ - --baremetal-deployment baremetal_deployment.yaml \ - -e /home/centos/tripleo-heat-templates/environments/docker-ha.yaml \ - -e /home/centos/tripleo/environments/containers-prepare-parameter.yaml \ - -e /home/centos/tripleo-heat-templates/environments/deployed-server-environment.yaml \ - -e /home/centos/tripleo-heat-templates/environments/deployed-server-bootstrap-environment-centos.yaml \ - -e /home/centos/tripleo-heat-templates/environments/network-isolation.yaml \ - -e /home/centos/tripleo-heat-templates/environments/net-multiple-nics.yaml \ - -e hostnamemap.yaml \ - -e network-environment.yaml \ - -e deployed-server-port-map.yaml \ - -e az.yaml - - -Many of the specified environments and options are not specific to DCN. The -ones that relate to DCN are as follows. - -``--stack control-plane`` sets the stack name to ``control-plane``. - -The ``roles-data.yaml`` file contains only the Controller role from the -templates directory at ``roles/Controller.yaml``. - -``role-counts.yaml`` contains:: - - parameter_defaults: - ControllerCount: 1 - -.. warning:: - Only one `Controller` node is deployed for example purposes but - three are recommended in order to have a highly available control - plane. - -``network_data_v2.yaml``, ``vip_data.yaml``, and ``baremetal_deployment.yaml`` -contain the definitions to manage the network resources. See :ref:`network_v2` -for creating these files. - -``az.yaml`` contains:: - - parameter_defaults: - CinderStorageAvailabilityZone: 'central' - NovaComputeAvailabilityZone: 'central' - -When the deployment completes, a single stack is deployed:: - - (undercloud) [centos@scale ~]$ openstack stack list - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - | 5f172fd8-97a5-4b9b-8d4c-2c931fd048e7 | control-plane | c117a9b489384603b2f45185215e9728 | CREATE_COMPLETE | 2019-03-13T18:51:08Z | 2019-03-13T19:44:27Z | - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - -.. _example_export_dcn: - -Exported configuration from the ``control-plane`` stack -_______________________________________________________ -As documented in export_dcn_, the export file is created automatically by the -``openstack overcloud deploy`` command. - -.. admonition:: Victoria and prior releases - - For Victoria and prior releases, the following command must be run to export - the configuration data from the ``control-plane`` stack:: - - openstack overcloud export \ - --stack control-plane \ - --output-file control-plane-export.yaml - -Deploy the central stack -________________________ -The ``central`` stack deploys compute and storage services to be co-located -at the same site where the ``control-plane`` stack was deployed. - -The ``central`` stack is deployed with the following command:: - - openstack overcloud deploy \ - --verbose \ - --stack central \ - --templates /home/centos/tripleo-heat-templates \ - -r distributed-roles-data.yaml \ - -n site_network_data.yaml \ - --disable-validations \ - --networks-file network_data_v2.yaml \ - --vip-file vip_data.yaml \ - --baremetal-deployment baremetal_deployment.yaml \ - -e /home/centos/tripleo-heat-templates/environments/docker-ha.yaml \ - -e /home/centos/tripleo/environments/containers-prepare-parameter.yaml \ - -e /home/centos/tripleo-heat-templates/environments/deployed-server-environment.yaml \ - -e /home/centos/tripleo-heat-templates/environments/deployed-server-bootstrap-environment-centos.yaml \ - -e /home/centos/tripleo-heat-templates/environments/network-isolation.yaml \ - -e /home/centos/tripleo-heat-templates/environments/net-multiple-nics.yaml \ - -e /home/centos/tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml \ - -e /home/centos/tripleo-heat-templates/environments/low-memory-usage.yaml \ - -e role-counts.yaml \ - -e hostnamemap.yaml \ - -e network-environment.yaml \ - -e deployed-server-port-map.yaml \ - -e ceph-environment.yaml \ - -e az.yaml \ - -e /home/centos/overcloud-deploy/control-plane/control-plane-export.yaml - -``--stack central`` sets the stack name to ``central``. - -``distributed-roles-data.yaml`` contains a single role called ``DistributedComputeHCI`` -which contains Nova, Cinder, and Ceph services. The example role is from the -templates directory at ``roles/DistributedComputeHCI.yaml``. - -``role-counts.yaml`` contains:: - - parameter_defaults: - DistributedComputeHCICount: 1 - -.. warning:: - Only one `DistributedComputeHCI` is deployed for example - purposes but three are recommended in order to have a highly - available Ceph cluster. If more than three such nodes of that role - are necessary for additional compute and storage resources, then - use additional nodes from the `DistributedComputeHCIScaleOut` role. - -``network_data_v2.yaml``, ``vip_data.yaml``, and ``baremetal_deployment.yaml`` -are the same files used with the ``control-plane`` stack. - -``az.yaml`` contains the same content as was used in the ``control-plane`` -stack:: - - parameter_defaults: - CinderStorageAvailabilityZone: 'central' - NovaComputeAvailabilityZone: 'central' - -The ``control-plane-export.yaml`` file was generated by the ``openstack -overcloud deploy`` command when deploying the ``control-plane`` stack or from -the command from example_export_dcn_ (Victoria or prior releases). - -When the deployment completes, 2 stacks are deployed:: - - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - | 0bdade63-4645-4490-a540-24be48527e10 | central | c117a9b489384603b2f45185215e9728 | CREATE_COMPLETE | 2019-03-25T21:35:49Z | None | - | 5f172fd8-97a5-4b9b-8d4c-2c931fd048e7 | control-plane | c117a9b489384603b2f45185215e9728 | CREATE_COMPLETE | 2019-03-13T18:51:08Z | None | - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - -The AZ and aggregate configuration for Nova can be checked and verified with -these commands. Note that the ``rc`` file for the ``control-plane`` stack must be -sourced as these commands talk to overcloud APIs:: - - (undercloud) [centos@scale ~]$ source control-planerc - (control-plane) [centos@scale ~]$ openstack aggregate list - +----+---------+-------------------+ - | ID | Name | Availability Zone | - +----+---------+-------------------+ - | 9 | central | central | - +----+---------+-------------------+ - (control-plane) [centos@scale ~]$ openstack aggregate show central - +-------------------+----------------------------+ - | Field | Value | - +-------------------+----------------------------+ - | availability_zone | central | - | created_at | 2019-03-25T22:23:25.000000 | - | deleted | False | - | deleted_at | None | - | hosts | [u'compute-0.localdomain'] | - | id | 9 | - | name | central | - | properties | | - | updated_at | None | - +-------------------+----------------------------+ - (control-plane) [centos@scale ~]$ nova availability-zone-list - +----------------------------+----------------------------------------+ - | Name | Status | - +----------------------------+----------------------------------------+ - | internal | available | - | |- openstack-0.localdomain | | - | | |- nova-conductor | enabled :-) 2019-03-27T18:21:29.000000 | - | | |- nova-scheduler | enabled :-) 2019-03-27T18:21:31.000000 | - | | |- nova-consoleauth | enabled :-) 2019-03-27T18:21:34.000000 | - | central | available | - | |- compute-0.localdomain | | - | | |- nova-compute | enabled :-) 2019-03-27T18:21:32.000000 | - +----------------------------+----------------------------------------+ - (control-plane) [centos@scale ~]$ openstack compute service list - +----+------------------+-------------------------+----------+---------+-------+----------------------------+ - | ID | Binary | Host | Zone | Status | State | Updated At | - +----+------------------+-------------------------+----------+---------+-------+----------------------------+ - | 1 | nova-scheduler | openstack-0.localdomain | internal | enabled | up | 2019-03-27T18:23:31.000000 | - | 2 | nova-consoleauth | openstack-0.localdomain | internal | enabled | up | 2019-03-27T18:23:34.000000 | - | 3 | nova-conductor | openstack-0.localdomain | internal | enabled | up | 2019-03-27T18:23:29.000000 | - | 7 | nova-compute | compute-0.localdomain | central | enabled | up | 2019-03-27T18:23:32.000000 | - +----+------------------+-------------------------+----------+---------+-------+----------------------------+ - - -Note how a new aggregate and AZ called ``central`` has been automatically -created. The newly deployed ``nova-compute`` service from the ``compute-0`` host in -the ``central`` stack is automatically added to this aggregate and zone. - -The AZ configuration for Cinder can be checked and verified with these -commands:: - - (control-plane) [centos@scale ~]$ openstack volume service list - +------------------+-------------------------+---------+---------+-------+----------------------------+ - | Binary | Host | Zone | Status | State | Updated At | - +------------------+-------------------------+---------+---------+-------+----------------------------+ - | cinder-scheduler | openstack-0.rdocloud | central | enabled | up | 2019-03-27T21:17:44.000000 | - | cinder-volume | compute-0@tripleo_ceph | central | enabled | up | 2019-03-27T21:17:44.000000 | - +------------------+-------------------------+---------+---------+-------+----------------------------+ - -The Cinder AZ configuration shows the ceph backend in the ``central`` zone -which was deployed by the ``central`` stack. - -Deploy the edge-0 and edge-1 stacks -___________________________________ -Now that the ``control-plane`` and ``central`` stacks are deployed, we'll deploy an -``edge-0`` and ``edge-1`` stack. These stacks are similar to the ``central`` stack in that they -deploy the same roles with the same services. It differs in that the nodes -will be managed in a separate stack and it illustrates the separation of -deployment and management between edge sites. - -The AZs will be configured differently in these stacks as the nova and -cinder services will belong to an AZ unique to each the site. - -The ``edge-0`` stack is deployed with the following command:: - - openstack overcloud deploy \ - --verbose \ - --stack edge-0 \ - --templates /home/centos/tripleo-heat-templates \ - -r distributed-roles-data.yaml \ - -n site_network_data.yaml \ - --disable-validations \ - --networks-file network_data_v2.yaml \ - --vip-file vip_data.yaml \ - --baremetal-deployment baremetal_deployment.yaml \ - -e /home/centos/tripleo-heat-templates/environments/docker-ha.yaml \ - -e /home/centos/tripleo/environments/containers-prepare-parameter.yaml \ - -e /home/centos/tripleo-heat-templates/environments/deployed-server-environment.yaml \ - -e /home/centos/tripleo-heat-templates/environments/deployed-server-bootstrap-environment-centos.yaml \ - -e /home/centos/tripleo-heat-templates/environments/network-isolation.yaml \ - -e /home/centos/tripleo-heat-templates/environments/net-multiple-nics.yaml \ - -e /home/centos/tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml \ - -e /home/centos/tripleo-heat-templates/environments/low-memory-usage.yaml \ - -e role-counts.yaml \ - -e hostnamemap.yaml \ - -e network-environment.yaml \ - -e deployed-server-port-map.yaml \ - -e ceph-environment.yaml \ - -e az.yaml \ - -e /home/centos/overcloud-deploy/control-plane/control-plane-export.yaml - -``--stack edge-0`` sets the stack name to ``edge-0``. - -``distributed-roles-data.yaml`` contains a single role called ``DistributedComputeHCI`` -which contains Nova, Cinder, and Ceph services. The example role is from the -templates directory at ``roles/DistributedComputeHCI.yaml``. This file is the -same as was used in the ``central`` stack. - -``role-counts.yaml`` contains:: - - parameter_defaults: - DistributedComputeHCICount: 1 - -.. warning:: - Only one `DistributedComputeHCI` is deployed for example - purposes but three are recommended in order to have a highly - available Ceph cluster. If more than three such nodes of that role - are necessary for additional compute and storage resources, then - use additional nodes from the `DistributedComputeHCIScaleOut` role. - -``az.yaml`` contains specific content for the ``edge-0`` stack:: - - parameter_defaults: - CinderStorageAvailabilityZone: 'edge-0' - NovaComputeAvailabilityZone: 'edge-0' - -The ``CinderStorageAvailabilityZone`` and ``NovaDefaultAvailabilityZone`` -parameters are set to ``edge-0`` to match the stack name. - -The ``control-plane-export.yaml`` file was generated by the ``openstack -overcloud deploy`` command when deploying the ``control-plane`` stack or from -the command from example_export_dcn_ (Victoria or prior releases). - -``network_data_v2.yaml``, ``vip_data.yaml``, and ``baremetal_deployment.yaml`` -are the same files used with the ``control-plane`` stack. However, the files -will need to be modified if the ``edge-0`` or ``edge-1`` stacks require -additional provisioning of network resources for new subnets. Update the files -as needed and continue to use the same files for all ``overcloud deploy`` -commands across all stacks. - -The ``edge-1`` stack is deployed with a similar command. The stack is given a -different name with ``--stack edge-1`` and ``az.yaml`` contains:: - - parameter_defaults: - CinderStorageAvailabilityZone: 'edge-1' - NovaComputeAvailabilityZone: 'edge-1' - -When the deployment completes, there are now 4 stacks are deployed:: - - (undercloud) [centos@scale ~]$ openstack stack list - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - | ID | Stack Name | Project | Stack Status | Creation Time | Updated Time | - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - | 203dc480-3b0b-4cd9-9f70-f79898461c17 | edge-0 | c117a9b489384603b2f45185215e9728 | CREATE_COMPLETE | 2019-03-29T17:30:15Z | None | - | 0bdade63-4645-4490-a540-24be48527e10 | central | c117a9b489384603b2f45185215e9728 | CREATE_COMPLETE | 2019-03-25T21:35:49Z | None | - | 5f172fd8-97a5-4b9b-8d4c-2c931fd048e7 | control-plane | c117a9b489384603b2f45185215e9728 | UPDATE_COMPLETE | 2019-03-13T18:51:08Z | 2019-03-13T19:44:27Z | - +--------------------------------------+---------------+----------------------------------+-----------------+----------------------+----------------------+ - -Repeating the same commands that were run after the ``central`` stack was -deployed to show the AZ configuration, shows that the new AZs for ``edge-0`` -and ``edge-1`` are created and available:: - - (undercloud) [centos@scale ~]$ source control-planerc - (control-plane) [centos@scale ~]$ openstack aggregate list - +----+---------+-------------------+ - | ID | Name | Availability Zone | - +----+---------+-------------------+ - | 9 | central | central | - | 10 | edge-0 | edge-0 | - | 11 | edge-1 | edge-1 | - +----+---------+-------------------+ - (control-plane) [centos@scale ~]$ openstack aggregate show edge-0 - +-------------------+----------------------------+ - | Field | Value | - +-------------------+----------------------------+ - | availability_zone | edge-0 | - | created_at | 2019-03-29T19:01:59.000000 | - | deleted | False | - | deleted_at | None | - | hosts | [u'compute-1.localdomain'] | - | id | 10 | - | name | edge-0 | - | properties | | - | updated_at | None | - +-------------------+----------------------------+ - (control-plane) [centos@scale ~]$ nova availability-zone-list - +----------------------------+----------------------------------------+ - | Name | Status | - +----------------------------+----------------------------------------+ - | internal | available | - | |- openstack-0.localdomain | | - | | |- nova-conductor | enabled :-) 2019-04-01T17:38:06.000000 | - | | |- nova-scheduler | enabled :-) 2019-04-01T17:38:13.000000 | - | | |- nova-consoleauth | enabled :-) 2019-04-01T17:38:09.000000 | - | central | available | - | |- compute-0.localdomain | | - | | |- nova-compute | enabled :-) 2019-04-01T17:38:07.000000 | - | edge-0 | available | - | |- compute-1.localdomain | | - | | |- nova-compute | enabled :-) 2019-04-01T17:38:07.000000 | - | edge-1 | available | - | |- compute-2.localdomain | | - | | |- nova-compute | enabled :-) 2019-04-01T17:38:06.000000 | - +----------------------------+----------------------------------------+ - (control-plane) [centos@scale ~]$ openstack compute service list - +----+------------------+-------------------------+----------+---------+-------+----------------------------+ - | ID | Binary | Host | Zone | Status | State | Updated At | - +----+------------------+-------------------------+----------+---------+-------+----------------------------+ - | 1 | nova-scheduler | openstack-0.localdomain | internal | enabled | up | 2019-04-01T17:38:23.000000 | - | 2 | nova-consoleauth | openstack-0.localdomain | internal | enabled | up | 2019-04-01T17:38:19.000000 | - | 3 | nova-conductor | openstack-0.localdomain | internal | enabled | up | 2019-04-01T17:38:26.000000 | - | 7 | nova-compute | compute-0.localdomain | central | enabled | up | 2019-04-01T17:38:27.000000 | - | 16 | nova-compute | compute-1.localdomain | edge-0 | enabled | up | 2019-04-01T17:38:27.000000 | - | 17 | nova-compute | compute-2.localdomain | edge-1 | enabled | up | 2019-04-01T17:38:26.000000 | - +----+------------------+-------------------------+----------+---------+-------+----------------------------+ - (control-plane) [centos@scale ~]$ openstack volume service list - +------------------+-------------------------+---------+---------+-------+----------------------------+ - | Binary | Host | Zone | Status | State | Updated At | - +------------------+-------------------------+---------+---------+-------+----------------------------+ - | cinder-scheduler | openstack-0.rdocloud | central | enabled | up | 2019-04-01T17:38:27.000000 | - | cinder-volume | hostgroup@tripleo_iscsi | central | enabled | up | 2019-04-01T17:38:27.000000 | - | cinder-volume | compute-0@tripleo_ceph | central | enabled | up | 2019-04-01T17:38:30.000000 | - | cinder-volume | compute-1@tripleo_ceph | edge-0 | enabled | up | 2019-04-01T17:38:32.000000 | - | cinder-volume | compute-2@tripleo_ceph | edge-1 | enabled | up | 2019-04-01T17:38:28.000000 | - +------------------+-------------------------+---------+---------+-------+----------------------------+ - (control-plane) [centos@scale ~]$ - -For information on extending this example with distributed image -management for image sharing between DCN site Ceph clusters see -:doc:`distributed_multibackend_storage`. - -Updating DCN ------------- - -Each stack in a multi-stack DCN deployment must be updated to perform a full -minor update across the entire deployment. - -The minor update procedure as detailed in :ref:`package_update` be run for -each stack in the deployment. - -The control-plane or central stack should be updated first by completing all -the steps from the minor update procedure. - -.. admonition:: Victoria and prior releases - - Once the central stack is updated, re-run the export command from - :ref:`export_dcn` to recreate the required input file for each separate - DCN stack. - - .. note:: - - When re-running the export command, save the generated file in a new - directory so that the previous version is not overwritten. In the event - that a separate DCN stack needs a stack update operation performed prior to - the minor update procedure, the previous version of the exported file - should be used. - -Each separate DCN stack can then be updated individually as required. There is -no requirement as to the order of which DCN stack is updated first. - -Running Ansible across multiple DCN stacks ------------------------------------------- - -.. warning:: - This currently is only supported in Train or newer versions. - -Each DCN stack should usually be updated individually. However if you -need to run Ansible on nodes deployed from more than one DCN stack, -then the ``tripleo-ansible-inventory`` command's ``--stack`` option -supports being passed more than one stack. If more than one stack is -passed, then a single merged inventory will be generated which -contains the union of the nodes in those stacks. For example, if you -were to run the following:: - - tripleo-ansible-inventory --static-yaml-inventory inventory.yaml --stack central,edge0 - -then you could use the generated inventory.yaml as follows:: - - (undercloud) [stack@undercloud ~]$ ansible -i inventory.yaml -m ping central - central-controller-0 | SUCCESS => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/bin/python" - }, - "changed": false, - "ping": "pong" - } - (undercloud) [stack@undercloud ~]$ ansible -i inventory.yaml -m ping edge0 - edge0-distributedcomputehci-0 | SUCCESS => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/bin/python" - }, - "changed": false, - "ping": "pong" - } - (undercloud) [stack@undercloud ~]$ ansible -i inventory.yaml -m ping all - undercloud | SUCCESS => { - "changed": false, - "ping": "pong" - } - edge0-distributedcomputehci-0 | SUCCESS => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/bin/python" - }, - "changed": false, - "ping": "pong" - } - central-controller-0 | SUCCESS => { - "ansible_facts": { - "discovered_interpreter_python": "/usr/bin/python" - }, - "changed": false, - "ping": "pong" - } - (undercloud) [stack@undercloud ~]$ - -When multiple stacks are passed as input a host group is created -after each stack which refers to all of the nodes in that stack. -In the example above, edge0 has only one node from the -DistributedComputeHci role and central has only one node from the -Controller role. - -The inventory will also have a host group created for every item in -the cross product of stacks and roles. For example, -central_Controller, edge0_Compute, edge1_Compute, etc. This is done -in order to avoid name collisions, e.g. Compute would refer to all -nodes in the Compute role, but when there's more than one stack -edge0_Compute and edge1_Compute refer to different Compute nodes -based on the stack from which they were deployed. diff --git a/deploy-guide/source/features/distributed_multibackend_storage.rst b/deploy-guide/source/features/distributed_multibackend_storage.rst deleted file mode 100644 index 0334a80d..00000000 --- a/deploy-guide/source/features/distributed_multibackend_storage.rst +++ /dev/null @@ -1,1331 +0,0 @@ -Distributed Multibackend Storage -================================ - -|project| is able to extend :doc:`distributed_compute_node` to include -distributed image management and persistent storage with the benefits -of using OpenStack and Ceph. - -Features --------- - -This Distributed Multibackend Storage design extends the architecture -described in :doc:`distributed_compute_node` to support the following -workflow. - -- Upload an image to the Central site using `glance image-create` - command with `--file` and `--store central` parameters. -- Move a copy of the same image to DCN sites using a command like - `glance image-import --stores dcn1,dcn2 --import-method - copy-image`. -- The image's unique ID will be shared consistently across sites -- The image may be copy-on-write booted on any DCN site as the RBD - pools for Glance and Nova will use the same local Ceph cluster. -- If the Glance server at each DCN site was configured with write - access to the Central Ceph cluster as an additional store, then an - image generated from making a snapshot of an instance running at a - DCN site may be copied back to the central site and then copied to - additional DCN sites. -- The same Ceph cluster per site may also be used by Cinder as an RBD - store to offer local volumes in active/active mode. - -In the above workflow the only time RBD traffic crosses the WAN is -when an image is imported or copied between sites. Otherwise all RBD -traffic is local to each site for fast COW boots, and performant IO -to the local Cinder and Nova Ceph pools. - -Architecture ------------- - -The architecture to support the above features has the following -properties. - -- A separate Ceph cluster at each availability zone or geographic - location -- Glance servers at each availability zone or geographic location -- The containers implementing the Ceph clusters may be collocated on - the same hardware providing compute services, i.e. the compute nodes - may be hyper-converged, though it is not necessary that they be - hyper-converged -- It is not necessary to deploy Glance and Ceph at each DCN site, if - storage services are not needed at that DCN site - -In this scenario the Glance service at the central site is configured -with multiple stores such that. - -- The central Glance server's default store is the central Ceph - cluster using the RBD driver -- The central Glance server has additional RBD stores; one per DCN - site running Ceph - -Similarly the Glance server at each DCN site is configured with -multiple stores such that. - -- Each DCN Glance server's default store is the DCN Ceph - cluster that is in the same geographic location. -- Each DCN Glance server is configured with one additional store which - is the Central RBD Ceph cluster. - -Though there are Glance services distributed to multiple sites, the -Glance client for overcloud users should use the public Glance -endpoints at the central site. These endpoints may be determined by -querying the Keystone service, which only runs at the central site, -with `openstack endpoint list`. Ideally all images should reside in -the central Glance and be copied to DCN sites before instances of -those images are booted on DCN sites. If an image is not copied to a -DCN site before it is booted, then the image will be streamed to the -DCN site and then the image will boot as an instance. This happens -because Glance at the DCN site has access to the images store at the -Central ceph cluster. Though the booting of the image will take time -because it has not been copied in advance, this is still preferable -to failing to boot the image. - -Stacks ------- - -In the example deployment three stacks are deployed: - -control-plane - All control plane services including Glance. Includes a Ceph - cluster named central which is hypercoverged with compute nodes and - runs Cinder in active/passive mode managed by pacemaker. -dcn0 - Runs Compute, Glance and Ceph services. The Cinder volume service - is configured in active/active mode and not managed by pacemaker. - The Compute and Cinder services are deployed in a separate - availability zone and may also be in a separate geographic - location. -dcn1 - Deploys the same services as dcn0 but in a different availability - zone and also in a separate geographic location. - -Note how the above differs from the :doc:`distributed_compute_node` -example which splits services at the primary location into two stacks -called `control-plane` and `central`. This example combines the two -into one stack. - -During the deployment steps all templates used to deploy the -control-plane stack will be kept on the undercloud in -`/home/stack/control-plane`, all templates used to deploy the dcn0 -stack will be kept on the undercloud in `/home/stack/dcn0` and dcn1 -will follow the same pattern as dcn0. The sites dcn2, dcn3 and so on -may be created, based on need, by following the same pattern. - -Ceph Deployment Types ---------------------- - -|project| supports two types of Ceph deployments. An "internal" Ceph -deployment is one where a Ceph cluster is deployed as part of the -overcloud as described in :doc:`deployed_ceph`. An "external" Ceph -deployment is one where a Ceph cluster already exists and an overcloud -is configured to be a client of that Ceph cluster as described in -:doc:`ceph_external`. Ceph external deployments have special meaning -to |project| in the following ways: - -- The Ceph cluster was not deployed by |project| -- The OpenStack Ceph client is configured by |project| - -The deployment example in this document uses the "external" term to -focus on the second of the above because the client configuration is -important. This example differs from the first of the above because -Ceph was deployed by |project|, however relative to other stacks, it -is an external Ceph cluster because, for the stacks which configure -the Ceph clients, it doesn't matter that the Ceph server came from a -different stack. In this sense, the example in this document uses both -types of deployments as described in the following sequence: - -- The central site deploys an internal Ceph cluster called central - with a cephx keyring which may be used to access the central ceph - pools. -- The dcn0 site deploys an internal Ceph cluster called dcn0 with a - cephx keyring which may be used to access the dcn0 Ceph pools. - During the same deployment the dcn0 site is also configured - with the cephx keyring from the previous step so that it is also a - client of the external Ceph cluster, relative to dcn0, called - central from the previous step. The `GlanceMultistoreConfig` - parameter is also used during this step so that Glance will use the - dcn0 Ceph cluster as an RBD store by default but it will also be - configured to use the central Ceph cluster as an additional RBD - backend. -- The dcn1 site is deployed the same way as the dcn0 site and the - pattern may be continued for as many DCN sites as necessary. -- The central site is then updated so that in addition to having an - internal Ceph deployment for the cluster called central, it is also - configured with multiple external ceph clusters, relative to the - central site, for each DCN site. This is accomplished by passing - the cephx keys which were created during each DCN site deployment - as input to the stack update. During the stack update the - `GlanceMultistoreConfig` parameter is added so that Glance will - continue to use the central Ceph cluster as an RBD store by - default but it will also be configured to use each DCN Ceph cluster - as an additional RBD backend. - -The above sequence is possible by using the `CephExtraKeys` parameter -as described in :doc:`deployed_ceph` and the `CephExternalMultiConfig` -parameter described in :doc:`ceph_external`. - -Decide which cephx key will be used to access remote Ceph clusters -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When |project| deploys Ceph it creates a cephx key called openstack and -configures Cinder, Glance, and Nova to use this key. When |project| creates -multiple Ceph clusters, as described in this document, a unique version of -this key is automatically created for each site, -e.g. central.client.openstack.keyring, dcn0.client.openstack.keyring, -and dcn1.client.openstack.keyring. Each site also needs a cephx key to -access the Ceph cluster at another site, and there are two options. - -1. Each site shares a copy of its openstack cephx key with the other site. -2. Each site shares a separately created external cephx key with the other - site, and does not share its own openstack key. - -Option 1 allows certain Cinder volume operations to function correctly across -sites. For example, Cinder can back up volumes at DCN sites to the central -site, and restore volume backups to other sites. Offline volume migration can -be used to move volumes from DCN sites to the central site, and from the -central site to DCN sites. Note that online volume migration between sites, -and migrating volumes directly from one DCN site to another DCN site are not -supported. - -Option 2 does not support backing up or restoring cinder volumes between the -central and DCN sites, nor does it support offline volume migration between -the sites. However, if a shared external key is ever compromised, it can be -rescinded without affecting the site's own openstack key. - -Deployment Steps ----------------- - -This section shows the deployment commands and associated environment -files of an example DCN deployment with distributed image -management. It is based on the :doc:`distributed_compute_node` -example and does not cover redundant aspects of it such as networking. - -This example assumes that the VIPs and Networks have already been -provisioned as described in :doc:`../deployment/network_v2`. We assume -that ``~/deployed-vips-control-plane.yaml`` was created by the output -of `openstack overcloud network vip provision` and that -``~/deployed-network-control-plane.yaml`` was created by the output of -`openstack overcloud network provision`. - -Create a separate external Cephx key (optional) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you do not wish to distribute the default cephx key called -openstack, and instead create a cephx key used at external sites, then -follow this section. Otherwise proceed to the next section. -Some cinder volume operations only work when sites are using a common -'openstack' cephx key name. Cross-AZ backups and offline volume -migration are not supported when using a separate external cephx key. - -Create ``/home/stack/control-plane/ceph_keys.yaml`` with contents like -the following:: - - parameter_defaults: - CephExtraKeys: - - name: "client.external" - caps: - mgr: "allow *" - mon: "profile rbd" - osd: "profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images" - key: "AQD29WteAAAAABAAphgOjFD7nyjdYe8Lz0mQ5Q==" - mode: "0600" - -The key should be considered sensitive and may be randomly generated -with the following command:: - - python3 -c 'import os,struct,time,base64; key = os.urandom(16); header = struct.pack(" ~/control-plane/initial-ceph.conf - [osd] - osd_memory_target_autotune = true - osd_numa_auto_affinity = true - [mgr] - mgr/cephadm/autotune_memory_target_ratio = 0.2 - EOF - $ - -The ``--container-image-prepare`` and ``--network-data`` options are -included to make the example complete but are not displayed in this -document. Both are necessary so that ``cephadm`` can download the Ceph -container from the undercloud and so that the correct storage networks -are used. - -Passing ``--stack control-plane`` directs the above command to use the -working directory (e.g. ``$HOME/overcloud-deploy/``) which was -created by `openstack overcloud node provision`. This directory -contains the Ansible inventory and is where generated files from the -Ceph deployment will be stored. - -Passing ``--cluster central`` changes the name of Ceph cluster. As -multiple Ceph clusters will be deployed, each is given a separate -name. This name is inherited in the cephx key and configuration files. - -After Ceph is deployed, confirm that the central admin cephx key and -Ceph configuration file have been configured on one of the -controllers:: - - [root@oc0-controller-0 ~]# ls -l /etc/ceph/ - -rw-------. 1 root root 63 Mar 26 21:49 central.client.admin.keyring - -rw-r--r--. 1 root root 177 Mar 26 21:49 central.conf - [root@oc0-controller-0 ~]# - -From one of the controller nodes confirm that the `cephadm shell` -functions when passed these files:: - - cephadm shell --config /etc/ceph/central.conf \ - --keyring /etc/ceph/central.client.admin.keyring - -Deploy the control-plane stack -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Deploy the control-plane stack:: - - openstack overcloud deploy \ - --stack control-plane \ - --templates /usr/share/openstack-tripleo-heat-templates/ \ - -r ~/control-plane/control_plane_roles.yaml \ - -n ~/network-data.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/podman.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm-rbd-only.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cinder-backup.yaml \ - -e ~/control-plane/deployed-ceph-control-plane.yaml \ - -e ~/control-plane/ceph_keys.yaml \ - -e ~/deployed-vips-control-plane.yaml \ - -e ~/deployed-network-control-plane.yaml \ - -e ~/deployed-metal-control-plane.yaml \ - -e ~/control-plane/glance.yaml - - -Passing ``-e ~/control-plane/ceph_keys.yaml`` is only required if you -followed the optional section called "Create a separate external Cephx -key (optional)". If you are using the openstack keyring, then you may -pass the ``environments/cinder-backup.yaml`` to deploy the -cinder-backup service at the central site. The cinder-backup service -running in the central site will be able to back up volumes located at -DCN sites as long as all sites use the default 'openstack' cephx key -name. DCN volumes cannot be backed up to the central site if the -deployment uses a separate 'external' cephx key. - -The network related files are included to make the example complete -but are not displayed in this document. For more information on -configuring networks with distributed compute nodes see -:doc:`distributed_compute_node`. - -The ``environments/cephadm/cephadm-rbd-only.yaml`` results in -additional configuration of ceph for the ``control-plane`` stack. It -creates the pools for the OpenStack services being deployed and -creates the cephx keyring for the `openstack` cephx user and -distributes the keys and conf files so OpenStack can be a client of -the Ceph cluster. RGW is not deployed simply because an object storage -system is not needed for this example. However, if an object storage -system is desired at the Central site, substitute -``environments/cephadm/cephadm.yaml`` for -``environments/cephadm/cephadm-rbd-only.yaml`` and Ceph RGW will also -be configured at the central site. - -This file also contains both `NovaEnableRbdBackend: true` and -`GlanceBackend: rbd`. When both of these settings are used, the Glance -`image_import_plugins` setting will contain `image_conversion`. With -this setting enabled commands like `glance image-create-via-import` -with `--disk-format qcow2` will result in the image being converted -into a raw format, which is optimal for the Ceph RBD driver. If -you need to disable image conversion you may override the -`GlanceImageImportPlugin` parameter. For example:: - - parameter_defaults: - GlanceImageImportPlugin: [] - -The ``glance.yaml`` file sets the following to configure the local Glance backend:: - - parameter_defaults: - GlanceShowMultipleLocations: true - GlanceEnabledImportMethods: web-download,copy-image - GlanceBackend: rbd - GlanceBackendID: central - GlanceStoreDescription: 'central rbd glance store' - -The ``environments/cinder-backup.yaml`` file is not used in this -deployment. It's possible to enable the Cinder-backup service by using -this file but it will only write to the backups pool of the central -Ceph cluster. - -All files matching ``deployed-*.yaml`` should have been created in the -previous sections. - -The optional ``~/control-plane/ceph_keys.yaml`` file was created in -the previous sections. - -Extract overcloud control-plane and Ceph configuration -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Once the overcloud control plane has been deployed, data needs to be -retrieved from it to pass as input values into the separate DCN -deployment. - -The Heat export file is created automatically within the working -directory as described in :doc:`distributed_compute_node`. Confirm -this file was created for the control-plane as it will be used in the -next section:: - - stat ~/overcloud-deploy/control-plane/control-plane-export.yaml - -Use the `openstack overcloud export ceph` command to create -``~/central_ceph_external.yaml``:: - - openstack overcloud export ceph \ - --stack control-plane \ - --output-file ~/central_ceph_external.yaml - -By default the ``~/central_ceph_external.yaml`` file created from the -command above will contain the contents of cephx file -central.client.openstack.keyring. This document uses the convention of -calling the file "external" because it's for connecting to a Ceph -cluster (central) which is external and deployed before dcn0 which -contains is only internal and deployed during the dcn0 deployment. -If you do not wish to distribute central.client.openstack.keyring -and chose to create an external cephx keyring called "external" as -described in the optional cephx section above, then use the following -following command instead to create ``~/central_ceph_external.yaml``:: - - openstack overcloud export ceph \ - --stack control-plane \ - --cephx-key-client-name external \ - --output-file ~/central_ceph_external.yaml - -The ``--cephx-key-client-name external`` option passed to the -``openstack overcloud export ceph`` command results in the external -key, created during deployment and defined in -`/home/stack/control-plane/ceph_keys.yaml`, being extracted from -config-download. If the ``--cephx-key-client-name`` is not passed, -then the default cephx client key called `openstack` will be -extracted. - -The generated ``~/central_ceph_external.yaml`` should look something -like the following:: - - parameter_defaults: - CephExternalMultiConfig: - - cluster: "central" - fsid: "3161a3b4-e5ff-42a0-9f53-860403b29a33" - external_cluster_mon_ips: "172.16.11.84, 172.16.11.87, 172.16.11.92" - keys: - - name: "client.external" - caps: - mgr: "allow *" - mon: "profile rbd" - osd: "profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images" - key: "AQD29WteAAAAABAAphgOjFD7nyjdYe8Lz0mQ5Q==" - mode: "0600" - dashboard_enabled: false - ceph_conf_overrides: - client: - keyring: /etc/ceph/central.client.external.keyring - -The `CephExternalMultiConfig` section of the above is used to -configure any DCN node as a Ceph client of the central Ceph -cluster. - -The ``openstack overcloud export ceph`` command will obtain all of the -values from the config-download directory of the stack specified by -`--stack` option. All values are extracted from the -``cephadm/ceph_client.yml`` file. This file is generated when -config-download executes the export tasks from the tripleo-ansible -role `tripleo_cephadm`. It should not be necessary to extract these -values manually as the ``openstack overcloud export ceph`` command -will generate a valid YAML file with `CephExternalMultiConfig` -populated for all stacks passed with the `--stack` option. - -The `ceph_conf_overrides` section of the file generated by ``openstack -overcloud export ceph`` should look like the following:: - - ceph_conf_overrides: - client: - keyring: /etc/ceph/central.client.external.keyring - -The above will result in the following lines in -``/etc/ceph/central.conf`` on all DCN nodes which interact with -the central Ceph cluster:: - - [client] - keyring = /etc/ceph/central.client.external.keyring - -The name of the external Ceph cluster, relative to the DCN nodes, -is `central` so the relevant Ceph configuration file is called -``/etc/ceph/central.conf``. This directive is necessary so that the -Glance client called by Nova on all DCN nodes, which will be deployed -in the next section, know which keyring to use so they may connect to -the central Ceph cluster. - -It is necessary to always pass `dashboard_enabled: false` when using -`CephExternalMultiConfig` as the Ceph dashboard cannot be deployed -when configuring an overcloud as a client of an external Ceph cluster. -Thus the ``openstack overcloud export ceph`` command adds this option. - -For more information on the `CephExternalMultiConfig` parameter see -:doc:`ceph_external`. - -Create extra Ceph key for dcn0 (optional) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you do not wish for the central site to use the openstack keyring -generated for the dcn0 site, then create ``~/dcn0/ceph_keys.yaml`` -with content like the following:: - - parameter_defaults: - CephExtraKeys: - - name: "client.external" - caps: - mgr: "allow *" - mon: "profile rbd" - osd: "profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images" - key: "AQBO/mteAAAAABAAc4mVMTpq7OFtrPlRFqN+FQ==" - mode: "0600" - -The `CephExtraKeys` section of the above should follow the same -pattern as the first step of this procedure. It should use a -new key, which should be considered sensitive and can be randomly -generated with the same Python command from the first step. This same -key will be used later when Glance on the central site needs to -connect to the dcn0 images pool. - -Override Glance defaults for dcn0 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Create ``~/dcn0/glance.yaml`` with content like the following:: - - parameter_defaults: - GlanceShowMultipleLocations: true - GlanceEnabledImportMethods: web-download,copy-image - GlanceBackend: rbd - GlangeBackendID: dcn0 - GlanceStoreDescription: 'dcn0 rbd glance store' - GlanceMultistoreConfig: - central: - GlanceBackend: rbd - GlanceStoreDescription: 'central rbd glance store' - CephClusterName: central - -In the above example the `CephClientUserName` is not set because it -uses the default of 'openstack' and thus the openstack cephx key is -used. If you choose to create and distribute separate cephx keys as -described in the optional cephx section, then add this line to this -file so that it looks like the following:: - - parameter_defaults: - GlanceShowMultipleLocations: true - GlanceEnabledImportMethods: web-download,copy-image - GlanceBackend: rbd - GlanceStoreDescription: 'dcn0 rbd glance store' - GlanceMultistoreConfig: - central: - GlanceBackend: rbd - GlanceStoreDescription: 'central rbd glance store' - CephClusterName: central - CephClientUserName: 'external' - -The `CephClientUserName` should only be set to "external" if an -additional key which was passed with `CephExtraKeys` to the -control-plane stack had a name of "client.external". - -The `GlanceEnabledImportMethods` parameter is used to override the -default of 'web-download' to also include 'copy-image', which is -necessary to support the workflow described earlier. - -By default Glance on the dcn0 node will use the RBD store of the -dcn0 Ceph cluster. The `GlanceMultistoreConfig` parameter is then used -to add an additional store of type RBD called `central` which uses -the Ceph cluster deployed by the control-plane stack so the -`CephClusterName` is set to "central". - -Create DCN roles for dcn0 -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Generate the roles used for the deployment:: - - openstack overcloud roles generate DistributedComputeHCI DistributedComputeHCIScaleOut -o ~/dcn0/dcn_roles.yaml - -The `DistributedComputeHCI` role includes the default compute -services, the cinder volume service, and also includes the Ceph Mon, -Mgr, and OSD services for deploying a Ceph cluster at the distributed -site. Using this role, both the compute services and Ceph services are -deployed on the same nodes, enabling a hyper-converged infrastructure -for persistent storage at the distributed site. When Ceph is used, -there must be a minimum of three `DistributedComputeHCI` nodes. This -role also includes a Glance server, provided by the `GlanceApiEdge` -service with in the `DistributedComputeHCI` role. The Nova compute -service of each node in the `DistributedComputeHCI` role is configured -by default to use its local Glance server. - -`DistributedComputeHCIScaleOut` role is like the `DistributedComputeHCI` -role but does not run the Ceph Mon and Mgr service. It offers the Ceph -OSD service however, so it may be used to scale up storage and compute -services at each DCN site after the minimum of three -`DistributedComputeHCI` nodes have been deployed. There is no -`GlanceApiEdge` service in the `DistributedComputeHCIScaleOut` role but -in its place the Nova compute service of the role is configured by -default to connect to a local `HaProxyEdge` service which in turn -proxies image requests to the Glance servers running on the -`DistributedComputeHCI` roles. - -If you do not wish to hyper-converge the compute nodes with Ceph OSD -services, then substitute `DistributedCompute` for -`DistributedComputeHCI` and `DistributedComputeScaleOut` for -`DistributedComputeHCIScaleOut`, and add `CephAll` nodes (which host -both the Mon, Mgr and OSD services). - -Both the `DistributedCompute` and `DistributedComputeHCI` roles -contain `CinderVolumeEdge` and `Etcd` service for running Cinder -in active/active mode but this service will not be enabled unless -the `environments/dcn-storage.yaml` environment file is included in the -deploy command. If the `environments/dcn.yaml` is used in its place, -then the CinderVolumeEdge service will remain disabled. - -The `DistributedCompute` role contains the `GlanceApiEdge` service so -that the Compute service uses its the local Glance and local Ceph -server at the dcn0 site. The `DistributedComputeScaleOut` contains the -`HAproxyEdge` service so that any compute instances booting on the -`DistributedComputeScaleOut` node proxy their request for images to the -Glance services running on the `DistributedCompute` nodes. It is only -necessary to deploy the `ScaleOut` roles if more than three -`DistributedComputeHCI` or `DistributedCompute` nodes are necessary. -Three are needed for the Cinder active/active service and if -applicable the Ceph Monitor and Manager services. - -The roles should align to hosts which are deployed as described in -:doc:`../provisioning/baremetal_provision`. Since each site should -use a separate stack, this example assumes that ``--stack -dcn0`` was passed to the `openstack overcloud node provision` -command and that ``~/deployed-metal-dcn0.yaml`` was the -output of the same command. We also assume that the -``--network-config`` option was used to configure the network when the -hosts were provisioned. - -Deploy the dcn0 Ceph cluster -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Use the `openstack overcloud ceph deploy` command as described in -:doc:`deployed_ceph` to deploy the first DCN Ceph cluster:: - - openstack overcloud ceph deploy \ - ~/deployed-metal-dcn0.yaml \ - --output ~/dcn0/deployed-ceph-dcn0.yaml \ - --config ~/dcn0/initial-ceph.conf \ - --container-image-prepare ~/containers-prepare-parameter.yaml \ - --network-data ~/network-data.yaml \ - --roles-data ~/dcn0/dcn_roles.yaml \ - --cluster dcn0 \ - --stack dcn0 - -The output of the above command, -``--output ~/dcn0/deployed-ceph-dcn0.yaml``, will be -used when deploying the overcloud in the next section. - -The ``--config ~/dcn0/initial-ceph.conf`` is optional and -may be used for initial Ceph configuration. If the Ceph cluster -will be hyper-converged with compute services then create this file -like the following so Ceph will not consume memory that Nova compute -instances will need:: - - $ cat < ~/dcn0/initial-ceph.conf - [osd] - osd_memory_target_autotune = true - osd_numa_auto_affinity = true - [mgr] - mgr/cephadm/autotune_memory_target_ratio = 0.2 - EOF - $ - -The ``--container-image-prepare`` and ``--network-data`` options are -included to make the example complete but are not displayed in this -document. Both are necessary so that ``cephadm`` can download the Ceph -container from the undercloud and so that the correct storage networks -are used. - -Passing ``--stack dcn0`` directs the above command to use the -working directory (e.g. ``$HOME/overcloud-deploy/``) which was -created by `openstack overcloud node provision`. This directory -contains the Ansible inventory and is where generated files from the -Ceph deployment will be stored. - -Passing ``--cluster dcn0`` changes the name of Ceph cluster. As -multiple Ceph clusters will be deployed, each is given a separate -name. This name is inherited in the cephx key and configuration files. - -After Ceph is deployed, confirm that the dcn0 admin cephx key and -Ceph configuration file have been configured in ``/etc/ceph``. -Ensure the `cephadm shell` functions when passed these files:: - - cephadm shell --config /etc/ceph/dcn0.conf \ - --keyring /etc/ceph/dcn0.client.admin.keyring - - -Deploy the dcn0 stack -^^^^^^^^^^^^^^^^^^^^^ - -Deploy the dcn0 stack:: - - openstack overcloud deploy \ - --stack dcn0 \ - --templates /usr/share/openstack-tripleo-heat-templates/ \ - -r ~/dcn0/dcn_roles.yaml \ - -n ~/network-data.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/podman.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/cephadm/cephadm-rbd-only.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/dcn-storage.yaml \ - -e ~/overcloud-deploy/control-plane/control-plane-export.yaml \ - -e ~/central_ceph_external.yaml \ - -e ~/dcn0/deployed-ceph-dcn0.yaml \ - -e ~/dcn0/dcn_ceph_keys.yaml \ - -e deployed-vips-dcn0.yaml \ - -e deployed-network-dcn0.yaml \ - -e deployed-metal-dcn0.yaml \ - -e ~/dcn0/az.yaml \ - -e ~/dcn0/glance.yaml - -Passing ``-e ~/dcn0/dcn_ceph_keys.yaml`` is only required if you -followed the optional section called "Create extra Ceph key for dcn0 -(optional)". - -The network related files are included to make the example complete -but are not displayed in this document. For more information on -configuring networks with distributed compute nodes see -:doc:`distributed_compute_node`. - -The ``environments/cinder-volume-active-active.yaml`` file is NOT used -to configure Cinder active/active on the DCN site because -``environments/dcn-storage.yaml`` contains the same parameters. The -``environments/dcn-storage.yaml`` file is also used to configure the -`GlanceApiEdge` and `HAproxyEdge` edge services. If you are not using -hyper-converged Ceph, then use ``environments/dcn.yaml`` instead. -Both ``environments/dcn-storage.yaml`` and ``environments/dcn.yaml`` use -`NovaCrossAZAttach: False` to override the Nova configuration `[cinder]` -`cross_az_attach` setting from its default of `true`. This setting -should be `false` for all nodes in the dcn0 stack so that volumes -attached to an instance must be in the same availability zone in -Cinder as the instance availability zone in Nova. This is useful when -booting an instance from a volume on DCN nodes because Nova will -attempt to create a volume using the same availability zone as what is -assigned to the instance. - -The ``~/dcn0/az.yaml`` file contains the following:: - - parameter_defaults: - ManageNetworks: false - NovaComputeAvailabilityZone: dcn0 - CinderStorageAvailabilityZone: dcn0 - CinderVolumeCluster: dcn0 - -`CinderVolumeCluster` is the name of the Cinder active/active cluster -which is deployed per DCN site. The above setting overrides the -default of "dcn" to "dcn0" found in `environments/dcn-storage.yaml`. See -:doc:`distributed_compute_node` for details on the other parameters -above. - -The ``~/overcloud-deploy/control-plane/control-plane-export.yaml``, -``~/dcn0/dcn_ceph_keys.yaml``, ``~/dcn0/glance.yaml``, and -``role-counts.yaml`` files were created in the previous steps. The -``~/central_ceph_external.yaml`` file should also have been created in -a previous step. Deployment with this file is only necessary if images -on DCN sites will be pushed back to the central site so that they may -then be shared with other DCN sites. This may be useful for sharing -snapshots between sites. - -All files matching ``deployed-*.yaml`` should have been created in the -previous sections. - -Deploy additional DCN sites -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -All of the previous sections which were done for dcn0 may be repeated -verbatim except with "dcn1" substituted for "dcn0" and a new cephx key -should be generated for each DCN site as described under `Create extra -Ceph key`. Other than that, the same process may be continued to -deploy as many DCN sites as needed. Once all of the desired DCN sites -have been deployed proceed to the next section. The -``~/overcloud-deploy/control-plane/control-plane-export.yaml`` and ``~/central_ceph_external.yaml`` -which were created earlier may be reused for each DCN deployment and -do not need to be recreated. The roles in the previous section were -created specifically for dcn0 to allow for variations between DCN -sites. - -Update central site to use additional Ceph clusters as Glance stores -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Once all of the desired DCN sites are deployed the central site needs -to be updated so that the central Glance service may push images to -the DCN sites. - -In this example only one additional DCN site, dcn1, has been deployed -as indicated by the list of undercloud Heat stacks:: - - $ openstack stack list -c "Stack Name" -c "Stack Status" - +---------------+-----------------+ - | Stack Name | Stack Status | - +---------------+-----------------+ - | dcn1 | CREATE_COMPLETE | - | dcn0 | CREATE_COMPLETE | - | control-plane | CREATE_COMPLETE | - +---------------+-----------------+ - $ - -Create ``~/control-plane/glance-dcn-stores.yaml`` with content like the -following:: - - parameter_defaults: - GlanceMultistoreConfig: - dcn0: - GlanceBackend: rbd - GlanceStoreDescription: 'dcn0 rbd glance store' - CephClusterName: dcn0 - dcn1: - GlanceBackend: rbd - GlanceStoreDescription: 'dcn1 rbd glance store' - CephClusterName: dcn1 - -In the above example the `CephClientUserName` is not set because it -uses the default of 'openstack' and thus the openstack cephx key is -used. If you choose to create and distribute separate cephx keys as -described in the optional cephx section, then add this line to this -file per DCN site so that it looks like the following:: - - parameter_defaults: - GlanceShowMultipleLocations: true - GlanceEnabledImportMethods: web-download,copy-image - GlanceBackend: rbd - GlanceStoreDescription: 'central rbd glance store' - CephClusterName: central - GlanceMultistoreConfig: - dcn0: - GlanceBackend: rbd - GlanceStoreDescription: 'dcn0 rbd glance store' - CephClientUserName: 'external' - CephClusterName: dcn0 - dcn1: - GlanceBackend: rbd - GlanceStoreDescription: 'dcn1 rbd glance store' - CephClientUserName: 'external' - CephClusterName: dcn1 - -The `CephClientUserName` should only be set to "external" if an -additional key which was passed with `CephExtraKeys` to the -DCN stacks had a name of "client.external". The above will configure -the Glance service running on the Controllers to use two additional -stores called "dcn0" and "dcn1". - -Use the `openstack overcloud export ceph` command to create -``~/control-plane/dcn_ceph_external.yaml``:: - - openstack overcloud export ceph \ - --stack dcn0,dcn1 \ - --output-file ~/control-plane/dcn_ceph_external.yaml - -In the above example a coma-delimited list of Heat stack names is -provided to the ``--stack`` option. Pass as many stacks as necessary -for all deployed DCN sites so that the configuration data to connect -to every DCN Ceph cluster is extracted into the single generated -``dcn_ceph_external.yaml`` file. - -If you created a separate cephx key called external on each DCN ceph -cluster with ``CephExtraKeys``, then use the following variation of -the above command instead:: - - openstack overcloud export ceph \ - --stack dcn0,dcn1 \ - --cephx-key-client-name external \ - --output-file ~/control-plane/dcn_ceph_external.yaml - -Create ``~/control-plane/dcn_ceph_external.yaml`` should have content -like the following:: - - parameter_defaults: - CephExternalMultiConfig: - - cluster: "dcn0" - fsid: "539e2b96-316e-4c23-b7df-035a3037ddd1" - external_cluster_mon_ips: "172.16.11.61, 172.16.11.64, 172.16.11.66" - keys: - - name: "client.external" - caps: - mgr: "allow *" - mon: "profile rbd" - osd: "profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images" - key: "AQBO/mteAAAAABAAc4mVMTpq7OFtrPlRFqN+FQ==" - mode: "0600" - dashboard_enabled: false - ceph_conf_overrides: - client: - keyring: /etc/ceph/dcn0.client.external.keyring - - cluster: "dcn1" - fsid: "7504a91e-5a0f-4408-bb55-33c3ee2c67e9" - external_cluster_mon_ips: "172.16.11.182, 172.16.11.185, 172.16.11.187" - keys: - - name: "client.external" - caps: - mgr: "allow *" - mon: "profile rbd" - osd: "profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images" - key: "AQACCGxeAAAAABAAHocX/cnygrVnLBrKiZHJfw==" - mode: "0600" - dashboard_enabled: false - ceph_conf_overrides: - client: - keyring: /etc/ceph/dcn1.client.external.keyring - -The `CephExternalMultiConfig` section of the above is used to -configure the Glance service at the central site as a Ceph client of -all of the Ceph clusters of the DCN sites; that is "dcn0" and "dcn1" -in this example. This will be possible because the central nodes will -have the following files created: - -- /etc/ceph/dcn0.conf -- /etc/ceph/dcn0.client.external.keyring -- /etc/ceph/dcn1.conf -- /etc/ceph/dcn1.client.external.keyring - -For more information on the `CephExternalMultiConfig` parameter see -:doc:`ceph_external`. - -The number of lines in the ``~/control-plane/glance-dcn-stores.yaml`` and -``~/control-plane/dcn_ceph_external.yaml`` files will be proportional to -the number of DCN sites deployed. - -Run the same `openstack overcloud deploy --stack control-plane ...` -command which was run in the previous section but also include the -the ``~/control-plane/glance-dcn-stores.yaml`` and -``~/control-plane/dcn_ceph_external.yaml`` files with a `-e`. When the -stack update is complete, proceed to the next section. - -DCN using only External Ceph Clusters (optional) ------------------------------------------------- - -A possible variation of the deployment described above is one in which -Ceph is not deployed by director but is external to director as -described in :doc:`ceph_external`. Each site must still use a Ceph -cluster which is in the same physical location in order to address -latency requirements but that Ceph cluster does not need to be -deployed by director as in the examples above. In this configuration -Ceph services may not be hyperconverged with the Compute and -Controller nodes. The example in this section makes the following -assumptions: - -- A separate Ceph cluster at the central site called central -- A separate Ceph cluster at the dcn0 site called dcn0 -- A separate Ceph cluster at each dcnN site called dcnN for any other - DCN sites - -For each Ceph cluster listed above the following command has been -run:: - - ceph auth add client.openstack mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rwx pool=images' - -For the central site you may optionally append `, allow rwx -pool=backups, allow rwx pool=metrics` to the above command if you will -be using the Cinder backup or Telemetry services. Either way, the -above command will return a Ceph client key which should be saved in -an environment file to set the value of `CephClientKey`. The -environment file should be named something like -external-ceph-.yaml (e.g. external-ceph-central.yaml, -external-ceph-dcn0.yaml, external-ceph-dcn1.yaml, etc.) and should -contain values like the following:: - - parameter_defaults: - # The cluster FSID - CephClusterFSID: '4b5c8c0a-ff60-454b-a1b4-9747aa737d19' - # The CephX user auth key - CephClientKey: 'AQDLOh1VgEp6FRAAFzT7Zw+Y9V6JJExQAsRnRQ==' - # The list of IPs or hostnames of the Ceph monitors - CephExternalMonHost: '172.16.1.7, 172.16.1.8, 172.16.1.9' - # The desired name of the generated key and conf files - CephClusterName: central - -The above will not result in creating a new Ceph cluster but in -configuring a client to connect to an existing one, though the -`CephClusterName` variable should still be set so that the -configuration files are named based on the variable's value, -e.g. /etc/ceph/central.conf. The above example might be used for -the central site but for the dcn1 site, `CephClusterName` should be -set to "dcn1". Naming the cluster after its planned availability zone -is a strategy to keep the names consistent. Whatever name is supplied -will result in the Ceph configuration file in /etc/ceph/ having that -name, e.g. /etc/ceph/central.conf, /etc/ceph/dcn0.conf, -/etc/ceph/dcn1.conf, etc. and central.client.openstack.keyring, -dcn0.client.openstack.keyring, etc. The name should be unique so as to -avoid file overwrites. If the name is not set it will default to -"ceph". - -In each `openstack overcloud deploy` command in the previous sections -replace ``environments/cephadm/cephadm-rbd-only.yaml`` with -``environments/external-ceph.yaml`` and replace the -``deployed-ceph-.yaml`` with ``external-ceph-.yaml`` as -described above. - -Thus, for a three stack deployment the following will be the case. - -- The initial deployment of the central stack is configured with one - external Ceph cluster called central, which is the default store for - Cinder, Glance, and Nova. We will refer to this as the central - site's "primary external Ceph cluster". - -- The initial deployment of the dcn0 stack is configured - with its own primary external Ceph cluster called dcn0 which is the - default store for the Cinder, Glance, and Nova services at the dcn0 - site. It is also configured with the secondary external Ceph cluster - central. - -- Each subsequent dcnN stack has its own primary external Ceph cluster - and a secondary Ceph cluster which is central. - -- After every DCN site is deployed, the central stack is updated so - that in addition to its primary external Ceph cluster, "central", it - has multiple secondary external Ceph clusters. This stack update - will also configure Glance to use the additional secondary external - Ceph clusters as additional stores. - -In the example above, each site must have a primary external Ceph -cluster and each secondary external Ceph cluster is configured by -using the `CephExternalMultiConfig` parameter described in -:doc:`ceph_external`. - -The `CephExternalMultiConfig` parameter must be manually configured -because the `openstack overcloud export ceph` command can only export -Ceph configuration information from clusters which it has deployed. -However, the `ceph auth add` command and `external-ceph-.yaml` -site file described above contain all of the information necessary -to populate the `CephExternalMultiConfig` parameter. - -If the external Ceph cluster at each DCN site has the default name of -"ceph", then you should still define a unique cluster name within the -`CephExternalMultiConfig` parameter like the following:: - - parameter_defaults: - CephExternalMultiConfig: - - cluster: dcn1 - ... - - cluster: dcn2 - ... - -The above will result in dcn1.conf, dcn2.conf, etc, being created in -/etc/ceph on the control-plane nodes so that Glance is able to use -the correct Ceph configuration file per image store. If each -`cluster:` parameter above were set to "ceph", then the configuration -for each cluster would overwrite the file defined in the previous -configuration, so be sure to use a unique cluster name matching the -planned name of the availability zone. - -Confirm images may be copied between sites ------------------------------------------- - -Ensure you have Glance 3.0.0 or newer as provided by the -`python3-glanceclient` RPM: - -.. code-block:: bash - - $ glance --version - 3.0.0 - -Authenticate to the control-plane using the RC file generated -by the stack from the first deployment which contains Keystone. -In this example the stack was called "control-plane" so the file -to source before running Glance commands will be called -"control-planerc". - -Confirm the expected stores are available: - -.. code-block:: bash - - $ glance stores-info - +----------+----------------------------------------------------------------------------------+ - | Property | Value | - +----------+----------------------------------------------------------------------------------+ - | stores | [{"default": "true", "id": "central", "description": "central rbd glance | - | | store"}, {"id": "http", "read-only": "true"}, {"id": "dcn0", "description": | - | | "dcn0 rbd glance store"}, {"id": "dcn1", "description": "dcn1 rbd glance | - | | store"}] | - +----------+----------------------------------------------------------------------------------+ - -Assuming an image like `cirros-0.4.0-x86_64-disk.img` is in the -current directory, convert the image from QCOW2 format to RAW format -using a command like the following: - -.. code-block:: bash - - qemu-img convert -f qcow2 -O raw cirros-0.4.0-x86_64-disk.img cirros-0.4.0-x86_64-disk.raw - -Create an image in Glance default store at the central site as seen -in the following example: - -.. code-block:: bash - - glance image-create \ - --disk-format raw --container-format bare \ - --name cirros --file cirros-0.4.0-x86_64-disk.raw \ - --store central - -Alternatively, if the image is not in the current directory but in -qcow2 format on a web server, then it may be imported and converted in -one command by running the following: - -.. code-block:: bash - - glance --verbose image-create-via-import --disk-format qcow2 --container-format bare --name cirros --uri http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img --import-method web-download --stores central - -.. note:: The example above assumes that Glance image format - conversion is enabled. Thus, even though `--disk-format` is - set to `qcow2`, which is the format of the image file, Glance - will convert and store the image in raw format after it's - uploaded because the raw format is the optimal setting for - Ceph RBD. The conversion may be confirmed by running - `glance image-show | grep disk_format` after the image - is uploaded. - -Set an environment variable to the ID of the newly created image: - -.. code-block:: bash - - ID=$(openstack image show cirros -c id -f value) - -Copy the image from the default store to the dcn0 and dcn1 stores: - -.. code-block:: bash - - glance image-import $ID --stores dcn0,dcn1 --import-method copy-image - -Confirm a copy of the image is in each store by looking at the image properties: - -.. code-block:: bash - - $ openstack image show $ID | grep properties - | properties | direct_url='rbd://d25504ce-459f-432d-b6fa-79854d786f2b/images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076/snap', locations='[{u'url': u'rbd://d25504ce-459f-432d-b6fa-79854d786f2b/images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076/snap', u'metadata': {u'store': u'central'}}, {u'url': u'rbd://0c10d6b5-a455-4c4d-bd53-8f2b9357c3c7/images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076/snap', u'metadata': {u'store': u'dcn0'}}, {u'url': u'rbd://8649d6c3-dcb3-4aae-8c19-8c2fe5a853ac/images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076/snap', u'metadata': {u'store': u'dcn1'}}]', os_glance_failed_import='', os_glance_importing_to_stores='', os_hash_algo='sha512', os_hash_value='b795f047a1b10ba0b7c95b43b2a481a59289dc4cf2e49845e60b194a911819d3ada03767bbba4143b44c93fd7f66c96c5a621e28dff51d1196dae64974ce240e', os_hidden='False', stores='central,dcn0,dcn1' | - -The `stores` key, which is the last item in the properties map is set -to 'central,dcn0,dcn1'. - -On further inspection the `direct_url` key is set to:: - - rbd://d25504ce-459f-432d-b6fa-79854d786f2b/images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076/snap - -Which contains 'd25504ce-459f-432d-b6fa-79854d786f2b', the FSID of the -central Ceph cluster, the name of the pool, 'images', followed by -'8083c7e7-32d8-4f7a-b1da-0ed7884f1076', the Glance image ID and name -of the Ceph object. - -The properties map also contains `locations` which is set to similar -RBD paths for the dcn0 and dcn1 cluster with their respective FSIDs -and pool names. Note that the Glance image ID is consistent in all RBD -paths. - -If the image were deleted with `glance image-delete`, then the image -would be removed from all three RBD stores to ensure consistency. -However, if the glanceclient is >3.1.0, then an image may be deleted -from a specific store only by using a syntax like `glance -stores-delete --store `. - -Optionally, run the following on any Controller node from the -control-plane stack: - -.. code-block:: bash - - sudo podman exec ceph-mon-$(hostname) rbd --cluster central -p images ls -l - -Run the following on any DistributedComputeHCI node from the dcn0 stack: - -.. code-block:: bash - - sudo podman exec ceph-mon-$(hostname) rbd --id external --keyring /etc/ceph/dcn0.client.external.keyring --conf /etc/ceph/dcn0.conf -p images ls -l - -Run the following on any DistributedComputeHCI node from the dcn1 stack: - -.. code-block:: bash - - sudo podman exec ceph-mon-$(hostname) rbd --id external --keyring /etc/ceph/dcn1.client.external.keyring --conf /etc/ceph/dcn1.conf -p images ls -l - -The results in all cases should produce output like the following:: - - NAME SIZE PARENT FMT PROT LOCK - 8083c7e7-32d8-4f7a-b1da-0ed7884f1076 44 MiB 2 - 8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap 44 MiB 2 yes - -When an ephemeral instance is COW booted from the image a similar -command in the vms pool should show the same parent image: - -.. code-block:: bash - - $ sudo podman exec ceph-mon-$(hostname) rbd --id external --keyring /etc/ceph/dcn1.client.external.keyring --conf /etc/ceph/dcn1.conf -p vms ls -l - NAME SIZE PARENT FMT PROT LOCK - 2b431c77-93b8-4edf-88d9-1fd518d987c2_disk 1 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap 2 excl - $ - - -Confirm image-based volumes may be booted as DCN instances ----------------------------------------------------------- - -An instance with a persistent root volume may be created on a DCN -site by using the active/active Cinder service at the DCN site. -Assuming the Glance image created in the previous step is available, -identify the image ID and pass it to `openstack volume create` with -the `--image` option to create a volume based on that image. - -.. code-block:: bash - - IMG_ID=$(openstack image show cirros -c id -f value) - openstack volume create --size 8 --availability-zone dcn0 pet-volume-dcn0 --image $IMG_ID - -Once the volume is created identify its volume ID and pass it to -`openstack server create` with the `--volume` option. This example -assumes a flavor, key, security group and network have already been -created. - -.. code-block:: bash - - VOL_ID=$(openstack volume show -f value -c id pet-volume-dcn0) - openstack server create --flavor tiny --key-name dcn0-key --network dcn0-network --security-group basic --availability-zone dcn0 --volume $VOL_ID pet-server-dcn0 - -It is also possible to issue one command to have Nova ask Cinder -to create the volume before it boots the instance by passing the -`--image` and `--boot-from-volume` options as in the shown in the -example below: - -.. code-block:: bash - - openstack server create --flavor tiny --image $IMG_ID --key-name dcn0-key --network dcn0-network --security-group basic --availability-zone dcn0 --boot-from-volume 4 pet-server-dcn0 - -The above will only work if the Nova `cross_az_attach` setting -of the relevant compute node is set to `false`. This is automatically -configured by deploying with `environments/dcn-storage.yaml`. If the -`cross_az_attach` setting is `true` (the default), then the volume -will be created from the image not in the dcn0 site, but on the -default central site (as verified with the `rbd` command on the -central Ceph cluster) and then the instance will fail to boot on the -dcn0 site. Even if `cross_az_attach` is `true`, it's still possible to -create an instance from a volume by using `openstack volume create` -and then `openstack server create` as shown earlier. - -Optionally, after creating the volume from the image at the dcn0 -site and then creating an instance from the existing volume, verify -that the volume is based on the image by running the `rbd` command -within a ceph-mon container on the dcn0 site to list the volumes pool. - -.. code-block:: bash - - $ sudo podman exec ceph-mon-$HOSTNAME rbd --cluster dcn0 -p volumes ls -l - NAME SIZE PARENT FMT PROT LOCK - volume-28c6fc32-047b-4306-ad2d-de2be02716b7 8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap 2 excl - $ - -The following commands may be used to create a Cinder snapshot of the -root volume of the instance. - -.. code-block:: bash - - openstack server stop pet-server-dcn0 - openstack volume snapshot create pet-volume-dcn0-snap --volume $VOL_ID --force - openstack server start pet-server-dcn0 - -In the above example the server is stopped to quiesce data for clean -a snapshot. The `--force` option is necessary when creating the -snapshot because the volume status will remain "in-use" even when the -server is shut down. When the snapshot is completed start the -server. Listing the contents of the volumes pool on the dcn0 Ceph -cluster should show the snapshot which was created and how it is -connected to the original volume and original image. - -.. code-block:: bash - - $ sudo podman exec ceph-mon-$HOSTNAME rbd --cluster dcn0 -p volumes ls -l - NAME SIZE PARENT FMT PROT LOCK - volume-28c6fc32-047b-4306-ad2d-de2be02716b7 8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap 2 excl - volume-28c6fc32-047b-4306-ad2d-de2be02716b7@snapshot-a1ca8602-6819-45b4-a228-b4cd3e5adf60 8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap 2 yes - $ - -Confirm image snapshots may be created and copied between sites ---------------------------------------------------------------- - -A new image called "cirros-snapshot" may be created at the dcn0 site -from the instance created in the previous section by running the -following commands. - -.. code-block:: bash - - NOVA_ID=$(openstack server show pet-server-dcn0 -f value -c id) - openstack server stop $NOVA_ID - openstack server image create --name cirros-snapshot $NOVA_ID - openstack server start $NOVA_ID - -In the above example the instance is stopped to quiesce data for clean -a snapshot image and is then restarted after the image has been -created. The output of `openstack image show $IMAGE_ID -f value -c -properties` should contain a JSON data structure whose key called -`stores` should only contain "dcn0" as that is the only store -which has a copy of the new cirros-snapshot image. - -The new image may then by copied from the dcn0 site to the central -site, which is the default backend for Glance. - -.. code-block:: bash - - IMAGE_ID=$(openstack image show cirros-snapshot -f value -c id) - glance image-import $IMAGE_ID --stores central --import-method copy-image - -After the above is run the output of `openstack image show -$IMAGE_ID -f value -c properties` should contain a JSON data structure -whose key called `stores` should look like "dcn0,central" as -the image will also exist in the "central" backend which stores its -data on the central Ceph cluster. The same image at the Central site -may then be copied to other DCN sites, booted in the vms or volumes -pool, and snapshotted so that the same process may repeat. diff --git a/deploy-guide/source/features/domain_specific_ldap_backends.rst b/deploy-guide/source/features/domain_specific_ldap_backends.rst deleted file mode 100644 index bd068f59..00000000 --- a/deploy-guide/source/features/domain_specific_ldap_backends.rst +++ /dev/null @@ -1,295 +0,0 @@ -Domain-specific LDAP Backends -============================= - -It is possible to configure keystone to use one or more LDAP backends for the -identity resources as described in the `OpenStack Identity documentation`_. -This will result in an LDAP backend per keystone domain. - -Setup ------ - -To configure LDAP backends, set the ``KeystoneLDAPDomainEnable`` flag to -``true``. Enabling this will set the ``domain_specific_drivers_enabled`` option -in keystone in the ``identity`` configuration group. By default the domain -configurations are stored in the **/etc/keystone/domains** directory on the -controller nodes. You can override this directory by setting the -``keystone::domain_config_directory`` hiera key, and setting that via the -``ExtraConfig`` parameter in an environment file. For instance, to set this in -the controller nodes, one would do the following:: - - parameter_defaults: - ControllerExtraConfig: - keystone::domain_config_directory: /etc/another/directory - -The LDAP backend configuration should be provided via the -``KeystoneLDAPBackendConfigs`` parameter in tripleo-heat-templates. It's a -dictionary mapping the LDAP domain names to options that take the following -keys: - -* **identity_driver**: Identity backend driver. Defaults to 'ldap' - -* **url**: URL for connecting to the LDAP server. - -* **user**: User BindDN to query the LDAP server. - -* **password**: Password for the BindDN to query the LDAP server. - -* **suffix**: LDAP server suffix - -* **query_scope**: The LDAP scope for queries, this can be either "one" - (onelevel/singleLevel which is the default in keystone) or "sub" - (subtree/wholeSubtree). - -* **page_size**: Maximum results per page; a value of zero ("0") disables - paging. (integer value) - -* **user_tree_dn**: Search base for users. - -* **user_filter**: LDAP search filter for users. - -* **user_objectclass**: LDAP objectclass for users. - -* **user_id_attribute**: LDAP attribute mapped to user id. **WARNING**: must - not be a multivalued attribute. (string value) - -* **user_name_attribute**: LDAP attribute mapped to user name. - -* **user_mail_attribute**: LDAP attribute mapped to user email. - -* **user_enabled_attribute**: LDAP attribute mapped to user enabled flag. - -* **user_enabled_mask**: Bitmask integer to indicate the bit that the enabled - value is stored in if the LDAP server represents "enabled" as a bit on an - integer rather than a boolean. A value of "0" indicates the mask is not used. - If this is not set to "0" the typical value is "2". This is typically used - when "user_enabled_attribute = userAccountControl". (integer value) - -* **user_enabled_default**: Default value to enable users. This should match an - appropriate int value if the LDAP server uses non-boolean (bitmask) values - to indicate if a user is enabled or disabled. If this is not set to "True" - the typical value is "512". This is typically used when - "user_enabled_attribute = userAccountControl". - -* **user_enabled_invert**: Invert the meaning of the boolean enabled values. - Some LDAP servers use a boolean lock attribute where "true" means an account - is disabled. Setting "user_enabled_invert = true" will allow these lock - attributes to be used. This setting will have no effect if - "user_enabled_mask" or "user_enabled_emulation" settings are in use. - (boolean value) - -* **user_attribute_ignore**: List of attributes stripped off the user on - update. (list value) - -* **user_default_project_id_attribute**: LDAP attribute mapped to - default_project_id for users. - -* **user_pass_attribute**: LDAP attribute mapped to password. - -* **user_enabled_emulation**: If true, Keystone uses an alternative method to - determine if a user is enabled or not by checking if they are a member of - the "user_enabled_emulation_dn" group. (boolean value) - -* **user_enabled_emulation_dn**: DN of the group entry to hold enabled users - when using enabled emulation. - -* **user_additional_attribute_mapping**: List of additional LDAP attributes - used for mapping additional attribute mappings for users. Attribute mapping - format is :, where ldap_attr is the attribute in the - LDAP entry and user_attr is the Identity API attribute. (list value) - -* **group_tree_dn**: Search base for groups. - -* **group_filter**: LDAP search filter for groups. - -* **group_objectclass**: LDAP objectclass for groups. - -* **group_id_attribute**: LDAP attribute mapped to group id. - -* **group_name_attribute**: LDAP attribute mapped to group name. - -* **group_member_attribute**: LDAP attribute mapped to show group membership. - -* **group_desc_attribute**: LDAP attribute mapped to group description. - -* **group_attribute_ignore**: List of attributes stripped off the group on - update. (list value) - -* **group_additional_attribute_mapping**: Additional attribute mappings for - groups. Attribute mapping format is :, where ldap_attr - is the attribute in the LDAP entry and user_attr is the Identity API - attribute. (list value) - -* **chase_referrals**: Whether or not to chase returned referrals. Note that - it's possible that your client or even your backend do this for you already. - All this does is try to override the client configuration. If your client - doesn't support this, you might want to enable *chaining* on your LDAP server - side. (boolean value) - -* **use_tls**: Enable TLS for communicating with LDAP servers. Note that you - might also enable this by using a TLS-enabled scheme in the URL (e.g. - "ldaps"). However, if you configure this via the URL, this option is not - needed. (boolean value) - -* **tls_cacertfile**: CA certificate file path for communicating with LDAP - servers. - -* **tls_cacertdir**: CA certificate directory path for communicating with LDAP - servers. - -* **tls_req_cert**: Valid options for tls_req_cert are demand, never, and allow. - -* **use_pool**: Enable LDAP connection pooling. (boolean value and defaults to - true) - -* **pool_size**: Connection pool size. (integer value and defaults to '10') - -* **pool_retry_max**: Maximum count of reconnect trials. (integer value and - defaults to '3' - -* **pool_retry_delay**: Time span in seconds to wait between two reconnect - trials. (floating point value and defaults to '0.1') - -* **pool_connection_timeout**: Connector timeout in seconds. Value -1 - indicates indefinite wait for response. (integer value and defaults to '-1') - -* **pool_connection_lifetime**: Connection lifetime in seconds. (integer value - and defaults to '600') - -* **use_auth_pool**: Enable LDAP connection pooling for end user authentication. - If use_pool is disabled, then this setting is meaningless and is not used at - all. (boolean value and defaults to true) - -* **auth_pool_size**: End user auth connection pool size. (integer value and - defaults to '100') - -* **auth_pool_connection_lifetime**: End user auth connection lifetime in - seconds. (integer value and defaults to '60') - -An example of an environment file with LDAP configuration for the keystone -domain called ``tripleodomain`` would look as follows:: - - parameter_defaults: - KeystoneLDAPDomainEnable: true - KeystoneLDAPBackendConfigs: - tripleodomain: - url: ldap://192.0.2.250 - user: cn=openstack,ou=Users,dc=tripleo,dc=example,dc=com - password: Secrete - suffix: dc=tripleo,dc=example,dc=com - user_tree_dn: ou=Users,dc=tripleo,dc=example,dc=com - user_filter: "(memberOf=cn=OSuser,ou=Groups,dc=tripleo,dc=example,dc=com)" - user_objectclass: person - user_id_attribute: cn - -This will create a file in the default domain directory -**/etc/keystone/domains** with the name **keystone.tripleodomain.conf**. And -will use the attributes to create such a configuration. - -Please note that both the ``KeystoneLDAPDomainEnable`` flag and the -configuration ``KeystoneLDAPBackendConfigs`` must be set. - -One can also specify several domains. For instance:: - - KeystoneLDAPBackendConfigs: - tripleodomain1: - url: ldap://tripleodomain1.example.com - user: cn=openstack,ou=Users,dc=tripleo,dc=example,dc=com - password: Secrete1 - ... - tripleodomain2: - url: ldaps://tripleodomain2.example.com - user: cn=openstack,ou=Users,dc=tripleo,dc=example,dc=com - password: Secrete2 - ... - -This will add two domains, called ``tripleodomain1`` and ``tripleodomain2``, -with their own configurations. - -Post-deployment setup ---------------------- - -After the overcloud deployment is done, you'll need to give the admin user a -role in the newly created domain. - -1. Source the overcloudrc.v3 file:: - - source overcloudrc.v3 - -2. Grant admin user on your domain:: - - openstack role add --domain $(openstack domain show tripleodomain -f value -c id)\ - --user $(openstack user show admin --domain default -f value -c id) \ - $(openstack role show admin -c id -f value) - -3. Test LDAP domain in listing users:: - - openstack user list --domain tripleodomain - -FreeIPA as an LDAP backend --------------------------- - -Before configuring the domain, there needs to be a user that will query -FreeIPA. In this case, we'll create an account called ``keystone`` in FreeIPA, -and we'll use it's credentials on our configuration. On the FreeIPA side and -with proper credentials loaded, we'll do the following:: - - ipa user-add keystone --cn="keystone user" --first="keystone" \ - --last="user" --password - -This will create the user and we'll be prompted to write the password for it. - -Configuring FreeIPA as an LDAP backend for a domain can be done by using the -following template as a configuration:: - - parameter_defaults: - KeystoneLDAPDomainEnable: true - KeystoneLDAPBackendConfigs: - freeipadomain: - url: ldaps://$FREEIPA_SERVER - user: uid=keystone,cn=users,cn=accounts,$SUFFIX - password: $SOME_PASSWORD - suffix: $SUFFIX - user_tree_dn: cn=users,cn=accounts,$SUFFIX - user_objectclass: inetOrgPerson - user_id_attribute: uid - user_name_attribute: uid - user_mail_attribute: mail - group_tree_dn: cn=groups,cn=accounts,$SUFFIX - group_objectclass: groupOfNames - group_id_attribute: cn - group_name_attribute: cn - group_member_attribute: member - group_desc_attribute: description - user_enabled_attribute: nsAccountLock - user_enabled_default: False - user_enabled_invert: true - -* $FREEIPA_SERVER will contain the FQDN that points to your FreeIPA server. - Remember that it needs to be available from some network (most likely the - ctlplane network) in TripleO - -* You should also make sure that the ldap ports need to be accessible. In this - case, we need port 636 available since we're using the ``ldaps`` scheme. - However, if you would be using the ``use_tls`` configuration option or if you - are not using TLS at all (not recommended), you might also need port 389. - -* To use TLS, the FreeIPA server's certificate must also be trusted by the - openldap client libraries. If you're using novajoin (and - :doc:`tls-everywhere`) this is easily achieved since all the nodes in your - overcloud are enrolled in FreeIPA. If you're not using this setup, you should - then follow the 'Getting the overcloud to trust CAs' section in the - :doc:`ssl` document. - -* $SUFFIX will be the domain for your users. Given a domain, the suffix DN can - be created with the following snippet:: - - suffix=`echo $DOMAIN | sed -e 's/^/dc=/' -e 's/\./,dc=/g'` - - Given the domain ``example.com`` the suffix will be ``dc=example,dc=com``. - -* In this configuration, we configure this backend as read-only. So you'll need - to create your OpenStack users on the FreeIPA side. - -.. References - -.. _`OpenStack Identity documentation`: https://docs.openstack.org/admin-guide/identity-integrate-with-ldap.html diff --git a/deploy-guide/source/features/extra_config.rst b/deploy-guide/source/features/extra_config.rst deleted file mode 100644 index bc840e35..00000000 --- a/deploy-guide/source/features/extra_config.rst +++ /dev/null @@ -1,279 +0,0 @@ -Node customization and Third-Party Integration -============================================== - -It is possible to enable additional configuration during one of the -following deployment phases: - -* firstboot - run once config (performed on each node by cloud-init) -* per-node - run after the node is initially created but before services are deployed and configured (e.g by puppet) -* post-deploy - run after the services have been deployed and configured (e.g by puppet) - -.. note:: - - This documentation assumes some knowledge of heat HOT_ template - syntax, and makes use of heat environment_ files. See the upstream - heat documentation_ for further information. - -.. _HOT: https://docs.openstack.org/heat/template_guide/hot_guide.html -.. _environment: https://docs.openstack.org/heat/template_guide/environment.html -.. _documentation: https://docs.openstack.org/heat/template_guide/index.html - -Firstboot extra configuration ------------------------------ - -Firstboot configuration is optional, and is performed on *all* nodes on initial -deployment. - -Any configuration possible via cloud-init may be performed at this point, -either by applying cloud-config yaml or running arbitrary additional -scripts. - -The heat templates used for deployment provide the `OS::TripleO::NodeUserData` -resource as the interface to enable this configuration. A basic example of its -usage is provided below, followed by some notes related to real world -usage. - -The script snippet below shows how to create a simple example containing two -scripts, combined via the MultipartMime_ resource:: - - mkdir firstboot - cat > firstboot/one_two.yaml << EOF - heat_template_version: 2014-10-16 - - resources: - userdata: - type: OS::Heat::MultipartMime - properties: - parts: - - config: {get_resource: one_config} - - config: {get_resource: two_config} - - one_config: - type: OS::Heat::SoftwareConfig - properties: - config: | - #!/bin/bash - echo "one" > /tmp/one - - two_config: - type: OS::Heat::SoftwareConfig - properties: - config: | - #!/bin/bash - echo "two" > /tmp/two - - outputs: - OS::stack_id: - value: {get_resource: userdata} - EOF - -.. _MultipartMime: https://docs.openstack.org/heat/template_guide/openstack.html#OS::Heat::MultipartMime - -.. note:: - - The stack must expose an `OS::stack_id` output which references an - OS::Heat::MultipartMime resource. - -This template is then mapped to the `OS::TripleO::NodeUserData` resource type -via a heat environment file:: - - cat > userdata_env.yaml << EOF - resource_registry: - OS::TripleO::NodeUserData: firstboot/one_two.yaml - EOF - -You may then deploy your overcloud referencing the additional environment file:: - - openstack overcloud deploy --templates \ - -e -e userdata_env.yaml - -.. note:: - - Make sure you pass the same environment parameters that were used at - deployment time in addition to your customization environments at the - end (`userdata_env.yaml`). - -.. note:: - - The userdata is applied to *all* nodes in the deployment. If you need role - specific logic, the userdata scripts can contain conditionals which use - e.g the node hostname to determine the role. - -.. note:: - - OS::TripleO::NodeUserData is only applied on initial node deployment, - not on any subsequent stack update, because cloud-init only processes the - nova user-data once, on first boot. If you need to add custom configuration - that runs on all stack creates and updates, see the - `Post-Deploy extra configuration`_ section below. - -For a more complete example, which creates an additional user and configures -SSH keys by accessing the nova metadata server, see -`/usr/share/openstack-tripleo-heat-templates/firstboot/userdata_example.yaml` -on the undercloud node or the tripleo-heat-templates_ repo. - -.. _tripleo-heat-templates: https://opendev.org/openstack/tripleo-heat-templates - -Per-node extra configuration ----------------------------- - -This configuration happens after any "firstboot" configuration is applied, -but before any Post-Deploy configuration takes place. - -Typically these interfaces are suitable for preparing each node for service -deployment, such as registering nodes with a content repository, or creating -additional data to be consumed by the post-deploy phase. They may also be suitable -integration points for additional third-party services, drivers or plugins. - - -.. note:: - If you only need to provide some additional data to the existing service - configuration, see :ref:`node_config` as this may provide a simpler solution. - -.. note:: - The per-node interface only enable *individual* nodes to be configured, - if cluster-wide configuration is required, the Post-Deploy interfaces should be - used instead. - -The following interfaces are available: - -* `OS::TripleO::ControllerExtraConfigPre`: Controller node additional configuration -* `OS::TripleO::ComputeExtraConfigPre`: Compute node additional configuration -* `OS::TripleO::CephStorageExtraConfigPre` : CephStorage node additional configuration -* `OS::TripleO::NodeExtraConfig`: additional configuration applied to all nodes (all roles). - -Below is an example of a per-node configuration template that shows additional node configuration -via standard heat SoftwareConfig_ resources:: - - mkdir -p extraconfig/per-node - cat > extraconfig/per-node/example.yaml << EOF - - heat_template_version: 2014-10-16 - - parameters: - server: - description: ID of the controller node to apply this config to - type: string - - resources: - NodeConfig: - type: OS::Heat::SoftwareConfig - properties: - group: script - config: | - #!/bin/sh - echo "Node configured" > /root/per-node - - NodeDeployment: - type: OS::Heat::SoftwareDeployment - properties: - config: {get_resource: NodeConfig} - server: {get_param: server} - outputs: - deploy_stdout: - description: Deployment reference, used to trigger post-deploy on changes - value: {get_attr: [NodeDeployment, deploy_stdout]} - - EOF - -The "server" parameter must be specified in all per-node ExtraConfig templates, -this is the server to apply the configuration to, and is provided by the parent -template. Optionally additional implementation specific parameters may also be -provided by parameter_defaults, see below for more details. - -Any resources may be defined in the template, but the outputs must define a "deploy_stdout" -value, which is an identifier used to detect if the configuration applied has changed, -hence when any post-deploy actions (such as re-applying puppet manifests on update) -may need to be performed. - -For a more complete example showing how to apply a personalized map of per-node configuration -to each node, see `/usr/share/openstack-tripleo-heat-templates/puppet/extraconfig/pre_deploy/per_node.yaml` -or the tripleo-heat-templates_ repo. - -.. _SoftwareConfig: https://docs.openstack.org/heat/template_guide/software_deployment.html - - -Post-Deploy extra configuration -------------------------------- - -Post-deploy additional configuration is possible via the -`OS::TripleO::NodeExtraConfigPost` interface, which is applied after any -per-node configuration has completed. - -.. note:: - - The `OS::TripleO::NodeExtraConfigPost` applies configuration to *all* nodes, - there is currently no per-role NodeExtraConfigPost interface. - -Below is an example of a post-deployment configuration template:: - - mkdir -p extraconfig/post-deploy/ - cat > extraconfig/post-deploy/example.yaml << EOF - heat_template_version: 2014-10-16 - - parameters: - servers: - type: json - EndpointMap: - default: {} - type: json - - # Optional implementation specific parameters - some_extraparam: - type: string - - resources: - - ExtraConfig: - type: OS::Heat::SoftwareConfig - properties: - group: script - config: - str_replace: - template: | - #!/bin/sh - echo "extra _APARAM_" > /root/extra - params: - _APARAM_: {get_param: some_extraparam} - - ExtraDeployments: - type: OS::Heat::SoftwareDeploymentGroup - properties: - servers: {get_param: servers} - config: {get_resource: ExtraConfig} - actions: ['CREATE'] # Only do this on CREATE - EOF - -The "servers" parameter must be specified in all NodeExtraConfigPost -templates, this is the server list to apply the configuration to, -and is provided by the parent template. - -Optionally, you may define additional parameters which are consumed by the -implementation. These may then be provided via parameter_defaults in the -environment which enables the configuration. - -.. note:: - - If the parameter_defaults approach is used, care must be used to avoid - unintended reuse of parameter names between multiple templates, because - parameter_defaults is applied globally. - -The "actions" property of the `OS::Heat::SoftwareDeploymentGroup` resource may be -used to specify when the configuration should be applied, e.g only on CREATE, -only on DELETE etc. If this is omitted, the heat default is to apply the -config on CREATE and UPDATE, e.g on initial deployment and every subsequent -update. - -The extra config may be enabled via an environment file:: - - cat > post_config_env.yaml << EOF - resource_registry: - OS::TripleO::NodeExtraConfigPost: extraconfig/post-deploy/example.yaml - parameter_defaults: - some_extraparam: avalue123 - EOF - -You may then deploy your overcloud referencing the additional environment file:: - - openstack overcloud deploy --templates \ - -e -e post_config_env.yaml diff --git a/deploy-guide/source/features/high_availability.rst b/deploy-guide/source/features/high_availability.rst deleted file mode 100644 index aed87701..00000000 --- a/deploy-guide/source/features/high_availability.rst +++ /dev/null @@ -1,18 +0,0 @@ -Configuring High Availability -============================= - -|project| supports high availability of the controller services using -Pacemaker. To enable this feature, you need at least three controller -nodes, enable Pacemaker as the resource manager and specify an NTP -server. - -Create the following environment file:: - - $ cat ~/environment.yaml - parameter_defaults: - ControllerCount: 3 - -And add the following arguments to your `openstack overcloud deploy` -command to deploy with HA:: - - -e environment.yaml -e /usr/share/openstack-tripleo-heat-templates/environments/docker-ha.yaml --ntp-server pool.ntp.org diff --git a/deploy-guide/source/features/index.rst b/deploy-guide/source/features/index.rst deleted file mode 100644 index fe77bb19..00000000 --- a/deploy-guide/source/features/index.rst +++ /dev/null @@ -1,51 +0,0 @@ -Feature Configurations -====================== - -Documentation on additional features for |project|. - -.. toctree:: - - api_policies - backends - baremetal_overcloud - composable_services - custom_networks - custom_roles - compute_nvdimm - deploy_cellv2 - deploy_swift - deployed_server - designate - disable_telemetry - distributed_compute_node - distributed_multibackend_storage - extra_config - tolerated_failure - high_availability - instance_ha - ipsec - keystone_security_compliance - lvmfilter - multiple_overclouds - network_isolation - network_isolation_virt - node_config - node_specific_hieradata - octavia - ops_tools - oslo_messaging_config - ovs_dpdk_config - sriov_deployment - rhsm - role_specific_parameters - routed_spine_leaf_network - server_blacklist - security_hardening - split_stack - ssl - tls-introduction - tls-everywhere - tuned - undercloud_minion - vdpa_deployment - pre_network_config diff --git a/deploy-guide/source/features/instance_ha.rst b/deploy-guide/source/features/instance_ha.rst deleted file mode 100644 index 709ad746..00000000 --- a/deploy-guide/source/features/instance_ha.rst +++ /dev/null @@ -1,81 +0,0 @@ -Configuring Instance High Availability -====================================== - -|project|, starting with the Queens release, supports a form of instance -high availability when the overcloud is deployed in a specific way. - -In order to activate instance high-availability (also called ``IHA``) -the following steps are needed: - -1. Add the following environment file to your overcloud deployment command. Make sure you are deploying an HA overcloud:: - - -e /usr/share/openstack-tripleo-heat-templates/environments/compute-instanceha.yaml - -2. Instead of using the ``Compute`` role use the ``ComputeInstanceHA`` role for your compute plane. The ``ComputeInstanceHA`` role has the following additional services when compared to the ``Compute`` role:: - - - OS::TripleO::Services::ComputeInstanceHA - - OS::TripleO::Services::PacemakerRemote - -3. Make sure that fencing is configured for the whole overcloud (controllers and computes). You can do so by adding an environment file to your deployment command that contains the necessary fencing information. For example:: - - parameter_defaults: - EnableFencing: true - FencingConfig: - devices: - - agent: fence_ipmilan - host_mac: 00:ec:ad:cb:3c:c7 - params: - login: admin - ipaddr: 192.168.24.1 - ipport: 6230 - passwd: password - lanplus: 1 - - agent: fence_ipmilan - host_mac: 00:ec:ad:cb:3c:cb - params: - login: admin - ipaddr: 192.168.24.1 - ipport: 6231 - passwd: password - lanplus: 1 - - agent: fence_ipmilan - host_mac: 00:ec:ad:cb:3c:cf - params: - login: admin - ipaddr: 192.168.24.1 - ipport: 6232 - passwd: password - lanplus: 1 - - agent: fence_ipmilan - host_mac: 00:ec:ad:cb:3c:d3 - params: - login: admin - ipaddr: 192.168.24.1 - ipport: 6233 - passwd: password - lanplus: 1 - - agent: fence_ipmilan - host_mac: 00:ec:ad:cb:3c:d7 - params: - login: admin - ipaddr: 192.168.24.1 - ipport: 6234 - passwd: password - lanplus: 1 - - -Once the deployment is completed, the overcloud should show a stonith device for each compute node and one for each controller node and a GuestNode for every compute node. The expected behavior is that if a compute node dies, it will be fenced and the VMs that were running on it will be evacuated (i.e. restarted) on another compute node. - -In case it is necessary to limit which VMs are to be resuscitated on another compute node it is possible to tag with ``evacuable`` either the image:: - - openstack image set --tag evacuable 0c305437-89eb-48bc-9997-e4e4ea77e449 - -the flavor:: - - nova flavor-key bb31d84a-72b3-4425-90f7-25fea81e012f set evacuable=true - -or the VM:: - - nova server-tag-add 89b70b07-8199-46f4-9b2d-849e5cdda3c2 evacuable - -At the moment this last method should be avoided because of a significant reason: setting the tag on a single VM means that just *that* instance will be evacuated, tagging no VM implies that *all* the servers on the compute node will resuscitate. In a partial tagging situation, if a compute node runs only untagged VMs, the cluster will evacuate all of them, ignoring the overall tag status. diff --git a/deploy-guide/source/features/ipsec.rst b/deploy-guide/source/features/ipsec.rst deleted file mode 100644 index 22bcd069..00000000 --- a/deploy-guide/source/features/ipsec.rst +++ /dev/null @@ -1,170 +0,0 @@ -.. _ipsec: - -Deploying with IPSec -==================== - -Since the Queens release, it is possible to encrypt communications within the -internal network by setting up IPSec tunnels configured by TripleO. - -There are several options that TripleO provides deployers whose requirements call -for encrypting everything in the network. For example, TLS Everywhere has been -supported since the Pike release. This method requires the deployer -to procure a CA server on a separate node. FreeIPA is recommended for this. - -However, there are cases where a deployers authorized CA does not have an -interface that can automatically request certificates. Furthermore, it may -not be possible to add another node to the network for various other reasons. -For these cases, IPSec is a viable, alternative solution. - -.. note:: For more information on TLS Everywhere, please see - :doc:`tls-everywhere`. - -IPSec thus, provides an alternative to TLS Everywhere. With IPSec the encryption -happens on the IP layer, and not over TCP (as happens in TLS). As a result, the -services will communicate with each other over standard 'http', and not -actually know that the underlying traffic is being encrypted. This means that -the services do not require any extra configuration. - -Solution Overview ------------------ - -The current IPSec solution relies on `Libreswan`_, which is already available -in RHEL and CentOS, and is driven and configured via Ansible. - -There are two types of tunnels configured in the overcloud: - -* **node-to-node tunnels**: These tunnels are a simple 1-to-1 tunnel between the ip - addresses of two nodes on the same network. This results in a tunnel to each node - in the overcloud for each network that the node is connected to. - -* **Virtual IP tunnels**: These are tunnels from each Virtual IP address and - each node that can contact to them. The node hosting the VIP will open a tunnel - for any host in the specific network that can properly authenticate. This - makes the configuration simpler, allows for easier scaling, and assists - deployers to securely communicate with the Virtual IP from hosts - or services that are not necessarily managed by TripleO. - -Authentication is currently done via a Pre-Shared Key (PSK) which all the nodes -share. However, future iterations will add more authentication methods to the -deployment. - -Currently, the default encryption method is AES using GCM with a block size of -128 bits. Changing this default will be talked about in a further section. - -To handle the moving of a Virtual IP from one node to another (VIP failover), -we also deploy a pacemaker resource agent per VIP. This resource agent is in -charge of creating the tunnel when the VIP is set in a certain node, and -removing the tunnel when it moves to another node. - -.. note:: One important thing to note is that we set tunnels for every network - except the control plane network. The reason for this is that in our - testing, setting up tunnels for this network cuts of the - communication between the overcloud nodes and the undercloud. We thus - rely on the fact that Ansible uses SSH to communicate with the - overcloud nodes, thus, still giving the deployment secure - communications. - -Deployment ----------- - -.. note:: Please note that the IPSec deployment depends on Ansible being used - for the overcloud deployment. For more information on this, please - see :doc:`../deployment/ansible_config_download` - -.. note:: Also note that the IPSec deployment assumes that you're using network - isolation. For more information on this, please see - :doc:`network_isolation` - -To enable IPSec tunnels for the overcloud, you need to use the following -environment file:: - - /usr/share/openstack-tripleo-heat-templates/environments/ipsec.yaml - -With this, your deployment command will be similar to this:: - - openstack overcloud deploy \ - ... - -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ - -e /home/stack/templates/network-environment.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/ipsec.yaml - -To change the default encryption algorithm, you can use an environment file -that looks as follows:: - - parameter_defaults: - IpsecVars: - ipsec_algorithm: 'aes_gcm256-null' - -The ``IpsecVars`` option is able to change any parameter in the tripleo-ipsec -ansible role. - -.. note:: For more information on the algorithms that Libreswan supports, - please check the `Libreswan documentation`_ - -.. note:: For more information on the available parameters, check the README - file in the `tripleo-ipsec repository`_. - - -Verification ------------- - -To verify that the IPSec tunnels were setup correctly after the overcloud -deployment is done, you'll need to do several things: - -* Log into each node - -* In each node, check the output of ``ipsec status`` with sudo or root - privileges. This will show you the status of all the tunnels that are set up - in the node. - - - The line starting with "Total IPsec connections" should show - that there are active connections. - - The Security Associations should be all authenticated:: - - 000 IKE SAs: total(23), half-open(0), open(0), authenticated(23), anonymous(0) - 000 IPsec SAs: total(37), authenticated(37), anonymous(0) - - Note that this number will vary depending on the number of networks and - nodes you have. - -* The configuration files generated can be found in the ``/etc/ipsec.d`` - directory. - - - They conveniently all start with the prefix **overcloud-** and - you could list them with the following command:: - - ls /etc/ipsec.d/overcloud-*.conf - - - The PSKs can be found with the following command:: - - ls /etc/ipsec.d/overcloud-*.secrets - - - You can find the connection names from the ``*.conf`` files. - - - To view the status of a certain connection, you can use the aforementioned - ``ipsec status`` command, and filter the result, searching for the specific - connection name. For instance, in the node that's hosting the Internal API - VIP, you can view the status of the tunnels for that VIP with the following - command:: - - ipsec status | grep overcloud-internal_api-vip-tunnel - -* To view the status of the resource agents, you can use ``pcs status``. - - - The IPSEC-related agents will have a name with the **tripleo-ipsec** - prefix. - - - Note that the resource agents for the tunnels are collocated with the IP - resource agents. This is enforced through a collocation rule in pacemaker. - You can verify this by running the ``pcs constraint`` command. - -.. note:: To get further explanations for understanding the output of the - ``ipsec status`` command, you can read the `Libreswan wiki entry on - the subject`_. - -.. References - -.. _Libreswan: https://libreswan.org/ -.. _Libreswan documentation: https://libreswan.org/man/ipsec.conf.5.html -.. _Libreswan wiki entry on the subject: https://libreswan.org/wiki/How_to_read_status_output -.. _tripleo-ipsec repository: https://github.com/openstack/tripleo-ipsec/blob/master/README.md diff --git a/deploy-guide/source/features/keystone_security_compliance.rst b/deploy-guide/source/features/keystone_security_compliance.rst deleted file mode 100644 index 90c6f057..00000000 --- a/deploy-guide/source/features/keystone_security_compliance.rst +++ /dev/null @@ -1,50 +0,0 @@ -Keystone Security Compliance -============================ - -Keystone has several configuration options available in order to comply with -standards such as Payment Card Industry - Data Security Standard (PCI-DSS) -v3.1. - -TripleO exposes these features via Heat parameters. They will be listed below: - -* ``KeystoneChangePasswordUponFirstUse``: Enabling this option requires users - to change their password when the user is created, or upon administrative - reset. - -* ``KeystoneDisableUserAccountDaysInactive``: The maximum number of days a user - can go without authenticating before being considered "inactive" and - automatically disabled (locked). - -* ``KeystoneLockoutDuration``: The number of seconds a user account will be - locked when the maximum number of failed authentication attempts (as - specified by ``KeystoneLockoutFailureAttempts``) is exceeded. - -* ``KeystoneLockoutFailureAttempts``: The maximum number of times that a user - can fail to authenticate before the user account is locked for the number of - seconds specified by ``KeystoneLockoutDuration``. - -* ``KeystoneMinimumPasswordAge``: The number of days that a password must be - used before the user can change it. This prevents users from changing their - passwords immediately in order to wipe out their password history and reuse - an old password. - -* ``KeystonePasswordExpiresDays``: The number of days for which a password will - be considered valid before requiring it to be changed. - -* ``KeystonePasswordRegex``: The regular expression used to validate password - strength requirements. - -* ``KeystonePasswordRegexDescription``: Describe your password regular - expression here in language for humans. - -* ``KeystoneUniqueLastPasswordCount``: This controls the number of previous - user password iterations to keep in history, in order to enforce that newly - created passwords are unique. - -.. note:: All of the aforementioned options only apply to the SQL backend. For - other identity backends like LDAP, these configuration settings - should be applied on that backend's side. - -.. note:: All of these parameters are defined as type ``string`` in heat. As - per the implementation, if left unset, they will not be configured at - all in the keystone configuration. diff --git a/deploy-guide/source/features/lvmfilter.rst b/deploy-guide/source/features/lvmfilter.rst deleted file mode 100644 index 19c07bbf..00000000 --- a/deploy-guide/source/features/lvmfilter.rst +++ /dev/null @@ -1,38 +0,0 @@ -Enable LVM2 filtering on overcloud nodes -======================================== - -While by default the overcloud image will not use LVM2 volumes, it is -possible that with some Cinder backends, for example remote iSCSI or FC, -the remote LUNs hosting OpenStack volumes will be visible on the nodes -hosting cinder-volume or nova-compute containers. - -In that case, should the OpenStack guest create LVM2 volumes inside its -additional disks, those volumes will be scanned by the LVM2 tools -installed on the hosting node. - -To prevent that, it is possible to configure an LVM2 global_filter when -deploying or updating the overcloud. The feature is, by default, disabled -and can be enabled passing `LVMFilterEnabled: true` in a Heat environment -file. - -When enabled, a global_filter will be computed from the list of physical -devices hosting active LVM2 volumes. This list can be extended further, -manually, listing any additional block device via `LVMFilterAllowlist` -parameter, which supports regexp. A deny list can be configured as well, -via `LVMFilterDenylist` parameter; it defaults to ['.*'] so that any -block device which isn't in the allow list will be ignored by the LVM2 -tools by default. - -Any of the template parameters can be set per-role; for example, to enable -the feature only on Compute nodes and add `/dev/sdb` to the deny list use:: - - $ cat ~/environment.yaml - parameter_defaults: - ComputeParameters: - LVMFilterEnabled: true - LVMFilterDenylist: - - /dev/sdb - -Then add the following argument to your `openstack overcloud deploy` command:: - - -e environment.yaml diff --git a/deploy-guide/source/features/multiple_overclouds.rst b/deploy-guide/source/features/multiple_overclouds.rst deleted file mode 100644 index 0229e9aa..00000000 --- a/deploy-guide/source/features/multiple_overclouds.rst +++ /dev/null @@ -1,132 +0,0 @@ -Multiple Overclouds from a Single Undercloud -============================================ - -TripleO can be used to deploy multiple Overclouds from a single Undercloud -node. - -In this scenario, a single Undercloud deploys and manages multiple Overclouds -as unique Heat stacks, with no stack resources shared between them. This can -be useful for environments where having a 1:1 ratio of Underclouds and -Overclouds creates an unmanageable amount of overhead, such as edge cloud -deployments. - -Requirements ------------- - -All Overclouds must be deployed in the same tenant (admin) on the Undercloud. -If using Ironic for baremetal provisioning, all Overclouds must be on the same -provisioning network. - - -Undercloud Deployment ---------------------- - -Deploy the Undercloud :doc:`as usual <../deployment/install_undercloud>`. - -First Overcloud ---------------- - -The first Overcloud can be deployed as usual using the :doc:`cli <../deployment/install_overcloud>`. - -Deploying Additional Overclouds -------------------------------- - -Additional Overclouds can be deployed by specifying a new stack name and any -necessary parameters in a new deployment plan. Networks for additional -overclouds must be defined as :doc:`custom networks <./custom_networks>` -with ``name_lower`` and ``service_net_map_replace`` directives for each -overcloud to have unique networks in the resulting stack. - -If your first cloud was named ``overcloud`` and had the following -``network_data.yaml``:: - - cat overcloud/network_data.yaml - - name: InternalApi - name_lower: internal_api_cloud_1 - service_net_map_replace: internal_api - vip: true - vlan: 201 - ip_subnet: '172.17.0.0/24' - allocation_pools: [{'start': '172.17.0.4', 'end': '172.17.0.250'}] - -You would create a new ``network_data.yaml`` with unique ``name_lower`` values -and VLANs for each network, making sure to specify ``service_net_map_replace``:: - - cat overcloud-two/network_data.yaml - - name: InternalApi - name_lower: internal_api_cloud_2 - service_net_map_replace: internal_api - vip: true - vlan: 301 - ip_subnet: '172.21.0.0/24' - allocation_pools: [{'start': '172.21.0.4', 'end': '172.21.0.250'}] - -Then deploy the second Overcloud as:: - - openstack overcloud deploy --templates ~/overcloud-two/templates/ \ - --stack overcloud-two \ - -n ~/overcloud-two/network_data.yaml - - -Managing Heat Templates ------------------------ - -If the Heat templates will be customized for any of the deployed clouds -(undercloud, or any overclouds) they should be copied from -/usr/share/openstack-tripleo-heat-templates to a new location before being -modified. Then the location would be specified to the deploy command using -the --templates flag. - -The templates could be managed using separate directories for each deployed -cloud:: - - ~stack/undercloud-templates - ~stack/overcloud-templates - ~stack/overcloud-two-templates - -Or by creating a repository in a version control system for the templates -and making a branch for each deployment. For example, using git:: - - ~stack/tripleo-heat-templates $ git branch - * master - undercloud - overcloud - overcloud-two - -To deploy to a specific cloud, ensure you are using the correct branch first:: - - cd ~stack/tripleo-heat-templates ;\ - git checkout overcloud-two ;\ - openstack overcloud deploy --templates ~stack/tripleo-heat-templates --stack overcloud-two -e $ENV_FILES - -Using Pre-Provisioned Nodes ---------------------------- - -Deploying multiple overclouds with the Ironic baremetal installer currently -requires a shared provisioning network. If this is not possible, you may use -the :ref:`Deployed Servers ` method with routed networks. Ensure that the values -in the ``HostnameMap`` match the stack name being used for each Overcloud. - -For example: -``hostnamemap.yaml`` for stack ``overcloud``:: - - parameter_defaults: - HostnameMap: - overcloud-controller-0: controller-00-rack01 - overcloud-controller-1: controller-01-rack02 - overcloud-controller-2: controller-02-rack03 - overcloud-novacompute-0: compute-00-rack01 - overcloud-novacompute-1: compute-01-rack01 - overcloud-novacompute-2: compute-02-rack01 - - -``hostnamemap.yaml`` for stack ``overcloud-two``:: - - parameter_defaults: - HostnameMap: - overcloud-two-controller-0: controller-00-rack01 - overcloud-two-controller-1: controller-01-rack02 - overcloud-two-controller-2: controller-02-rack03 - overcloud-two-novacompute-0: compute-00-rack01 - overcloud-two-novacompute-1: compute-01-rack01 - overcloud-two-novacompute-2: compute-02-rack01 diff --git a/deploy-guide/source/features/network_isolation.rst b/deploy-guide/source/features/network_isolation.rst deleted file mode 100644 index 9a6c5a40..00000000 --- a/deploy-guide/source/features/network_isolation.rst +++ /dev/null @@ -1,1085 +0,0 @@ -.. _network_isolation: - -Configuring Network Isolation -============================= - -Introduction ------------- - -|project| provides configuration of isolated overcloud networks. Using -this approach it is possible to host traffic for specific types of network -traffic (tenants, storage, API/RPC, etc.) in isolated networks. This allows -for assigning network traffic to specific network interfaces or bonds. Using -bonds provides fault tolerance, and may provide load sharing, depending on the -bonding protocols used. When isolated networks are configured, the OpenStack -services will be configured to use the isolated networks. If no isolated -networks are configured, all services run on the provisioning network. - -There are two parts to the network configuration: the parameters that apply -to the network as a whole, and the templates which configure the network -interfaces on the deployed hosts. - -Architecture ------------- - -The following VLANs will be used in the final deployment: - -* IPMI* (IPMI System controller, iLO, DRAC) -* Provisioning* (Undercloud control plane for deployment and management) -* Internal API (OpenStack internal API, RPC, and DB) -* Tenant (Tenant tunneling network for GRE/VXLAN networks) -* Storage (Access to storage resources from Compute and Controller nodes) -* Storage Management (Replication, Ceph back-end services) -* External (Public OpenStack APIs, Horizon dashboard, optionally floating IPs) -* Floating IP (Optional, can be combined with External) - -.. note:: - Networks marked with '*' are usually native VLANs, others may be trunked. - -The External network should have a gateway router address. This will be used -in the subnet configuration of the network environment. - -If floating IPs will be hosted on a separate VLAN from External, that VLAN will -need to be trunked to the controller hosts. It will not be included in the -network configuration steps for the deployment, the VLAN will be added via -Neutron and Open vSwitch. There can be multiple floating IP networks, and they -can be attached to multiple bridges. The VLANs will be trunked, but not -configured as interfaces. Instead, Neutron will create an OVS port with the -VLAN segmentation ID on the chosen bridge for each floating IP network. - -The Provisioning network will usually be delivered on a dedicated interface. -DHCP+PXE is used to initially deploy, then the IP will be converted to static. -By default, PXE boot must occur on the native VLAN, although some system -controllers will allow booting from a VLAN. The Provisioning interface is -also used by the Compute and Storage nodes as their default gateway, in order -to contact DNS, NTP, and for system maintenance. The Undercloud can be used -as a default gateway, but in that case all traffic will be behind an IP -masquerade NAT, and will not be reachable from the rest of the network. The -Undercloud is also a single point of failure for the overcloud default route. -If there is an external gateway on a router device on the Provisioning network, -the Undercloud Neutron DHCP server can offer that instead. If the -``network_gateway`` was not set properly in undercloud.conf, it can be set -manually after installing the Undercloud:: - - neutron subnet-show # Copy the UUID from the provisioning subnet - neutron subnet-update --gateway_ip - -Often, the number of VLANs will exceed the number of physical Ethernet ports, -so some VLANs are delivered with VLAN tagging to separate the traffic. On an -Ethernet bond, typically all VLANs are trunked, and there is no traffic on the -native VLAN (native VLANs on bonds are supported, but will require customizing -the NIC templates). - -.. note:: - It is recommended to deploy a Tenant VLAN (which is used for tunneling GRE - and/or VXLAN) even if Neutron VLAN mode is chosen and tunneling is disabled - at deployment time. This requires the least customization at deployment time, - and leaves the option available to use tunnel networks as utility networks, - or for network function virtualization in the future. Tenant networks will - still be created using VLANs, but the operator can create VXLAN tunnels for - special use networks without consuming tenant VLANs. It is possible to add - VXLAN capability to a deployment with a Tenant VLAN, but it is not possible - to add a Tenant VLAN to an already deployed set of hosts without disruption. - -The networks are connected to the roles as follows: - -Controller: - -* Provisioning -* Internal API -* Storage -* Storage Management -* Tenant -* External - -Compute: - -* Provisioning -* Internal API -* Storage -* Tenant - -Ceph Storage: - -* Provisioning -* Storage -* Storage Management - -Cinder Storage: - -* Provisioning -* Internal API -* Storage -* Storage Management - -Swift Storage: - -* Provisioning -* Internal API -* Storage -* Storage Management - -Workflow --------- - -The procedure for enabling network isolation is this: - -#. Create and edit network data YAML definition file for the cluster -#. Use the network data YAML definition file as input to create network - resources and generate the networks-deployed-environment.yaml - environment file -#. Generate templates from Jinja2 -#. Create network environment overrides file (e.g. ~/network-environment-overrides.yaml) -#. Make a copy of the appropriate sample network interface configurations -#. Edit the network interface configurations to match local environment -#. Deploy overcloud with the proper parameters to include network isolation - -.. admonition:: Victoria and prior releases - - For Victoria and earlier releases the procedure is: - - #. Create and edit network data YAML definition file for the cluster - #. Generate templates from Jinja2 - #. Create network environment overrides file (e.g. ~/network-environment-overrides.yaml) - #. Make a copy of the appropriate sample network interface configurations - #. Edit the network interface configurations to match local environment - #. Deploy overcloud with the proper parameters to include network isolation - -The next section will walk through the elements that need to be added to -the network-environment.yaml to enable network isolation. The sections -after that deal with configuring the network interface templates. The final step -will deploy the overcloud with network isolation and a custom environment. - -Create and Edit network data YAML definition file -------------------------------------------------- - -Use the network-data-samples_ in tripleo-heat-templates_ as a reference and -customize the networks, IP addressing, VLANs, etc., as per the cluster -requirements. - -Please refer to the :ref:`network_definition_opts` reference section on the -:ref:`custom_networks` document page for a reference on available options in -the network data YAML schema. - -.. admonition:: Victoria and prior releases - - Copy the default ``network_data.yaml`` file and customize the networks, IP - subnets, VLANs, etc., as per the cluster requirements: - -.. code-block:: bash - - $ cp /usr/share/openstack-tripleo-heat-templates/network_data.yaml ~/templates/network_data.yaml - -Create the networks, segments and subnet resources on the Undercloud --------------------------------------------------------------------- - -.. admonition:: Victoria and prior releases - - For Victoria and prior releases the network resources are created as part of - the overcloud heat stack. This step is not valid for these releases. - -Run the "openstack overcloud network provision" command to create/update the -networks on the Undercloud. This command will also generate the -``networks-deployed-environment.yaml`` environment file which must be used -when deploying the overcloud. - -.. code-block:: bash - - $ openstack overcloud network provision \ - --output ~/templates/networks-deployed-environment.yaml \ - ~/templates/custom_network_data.yaml - -.. note:: This step is optional when using the ``--baremetal-deployment`` and - ``--vip-data`` options with the ``overcloud deploy`` command. The - deploy command will detect the new format of the network data YAML - definition, run the workflow to create the networks and include the - ``networks-deployed-environment.yaml`` automatically. - -Create and Edit network Virtual IPs YAML definition file --------------------------------------------------------- - -.. admonition:: Victoria and prior releases - - For Victoria and prior releases the Virtual IP resources are created as part - of the overcloud heat stack. This step is not valid for these releases. - -Use the vip-data-samples_ in tripleo-heat-templates_ as a reference and -customize the networks, subnet, fixed_ips, dns_names etc., as per the cluster -requirements. - -Please refer to the :ref:`virtual_ips_definition_opts` reference section on the -:ref:`custom_networks` document page for a reference on available options in -the network Virtual IPs data YAML schema. - -The below example show a Virtual IPs definition for the default -network-isolation isolation scenario. - -.. code-block:: yaml - - - network: ctlplane - dns_name: overcloud - - network: external - dns_name: overcloud - - network: internal_api - dns_name: overcloud - - network: storage - dns_name: overcloud - - network: storage_mgmt - dns_name: overcloud - -Create the overcloud network Virtual IPs on the Undercloud ----------------------------------------------------------- - -.. admonition:: Victoria and prior releases - - For Victoria and prior releases the Virtual IP resources are created as part - of the overcloud heat stack. This step is not valid for these releases. - -Run the "openstack overcloud network vip provision" command to create/update -the network Virtual IPs on the Undercloud. This command will also generate the -``vips-deployed-environment.yaml`` environment file which must be used when -deploying the overcloud. - -.. code-block:: bash - - $ openstack overcloud network vip provision \ - --output ~/templates/vips-deployed-environment.yaml \ - ~/templates/custom_vip_data.yaml - -.. note:: This step is optional if using the ``--vip-data`` options with the - ``overcloud deploy`` command. In that case workflow to create the - Virtual IPs and including the environment is automated. - -Generate Templates from Jinja2 ------------------------------- - -With the Queens cycle, the network configuration templates have been converted to -Jinja2 templates, so that templates can be generated for each role with -customized network data. A utility script is available to generate the -templates based on the provided ``roles_data.yaml`` and ``network_data.yaml`` -inputs. - -Before generating the templates, ensure that the ``roles_data.yaml`` is -generated as per the cluster requirements using the command:: - - $ openstack overcloud roles generate -o ~/templates/roles_data.yaml Controller Compute \ - BlockStorage ObjectStorage CephStorage - -.. note:: - If the default ``roles_data.yaml`` or ``network_data.yaml`` file suits the - needs of the cluster, then there is no need to generate/customize the files, - the default files can be used as is for generating the templates. - -To generate the templates, run:: - - $ /usr/share/openstack-tripleo-heat-templates/tools/process-templates.py \ - -p /usr/share/openstack-tripleo-heat-templates \ - -r ~/templates/roles_data.yaml \ - -n ~/templates/network_data.yaml \ - -o ~/generated-openstack-tripleo-heat-templates --safe - -Now the temporary directory ``~/generated-openstack-tripleo-heat-templates`` -contains the generated template files according to provided role and network -data. Copy the required templates to a user specific template directory -``~/templates`` to modify the content to suit the cluster needs. Some of the -specific use of generated templates are explained by some of the below -sections. - -Create Network Environment Overrides File ------------------------------------------ - -The environment file will describe the network environment and will point to -the network interface configuration files to use for the overcloud nodes. - -Earlier method of generating network interface configurations with heat has -been deprecated since victoria. To use a custom network configuration copy -an appropriate sample network interface configuration file from -`tripleo-ansible `_ and make necessary changes. - -Then copy the generated -``net-single-nic-with-vlans.yaml`` file to apply the required cluster specific -changes, which overrides the defaults:: - - $ cp ~/generated-openstack-tripleo-heat-templates/environments/net-single-nic-with-vlans.yaml \ - ~/templates/network-environment-overrides.yaml - -Add any other parameters which should be overridden from the defaults to this -environment file. It is important for the ``ExternalInterfaceDefaultRoute`` to -be reachable on the subnet that is used for ``ExternalNetCidr``. This will -allow the OpenStack Public APIs and the Horizon Dashboard to be reachable. -Without a valid default route, the post-deployment steps cannot be performed. - -.. note:: - - The ``parameter_defaults`` section of the ``network-environment-overrides.yaml`` - contains pointers to the network interface configuration files for the deployed - roles. These files must exist at the path referenced here. - -Example:: - - parameter_defaults: - ControllerNetworkConfigTemplate: 'templates/single_nic_vlans/single_nic_vlans.j2' - ComputeNetworkConfigTemplate: 'templates/single_nic_vlans/single_nic_vlans.j2' - BlockStorageNetworkConfigTemplate: 'templates/single_nic_vlans/single_nic_vlans_storage.j2' - - # May set to br-ex if using floating IPs only on native VLAN on bridge br-ex - NeutronExternalNetworkBridge: "''" - NeutronNetworkType: 'vxlan,vlan' - NeutronTunnelTypes: 'vxlan' - # Customize bonding options if required (ignored if bonds are not used) - BondInterfaceOvsOptions: "lacp=active other-config:lacp-fallback-ab=true" - - -Users can still use the old network interface configuration heat templates -for custom network configuration. Set ``NetworkConfigWithAnsible`` parameter -to ``false`` to use them:: - - parameter_defaults: - NetworkConfigWithAnsible: false - - -Configure IP Subnets --------------------- -Each environment will have its own IP subnets for each network. This will vary -by deployment, and should be tailored to the environment. We will set the -subnet information for all the networks inside our environment file. Each -subnet will have a range of IP addresses that will be used for assigning IP -addresses to hosts and virtual IPs. - -In the example above, the Allocation Pool for the Internal API network starts -at .10 and continues to .200. This results in the static IPs and virtual IPs -that are assigned starting at .10, and will be assigned upwards with .200 being -the highest assigned IP. The External network hosts the Horizon dashboard and -the OpenStack public API. If the External network will be used for both cloud -administration and floating IPs, we need to make sure there is room for a pool -of IPs to use as floating IPs for VM instances. Alternately, the floating IPs -can be placed on a separate VLAN (which is configured by the operator -post-deployment). - -Configure Bonding Options ------------------------------------ - -The example bonding options will try to negotiate LACP, but will fallback to -active-backup if LACP cannot be established:: - - BondInterfaceOvsOptions: - "lacp=active other-config:lacp-fallback-ab=true" - -The BondInterfaceOvsOptions parameter will pass the options to Open vSwitch -when setting up bonding (if used in the environment). The value above will -enable fault-tolerance and load balancing if the switch supports (and is -configured to use) LACP bonding. If LACP cannot be established, the bond will -fallback to active/backup mode, with fault tolerance, but where only one link -in the bond will be used at a time. - -If the switches do not support LACP, then do not configure a bond on the -upstream switch. Instead, OVS can use ``balance-slb`` mode to enable using -two interfaces on the same VLAN as a bond:: - - # Use balance-slb for bonds configured on a switch without LACP support - "bond_mode=balance-slb lacp=off" - -Bonding with balance-slb allows a limited form of load balancing without the -remote switch's knowledge or cooperation. The basics of SLB are simple. SLB -assigns each source MAC+VLAN pair to a link and transmits all packets -from that MAC+VLAN through that link. Learning in the remote switch causes it -to send packets to that MAC+VLAN through the same link. - -OVS will balance traffic based on source MAC and destination VLAN. The -switch will only see a given MAC address on one link in the bond at a time, and -OVS will use special filtering to prevent packet duplication across the links. - -In addition, the following options may be added to the options string to tune -the bond:: - - # Force bond to use active-backup, e.g. for connecting to 2 different switches - "bond_mode=active-backup" - - # Set the LACP heartbeat to 1 second or 30 seconds (default) - "other_config:lacp-time=[fast|slow]" - - # Set the link detection to use miimon heartbeats or monitor carrier (default) - "other_config:bond-detect-mode=[miimon|carrier]" - - # If using miimon, heartbeat interval in milliseconds (100 is usually good) - "other_config:bond-miimon-interval=100" - - # Number of milliseconds a link must be up to be activated (to prevent flapping) - "other_config:bond_updelay=1000" - - # Milliseconds between rebalancing flows between bond members, zero to disable - "other_config:bond-rebalance-interval=10000" - -.. _creating_custom_interface_templates: - -Creating Custom Interface Templates ------------------------------------ - -In order to configure the network interfaces on each node, the network -interface templates may need to be customized. - -Start by copying the existing templates in `tripleo-ansible `_. -The first example copies the templates which include network bonding. The second -example copies the templates which use a single network interface with multiple -VLANs (this configuration is mostly intended for testing). - -.. _tripleo_ansible: https://opendev.org/openstack/tripleo-ansible/src/branch/master/tripleo_ansible/roles/tripleo_network_config/templates - -To copy the bonded example interface configurations, run:: - - $ cp /usr/share/ansible/roles/tripleo_network_config/templates/bonds_vlans/* \ - ~/templates/nic-configs - -To copy the single NIC with VLANs example interface configurations, run:: - - $ cp /usr/share/ansible/roles/tripleo_network_config/templates/single_nic_vlans/* \ - ~/templates/nic-configs - -Or, if you have custom NIC templates from another source, copy them to the -location referenced in the ``parameter_defaults`` section of the environment -file. - -Customizing the Interface Templates ------------------------------------ - -The following example configures a bond on interfaces 3 and 4 of a system -with 4 interfaces. This example is based on the controller template from the -bond-with-vlans sample templates, but the bond has been placed on nic3 and nic4 -instead of nic2 and nic3. The other roles will have a similar configuration, -but will have only a subset of the networks attached. - -.. note:: - The nic1, nic2... abstraction considers only network interfaces which are - connected to an Ethernet switch. If interfaces 1 and 4 are the only - interfaces which are plugged in, they will be referred to as nic1 and nic2. - -Example:: - - --- - {% set mtu_list = [ctlplane_mtu] %} - {% for network in role_networks %} - {{ mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) }} - {%- endfor %} - {% set min_viable_mtu = mtu_list | max %} - network_config: - - type: interface - name: nic1 - mtu: {{ ctlplane_mtu }} - use_dhcp: false - addresses: - - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_subnet_cidr }} - routes: {{ ctlplane_host_routes }} - - type: ovs_bridge - name: {{ neutron_physical_bridge_name }} - dns_servers: {{ ctlplane_dns_nameservers }} - domain: {{ dns_search_domains }} - members: - - type: ovs_bond - name: bond1 - mtu: {{ min_viable_mtu }} - ovs_options: {{ bond_interface_ovs_options }} - members: - - type: interface - name: nic3 - mtu: {{ min_viable_mtu }} - primary: true - - type: interface - name: nic4 - mtu: {{ min_viable_mtu }} - {% for network in role_networks %} - - type: vlan - mtu: {{ lookup('vars', networks_lower[network] ~ '_mtu') }} - vlan_id: {{ lookup('vars', networks_lower[network] ~ '_vlan_id') }} - addresses: - - ip_netmask: {{ lookup('vars', networks_lower[network] ~ '_ip') }}/{{ lookup('vars', networks_lower[network] ~ '_cidr') }} - routes: {{ lookup('vars', networks_lower[network] ~ '_host_routes') }} - {%- endfor %} - -.. note:: - If you are using old heat network interface configuration templates from - versions prior to Victoria, either migrate them to new format and update - the environments accordingly, for them to be used with ansible interface - or update them to use ``OS::Heat::Value`` resource. - -.. _migrating_existing_network_interface_templates: - -Migrating existing Network Interface Configuration Templates ------------------------------------------------------------- - -Below outlines some guidelines on how to migrate the old heat net configs -to the new format consumed by ansible. - -#. Create a Jinja2 template using `os-net-config `_ - schema. You can also use one of the in-tree `examples `_ - or a copy of `/etc/os-net-config/config.json` (converted to yaml) from - an existing node (per role) as a start. -#. Use `role_networks` and `networks_lower` ansible vars to loop through - available networks for a role and their lowercase names. -#. Use Jinja2 filters to replace heat intrinsic functions. For example - `min_viable_mtu` can be calculated with:: - - {% set mtu_list = [ctlplane_mtu] %} - {% for network in role_networks %} - {{ mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) }} - {%- endfor %} - {% set min_viable_mtu = mtu_list | max %} - -#. Heat parameters used with `get_param` can be mapped to ansible vars as per - below mapping. Host routes are pre-merged and are available as - `ctlplane_host_routes` and `networks_lower[network] ~ '_host_routes'` - ansible vars and can be used directly. - -#. Any custom heat parameter used, already not available as ansible var has to - be passed using `{{role.name}}ExtraGroupVars` THT interface and can then be - used in the templates. For example, `StorageSupernet` parameter has to be - passed as below:: - - parameter_defaults: - ControllerExtraGroupVars: - storage_supernet: 172.16.0.0/16 - -.. table:: **Heat parameters to Ansible vars Mapping** - - ======================================= ================================================================================================================ - Heat Parameters Ansible Vars - ======================================= ================================================================================================================ - BondInterfaceOvsOptions {{ bond_interface_ovs_options }} - ControlPlaneIp {{ ctlplane_ip }} - ControlPlaneSubnetCidr {{ ctlplane_subnet_cidr }} - ControlPlaneDefaultRoute {{ ctlplane_gateway_ip }} - ControlPlaneStaticRoutes {{ ctlplane_host_routes }} - ControlPlaneMtu {{ ctlplane_mtu }} - DnsServers {{ ctlplane_dns_nameservers }} - DnsSearchDomains {{ dns_search_domains }} - NumDpdkInterfaceRxQueues {{ num_dpdk_interface_rx_queues }} - {{network.name}}IpSubnet {{ lookup('vars', networks_lower[network] ~ '_ip') }}/{{ lookup('vars', networks_lower[network] ~ '_cidr') }} - {{network.name}}NetworkVlanID {{ lookup('vars', networks_lower[network] ~ '_vlan_id') }} - {{network.name}}Mtu {{ lookup('vars', networks_lower[network] ~ '_mtu') }} - {{network.name}}InterfaceDefaultRoute {{ lookup('vars', networks_lower[network] ~ '_gateway_ip') }} - {{network.name}}InterfaceRoutes {{ lookup('vars', networks_lower[network] ~ '_host_routes') }} - ======================================= ================================================================================================================ - - -.. _os_net_config_schema: https://opendev.org/openstack/os-net-config/src/branch/master/os_net_config/schema.yaml -.. _config_ex: https://opendev.org/openstack/tripleo-ansible/src/branch/master/tripleo_ansible/roles/tripleo_network_config/templates - -Updating Existing Network Interface Configuration Templates ------------------------------------------------------------ - -Prior to Victoria release the network interface configuration files -used ``OS::Heat::SoftwareConfig`` resource to configure interfaces:: - - resources: - OsNetConfigImpl: - type: OS::Heat::SoftwareConfig - properties: - group: script - config: - str_replace: - template: - get_file: /usr/share/openstack-tripleo-heat-templates/network/scripts/run-os-net-config.sh - params: - $network_config: - network_config: - [NETWORK INTERFACE CONFIGURATION HERE] - -These templates are now expected to use ``OS::Heat::Value`` resource:: - - resources: - OsNetConfigImpl: - type: OS::Heat::Value - properties: - value: - network_config: - [NETWORK INTERFACE CONFIGURATION HERE] - outputs: - config: - value: get_attr[OsNetConfigImpl, value] - - - -Old network interface configuration heat templates can be converted using -the provided conversion `convert-nic-config.py `_ script. - -.. _convert_nic_config: https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/tools/convert_nic_config.py - - -Prior to the Ocata release, the network interface configuration files used -a different mechanism for running os-net-config. Ocata introduced the -run-os-net-config.sh script, and the old mechanism was deprecated. The -deprecated mechanism was removed in Queens, so older templates must be -updated. The resource definition must be changed, and {get_input: bridge_name} is -replaced with the special token "bridge_name", which will be replaced with -the value of the NeutronPhysicalBridge. - -Old Header:: - - resources: - OsNetConfigImpl: - type: OS::Heat::StructuredConfig - properties: - group: os-apply-config - config: - os_net_config: - network_config: - [NETWORK INTERFACE CONFIGURATION HERE] - -New Header:: - - resources: - OsNetConfigImpl: - type: OS::Heat::Value - properties: - value: - network_config: - [NETWORK INTERFACE CONFIGURATION HERE] - -Old Bridge Definition:: - - - type: ovs_bridge - name: {get_input: bridge_name} - -New Bridge Definition:: - - - type: ovs_bridge - name: bridge_name - -Configuring Interfaces ----------------------- -The individual interfaces may need to be modified. As an example, below are -the modifications that would be required to use the second NIC to connect to -an infrastructure network with DHCP addresses, and to use the third and fourth -NICs for the bond: - -Example:: - - network_config: - - type: interface - name: nic2 - mtu: {{ ctlplane_mtu }} - use_dhcp: true - defroute: no - - type: ovs_bridge - name: {{ neutron_physical_bridge_name }} - members: - - type: ovs_bond - name: bond1 - mtu: {{ min_viable_mtu }} - ovs_options: {{ bound_interface_ovs_options }} - members: - - type: interface - name: nic3 - mtu: {{ min_viable_mtu }} - primary: true - - type: interface - name: nic4 - mtu: {{ min_viable_mtu }} - -When using numbered interfaces ("nic1", "nic2", etc.) instead of named -interfaces ("eth0", "eno2", etc.), the network interfaces of hosts within -a role do not have to be exactly the same. For instance, one host may have -interfaces em1 and em2, while another has eno1 and eno2, but both hosts' NICs -can be referred to as nic1 and nic2. - -The numbered NIC scheme only takes into account the interfaces that are live -(have a cable attached to the switch). So if you have some hosts with 4 -interfaces, and some with 6, you should use nic1-nic4 and only plug in 4 -cables on each host. - -Configuring Routes and Default Routes -------------------------------------- -There are two ways that a host may have its default routes set. If the interface -is using DHCP, and the DHCP server offers a gateway address, the system will -install a default route for that gateway. Otherwise, a default route may be set -manually on an interface with a static IP. - -Although the Linux kernel supports multiple default gateways, it will only use -the one with the lowest metric. If there are multiple DHCP interfaces, this can -result in an unpredictable default gateway. In this case, it is recommended that -defroute=no be set for the interfaces other than the one where we want the -default route. In this case, we want a DHCP interface (NIC 2) to be the default -route (rather than the Provisioning interface), so we disable the default route -on the provisioning interface (note that the defroute parameter only applies -to routes learned via DHCP): - -Example:: - - network_config: - - type: interface - name: nic1 - use_dhcp: true - defroute: no - - type: interface - name: nic2 - use_dhcp: true - -To set a static route on an interface with a static IP, specify a route to the -subnet. For instance, here is a hypothetical route to the 10.1.2.0/24 subnet -via the gateway at 172.17.0.1 on the Internal API network: - -Example:: - - - type: vlan - device: bond1 - vlan_id: {{ internal_api_vlan_id }} - addresses: - - ip_netmask: {{ internal_api_ip ~ '/' ~ internal_api_cidr }} - routes: - - ip_netmask: 10.1.2.0/24 - next_hop: 172.17.0.1 - - -Using a Dedicated Interface For Tenant VLANs --------------------------------------------- -When using a dedicated interface or bond for tenant VLANs, a bridge must be -created. Neutron will create OVS ports on that bridge with the VLAN tags for the -provider VLANs. For example, to use NIC 4 as a dedicated interface for tenant -VLANs, you would add the following to the Controller and Compute templates: - -Example:: - - - type: ovs_bridge - name: br-vlan - members: - - type: interface - name: nic4 - primary: true - -A similar configuration may be used to define an interface or a bridge that -will be used for Provider VLANs. Provider VLANs are external networks which -are connected directly to the Compute hosts. VMs may be attached directly to -Provider networks to provide access to datacenter resources outside the cloud. - -Using the Native VLAN for Floating IPs --------------------------------------- -By default, Neutron is configured with an empty string for the Neutron external -bridge mapping. This results in the physical interface being patched to br-int, -rather than using br-ex directly (as in previous versions). This model allows -for multiple floating IP networks, using either VLANs or multiple physical -connections. - -Example:: - - parameter_defaults: - # May set to br-ex if using floating IPs only on native VLAN on bridge br-ex - NeutronExternalNetworkBridge: "''" - -When using only one floating IP network on the native VLAN of a bridge, -then you can optionally set the Neutron external bridge to e.g. "br-ex". This -results in the packets only having to traverse one bridge (instead of two), -and may result in slightly lower CPU when passing traffic over the floating -IP network. - -The next section contains the changes to the NIC config that need to happen -to put the External network on the native VLAN (if the External network is on -br-ex, then that bridge may be used for floating IPs in addition to the Horizon -dashboard and Public APIs). - -Using the Native VLAN on a Trunked Interface --------------------------------------------- -If a trunked interface or bond has a network on the native VLAN, then the IP -address will be assigned directly to the bridge and there will be no VLAN -interface. - -For example, if the external network is on the native VLAN, the bond -configuration would look like this: - -Example:: - - - type: ovs_bridge - name: bridge_name - dns_servers: {{ ctlplane_dns_nameservers }} - addresses: - - ip_netmask: {{ external_ip ~ '/' ~ external_cidr }} - routes: {{ external_host_routes }} - members: - - type: ovs_bond - name: bond1 - ovs_options: {{ bond_interface_ovs_options }} - members: - - type: interface - name: nic3 - primary: true - - type: interface - name: nic4 - -.. note:: - When moving the address (and possibly route) statements onto the bridge, be - sure to remove the corresponding VLAN interface from the bridge. Make sure to - make the changes to all applicable roles. The External network is only on the - controllers, so only the controller template needs to be changed. The Storage - network on the other hand is attached to all roles, so if the storage network - were on the default VLAN, all roles would need to be edited. - -Configuring Jumbo Frames ------------------------- -The Maximum Transmission Unit (MTU) setting determines the maximum amount of -data that can be transmitted by a single Ethernet frame. Using a larger value -can result in less overhead, since each frame adds data in the form of a -header. The default value is 1500, and using a value higher than that will -require the switch port to be configured to support jumbo frames. Most switches -support an MTU of at least 9000, but many are configured for 1500 by default. - -The MTU of a VLAN cannot exceed the MTU of the physical interface. Make sure to -include the MTU value on the bond and/or interface. - -Storage, Storage Management, Internal API, and Tenant networking can all -benefit from jumbo frames. In testing, tenant networking throughput was -over 300% greater when using jumbo frames in conjunction with VXLAN tunnels. - -.. note:: - It is recommended that the Provisioning interface, External interface, and - any floating IP interfaces be left at the default MTU of 1500. Connectivity - problems are likely to occur otherwise. This is because routers typically - cannot forward jumbo frames across L3 boundaries. - -Example:: - - - type: ovs_bond - name: bond1 - mtu: 9000 - ovs_options: {{ bond_interface_ovs_options }} - members: - - type: interface - name: nic3 - mtu: 9000 - primary: true - - type: interface - name: nic4 - mtu: 9000 - - type: vlan - device: bond1 - vlan_id: {{ external_vlan_id }} - addresses: - - ip_netmask: {{ external_ip ~ '/' ~ external_cidr }} - routes: {{ external_host_routes }} - - type: vlan - device: bond1 - mtu: 9000 - vlan_id: {{ internal_api_vlan_id }} - addresses: - - ip_netmask: {{ internal_api_ip ~ '/' ~ internal_api_cidr }} - -Assigning OpenStack Services to Isolated Networks -------------------------------------------------- -Each OpenStack service is assigned to a network using a default mapping. The -service will be bound to the host IP within the named network on each host. - -.. note:: - The services will be assigned to the networks according to the - ``ServiceNetMap`` in ``network/service_net_map.j2.yaml``. Unless these - defaults need to be overridden, the ServiceNetMap does not need to be defined - in the environment file. - -A service can be assigned to an alternate network by overriding the service to -network map in an environment file. The defaults should generally work, but -can be overridden. To override these values, add the ServiceNetMap to the -``parameter_defaults`` section of the network environment. - -Example:: - - parameter_defaults: - - ServiceNetMap: - NeutronTenantNetwork: tenant - CeilometerApiNetwork: internal_api - MongoDbNetwork: internal_api - CinderApiNetwork: internal_api - CinderIscsiNetwork: storage - GlanceApiNetwork: storage - GlanceRegistryNetwork: internal_api - KeystoneAdminApiNetwork: internal_api - KeystonePublicApiNetwork: internal_api - NeutronApiNetwork: internal_api - HeatApiNetwork: internal_api - NovaApiNetwork: internal_api - NovaMetadataNetwork: internal_api - NovaVncProxyNetwork: internal_api - SwiftMgmtNetwork: storage_mgmt - SwiftProxyNetwork: storage - HorizonNetwork: internal_api - MemcachedNetwork: internal_api - RabbitMqNetwork: internal_api - RedisNetwork: internal_api - MysqlNetwork: internal_api - CephClusterNetwork: storage_mgmt - CephPublicNetwork: storage - # Define which network will be used for hostname resolution - ControllerHostnameResolveNetwork: internal_api - ComputeHostnameResolveNetwork: internal_api - BlockStorageHostnameResolveNetwork: internal_api - ObjectStorageHostnameResolveNetwork: internal_api - CephStorageHostnameResolveNetwork: storage - -.. note:: - If an entry in the ServiceNetMap points to a network which does not exist, - that service will be placed on the Provisioning network. To avoid that, - make sure that each entry points to a valid network. - -Deploying the Overcloud With Network Isolation ----------------------------------------------- - -When deploying with network isolation, you should specify the NTP server for the -overcloud nodes. If the clocks are not synchronized, some OpenStack services may -be unable to start, especially when using HA. The NTP server should be reachable -from both the External and Provisioning subnets. The neutron network type should -be specified, along with the tunneling or VLAN parameters. Specify the libvirt -type if on bare metal, so that hardware virtualization will be used. - -To deploy with network isolation and include the network environment file, use -the ``-e`` and ``--networks-file`` parameters with the -``openstack overcloud deploy`` command. The following deploy command should -work for all of the subsequent examples: - -.. code-block:: bash - - openstack overcloud deploy \ - --templates \ - --networks-file ~/templates/custom_network_data.yaml \ - -e ~/templates/networks-deployed-environment.yaml \ - -e ~/templates/vips-deployed-environment.yaml \ - -e baremetal-deployed-environment.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml \ - -e ~/templates/network-environment-overrides.yaml \ - --ntp-server pool.ntp.org - -Alternatively include the network, Virtual IPs and baremetal provisioning -in the ``overcloud deploy`` command to do it all in one: - -.. code-block:: bash - - openstack overcloud deploy \ - --templates \ - --networks-file custom_network_data.yaml \ - --vip-file custom_vip_data.yaml \ - --baremetal-deployment baremetal_deployment.yaml \ - --network-config \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml \ - -e ~/templates/network-environment-overrides.yaml \ - --ntp-server pool.ntp.org - -.. note:: Please refer to :doc:`../provisioning/baremetal_provision` - document page for a reference on the ``baremetal_deployment.yaml`` - used in the above example. - -.. admonition:: Victoria and prior releases - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml \ - -e ~/templates/network-environment-overrides.yaml \ - --ntp-server pool.ntp.org - -To deploy VXLAN mode ``network-environment-overrides.yaml`` should contain the -following parameter values:: - - NeutronNetworkType: vxlan - NeutronTunnelTypes: vxlan - -To deploy with VLAN mode, you should specify the range of VLANs that will be -used for tenant networks. ``network-environment.yaml`` might contain the -following parameter values:: - - NeutronNetworkType: vlan - NeutronBridgeMappings: 'datacentre:br-ex' - NeutronNetworkVLANRanges: 'datacentre:100:199' - -If a dedicated interface or bridge is used for tenant VLANs or provider -networks, it should be included in the bridge mappings. For instance, if the -tenant VLANs were on a bridge named ``br-vlan``, then use these values in -``network-environment.yaml``:: - - NeutronBridgeMappings: 'datacentre:br-ex,tenant:br-vlan' - NeutronNetworkVLANRanges: 'tenant:200:299' - -.. note:: - - You must also pass the environment files (again using the ``-e`` or - ``--environment-file`` option) whenever you make subsequent changes to the - overcloud, such as :doc:`../post_deployment/scale_roles`, - :doc:`../post_deployment/delete_nodes` or - :doc:`../post_deployment/upgrade/minor_update`. - -Creating Floating IP Networks ------------------------------ - -In order to provide external connectivity and floating IPs to the VMs, an -external network must be created. The physical network is referred to by the -name used in the Neutron bridge mappings when deployed. The default bridge -mapping is ``datacentre:br-ex``, which maps the physical network name -``datacentre`` to the bridge ``br-ex`` which includes the physical network -link. For instance, to create a floating IP network on the br-ex bridge on -VLAN 104, this command is used:: - - neutron net-create ext-net --router:external \ - --provider:physical_network datacentre \ - --provider:network_type vlan \ - --provider:segmentation_id 104 - -If the floating IP network is on the native VLAN of br-ex, then a different -command is used to create the external network:: - - neutron net-create ext-net --router:external \ - --provider:physical_network datacentre \ - --provider:network_type flat - -Floating IP networks do not have to use br-ex, they can use any bridge as -long as the NeutronExternalNetworkBridge is set to "''". If the floating IP -network were going to be placed on a bridge named "br-floating", and the -deployment command included the bridge mapping of -``datacenter:br-ex,floating:br-floating``, then following command would be used -to create a floating IP network on VLAN 105:: - - neutron net-create ext-net --router:external \ - --provider:physical_network floating \ - --provider:network_type vlan \ - --provider:segmentation_id 105 - -Then a range of IP addresses must be assigned in the floating IP subnet and -assigned to the physical network. The Subnet will be associated with the network -name that was created in the previous step (``ext-net``):: - - neutron subnet-create --name ext-subnet \ - --enable_dhcp=False \ - --allocation-pool start=10.0.2.50,end=10.0.2.100 \ - --gateway 10.0.2.254 \ - ext-net 10.0.2.0/24 - -Creating Provider Networks --------------------------- - -A Provider Network is a network which is attached physically to a datacenter -network that exists outside of the deployed overcloud. This can be an existing -infrastructure network, or a network which provides external access directly to -VMs via routing instead of floating IPs. - -When a provider network is created, it is associated with a physical network -with a bridge mapping, similar to how floating IP networks are created. The -provider network being added must be attached to both the controller and the -compute nodes, since the compute node will attach a VM virtual network -interface directly to an attached network interface. - -For instance, if the provider network being added is a VLAN on the br-ex -bridge, then this command would add a provider network on VLAN 201:: - - neutron net-create --provider:physical_network datacentre \ - --provider:network_type vlan --provider:segmentation_id 201 \ - --shared provider_network - -This command would create a shared network, but it is also possible to -specify a tenant instead of specifying ``--shared``, and then that network will -only be available to that tenant. If a provider network is marked as external, -then only the operator may create ports on that network. A subnet can be added -to a provider network if Neutron is to provide DHCP services to tenant VMs:: - - neutron subnet-create --name provider-subnet \ - --enable_dhcp=True \ - --allocation-pool start=10.0.3.50,end=10.0.3.100 \ - --gateway 10.0.3.254 \ - provider_network 10.0.3.0/24 - - -.. _tripleo-heat-templates: https://opendev.org/openstack/tripleo-heat-templates -.. _default-network-isolation: https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/network-data-samples/default-network-isolation.yaml -.. _network-data-samples: https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/network-data-samples/ -.. _vip-data-samples: https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/network-data-samples/ diff --git a/deploy-guide/source/features/network_isolation_virt.rst b/deploy-guide/source/features/network_isolation_virt.rst deleted file mode 100644 index cc8a8035..00000000 --- a/deploy-guide/source/features/network_isolation_virt.rst +++ /dev/null @@ -1,73 +0,0 @@ -Configuring Network Isolation in Virtualized Environments -========================================================= - -Introduction ------------- - -This document describes how to configure a virtualized development -environment for use with network isolation. To make things as easy as -possible we will use the ``single-nic-with-vlans`` network isolation -templates to create isolated VLANs on top of the single NIC already -used for the provisioning/``ctlplane``. - -The ``single_nic_vlans.j2`` template work well for many virtualized environments -because they do not require adding any extra NICs. Additionally, Open vSwitch -automatically trunks VLANs for us, so there is no extra switch configuration -required. - -Create an External VLAN on Your Undercloud ------------------------------------------- - -By default all instack undercloud machines have a ``br-ctlplane`` which -is used as the provisioning network. We want to add an interface -on the 10.0.0.0/24 network which is used as the default "external" -(public) network for the overcloud. The default VLAN for the external -network is ``vlan10`` so we create an interface file to do this. Create -the following file ``/etc/sysconfig/network-scripts/ifcfg-vlan10``:: - - DEVICE=vlan10 - ONBOOT=yes - HOTPLUG=no - TYPE=OVSIntPort - OVS_BRIDGE=br-ctlplane - OVS_OPTIONS="tag=10" - BOOTPROTO=static - IPADDR=10.0.0.1 - PREFIX=24 - NM_CONTROLLED=no - -And then run ``ifup vlan10`` on your undercloud. - -Create a Custom Environment File --------------------------------- - -When using network isolation most of the network/config templates configure -static IPs for the ``ctlplane``. To ensure connectivity with Heat and Ec2 -metadata, we need to specify a couple of extra Heat parameters. Create a file -called ``/home/stack/custom.yaml`` with the following contents:: - - parameter_defaults: - EC2MetadataIp: 192.168.24.1 - ControlPlaneDefaultRoute: 192.168.24.1 - -Note that the specified IP addresses ``192.168.24.1`` are the same as the -undercloud IP address. - -Modify Your Overcloud Deploy to Enable Network Isolation --------------------------------------------------------- - -At this point we are ready to create the overcloud using the network -isolation defaults. The example command below demonstrates how to enable -network isolation by using Heat templates for network isolation, a -custom set of network config templates (single NIC VLANs), and our -``custom.yaml`` config file from above:: - - TEMPLATES=/path/to/openstack-tripleo-heat-templates - openstack overcloud deploy \ - --templates=$TEMPLATES \ - -e $TEMPLATES/environments/network-isolation.yaml \ - -e $TEMPLATES/environments/net-single-nic-with-vlans.yaml \ - -e /home/stack/custom.yaml - -After creating the stack you should now have a working virtualized -development environment with network isolation enabled. diff --git a/deploy-guide/source/features/node_config.rst b/deploy-guide/source/features/node_config.rst deleted file mode 100644 index 6abf45b4..00000000 --- a/deploy-guide/source/features/node_config.rst +++ /dev/null @@ -1,99 +0,0 @@ -.. _node_config: - -Modifying default node configuration -==================================== - -Many service configuration options are already exposed via parameters in the -top-level `overcloud.yaml` template, and these options should -be used wherever available to influence overcloud configuration. - -However in the event the service configuration required is not exposed -as a top-level parameter, there are flexible interfaces which enable passing -arbitrary additional configuration to the nodes on deployment. - -Making ansible variable changes -------------------------------- - -Since the Train release, it is now possible to change any Ansible variable -via group vars overriding. -For example, to override the `chrony_role_action` variable used in -ansible-role-chrony for all the Compute roles, we would do the following:: - - cat > compute_params.yaml << EOF - parameter_defaults: - ComputeExtraGroupVars: - chrony_role_action: config - EOF - - openstack overcloud deploy -e compute_params.yaml - -Any variable can be set in that interface and it will take precedence if the -variable was already set somewhere else (e.g. in the composable service). - -For any custom roles (defined via roles_data.yaml) the parameter name will -be RoleNameExtraGroupVars where RoleName is the name specified in -roles_data.yaml. - -Making puppet configuration changes ------------------------------------ - -If you want to make a configuration change, either prior to initial deployment, -or subsequently via an update, you can pass additional data to puppet via hiera -data, using either the global "ExtraConfig" parameter, or one of the role-specific -parameters, e.g using `ComputeExtraConfig` to set the reserved_host_memory -value for compute nodes:: - - - cat > compute_params.yaml << EOF - parameter_defaults: - ComputeExtraConfig: - nova::compute::reserved_host_memory: some_value - EOF - - openstack overcloud deploy -e compute_params.yaml - -The parameters available are: - -* `ExtraConfig`: Apply the data to all nodes, e.g all roles -* `ComputeExtraConfig`: Apply the data only to Compute nodes -* `ControllerExtraConfig`: Apply the data only to Controller nodes -* `BlockStorageExtraConfig`: Apply the data only to BlockStorage nodes -* `ObjectStorageExtraConfig`: Apply the data only to ObjectStorage nodes -* `CephStorageExtraConfig`: Apply the data only to CephStorage nodes - -For any custom roles (defined via roles_data.yaml) the parameter name will -be RoleNameExtraConfig where RoleName is the name specified in roles_data.yaml. - -.. note:: - - Previously the parameter for Controller nodes was named - `controllerExtraConfig` (note the inconsistent capitalization). If - you are updating a deployment which used the old parameter, all - values previously passed to `controllerExtraConfig` should be - passed to `ControllerExtraConfig` instead, and - `controllerExtraConfig: {}` should be explicitly set in - `parameter_defaults`, to ensure that values from the old parameter - will not be used anymore. Also ComputeExtraConfig was previously - named NovaComputeExtraConfig, so a similar update should be performed - where the old naming is used. - -.. note:: - - Passing data via the ExtraConfig parameters will override any statically - defined values in the Hiera data files included as part of tripleo-heat-templates, - e.g those located in `puppet/hieradata` directory. - -.. note:: - - If you set a configuration of a puppet class which is not being included - yet, make sure you include it in the ExtraConfig definition, for example - if you want to change the Max IOPS per host setting:: - - parameter_defaults: - ComputeExtraConfig: - 'nova::scheduler::filter::max_io_ops_per_host': '4.0' - Compute_classes: - - '::nova::scheduler::filter' - - The Compute_classes data is included via the hiera_include in the - overcloud_common.pp puppet manifest. diff --git a/deploy-guide/source/features/node_specific_hieradata.rst b/deploy-guide/source/features/node_specific_hieradata.rst deleted file mode 100644 index 2a8b3f35..00000000 --- a/deploy-guide/source/features/node_specific_hieradata.rst +++ /dev/null @@ -1,113 +0,0 @@ -Provisioning of node-specific Hieradata -======================================= - -This guide assumes that your undercloud is already installed and ready to -deploy an overcloud. - -It is possible to provide some node-specific hieradata via Heat environment -files and as such customize one or more settings for a specific node, -regardless of the Heat `ResourceGroup` to which it belongs. - -As a sample use case, we will distribute a node-specific disks configuration -for a particular CephStorage node, which by default runs the `ceph-osd` service. - -Collecting the node UUID ------------------------- - -The node-specific hieradata is provisioned based on the node UUID, which is -hardware dependent and immutable across reboots/reinstalls. - -First make sure the introspection data is available for the target node, if it -isn't one may run introspection for a particular node as described in: -:doc:`../provisioning/introspect_single_node`. If the `undercloud.conf` does not have -`inspection_extras = true` prior to undercloud installation/upgrade -and introspection, then the machine unique UUID will not be in the -Ironic database. - -Then extract the machine unique UUID for the target node with a command like:: - - baremetal introspection data save NODE-ID | jq .extra.system.product.uuid | tr '[:upper:]' '[:lower:]' - -where `NODE-ID` is the target node Ironic UUID. The value returned by the above -command will be a unique and immutable machine UUID which isn't related to the -Ironic node UUID. For the next step, we'll assume the output was -`32e87b4c-c4a7-41be-865b-191684a6883b`. - -Creating the Heat environment file ----------------------------------- - -Assuming we want to use `/dev/sdc` as a data disk for `ceph-osd` on our target -node, we'll create a yaml file, e.g. `my-node-settings.yaml`, with the -following content depending on if either ceph-ansible (Pike and newer) -or puppet-ceph (Ocata and older). - -For ceph-ansible use:: - - parameter_defaults: - NodeDataLookup: {"32e87b4c-c4a7-41be-865b-191684a6883b": {"devices": ["/dev/sdc"]}} - -For puppet-ceph use:: - - resource_registry: - OS::TripleO::CephStorageExtraConfigPre: /path/to/tripleo-heat-templates/puppet/extraconfig/pre_deploy/per_node.yaml - - parameter_defaults: - NodeDataLookup: {"32e87b4c-c4a7-41be-865b-191684a6883b": {"ceph::profile::params::osds": {"/dev/sdc": {}}}} - -In the above example we're customizing only a single key for a single node, but -the structure is that of a UUID-mapped hash so it is possible to customize -multiple and different keys for multiple nodes. - -Generating the Heat environment file for Ceph devices ------------------------------------------------------ - -The tools directory of tripleo-heat-templates -(`/usr/share/openstack-tripleo-heat-templates/tools/`) contains a -utility called `make_ceph_disk_list.py` which can be used to create -a valid JSON Heat environment file automatically from Ironic's -introspection data. - -Export the introspection data from Ironic for the Ceph nodes to be -deployed:: - - baremetal introspection data save oc0-ceph-0 > ceph0.json - baremetal introspection data save oc0-ceph-1 > ceph1.json - ... - -Copy the utility to the stack user's home directory on the undercloud -and then use it to generate a `node_data_lookup.json` file which may -be passed during openstack overcloud deployment:: - - ./make_ceph_disk_list.py -i ceph*.json -o node_data_lookup.json -k by_path - -Pass the introspection data file from `baremetal introspection data save` for -all nodes hosting Ceph OSDs to the utility as you may only define -`NodeDataLookup` once during a deployment. The `-i` option can take an -expression like `*.json` or a list of files as input. - -The `-k` option defines the key of ironic disk data structure to use -to identify the disk to be used as an OSD. Using `name` is not -recommended as it will produce a file of devices like `/dev/sdd` which -may not always point to the same device on reboot. Thus, `by_path` is -recommended and is the default if `-k` is not specified. - -Ironic will have one of the available disks on the system reserved as -the root disk. The utility will always exclude the root disk from the -list of devices generated. - -Use `./make_ceph_disk_list.py --help` to see other available options. - -Deploying with NodeDataLookup ------------------------------ - -Add the environment file described in the previous section to the -deploy commandline:: - - openstack overcloud deploy [other overcloud deploy options] -e ~/my-node-settings.yaml - -or:: - - openstack overcloud deploy [other overcloud deploy options] -e ~/node_data_lookup.json - -JSON is the recommended format (instead of JSON embedded in YAML) -because you may use `jq` to validate the entire file before deployment. diff --git a/deploy-guide/source/features/octavia.rst b/deploy-guide/source/features/octavia.rst deleted file mode 100644 index ede8177f..00000000 --- a/deploy-guide/source/features/octavia.rst +++ /dev/null @@ -1,77 +0,0 @@ -.. _deploy-octavia: - -Deploying Octavia in the Overcloud -================================== - -This guide assumes that your undercloud is already installed and ready to -deploy an overcloud with Octavia enabled. Please note that only container -deployments are supported. - -Preparing to deploy -------------------- - -TripleO can upload an Octavia Amphora image to the overcloud if one is -available when deploying. - -Configuring the amphora image ------------------------------ - -If the Octavia Amphora image is available when deploying it should be placed -in a readable path with the default location being a good choice. On CentOS, -the default location is:: - - /usr/share/openstack-octavia-amphora-images/amphora-x64-haproxy.qcow2 - -If deploying on Red Hat Enterprise Linux, the default location is:: - - /usr/share/openstack-octavia-amphora-images/octavia-amphora.qcow2 - -On Red Hat Enterprise Linux, downloading an image may be unnecessary as the -amphora image may already be installed. - -If using a non-default location, make sure to specify the location through the -``OctaviaAmphoraImageFilename`` variable in an environment file. For example:: - - parameter_defaults: - OctaviaAmphoraImageFilename: /usr/share/openstack-images/amphora-image.qcow2 - -.. warning:: Home directories are typically not readable by the workflow - tasks that upload the file image to Glance. Please use a generally - accessible path. - -Deploying the overcloud with the octavia services -------------------------------------------------- - -To deploy Octavia services in the overcloud, include the sample environment -file provided. For example:: - - openstack overcloud deploy --templates \ - -e /usr/share/openstack-tripleo-heat-templates/environments/services/octavia.yaml \ - -e ~/containers-default-parameters.yaml - -.. note:: Don't forget to include any additional environment files containing - parameters such as those for the amphora image file. - -Uploading/Updating the amphora image after deployment ------------------------------------------------------ - -Uploading a new amphora image to Glance in the overcloud can be done after -deployment. This may be required if the amphora image was not available at the -time of deployment or the image needs to be updated. - -There are two Octavia specific requirements:: - - - The image must be tagged in Glance (default value 'amphora-image') - - - The image must belong the 'service' project - -To upload an amphora image into glance:: - - openstack image create --disk-format qcow2 --container-format bare \ - --tag 'amphora-image' --file [amphora image filename] \ - --project service new-amphora-image - -.. note:: The amphora image tag name can be customized by setting the - ``OctaviaAmphoraImageTag`` variable. Note that if this is changed - after deployment, Octavia will not be able to use any previously - uploaded images until they are retagged. diff --git a/deploy-guide/source/features/ops_tools.rst b/deploy-guide/source/features/ops_tools.rst deleted file mode 100644 index 366477d4..00000000 --- a/deploy-guide/source/features/ops_tools.rst +++ /dev/null @@ -1,173 +0,0 @@ -Deploying Operational Tools -=========================== - -TripleO comes with an optional suite of tools designed to help operators -maintain an OpenStack environment. The tools perform the following functions: - -- Availability Monitoring -- Centralized Logging -- Performance Monitoring - -This document will go through the presentation and installation of these tools. - -Architecture ------------- - -#. Operational Tool Server: - - - Monitoring Relay/proxy (RabbitMQ_) - - Monitoring Controller/Server (Sensu_) - - Data Store (Redis_) - - API/Presentation Layer (Uchiwa_) - - Log relay/transformer (Fluentd_) - - Data store (Elastic_) - - API/Presentation Layer (Kibana_) - - Performance receptor (Collectd_) - - Aggregator/Relay (Graphite_) - - An API/Presentation Layer (Grafana_) - -#. Undercloud: - - - There is no operational tools installed by default on the undercloud - -#. Overcloud: - - - Monitoring Agent (Sensu_) - - Log Collection Agent (Fluentd_) - - Performance Collector Agent (Collectd_) - -.. _RabbitMQ: https://www.rabbitmq.com -.. _Sensu: http://sensuapp.org -.. _Redis: https://redis.io -.. _Uchiwa: https://uchiwa.io -.. _Fluentd: http://www.fluentd.org -.. _Elastic: https://www.elastic.co -.. _Kibana: https://www.elastic.co/products/kibana -.. _Collectd: https://collectd.org -.. _Graphite: https://graphiteapp.org -.. _Grafana: https://grafana.com - -Deploying the Operational Tool Server -------------------------------------- - -There is an ansible project called opstools-ansible (OpsTools_) on github that helps to install the Operator Server, further documentation of the operational tool server installation can be founded at (OpsToolsDoc_). - -.. _OpsTools: https://github.com/centos-opstools/opstools-ansible -.. _OpsToolsDoc: https://github.com/centos-opstools/opstools-doc - -Deploying the Undercloud ------------------------- - -As there is nothing to install on the undercloud nothing needs to be done. - -Before deploying the Overcloud ------------------------------- - -.. note:: - - The :doc:`../deployment/template_deploy` document has a more detailed explanation of the - following steps. - - -1. Install client packages on overcloud-full image: - - - Mount the image and create a chroot:: - - temp_dir=$(mktemp -d) - sudo tripleo-mount-image -a /path/to/overcloud-full.qcow2 -m $temp_dir - sudo mount -o bind /dev $temp_dir/dev/ - sudo cp /etc/resolv.conf $temp_dir/etc/resolv.conf - sudo chroot $temp_dir /bin/bash - - - Install the packages inside the chroot:: - - dnf install -y centos-release-opstools - dnf install -y sensu fluentd collectd - exit - - - Unmount the image:: - - sudo rm $temp_dir/etc/resolv.conf - sudo umount $temp_dir/dev - sudo tripleo-unmount-image -m $temp_dir - - - Upload new image to undercloud image registry:: - - openstack overcloud image upload --update-existing - -2. Operational tools configuration files: - - The files have some documentation about the parameters that need to be configured - - - Availability Monitoring:: - - /usr/share/openstack-tripleo-heat-templates/environments/monitoring-environment.yaml - - - Centralized Logging:: - - /usr/share/openstack-tripleo-heat-templates/environments/logging-environment.yaml - - - Performance Monitoring:: - - /usr/share/openstack-tripleo-heat-templates/environments/collectd-environment.yaml - -3. Configure the environment - - The easiest way to configure our environment will be to create a parameter file, let's called parameters.yaml with all the parameters defined. - - - Availability Monitoring:: - - MonitoringRabbitHost: server_ip # Server were the rabbitmq was installed - MonitoringRabbitPort: 5672 # Rabbitmq port - MonitoringRabbitUserName: sensu_user # the rabbitmq user to be used by sensu - MonitoringRabbitPassword: sensu_password # The password of the sensu user - MonitoringRabbitUseSSL: false # Set to false - MonitoringRabbitVhost: "/sensu_vhost" # The virtual host of the rabbitmq - - - Centralized Logging:: - - LoggingServers: # The servers - - host: server_ip # The ip of the server - port: 24224 # Port to send the logs [ 24224 plain & 24284 SSL ] - LoggingUsesSSL: false # Plain or SSL connections - # If LoggingUsesSSL is set to false the following lines can - # be deleted - LoggingSharedKey: secret # The key - LoggingSSLCertificate: | # The content of the SSL Certificate - -----BEGIN CERTIFICATE----- - ...contents of server.pem here... - -----END CERTIFICATE----- - - - Performance Monitoring:: - - CollectdServer: collectd0.example.com # Collectd server, where the data is going to be sent - CollectdServerPort: 25826 # Collectd port - # CollectdSecurityLevel: None # Security by default None the other values are - # Encrypt & Sign, but the two following parameters - # need to be set too - # CollectdUsername: user # User to connect to the server - # CollectdPassword: password # Password to connect to the server - - # Collectd, by default, comes with several plugins - # extra plugins can added on this parameter - CollectdExtraPlugins: - - disk # disk plugin - - df # df plugin - ExtraConfig: # If the plugins need to be set, this is the location - collectd::plugin::disk::disks: - - "/^[vhs]d[a-f][0-9]?$/" - collectd::plugin::df::mountpoints: - - "/" - collectd::plugin::df::ignoreselected: false - - -4. Continue following the TripleO instructions for deploying an overcloud:: - - openstack overcloud deploy --templates \ - [-e /usr/share/openstack-tripleo-heat-templates/environments/monitoring-environment.yaml] \ - [-e /usr/share/openstack-tripleo-heat-templates/environments/logging-environment.yaml] \ - [-e /usr/share/openstack-tripleo-heat-templates/environments/collectd-environment.yaml] \ - -e parameters.yaml - - -5. Wait for the completion of the overcloud deployment process. diff --git a/deploy-guide/source/features/oslo_messaging_config.rst b/deploy-guide/source/features/oslo_messaging_config.rst deleted file mode 100644 index 20b1a66f..00000000 --- a/deploy-guide/source/features/oslo_messaging_config.rst +++ /dev/null @@ -1,107 +0,0 @@ -Configuring Messaging RPC and Notifications -=========================================== - -TripleO can configure oslo.messaging RPC and Notification services and -deploy the corresponding messaging backends for the undercloud and -overcloud. The roles OsloMessagingRPC and OsloMessagingNotify have been -added in place of the RabbitMQ Server. Having independent roles for RPC -and Notify allows for the separation of messaging backends as well as -the deployment of different messaging backend intermediaries that are -supported by oslo.messaging drivers:: - - +----------------+-----------+-----------+-----+--------+-----------+ - | Oslo.Messaging | Transport | Backend | RPC | Notify | Messaging | - | Driver | Protocol | Server | | | Type | - +================+===========+===========+=====+========+===========+ - | rabbit | AMQP V0.9 | rabbitmq | yes | yes | queue | - +----------------+-----------+-----------+-----+--------+-----------+ - | amqp | AMQP V1.0 | qdrouterd | yes | | direct | - +----------------+-----------+-----------+-----+--------+-----------+ - | kafka | kafka | kafka | | yes | queue | - | (experimental) | binary | | | | (stream) | - +----------------+-----------+-----------+-----+--------+-----------+ - -Standard Deployment of RabbitMQ Server Backend ----------------------------------------------- - -A single RabbitMQ backend (e.g. server or cluster) is the default -deployment for TripleO. This messaging backend provides the services -for both RPC and Notification communications through its integration -with the oslo.messaging rabbit driver. - -The example `standard messaging`_ environment file depicts the -resource association for this defacto deployment configuration:: - - # ******************************************************************* - # This file was created automatically by the sample environment - # generator. Developers should use `tox -e genconfig` to update it. - # Users are recommended to make changes to a copy of the file instead - # of the original, if any customizations are needed. - # ******************************************************************* - # title: Share single rabbitmq backend for rpc and notify messaging backend - # description: | - # Include this environment to enable a shared rabbitmq backend for - # oslo.messaging rpc and notification services - parameter_defaults: - # The network port for messaging backend - # Type: number - RpcPort: 5672 - - resource_registry: - OS::TripleO::Services::OsloMessagingNotify: ../../deployment/rabbitmq/rabbitmq-messaging-notify-shared-puppet.yaml - OS::TripleO::Services::OsloMessagingRpc: ../../deployment/rabbitmq/rabbitmq-messaging-rpc-container-puppet.yaml - -The `rabbitmq-messaging-rpc-container-puppet.yaml`_ instantiates the rabbitmq server backend -while `rabbitmq-messaging-notify-container-puppet.yaml`_ sets up the notification -transport configuration to use the same shared rabbitmq server. - -Deployment of Separate RPC and Notify Messaging Backends --------------------------------------------------------- - -Separate messaging backends can be deployed for RPC and Notification -communications. For this TripleO deployment, the apache dispatch -router (qdrouterd) can be deployed for the RPC messaging backend using -the oslo.messaging AMQP 1.0 driver. - -The example `hybrid messaging`_ environment file can be used for an -overcloud deployment:: - - # ******************************************************************* - # This file was created automatically by the sample environment - # generator. Developers should use `tox -e genconfig` to update it. - # Users are recommended to make changes to a copy of the file instead - # of the original, if any customizations are needed. - # ******************************************************************* - # title: Hybrid qdrouterd for rpc and rabbitmq for notify messaging backend - # description: | - # Include this environment to enable hybrid messaging backends for - # oslo.messaging rpc and notification services - parameter_defaults: - # The network port for messaging Notify backend - # Type: number - NotifyPort: 5672 - - # The network port for messaging backend - # Type: number - RpcPort: 31459 - - resource_registry: - OS::TripleO::Services::OsloMessagingNotify: ../../deployment/rabbitmq/rabbitmq-messaging-notify-container-puppet.yaml - OS::TripleO::Services::OsloMessagingRpc: ../../deployment/messaging/rpc-qdrouterd-container-puppet.yaml - -The above will instantiate qdrouterd server(s) and configure them for -use as the RPC transport and will also instantiate the rabbitmq backend -and configure it for use as the Notification transport. It should -be noted that the RPC and Notify ports must be distinct to prevent the -qdrouterd and rabbitmq servers from simultaneously using the amqp -standard port (5672). - -Add the following arguments to your `openstack overcloud deploy` -command to deploy with separate messaging backends:: - - openstack overcloud deploy --templates -e /usr/share/openstack-tripleo-heat-templates/environments/messaging/rpc-qdrouterd-notify-rabbitmq-hybrid.yaml - -.. _`standard messaging`: https://github.com/openstack/tripleo-heat-templates/blob/master/environments/messaging/rpc-rabbitmq-notify-rabbitmq-shared.yaml -.. _`rabbitmq-messaging-rpc-container-puppet.yaml`: https://github.com/openstack/tripleo-heat-templates/blob/master/deployment/rabbitmq/rabbitmq-messaging-rpc-container-puppet.yaml -.. _`rabbitmq-messaging-notify-container-puppet.yaml`: https://github.com/openstack/tripleo-heat-templates/blob/master/deployment/rabbitmq/rabbitmq-messaging-notify-container-puppet.yaml -.. _`hybrid messaging`: https://github.com/openstack/tripleo-heat-templates/blob/master/environments/messaging/rpc-qdrouterd-notify-rabbitmq-hybrid.yaml diff --git a/deploy-guide/source/features/ovs_dpdk_config.rst b/deploy-guide/source/features/ovs_dpdk_config.rst deleted file mode 100644 index 851adb0c..00000000 --- a/deploy-guide/source/features/ovs_dpdk_config.rst +++ /dev/null @@ -1,98 +0,0 @@ -Deploying with OVS DPDK Support -=============================== - -TripleO can deploy Overcloud nodes with OVS DPDK support. A new role -``ComputeOvsDpdk`` has been added to create a custom ``roles_data.yaml`` with -composable OVS DPDK role. - -Execute below command to create the ``roles_data.yaml``:: - - openstack overcloud roles generate -o roles_data.yaml Controller ComputeOvsDpdk - -Once a roles file is created, the following changes are required: - -- Deploy Command -- Parameters -- Network Config - -Deploy Command ----------------- -Deploy command should include the generated roles data file from the above -command. - -Deploy command should also include the OVS DPDK environment file to override the -default neutron-ovs-agent service with neutron-ovs-dpdk-agent service. All the -required parameters are specified in this environment file as commented. The -parameters has to be configured according to the baremetal on which OVS DPDK -is enabled. - -Also, OVS-DPDK requires mandatory kernel parameters to be set before -configuring the DPDK driver, like ``intel_iommu=on`` on Intel machines. In -order to enable the configuration of kernel parameters to the host, host- -config-pre-network environment file has to be added for the deploy command. - -Adding the following arguments to the ``openstack overcloud deploy`` command -will do the trick:: - - openstack overcloud deploy --templates \ - -r roles_data.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs-dpdk.yaml \ - ... - -Parameters ----------- -Following are the list of parameters which need to be provided for deploying -with OVS DPDK support. - -* OvsPmdCoreList: List of Logical CPUs to be allocated for Poll Mode Driver -* OvsDpdkCoreList: List of Logical CPUs to be allocated for the openvswitch - host process (lcore list) -* OvsDpdkMemoryChannels: Number of memory channels -* OvsDpdkSocketMemory: Socket memory list per NUMA node - - -Example:: - - parameter_defaults: - OvsPmdCoreList: "2,3,18,19" - OvsDpdkCoreList: "0,1,16,17" - OvsDpdkMemoryChannels: "4" - OvsDpdkSocketMemory: "1024,1024" - - -The parameter ``KernelArgs`` should be provided in the deployment environment -file, with the set of kernel boot parameters to be applied on the -``ComputeOvsDpdk`` role where OVS DPDK is enabled:: - - parameter_defaults: - ComputeOvsDpdkParameters: - KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=64 intel_iommu=on iommu=pt" - - -Network Config --------------- -DPDK supported network interfaces should be specified in the network config -templates to configure OVS DPDK on the node. The following new network config -types have been added to support DPDK. - -- ovs_user_bridge -- ovs_dpdk_port -- ovs_dpdk_bond - -Example:: - - network_config: - - - type: ovs_user_bridge - name: br-link - use_dhcp: false - members: - - - type: ovs_dpdk_port - name: dpdk0 - mtu: 2000 - rx_queue: 2 - members: - - - type: interface - name: nic3 diff --git a/deploy-guide/source/features/pre_network_config.rst b/deploy-guide/source/features/pre_network_config.rst deleted file mode 100644 index f21e14a0..00000000 --- a/deploy-guide/source/features/pre_network_config.rst +++ /dev/null @@ -1,116 +0,0 @@ -Configure node before Network Config -==================================== - -In specific deployments, it is required to perform additional configurations -on the overcloud node before network deployment, but after applying kernel -args. For example, OvS-DPDK deployment requires DPDK to be enabled in -OpenvSwitch before network deployment (os-net-config), but after the -hugepages are created (hugepages are created using kernel args). This -requirement is also valid for some 3rd party SDN integration. This kind of -configuration requires additional TripleO service definitions. This document -explains how to achieve such deployments on and after `train` release. - -.. note:: - - In `queens` release, the resource `PreNetworkConfig` can be overridden to - achieve the required behavior, which has been deprecated from `train` - onwards. The implementations based on `PreNetworkConfig` should be - moved to other available alternates. - -The TripleO service `OS::TripleO::BootParams` configures the parameter -`KernelArgs` and reboots the node using the `tripleo-ansible` role -`tripleo_kernel`. Some points to consider on `KernelArgs`: - -* `BootParams` service is enabled by default on all the roles. -* The node will be restarted only when kernel args are applied for the first - time (fresh node configuration). -* In case of adding `KernelArgs` during update/upgrade/scale operations, when - a particular role does not have `KernelArgs`, it results in node reboot. - Such scenarios should be treated as role migration instead adding only - `KernelArgs`. -* `KernelArgs` can be updated from `wallaby` release onwards (where the role - already has `KernelArgs` but requires modification). In such cases, the - node reboot has to be planned by the user manually, after the TripleO - deployment is completed. For example, increasing the hugepages count post - deployment. - - -The firstboot_ scripts provide a mechanism to apply the custom node -configuration which is independent of kernel args. - -.. _firstboot: https://github.com/openstack/tripleo-heat-templates/tree/master/firstboot - -Custom Service --------------- - -When a configuration needs to be applied on the node after reboot and before -the network config, then a custom service template should be added that -includes the `BootParams` resource (example below) and any other required -configuration. It is important to allow the default implementation -of `BootParams` service to be included as it is, because any improvements -or fixes will be automatically included in the deployment. - -Here is an example OvS-DPDK_ has been configured after `BootParams` but before -network config:: - - heat_template_version: wallaby - - description: > - Open vSwitch Configuration - - parameters: - ServiceData: - default: {} - description: Dictionary packing service data - type: json - ServiceNetMap: - default: {} - description: Mapping of service_name -> network name. Typically set - via parameter_defaults in the resource registry. Use - parameter_merge_strategies to merge it with the defaults. - type: json - RoleName: - default: '' - description: Role name on which the service is applied - type: string - RoleParameters: - default: {} - description: Parameters specific to the role - type: json - EndpointMap: - default: {} - description: Mapping of service endpoint -> protocol. Typically set - via parameter_defaults in the resource registry. - type: json - - resources - BootParams: - type: /usr/share/openstack-tripleo-heat-templates/deployments/kernel/kernel-boot-params-baremetal-ansible.yaml - properties: - ServiceData: {get_param: ServiceData} - ServiceNetMap: {get_param: ServiceNetMap} - EndpointMap: {get_param: EndpointMap} - RoleName: {get_param: RoleName} - RoleParameters: {get_param: RoleParameters} - - outputs: - role_data: - description: Role data for the Open vSwitch service. - value: - service_name: openvswitch - deploy_steps_tasks: - - get_attr: [BootParams, role_data, deploy_steps_tasks] - - - name: Run ovs-dpdk role - when: step|int == 0 - include_role: - name: tripleo_ovs_dpdk - -.. _OvS-DPDK: https://github.com/openstack/tripleo-heat-templates/blob/master/deployment/openvswitch/openvswitch-dpdk-baremetal-ansible.yaml - -.. note:: - In the above sample service definition, the condition `step|int == 0` in - the `deploy_steps_tasks` section forces the associated steps to run - before starting any other node configuration (including network deployment). - -Add this service to the roles definition of the required roles so that the -configuration can be applied after reboot but before network deployment. diff --git a/deploy-guide/source/features/rhsm.rst b/deploy-guide/source/features/rhsm.rst deleted file mode 100644 index 5b20258d..00000000 --- a/deploy-guide/source/features/rhsm.rst +++ /dev/null @@ -1,139 +0,0 @@ -Deploying with RHSM -=================== - -Summary -------- - -Starting in the Queens release, it is possible to use Ansible to apply the -RHSM (Red Hat Subscription Management) configuration. - -Instead of the pre_deploy rhel-registration script, the new RHSM service will -allow our operators to: - -#. deploy advanced RHSM configurations, where each role can have their own - repositories for example. - -#. use config-download mechanism so operators can run the playbooks at anytime - after the deployment, in case RHSM parameters have changed. - - -Using RHSM ----------- -To enable deployment with Ansible and config-download pass the additional arg -to the deployment command:: - - openstack overcloud deploy \ - \ - -e ~/rhsm.yaml - -The ``rhsm.yaml`` environment enables mapping the OS::TripleO::Services::Rhsm to -the extraconfig service:: - - resource_registry: - OS::TripleO::Services::Rhsm: /usr/share/openstack-tripleo-heat-templates/deployment/rhsm/rhsm-baremetal-ansible.yaml - parameter_defaults: - RhsmVars: - rhsm_activation_key: "secrete_key" - rhsm_org_id: "Default_Organization" - rhsm_server_hostname: "mysatserver.com" - rhsm_baseurl: "https://mysatserver.com/pulp/repos" - rhsm_method: satellite - rhsm_insecure: yes - rhsm_release: 8.1 - -In some advanced use cases, you might want to configure RHSM for a specific role:: - - parameter_defaults: - ComputeHCIParameters: - RhsmVars: - rhsm_activation_key: "secrete_key" - rhsm_org_id: "Default_Organization" - rhsm_server_hostname: "mysatserver.com" - rhsm_baseurl: "https://mysatserver.com/pulp/repos" - rhsm_method: satellite - rhsm_insecure: yes - rhsm_release: 8.1 - -In that case, all nodes deployed with ComputeHCI will be configured with these RHSM parameters. - -Scale-down the Overcloud ------------------------- -The automatic unsubscription isn't currently supported and before scaling down the Overcloud, -the operator will have to run this playbook against the host(s) that will be removed. -Example when we want to remove 2 compute nodes:: - - - hosts: - - overcloud-compute47 - - overcloud-compute72 - vars: - rhsm_username: bob.smith@acme.com - rhsm_password: my_secret - rhsm_state: absent - roles: - - openstack.redhat-subscription - -The playbook needs to be executed prior to the actual scale-down. - -Transition from previous method -------------------------------- - -The previous method ran a script called rhel-registration during -pre_deploy step, which is located in the ``extraconfig/pre_deploy/rhel-registration`` -folder. While the script is still working, you can perform a -migration to the new service by replacing the parameters used in -rhel-registration with RhsmVars and switching the resource_registry -from:: - - resource_registry: - OS::TripleO::NodeExtraConfig: rhel-registration.yaml - -To:: - - resource_registry: - # Before Train cycle, the file is in /usr/share/openstack-tripleo-heat-templates/extraconfig/services/rhsm.yaml - OS::TripleO::Services::Rhsm: /usr/share/openstack-tripleo-heat-templates/deployment/rhsm/rhsm-baremetal-ansible.yaml - -The following table shows a migration path from the old -rhe-registration parameters to the new RhsmVars: - -+------------------------------+------------------------------+ -| rhel-registration script | rhsm with Ansible (RhsmVars) | -+==============================+==============================+ -| rhel_reg_activation_key | rhsm_activation_key | -+------------------------------+------------------------------+ -| rhel_reg_auto_attach | rhsm_autosubscribe | -+------------------------------+------------------------------+ -| rhel_reg_sat_url | rhsm_satellite_url | -+------------------------------+------------------------------+ -| rhel_reg_org | rhsm_org_id | -+------------------------------+------------------------------+ -| rhel_reg_password | rhsm_password | -+------------------------------+------------------------------+ -| rhel_reg_repos | rhsm_repos | -+------------------------------+------------------------------+ -| rhel_reg_pool_id | rhsm_pool_ids | -+------------------------------+------------------------------+ -| rhel_reg_user | rhsm_username | -+------------------------------+------------------------------+ -| rhel_reg_method | rhsm_method | -+------------------------------+------------------------------+ -| rhel_reg_http_proxy_host | rhsm_rhsm_proxy_hostname | -+------------------------------+------------------------------+ -| rhel_reg_http_proxy_port | rhsm_rhsm_proxy_port | -+------------------------------+------------------------------+ -| rhel_reg_http_proxy_username | rhsm_rhsm_proxy_user | -+------------------------------+------------------------------+ -| rhel_reg_http_proxy_password | rhsm_rhsm_proxy_password | -+------------------------------+------------------------------+ - - -More about the Ansible role ---------------------------- - -TripleO is using the Ansible role_ for Red Hat Subscription. - -.. _role: https://github.com/openstack/ansible-role-redhat-subscription - -The role parameters aren't documented here to avoid duplication but it is -recommended to take a look at them in the repository when using this feature -in TripleO. diff --git a/deploy-guide/source/features/role_specific_parameters.rst b/deploy-guide/source/features/role_specific_parameters.rst deleted file mode 100644 index ffff5d9b..00000000 --- a/deploy-guide/source/features/role_specific_parameters.rst +++ /dev/null @@ -1,108 +0,0 @@ -Role-Specific Parameters -======================== - -A service can be associated with multiple roles, like ``nova-compute`` -service can be associated with **ComputeRole1** and **ComputeRole2**. The -``nova-compute`` service takes multiple parameters like ``NovaVcpuPinSet``, -``NovaReservedHostMemory``, etc. It is possible to provide separate values -specific to a role with the following changes in the user environment file:: - - parameter_defaults: - NovaReservedHostMemory: 512 - ComputeRole1Parameters: - NovaReservedHostMemory: 2048 - ComputeRole2Parameter: - NovaReservedHostMemory: 1024 - -The format to provide role-specific parameters is ``Parameters``, -where the ``RoleName`` is the name of the role as defined in the -``roles_data.yaml`` template. - -In the above specified example, the value "512" will be applied all the roles -which has the ``nova-compute`` service, where as the value "2048" will be -applied only on the **ComputeRole1** role and the value "1024" will be applied -only on the **ComputeRole2** role. - -With this approach, the service implementation has to merge the role-specific -parameters with the global parameters in their definition template. The role- -specific parameter takes higher precedence than the global parameters. - -For any custom service which need to use role-specific parameter, the -parameter merging should be done. Here is a sample parameter merging example -which will be done by the service implementation:: - - RoleParametersValue: - type: OS::Heat::Value - properties: - type: json - value: - map_replace: - - map_replace: - - neutron::agents::ml2::ovs::datapath_type: NeutronDatapathType - neutron::agents::ml2::ovs::vhostuser_socket_dir: NeutronVhostuserSocketDir - vswitch::dpdk::driver_type: NeutronDpdkDriverType - vswitch::dpdk::host_core_list: HostCpusList - vswitch::dpdk::pmd_core_list: NeutronDpdkCoreList - vswitch::dpdk::memory_channels: NeutronDpdkMemoryChannels - vswitch::dpdk::socket_mem: NeutronDpdkSocketMemory - - values: {get_param: [RoleParameters]} - - values: - NeutronDatapathType: {get_param: NeutronDatapathType} - NeutronVhostuserSocketDir: {get_param: NeutronVhostuserSocketDir} - NeutronDpdkDriverType: {get_param: NeutronDpdkDriverType} - HostCpusList: {get_param: HostCpusList} - NeutronDpdkCoreList: {get_param: NeutronDpdkCoreList} - NeutronDpdkMemoryChannels: {get_param: NeutronDpdkMemoryChannels} - NeutronDpdkSocketMemory: {get_param: NeutronDpdkSocketMemory} - -A service can have a unique variable name that is different than the role specific one. -The example below shows how to define the service variable ``KeystoneWSGITimeout``, override -it with the role specific variable ``WSGITimeout`` if it is found, and create a new alias variable -named ``wsgi_timeout`` to store the value. Later on, that value can be retrieved by using -``{get_attr: [RoleParametersValue, value, wsgi_timeout]}``.:: - - parameters: - - KeystoneWSGITimeout: - description: The timeout for the Apache virtual host created for the API endpoint. - type: string - default: '60' - tags: - - role_specific - - resources: - - RoleParametersValue: - type: OS::Heat::Value - properties: - type: json - value: - map_replace: - - map_replace: - - wsgi_timeout: WSGITimeout - - values: {get_param: [RoleParameters]} - - values: - WSGITimeout: {get_param: KeystoneWSGITimeout} - - outputs: - role_data: - description: Role data for the Keystone API role. - value: - config_settings: - map_merge: - - keystone::wsgi::apache::vhost_custom_fragment: - list_join: [' ', ['Timeout', {get_attr: [RoleParametersValue, value, wsgi_timeout]}]] - -Now the variable can optionally have a default set at the composable roles data level.:: - - - name: Undercloud - RoleParametersDefault: - WSGITimeout: '600' - -.. note:: - As of now, not all parameters can be set per role, it is based on the - service or template implementation. Each service should have the - implementation to merge the global parameters and role-specific - parameters, as explained in the above examples. A warning will be shown - during the deployment, if an invalid parameter (which does not support - role-specific implementation) is provided as role-specific input. diff --git a/deploy-guide/source/features/routed_spine_leaf_network.rst b/deploy-guide/source/features/routed_spine_leaf_network.rst deleted file mode 100644 index a7294440..00000000 --- a/deploy-guide/source/features/routed_spine_leaf_network.rst +++ /dev/null @@ -1,621 +0,0 @@ -.. _routed_spine_leaf_network: - -Deploying Overcloud with L3 routed networking -============================================= - -Layer 3 Routed spine and leaf architectures is gaining in popularity due to the -benefits, such as high-performance, increased scalability and reduced failure -domains. - -The below diagram is an example L3 routed -`Clos `_ architecture. In this -example each server is connected to top-of-rack leaf switches. Each leaf switch -is attached to each spine switch. Within each rack, all servers share a layer 2 -domain. The layer 2 network segments are local to the rack. Layer 3 routing via -the spine switches permits East-West traffic between the racks: - -.. image:: ../_images/spine_and_leaf.svg - -.. Note:: Typically Dynamic Routing is implemented in such an architecture. - Often also - `ECMP `_ - (Equal-cost multi-path routing) and - `BFD `_ - (Bidirectional Forwarding Detection) are used to provide non-blocking - forwarding and fast convergence times in case of failures. - Configuration of the underlying network architecture is not in the - scope of this document. - -Layer 3 routed Requirements ---------------------------- - -For TripleO to deploy the ``overcloud`` on a network with a layer 3 routed -architecture the following requirements must be met: - -* **Layer 3 routing**: - The network infrastructure must have *routing* configured to enable traffic - between the different layer 2 segments. This can be statically or dynamically - configured. - -* **DHCP-Relay**: - Each layer 2 segment that is not local to the ``undercloud`` must provide - *dhcp-relay*. DHCP requests must be forwarded to the Undercloud on the - provisioning network segment where the ``undercloud`` is connected. - - .. Note:: The ``undercloud`` uses two DHCP servers. One for baremetal node - introspection, and another for deploying overcloud nodes. - - Make sure to read `DHCP relay configuration`_ to understand the - requirements when configuring *dhcp-relay*. - -Layer 3 routed Limitations --------------------------- - -* Some roles, such as the Controller role, use virtual IP addresses and - clustering. The mechanism behind this functionality requires layer-2 network - connectivity between these nodes. These nodes must all be placed within the - same leaf. - -* Similar restrictions apply to networker nodes. The Network service implements - highly-available default paths in the network using Virtual Router Redundancy - Protocol (VRRP). Since VRRP uses a virtual router ip address, master and - backup nodes must be connected to the same L2 network segment. - -* When using tenant or provider networks with VLAN segmentation, the particular - VLANs used must be shared between all networker and compute nodes. - - .. Note:: It is possible to configure the Network service with multiple sets - of networker nodes. Each set would share routes for their networks, - and VRRP would be used within each set of networker nodes to - provide highly-available default paths. In such configuration all - networker nodes sharing networks must be on the same L2 network - segment. - -Create undercloud configuration -------------------------------- - -To deploy the ``overcloud`` on a L3 routed architecture the ``undercloud`` -needs to be configured with multiple neutron network segments and subnets on -the ``ctlplane`` network. - -#. In the ``[DEFAULT]`` section of ``undercloud.conf`` enable the routed - networks feature by setting ``enable_routed_networks`` to ``true``. For - example:: - - enable_routed_networks = true - -#. In the ``[DEFAULT]`` section of ``undercloud.conf`` add a comma separated - list of control plane subnets. Define one subnet for each layer 2 segment in - the routed spine and leaf. For example:: - - subnets = leaf0,leaf1,leaf2 - -#. In the ``[DEFAULT]`` section of ``undercloud.conf`` specify the subnet that - is associated with the physical layer 2 segment that is *local* to the - ``undercloud``. For example:: - - local_subnet = leaf0 - -#. For each of the control plane subnets specified in ``[DEFAULT]\subnets`` - add an additional section in ``undercloud.conf``, for example:: - - [leaf0] - cidr = 192.168.10.0/24 - dhcp_start = 192.168.10.10 - dhcp_end = 192.168.10.90 - inspection_iprange = 192.168.10.100,192.168.10.190 - gateway = 192.168.10.1 - masquerade = False - - [leaf1] - cidr = 192.168.11.0/24 - dhcp_start = 192.168.11.10 - dhcp_end = 192.168.11.90 - inspection_iprange = 192.168.11.100,192.168.11.190 - gateway = 192.168.11.1 - masquerade = False - - [leaf2] - cidr = 192.168.12.0/24 - dhcp_start = 192.168.12.10 - dhcp_end = 192.168.12.90 - inspection_iprange = 192.168.12.100,192.168.12.190 - gateway = 192.168.12.1 - masquerade = False - -Install the undercloud ----------------------- - -Once the ``undercloud.conf`` is updated with the desired configuration, install -the undercloud by running the following command:: - - $ openstack undercloud install - -Once the ``undercloud`` is installed complete the post-install tasks such as -uploading images and registering baremetal nodes. (For addition details -regarding the post-install tasks, see -:doc:`../deployment/install_overcloud`.) - -DHCP relay configuration ------------------------- - -The TripleO Undercloud uses two DHCP servers on the provisioning network, one -for ``introspection`` and another one for ``provisioning``. When configuring -*dhcp-relay* make sure that DHCP requests are forwarded to both DHCP servers on -the Undercloud. - -For devices that support it, UDP *broadcast* can be used to relay DHCP requests -to the L2 network segment where the Undercloud provisioning network is -connected. Alternatively UDP *unicast* can be can be used, in this case DHCP -requests are relayed to specific ip addresses. - -.. Note:: Configuration of *dhcp-relay* on specific devices types is beyond the - scope of this document. As a reference - `DHCP relay configuration (Example)`_ using the implementation in - `ISC DHCP software `_ is - available below. (Please refer to manual page - `dhcrelay(8) `_ for further - details on how to use this implementation.) - - -Broadcast DHCP relay -~~~~~~~~~~~~~~~~~~~~ - -DHCP requests are relayed onto the L2 network segment where the DHCP server(s) -reside using UDP *broadcast* traffic. All devices on the network segment will -receive the broadcast traffic. When using UDP *broadcast* both DHCP servers on -the Undercloud will receive the relayed DHCP request. - -Depending on implementation this is typically configured by specifying either -*interface* or *ip network address*: - -* **Interface**: - Specifying an interface connected to the L2 network segment where the DHCP - requests will be relayed. -* **IP network address**: - Specifying the network address of the IP network where the DHCP request will - be relayed. - -Unicast DHCP relay -~~~~~~~~~~~~~~~~~~ - -DHCP requests are relayed to specific DHCP servers using UDP *unicast* traffic. -When using UDP *unicast* the device configured to provide *dhcp-relay* must be -configured to relay DHCP requests to both the IP address assigned to the -interface used for *introspection* on the Undercloud and the IP address of the -network namespace created by the Network service to host the DHCP service for -the ``ctlplane`` network. - -The interface used for *introspection* is the one defined as -``inspection_interface`` in ``undercloud.conf``. - -.. Note:: It is common to use the ``br-ctlplane`` interface for introspection, - the IP address defined as ``local_ip`` in ``undercloud.conf`` will be - on the ``br-ctlplane`` interface. - -The IP address allocated to the neutron DHCP namespace will typically be the -first address available in the IP range configured for the ``local_subnet`` in -``undercloud.conf``. (The first address in the IP range is the one defined as -``dhcp_start`` in the configuration.) For example: ``172.20.0.10`` would be the -IP address when the following configuration is used:: - - [DEFAULT] - local_subnet = leaf0 - subnets = leaf0,leaf1,leaf2 - - [leaf0] - cidr = 172.20.0.0/26 - dhcp_start = 172.20.0.10 - dhcp_end = 172.20.0.19 - inspection_iprange = 172.20.0.20,172.20.0.29 - gateway = 172.20.0.62 - masquerade = False - -.. Warning:: The IP address for the DHCP namespace is automatically allocated, - it will in most cases be the first address in the IP range, but - do make sure to verify that this is the case by running the - following commands on the Undercloud:: - - $ openstack port list --device-owner network:dhcp -c "Fixed IP Addresses" - +----------------------------------------------------------------------------+ - | Fixed IP Addresses | - +----------------------------------------------------------------------------+ - | ip_address='172.20.0.10', subnet_id='7526fbe3-f52a-4b39-a828-ec59f4ed12b2' | - +----------------------------------------------------------------------------+ - $ openstack subnet show 7526fbe3-f52a-4b39-a828-ec59f4ed12b2 -c name - +-------+--------+ - | Field | Value | - +-------+--------+ - | name | leaf0 | - +-------+--------+ - -DHCP relay configuration (Example) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In the following examples ``dhcrelay`` from -`ISC DHCP software `_ is started using -configuration parameters to relay incoming DHCP request on interfaces: -``eth1``, ``eth2`` and ``eth3``. The undercloud DHCP servers are on the network -segment connected to the ``eth0`` interface. The DHCP server used for -``introspection`` is listening on ip address: ``172.20.0.1`` and the DHCP -server used for ``provisioning`` is listening on ip address: ``172.20.0.10``. - -Example, dhcrelay version 4.2.5 (in CentOS 7):: - - dhcrelay -d --no-pid 172.20.0.10 172.20.0.1 \ - -i eth0 -i eth1 -i eth2 -i eth3 - -Example, dhcrelay version 4.3.6 (in Fedora 28):: - - dhcrelay -d --no-pid 172.20.0.10 172.20.0.1 \ - -iu eth0 -id eth1 -id eth2 -id eth3 - -Map bare metal node ports to control plane network segments ------------------------------------------------------------ - -To enable deployment onto a L3 routed network the baremetal ports must have -its ``physical_network`` field configured. Each baremetal port is associated -with a baremetal node in the Bare Metal service. The physical network names are -the ones used in the ``subnets`` option in the undercloud configuration. - -.. Note:: The physical network name of the subnet specified as ``local_subnet`` - in ``undercloud.conf`` is special. It is **always** named - ``ctlplane``. - -#. Make sure the baremetal nodes are in one of the following states: *enroll*, - or *manageable*. If the baremetal node is not in one of these states the - command used to set the ``physical_network`` property on the baremetal port - will fail. (For additional details regarding node states see - :doc:`../provisioning/node_states`.) - - To set all nodes to ``manageable`` state run the following command:: - - for node in $(baremetal node list -f value -c Name); do \ - baremetal node manage $node --wait; done - -#. Use ``baremetal port list --node `` command to find out - which baremetal ports are associated with which baremetal node. Then set the - ``physical-network`` for the ports. - - In the example below three subnets where defined in the configuration, - *leaf0*, *leaf1* and *leaf2*. Notice that the ``local_subnet`` is ``leaf0``, - since the physical network for the ``local_subnet`` is always ``ctlplane`` - the baremetal port connected to ``leaf0`` use ``ctlplane``. The remaining - ports use the ``leafX`` names:: - - $ baremetal port set --physical-network ctlplane - - $ baremetal port set --physical-network leaf1 - $ baremetal port set --physical-network leaf2 - $ baremetal port set --physical-network leaf2 - -#. Make sure the nodes are in ``available`` state before deploying the - overcloud:: - - $ openstack overcloud node provide --all-manageable - -Create network data with multi-subnet networks ----------------------------------------------- - -Network data (``network_data.yaml``) is used to define the networks in the -deployment. Each network has a base subnet defined by the network's -properties: ``ip_subnet``, ``allocation_pools``, ``gateway_ip``, ``vlan`` etc. - -With support for routed networks (multiple subnets per network) the schema for -network's was extended with the ``subnets`` property, a map of one or more -additional subnets associated with the network. ``subnets`` property example:: - - subnets: - : - vlan: '' - ip_subnet: '/' - allocation_pools: [{'start': '', 'end': ''}] - gateway_ip: '' - -.. Note:: The name of the base subnet is ``name_lower`` with the suffix - ``_subnet`` appended. For example, the base subnet on the - ``InternalApi`` network will be named ``internal_api_subnet``. This - name is used when setting the subnet for a role to use the base - subnet. (See - `Create roles specific to each leaf (layer 2 segment)`_) - -Full networks data example:: - - - name: External - vip: true - name_lower: external - vlan: 100 - ip_subnet: '10.0.0.0/24' - allocation_pools: [{'start': '10.0.0.4', 'end': '10.0.0.99'}] - gateway_ip: '10.0.0.254' - - name: InternalApi - name_lower: internal_api - vip: true - vlan: 10 - ip_subnet: '172.17.0.0/24' - allocation_pools: [{'start': '172.17.0.10', 'end': '172.17.0.250'}] - gateway_ip: '172.17.0.254' - subnets: - internal_api_leaf1: - vlan: 11 - ip_subnet: '172.17.1.0/24' - allocation_pools: [{'start': '172.17.1.10', 'end': '172.17.1.250'}] - gateway_ip: '172.17.1.254' - - name: Storage - vip: true - vlan: 20 - name_lower: storage - ip_subnet: '172.18.0.0/24' - allocation_pools: [{'start': '172.18.0.10', 'end': '172.18.0.250'}] - gateway_ip: '172.18.0.254' - subnets: - storage_leaf1: - vlan: 21 - ip_subnet: '172.18.1.0/24' - allocation_pools: [{'start': '172.18.1.10', 'end': '172.18.1.250'}] - gateway_ip: '172.18.1.254' - - name: StorageMgmt - name_lower: storage_mgmt - vip: true - vlan: 30 - ip_subnet: '172.19.0.0/24' - allocation_pools: [{'start': '172.19.0.10', 'end': '172.19.0.250'}] - gateway_ip: '172.19.0.254' - subnets: - storage_mgmt_leaf1: - vlan: 31 - ip_subnet: '172.19.1.0/24' - allocation_pools: [{'start': '172.19.1.10', 'end': '172.19.1.250'}] - gateway_ip: '172.19.1.254' - - name: Tenant - vip: false # Tenant network does not use VIPs - name_lower: tenant - vlan: 40 - ip_subnet: '172.16.0.0/24' - allocation_pools: [{'start': '172.16.0.10', 'end': '172.16.0.250'}] - gateway_ip: '172.16.0.254' - subnets: - tenant_leaf1: - vlan: 41 - ip_subnet: '172.16.1.0/24' - allocation_pools: [{'start': '172.16.1.10', 'end': '172.16.1.250'}] - gateway_ip: '172.16.1.254' - -Create roles specific to each leaf (layer 2 segment) ----------------------------------------------------- - -To aid in scheduling and to allow override of leaf specific parameters in -``tripleo-heat-templates`` create new roles for each l2 leaf. In the -``networks`` property for each role, add the networks and associated subnet. - -The following is an example with one controller role, and two compute roles. -Please refer to :doc:`custom_roles` for details on configuring custom roles. - -Example ``roles_data`` below. (The list of default services has been left out.) - -:: - - ############################################################################# - # Role: Controller # - ############################################################################# - - name: Controller - description: | - Controller role that has all the controller services loaded and handles - Database, Messaging and Network functions. - CountDefault: 1 - tags: - - primary - - controller - networks: - External: - subnet: external_subnet - InternalApi: - subnet: internal_api_subnet - Storage: - subnet: storage_subnet - StorageMgmt: - subnet: storage_mgmt_subnet - Tenant: - subnet: tenant_subnet - HostnameFormatDefault: '%stackname%-controller-%index%' - ServicesDefault: - - OS::TripleO::Services::AodhApi - - OS::TripleO::Services:: [...] - ############################################################################# - # Role: ComputeLeaf0 # - ############################################################################# - - name: ComputeLeaf0 - description: | - Basic Compute Node role - CountDefault: 1 - networks: - InternalApi: - subnet: internal_api_subnet - Tenant: - subnet: tenant_subnet - Storage: - subnet: storage_subnet - HostnameFormatDefault: '%stackname%-compute-leaf0-%index%' - disable_upgrade_deployment: True - ServicesDefault: - - OS::TripleO::Services::AuditD - - OS::TripleO::Services:: [...] - ############################################################################# - # Role: ComputeLeaf1 # - ############################################################################# - - name: ComputeLeaf1 - description: | - Basic Compute Node role - CountDefault: 1 - networks: - InternalApi: - subnet: internal_api_leaf1 - Tenant: - subnet: tenant_leaf1 - Storage: - subnet: storage_leaf1 - HostnameFormatDefault: '%stackname%-compute-leaf1-%index%' - disable_upgrade_deployment: True - ServicesDefault: - - OS::TripleO::Services::AuditD - - OS::TripleO::Services:: [...] - -Configure node placement ------------------------- - -Use node placement to map the baremetal nodes to roles, with each role using a -different set of local layer 2 segments. Please refer to :doc:`../provisioning/node_placement` -for details on how to configure node placement. - -Add role specific configuration to ``parameter_defaults`` ---------------------------------------------------------- - -In TripleO templates role specific parameters are defined using variables. One -of the variables used is ``{{role.name}}``. The templates have parameters such -as ``{{role.name}}Count``, ``Overcloud{{role.name}}Flavor``, -``{{role.name}}ControlPlaneSubnet`` and many more. This enables per-role values -for these parameters. - -Before deploying the ``overcloud`` create an environment file (The examples in -this document uses ``node_data.yaml`` for this.) that contains the required -overrides. In the example below there are parameter overrides to specify the -*Count*, *Flavor* and *ControlPlaneSubnet* to use for the following roles: - -* Controller -* ComputeLeaf0 -* ComputeLeaf1 - -Parameter override example:: - - parameter_defaults: - OvercloudComputeLeaf0Flavor: compute-leaf0 - OvercloudComputeLeaf1Flavor: compute-leaf1 - ControllerCount: 3 - ComputeLeaf0Count: 5 - ComputeLeaf1Count: 5 - ControllerControlPlaneSubnet: leaf0 - ComputeLeaf0ControlPlaneSubnet: leaf0 - ComputeLeaf1ControlPlaneSubnet: leaf1 - -Network configuration templates -------------------------------- - -Network configuration templates are dynamically generated, but depending on the -hardware configuration, the sample configurations might not be an option. If -this is the case, the dynamically generated network configuration templates can -be generated manually providing a good starting point for manual customization. - -Use the ``process-templates.py`` tool to generate network config templates for -all roles. For example:: - - $ /usr/share/openstack-tripleo-heat-templates/tools/process-templates.py \ - -p /usr/share/openstack-tripleo-heat-templates \ - -r /home/stack/roles_data.yaml \ - -n /home/stack/network_data_subnets_routed.yaml \ - -o /home/stack/processed_templates - -The generated example templates for each role can now be found under the -``/home/stack/processed_templates/network/config/`` directory:: - - /home/stack/processed_templates/network/config/ - ├── bond-with-vlans - │   ├── computeleaf0.yaml - │   ├── computeleaf1.yaml - │   ├── controller-no-external.yaml - │   ├── controller-v6.yaml - │   ├── controller.yaml - │   └── README.md - ├── multiple-nics - │   ├── compute-dvr.yaml - │   ├── computeleaf0.yaml - │   ├── computeleaf1.yaml - │   ├── controller-v6.yaml - │   ├── controller.yaml - │   └── README.md - ├── single-nic-linux-bridge-vlans - │   ├── computeleaf0.yaml - │   ├── computeleaf1.yaml - │   ├── controller-v6.yaml - │   ├── controller.yaml - │   └── README.md - └── single-nic-vlans - ├── computeleaf0.yaml - ├── computeleaf1.yaml - ├── controller-no-external.yaml - ├── controller-v6.yaml - ├── controller.yaml - └── README.md - -Inspect the generated template files to find out which sample is most similar -to the specific deployments hardware configuration. Make copies, and edit the -network configuration templates as needed. - -.. Note:: If compute nodes (or some other roles) in different leaf's have the - same hardware configuration and network needs, a single network - configuration template can be used for both roles. For example the - ``computeleaf0.yaml`` template could be copied as compute.yaml, and - be used for both compute roles (``computeleaf0`` and - ``computeleaf1``). - -Create a environment file (``network-environment-overrides.yaml``) with -``resource_registry`` overrides to specify the network configuration templates -to use. For example:: - - resource_registry: - # Port assignments for the Controller - OS::TripleO::Controller::Net::SoftwareConfig: - /home/stack/templates/controller.yaml - # Port assignments for the ComputeLeaf0 - OS::TripleO::ComputeLeaf0::Net::SoftwareConfig: - /home/stack/templates/compute.yaml - # Port assignments for the ComputeLeaf1 - OS::TripleO::ComputeLeaf1::Net::SoftwareConfig: - /home/stack/templates/compute.yaml - - -Virtual IP addresses (VIPs) ---------------------------- - -If the a controller role which is hosting VIP's (Virtual IP addresses) is not -using the base subnet of one or more networks, additional overrides to the -``VipSubnetMap`` is required to ensure VIP's are created on the subnet -associated with the L2 network segment the controller nodes is connected to. - -Example, specifying which subnet's to use when creating VIP's for the different -networks:: - - parameter_defaults: - VipSubnetMap: - ctlplane: leaf1 - redis: internal_api_leaf1 - InternalApi: internal_api_leaf1 - Storage: storage_leaf1 - StorageMgmt: storage_mgmt_leaf1 - -In this document the ctlplane subnet for the Controller is ``leaf0``. To set -which subnet on the ctlplane network that will be used for cluster VIP's -(Virtual IP addresses) the ``VipSubnetMap`` parameter must be overridden in an -environment file. For example add the following to -``network-environment-overrides.yaml``:: - - parameter_defaults: - VipSubnetMap: - ctlplane: leaf0 - - -Deploy the overcloud --------------------- - -To deploy the overcloud, run the ``openstack overcloud deploy`` specifying the -roles data file, the network data file and environment files. For example:: - - $ openstack overcloud deploy --templates \ - -n /home/stack/templates/network_data_subnets_routed.yaml - -r /home/stack/templates/roles_data.yaml \ - -e /home/stack/environments/node_data.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-environment.yaml \ - -e /home/stack/environments/network-environment-overrides.yaml - -.. Note:: Remember to include other environment files that you might want for - configuration of the overcloud. diff --git a/deploy-guide/source/features/security_hardening.rst b/deploy-guide/source/features/security_hardening.rst deleted file mode 100644 index 956210ea..00000000 --- a/deploy-guide/source/features/security_hardening.rst +++ /dev/null @@ -1,408 +0,0 @@ -Security Hardening -================== - -TripleO can deploy Overcloud nodes with various Security Hardening values -passed in as environment files to the ``openstack overcloud deploy`` command. - -.. note:: - It is especially important to remember that you **must** include all - environment files needed to deploy the overcloud. Make sure - you pass the full environment in addition to your customization environments - at the end of each of the ``openstack overcloud deploy`` command. - -Horizon Password Validation ---------------------------- - -Horizon provides a password validation check which OpenStack cloud operators -can use to enforce password complexity. - -Regular expression can be used for password validation with help text to display -if the users password does not adhere with validation checks. - -The following example will enforce users to create a password between 8 and 18 -characters in length:: - - parameter_defaults: - HorizonPasswordValidator: '^.{8,18}$' - HorizonPasswordValidatorHelp: 'Password must be between 8 and 18 characters.' - -If the above yaml was saved as ``horizon_password.yaml`` we can then pass this -into the overcloud deploy command as follows:: - - openstack overcloud deploy --templates \ - -e -e horizon_password.yaml - -Default Security Values in Horizon ----------------------------------- - -The following config directives are set to ``True`` as a secure default, however -if a reason exists for an operator to disable one of the following values, they -can do so using an environment file. - -.. note:: The following directives should only be set to ``False`` once the - potential security impacts are fully understood. - -Enforce Password Check -~~~~~~~~~~~~~~~~~~~~~~ - -By setting ``ENFORCE_PASSWORD_CHECK`` to ``True`` within Horizon's -``local_settings.py``, it displays an ‘Admin Password’ field on the -“Change Password” form to verify that it is the admin loggedin that wants to -perform the password change. - -If a need is present to disable ``ENFORCE_PASSWORD_CHECK`` then this can be -achieved using an environment file contain the following parameter:: - - parameter_defaults: - ControllerExtraConfig: - horizon::enforce_password_check: false - -Disallow Iframe Embed -~~~~~~~~~~~~~~~~~~~~~ - -DISALLOW_IFRAME_EMBED can be used to prevent Horizon from being embedded within -an iframe. Legacy browsers are still vulnerable to a Cross-Frame Scripting (XFS) -vulnerability, so this option allows extra security hardening where iframes are -not used in deployment. - -If however a reason exists to allow Iframe embedding, then the following -parameter can be set within an environment file:: - - parameter_defaults: - ControllerExtraConfig: - horizon::disallow_iframe_embed: false - -Disable Password Reveal -~~~~~~~~~~~~~~~~~~~~~~~ - -In the same way as ``ENFORCE_PASSWORD_CHECK`` and ``DISALLOW_IFRAME_EMBED`` the -``DISABLE_PASSWORD_REVEAL`` value to be toggled as a parameter:: - - parameter_defaults: - ControllerExtraConfig: - horizon::disable_password_reveal: false - -SSH Banner Text ---------------- - -SSH ``/etc/issue`` Banner text can be set using the following parameters in an -environment file:: - - resource_registry: - OS::TripleO::Services::Sshd: ../deployment/sshd/sshd-baremetal-ansible.yaml - - parameter_defaults: - BannerText: | - ****************************************************************** - * This system is for the use of authorized users only. Usage of * - * this system may be monitored and recorded by system personnel. * - * Anyone using this system expressly consents to such monitoring * - * and is advised that if such monitoring reveals possible * - * evidence of criminal activity, system personnel may provide * - * the evidence from such monitoring to law enforcement officials.* - ****************************************************************** - -As with the previous Horizon Password Validation example, saving the above into -a yaml file, will allow passing the aforementioned parameters into the overcloud -deploy command:: - - openstack overcloud deploy --templates \ - -e -e ssh_banner.yaml - -Audit ------ - -Having a system capable of recording all audit events is key for troubleshooting -and performing analysis of events that led to a certain outcome. The audit system -is capable of logging many events such as someone changing the system time, -changes to Mandatory / Discretionary Access Control, creating / destroying users -or groups. - -Rules can be declared using an environment file and injected into -``/etc/audit/audit.rules``:: - - parameter_defaults: - AuditdRules: - 'Record Events that Modify User/Group Information': - content: '-w /etc/group -p wa -k audit_rules_usergroup_modification' - order : 1 - 'Collects System Administrator Actions': - content: '-w /etc/sudoers -p wa -k actions' - order : 2 - 'Record Events that Modify the Systems Mandatory Access Controls': - content: '-w /etc/selinux/ -p wa -k MAC-policy' - order : 3 - -Firewall Management -------------------- - -Iptables rules are automatically deployed on overcloud nodes to open only the -ports which are needed to get OpenStack working. Rules can be added during the -deployment when needed. For example, for Zabbix monitoring system. - -.. code-block:: yaml - - parameter_defaults: - ExtraFirewallRules: - '301 allow zabbix': - dport: 10050 - proto: tcp - source: 10.0.0.8 - jump: accept - -Rules can also be used to restrict access. The number used at definition of a -rule will determine where the nftables rule will be inserted. For example, -rabbitmq rule number is 109 by default. If you want to restrain it, you could -do. - -.. code-block:: yaml - - parameter_defaults: - ExtraFirewallRules: - '098 allow rabbit from internalapi network': - dport: - - 4369 - - 5672 - - 25672 - proto: tcp - source: 10.0.0.0/24 - jump: accept - '099 drop other rabbit access': - dport: - - 4369 - - 5672 - - 25672 - proto: tcp - jump: drop - -In this example, 098 and 099 are arbitrarily numbers that are smaller than the -default rabbitmq rule number. To know the number of a rule, inspect the active -nftables rules on an appropriate node (controller, in case of rabbitmq) - -.. code-block:: shell - - nft list chain inet filter TRIPLEO_INPUT - [...] - tcp dport { 4369, 5672, 25672-25683 } ct state new counter packets 0 bytes 0 accept comment "109 rabbitmq" - -Alternatively it's possible to get the information in tripleo service in the -definition. In our case in `deployment/rabbitmq/rabbitmq-container-puppet.yaml`. - -.. code-block:: yaml - - firewall_rules: - '109 rabbitmq': - dport: - - 4369 - - 5672 - - 25672 - - 25673-25683 - -Additional information regarding the available interface options, the role, -some of the implementation details can be reviewed `here `_. - -VXLAN and nftables -~~~~~~~~~~~~~~~~~~ - -In order to properly get VXLAN support, you have to add a couple of rules to -the Undercloud firewall. This is especially true for a lab environment, or on -the upstream CI infrastructure. Here's an example of the custom rules for -the CI, feel free to adapt them. Note that the network is the one used on the -eth0 interface, aka "public" one of the Undercloud. - -.. code-block:: yaml - - parameter_defaults: - ExtraFirewallRules: - '020 Allow VXLan from CI infra network': - proto: "udp" - dport: 4789 - source: "PUBLIC_NETWORK_CIDR" - state: [] - '021 Allow OTV for vxlan from CI infra network': - proto: "udp" - dport: 8472 - source: "PUBLIC_NETWORK_CIDR" - state: [] - -.. note:: The ``state: []`` is mandatory in order to not only catch the NEW - connection (default with the nftables and iptables modules). - -AIDE - Intrusion Detection --------------------------- - -AIDE (Advanced Intrusion Detection Environment) is a file and directory -integrity checker. It is used as medium to reveal possible unauthorized file -tampering / changes. - -AIDE creates an integrity database of file hashes, which can then be used as a -comparison point to verify the integrity of the files and directories. - -The TripleO AIDE service allows an operator to populate entries into an AIDE -configuration, which is then used by the AIDE service to create an integrity -database. This can be achieved using an environment file with the following -example structure - -.. code-block:: yaml - - resource_registry: - OS::TripleO::Services::Aide: /usr/share/openstack-tripleo-heat-templates/deployment/aide/aide-baremetal-ansible.yaml - - parameter_defaults: - AideRules: - 'TripleORules': - content: 'TripleORules = p+sha256' - order : 1 - 'etc': - content: '/etc/ TripleORules' - order : 2 - 'boot': - content: '/boot/ TripleORules' - order : 3 - 'sbin': - content: '/sbin/ TripleORules' - order : 4 - 'var': - content: '/var/ TripleORules' - order : 5 - 'not var/log': - content: '!/var/log.*' - order : 6 - 'not var/spool': - content: '!/var/spool.*' - order : 7 - 'not /var/adm/utmp': - content: '!/var/adm/utmp$' - order: 8 - 'not nova instances': - content: '!/var/lib/nova/instances.*' - order: 9 - -.. note:: - Operators should select their own required AIDE values, as the example list - above is not actively maintained or benchmarked. It only seeks to provide - an document the YAML structure required. - -If above environment file were saved as `aide.yaml` it could then be passed to -the `overcloud deploy` command as follows:: - - openstack overcloud deploy --templates -e aide.yaml - -Let's walk through the different values used here. - -First an 'alias' name `TripleORules` is declared to save us repeatedly typing -out the same attributes each time. To the alias we apply attributes of -`p+sha256`. In AIDE terms this reads as monitor all file permissions `p` with an -integrity checksum of `sha256`. For a complete list of attributes that can be -used in AIDE's config files, refer to the `AIDE MAN page `_. - -Complex rules can be created using this format, such as the following:: - - MyAlias = p+i+n+u+g+s+b+m+c+sha512 - -The above would translate as monitor permissions, inodes, number of links, user, -group, size, block count, mtime, ctime, using sha256 for checksum generation. - -Note, the alias should always have an order position of `1`, which means that -it is positioned at the top of the AIDE rules and is applied recursively to all -values below. - -Following after the alias are the directories to monitor. Note that regular -expressions can be used. For example we set monitoring for the `var` directory, -but overwrite with a not clause using `!` with `'!/var/log.*'` and -`'!/var/spool.*'`. - -Further AIDE values -~~~~~~~~~~~~~~~~~~~ - -The following AIDE values can also be set. - -`AideConfPath`: The full POSIX path to the aide configuration file, this -defaults to `/etc/aide.conf`. If no requirement is in place to change the file -location, it is recommended to stick with the default path. - -`AideDBPath`: The full POSIX path to the AIDE integrity database. This value is -configurable to allow operators to declare their own full path, as often AIDE -database files are stored off node perhaps on a read only file mount. - -`AideDBTempPath`: The full POSIX path to the AIDE integrity temporary database. -This temporary files is created when AIDE initializes a new database. - -'AideHour': This value is to set the hour attribute as part of AIDE cron -configuration. - -'AideMinute': This value is to set the minute attribute as part of AIDE cron -configuration. - -'AideCronUser': This value is to set the linux user as part of AIDE cron -configuration. - -'AideEmail': This value sets the email address that receives AIDE reports each -time a cron run is made. - -'AideMuaPath': This value sets the path to the Mail User Agent that is used to -send AIDE reports to the email address set within `AideEmail`. - -Cron configuration -~~~~~~~~~~~~~~~~~~ - -The AIDE TripleO service allows configuration of a cron job. By default it will -send reports to `/var/log/audit/`, unless `AideEmail` is set, in which case it -will instead email the reports to the declared email address. - -AIDE and Upgrades -~~~~~~~~~~~~~~~~~ - -When an upgrade is performed, the AIDE service will automatically regenerate -a new integrity database to ensure all upgraded files are correctly recomputed -to possess a updated checksum. - -If `openstack overcloud deploy` is called as a subsequent run to an initial -deployment *and* the AIDE configuration rules are changed, the TripleO AIDE -service will rebuild the database to ensure the new config attributes are -encapsulated in the integrity database. - -SecureTTY ---------- - -SecureTTY allows disabling root access via any console device (tty) by means of -entries to the `/etc/securetty` file. - -An environment file can be used to set `/etc/securetty` entries as follows:: - - resource_registry: - OS::TripleO::Services::Securetty: ../deployment/securetty/securetty-baremetal-puppet.yaml - - parameter_defaults: - TtyValues: - - console - - tty1 - - tty2 - - tty3 - - tty4 - - tty5 - - tty6 - -Keystone CADF auditing ----------------------- - -Keystone CADF auditing can be enabled by setting `KeystoneNotificationFormat`:: - - parameter_defaults: - KeystoneNotificationFormat: cadf - -login.defs values ------------------ - -Entries can be made to `/etc/login.defs` to enforce password characteristics -for new users added to the system, for example:: - - resource_registry: - OS::TripleO::Services::LoginDefs: ../deployment/login-defs/login-defs-baremetal-puppet.yaml - - parameter_defaults: - PasswordMaxDays: 60 - PasswordMinDays: 1 - PasswordMinLen: 5 - PasswordWarnAge: 7 - FailDelay: 4 diff --git a/deploy-guide/source/features/server_blacklist.rst b/deploy-guide/source/features/server_blacklist.rst deleted file mode 100644 index 1183aef6..00000000 --- a/deploy-guide/source/features/server_blacklist.rst +++ /dev/null @@ -1,87 +0,0 @@ -Disabling updates to certain nodes -================================== - -Server blacklist ----------------- -Servers can be excluded from getting any updated Heat deployments by adding -them to a blacklist parameter called ``DeploymentServerBlacklist``. - - -Setting the blacklist -_____________________ -The ``DeploymentServerBlacklist`` parameter is a list of Heat server names. - -Write a new environment file, or add the parameter value to an existing -custom environment file and pass the file to the deployment command:: - - parameter_defaults: - DeploymentServerBlacklist: - - overcloud-compute-0 - - overcloud-compute-1 - - overcloud-compute-2 - -.. note:: - The server names in the parameter value are the names according to Heat, not - the actual server hostnames. - -Any servers in the list will be blacklisted by Heat from getting any updated -triggered deployments from Heat. After the stack operation completes, any -blacklisted servers will be unchanged. The blacklisted servers also could have -been powered off, or had their ``os-collect-config`` agents stopped during the -stack operation. - -The blacklist can be used during scale out operations or for isolating changes -to certain servers only. - -.. warning:: - Blacklisting servers disables **all** updates to the blacklisted nodes, even - for those deployments that could be considered critical. - -.. warning:: - Blacklisting servers should be done with caution, and only when the operator - understands that the requested change can be applied with a blacklist in - effect. - - It would be possible to blacklist servers in ways to create a hung stack in - Heat, or a misconfigured overcloud. For example, cluster configuration - changes that would need to be applied to all members of a pacemaker cluster - would not support blacklisting certain cluster members since it - could result is a misconfigured cluster. - -.. warning:: - The blacklist should not be used during the update or upgrade procedures. - Those procedures have their own methods for isolating changes to particular - servers. See the documentation for updates/upgrades for more information. - -.. warning:: - In cases where servers are added to the blacklist, further changes to those - nodes are not supported until the server is removed from the blacklist. This - includes updates/upgrades/scale up/scale down/node replacement. - -Clearing the blacklist -______________________ -When clearing the blacklist for subsequent stack operations, an empty parameter -value must be sent with the deploy command. It is not sufficient to simply omit -the parameter since Heat will use the previously saved value. - -Send an empty list value to force Heat to clear the blacklist:: - - parameter_defaults: - DeploymentServerBlacklist: [] - -Skip deploy identifier ----------------------- -The default behavior during a stack update operation is to force puppet to -reapply all manifests. This can be a time consuming operation and is not always -required if not changing any configuration date such as in the case of only -scaling out certain roles. - -The behavior can be overridden by passing ``--skip-deploy-identifier`` to the -``openstack overcloud deploy`` command. - -Similar to the server blacklist feature, this feature should be used only when -the operator is sure that puppet can be safely skipped on the stack update. - -.. note:: - In some cases, puppet will still run even when ``--skip-deploy-identifier`` - is specified. These cases include changes to puppet manifests or hieradata. diff --git a/deploy-guide/source/features/split_stack.rst b/deploy-guide/source/features/split_stack.rst deleted file mode 100644 index bd5cfc35..00000000 --- a/deploy-guide/source/features/split_stack.rst +++ /dev/null @@ -1,129 +0,0 @@ -Splitting the Overcloud stack into multiple independent Heat stacks -=================================================================== - -.. note:: Since victoria TripleO provisions baremetal using a separate - workflow :doc:`../provisioning/baremetal_provision` that does not - involve Heat stack, making this feature irrelevant. - -split-stack is a feature in TripleO that splits the overcloud stack into -multiple independent stacks in Heat. - -The ``overcloud`` stack is split into an ``overcloud-baremetal`` and -``overcloud-services`` stack. This allows for independent and isolated -management of the baremetal and services part of the Overcloud deployment. It -is a more modular design than deploying a single ``overcloud`` stack in that it -allows either the baremetal or services stack to be replaced by tooling that is -external to TripleO if desired. - -The ``overcloud-services`` stack makes extensive use of the deployed-server -feature, documented at :doc:`deployed_server` in order to orchestrate the -deployment and configuration of the services separate from the baremetal -deployment. - - -split-stack allows for mixing baremetal systems deployed by TripleO and those -deployed by external tooling when creating the services stack. Since the -baremetal resources are completely abstracted behind the deployed-server -interface when deploying the services stack, it does not matter whether the -servers were actually created with TripleO or not. - - -split-stack Requirements ------------------------- - -A default split-stack deployment (detailed in the later steps) can be deployed -without any special requirements. - -More advanced deployments where baremetal servers provisioned by TripleO will -be mixed with those not provisioned by TripleO will want to pay attention to -the requirements around using already deployed servers from -:doc:`deployed_server`. The requirements for using deployed servers will apply -when not using servers provisioned by TripleO. - -Default split-stack deployment ------------------------------- - -split-stack will be deployed by running 2 separate ``openstack overcloud -deploy`` commands to deploy the separate stacks. - -If applicable, prepare the custom roles files and any custom environments -initially. The custom roles file and an environment setting the role counts -should be passed to both deployment commands so that enough baremetal nodes are -deployed per what the ``overcloud-services`` stack expects. - -Baremetal Deployment Command -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Run the deployment command to deploy the ``overcloud-baremetal`` stack. -An additional environment file, ``overcloud-baremetal.yaml``, is passed to the -deployment to enable deploying just the baremetal stack. - -Enough baremetal nodes should be deployed to match how many nodes per role will -be needed when the services stack is deployed later. Be sure that the -environment file being used to set the role counts is passed to the baremetal -deployment command:: - - openstack overcloud deploy \ - \ - --stack overcloud-baremetal \ - -r roles-data.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/overcloud-baremetal.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/split-stack-consistent-hostname-format.yaml - -The ``--stack`` argument sets the name of the Heat stack to -``overcloud-baremetal``. This will also be the name of the Swift container that -stores the stack's plan (templates) and of the Mistral environment. - -The ``roles-data.yaml`` roles file illustrates passing a custom roles file to -the deployment command. It is not necessary to use custom roles when using -split stack, however if custom roles are used, the same roles file should be -used for both stacks. - -The ``overcloud-baremetal.yaml`` environment will set the parameters for the -deployment such that no services will be deployed. - -The ``split-stack-consistent-hostname-format.yaml`` environment will set the -respective ``HostnameFormat`` parameters for each role defined in -the role files used. The server hostnames for the 2 stacks must be the same, -otherwise the servers will not be able to pull their deployment metadata from -Heat. - -.. warning:: - - Do not pass any network isolation templates or NIC config templates to the - ``overcloud-baremetal`` stack deployment command. These will only be passed - to the ``overcloud-services`` stack deployment command. - -Services Deployment Command -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The services stack, ``overcloud-services`` will now be deployed with a separate -deployment command:: - - openstack overcloud deploy \ - \ - --stack overcloud-services \ - --disable-validations \ - -r roles-data.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-environment.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-deployed-neutron-ports.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-bootstrap-environment-centos.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/split-stack-consistent-hostname-format.yaml - -The ``overcloud-services`` stack makes use of the "deployed-server" feature. -The additional environments needed are shown in the above command. See -:doc:`deployed_server` for more information on how to fully configure the -feature. - -The roles file, ``roles-data.yaml`` is again passed to the services stack as -the same roles file should be used for both stacks. - -The ``split-stack-consistent-hostname-format.yaml`` environment is again -passed, so that the hostnames used for the server resources created by Heat are -the same as were created in the previous baremetal stack. - -During this deployment, any network isolation environments and/or NIC config -templates should be passed for the desired network configuration. - -The stack should complete and the generated ``overcloudrc`` can be used to -interact with the Overcloud. diff --git a/deploy-guide/source/features/sriov_deployment.rst b/deploy-guide/source/features/sriov_deployment.rst deleted file mode 100644 index a06226bb..00000000 --- a/deploy-guide/source/features/sriov_deployment.rst +++ /dev/null @@ -1,88 +0,0 @@ -Deploying with SR-IOV Support -=============================== - -TripleO can deploy Overcloud nodes with SR-IOV support. A new role ``ComputeSriov`` -has been added to create a custom ``roles_data.yaml`` with composable SR-IOV role. - -Execute below command to create the ``roles_data.yaml``:: - - openstack overcloud roles generate -o roles_data.yaml Controller ComputeSriov - -Once a roles file is created, the following changes are required: - -- Deploy Command -- Parameters -- Network Config - -Deploy Command ----------------- -Deploy command should include the generated roles data file from the above -command. - -Deploy command should also include the SR-IOV environment file to include the -neutron-sriov-agent service. All the required parameters are also specified in -this environment file. The parameters has to be configured according to the -baremetal on which SR-IOV needs to be enabled. - -Also, SR-IOV requires mandatory kernel parameters to be set, like -``intel_iommu=on iommu=pt`` on Intel machines. In order to enable the -configuration of kernel parameters to the host, host-config-pre-network -environment file has to be added for the deploy command. - -Adding the following arguments to the ``openstack overcloud deploy`` command -will do the trick:: - - openstack overcloud deploy --templates \ - -r roles_data.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-sriov.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/host-config-and-reboot.yaml \ - ... - -Parameters ----------- -Following are the list of parameters which need to be provided for deploying -with SR-IOV support. - -* NovaPCIPassthrough: Provide the list of SR-IOV device names, the logical network, - PCI addresses etc. The PF/VF devices matching the criteria would be available for - guests. -* NeutronPhysicalDevMappings: The map of logical network name and the physical interface. - - -Example:: - - parameter_defaults: - NovaPCIPassthrough: - - devname: "p7p1" - physical_network: "sriov1_net" - - devname: "p7p2" - physical_network: "sriov2_net" - NeutronPhysicalDevMappings: "sriov1_net:p7p1,sriov2_net:p7p2" - - -The parameter ``KernelArgs`` should be provided in the deployment environment -file, with the set of kernel boot parameters to be applied on the -``ComputeSriov`` role where SR-IOV is enabled:: - - parameter_defaults: - ComputeSriovParameters: - KernelArgs: "intel_iommu=on iommu=pt" - - -Network Config --------------- -SR-IOV supported network interfaces should be specified in the network config -templates as sriov_pf type. This mechanism of configuring numvfs for SR-IOV -device is recommended and NeutronSriovNumVFs shall be avoided. - -Example:: - - network_config: - - type: sriov_pf - name: p7p2 - mtu: 9000 - numvfs: 10 - use_dhcp: false - defroute: false - nm_controlled: true - promisc: false diff --git a/deploy-guide/source/features/ssl.rst b/deploy-guide/source/features/ssl.rst deleted file mode 100644 index 2374ce34..00000000 --- a/deploy-guide/source/features/ssl.rst +++ /dev/null @@ -1,399 +0,0 @@ -.. _ssl: - -Deploying with SSL -================== - -TripleO supports deploying with SSL on the public OpenStack endpoints as well -as deploying SSL in the internal network for most services. - -This document will focus on deployments using network isolation. For more -details on deploying that way, see -:doc:`network_isolation` - -Undercloud SSL --------------- - -To enable SSL with an automatically generated certificate, you must set -the ``generate_service_certificate`` option in ``undercloud.conf`` to -``True``. This will generate a certificate in ``/etc/pki/tls/certs`` with -a file name that follows the following pattern:: - - undercloud-[undercloud_public_vip].pem - -This will be a PEM file in a format that HAProxy can understand (see the -HAProxy documentation for more information on this). - -.. admonition:: Stable Branch - :class: stable - - As of the Rocky release, the default is to have TLS enabled through - this option. - -This option for auto-generating certificates uses Certmonger to request -and keep track of the certificate. So you will see a certificate with the -ID of ``undercloud-haproxy-public-cert`` in certmonger (you can check this -by using the ``sudo getcert list`` command). Note that this also implies -that certmonger will manage the certificate's lifecycle, so when it needs -renewing, certmonger will do that for you. - -The default is to use Certmonger's ``local`` CA. So using this option has -the side-effect of extracting Certmonger's local CA to a PEM file that is -located in the following path:: - - /etc/pki/ca-trust/source/anchors/cm-local-ca.pem - -This certificate will then be added to the trusted CA chain, since this is -needed to be able to use the undercloud's endpoints with that certificate. - -.. admonition:: Stable Branch - :class: stable - - As of the Rocky release, the default is for TripleO pass this CA - certificate to overcloud nodes so it'll be trusted. - -.. note:: If you need to access the undercloud from outside the node, the - aforementioned file is the one you need to add to your trust store. - So for RHEL-based systems you need to copy ``cm-local-ca.pem`` into - ``/etc/pki/ca-trust/source/anchors/`` and subsequently run the - command ``update-ca-trust extract``. This will add that CA to your - trust store. - -However, it is possible to not use certmonger's ``local`` CA. For -instance, one can use FreeIPA as the CA by setting the option -``certificate_generation_ca`` in ``undercloud.conf`` to have 'IPA' as the -value. This requires the undercloud host to be enrolled as a FreeIPA -client, and to define a ``haproxy/@`` -service in FreeIPA. We also need to set the option ``service_principal`` -to the relevant value in ``undercloud.conf``. Finally, we need to set the -public endpoints to use FQDNs instead of IP addresses, which will also -then use an FQDN for the certificate. - -To enable an FQDN for the certificate we set the ``undercloud_public_vip`` -to the desired hostname in ``undercloud.conf``. This will in turn also set -the keystone endpoints to relevant values. - -Note that the ``generate_service_certificate`` option doesn't take into -account the ``undercloud_service_certificate`` option and will have -precedence over it. - -To enable SSL on the undercloud with a pre-created certificate, you must -set the ``undercloud_service_certificate`` option in ``undercloud.conf`` -to an appropriate certificate file. Important: -The certificate file's Common Name *must* be set to the value of -``undercloud_public_vip`` in undercloud.conf. - -If you do not have a trusted CA signed certificate file, you can alternatively -generate a self-signed certificate file using the following command:: - - openssl genrsa -out privkey.pem 2048 - -The next command will prompt for some identification details. Most of these don't -matter, but make sure the ``Common Name`` entered matches the value of -``undercloud_public_vip`` in undercloud.conf:: - - openssl req -new -x509 -key privkey.pem -out cacert.pem -days 365 - -Combine the two files into one for HAProxy to use. The order of the -files in this command matters, so do not change it:: - - cat cacert.pem privkey.pem > undercloud.pem - -Move the file to a more appropriate location and set the SELinux context:: - - sudo mkdir /etc/pki/instack-certs - sudo cp undercloud.pem /etc/pki/instack-certs - sudo semanage fcontext -a -t etc_t "/etc/pki/instack-certs(/.*)?" - sudo restorecon -R /etc/pki/instack-certs - -``undercloud_service_certificate`` should then be set to -``/etc/pki/instack-certs/undercloud.pem``. - -Add the self-signed CA certificate to the undercloud system's trusted -certificate store:: - - sudo cp cacert.pem /etc/pki/ca-trust/source/anchors/ - sudo update-ca-trust extract - -.. note:: If you're using a self-signed or autogenerated certificate for the - undercloud, the overcloud nodes will need to trust it. So the - contents of the certificate need to be set in the CAMap as described - in ":ref:`ca-trust`" section. - -Overcloud SSL -------------- - -Certificate and Public VIP Configuration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The public VIP of the deployed overcloud needs to be predictable in order for -the SSL certificate to be configured properly. There are two options for -configuring the certificate: - -#. The certificate's Common Name can be set to the IP of the public - VIP. In this case, the Common Name must match *exactly*. If the public - VIP is ``10.0.0.1``, the certificate's Common Name must also be ``10.0.0.1``. - Wild cards will not work. - -#. The overcloud endpoints can be configured to point at - a DNS name. In this case, the certificate's Common Name must be valid - for the FQDN of the overcloud endpoints. Wild cards should work fine. - Note that this option also requires pre-configuration of the specified - DNS server with the appropriate FQDN and public VIP. - -In either case, the public VIP must be explicitly specified as part of the -deployment configuration. This can be done by passing an environment file -like the following:: - - parameter_defaults: - PublicVirtualFixedIPs: [{'ip_address':'10.0.0.1'}] - -.. note:: If network isolation is not in use, the ControlFixedIPs parameter - should be set instead. - -The selected IP should fall in the specified allocation range for the public -network. - -Certificate Details -~~~~~~~~~~~~~~~~~~~ - -.. This admonition is intentionally left class-less because it is only used - on the SSL page. -.. admonition:: Self-Signed SSL - - It is not recommended that the self-signed certificate is trusted; So for - this purpose, having a self-signed CA certificate is a better choice. In - this case we will trust the self-signed CA certificate, and not the leaf - certificate that will be used for the public VIP; This leaf certificate, - however, will be signed by the self-signed CA. - - For the self-signed case, just the predictable public VIP method will - be documented, as DNS configuration is outside the scope of this document. - - Generate a private key:: - - openssl genrsa -out overcloud-ca-privkey.pem 2048 - - Generate a self-signed CA certificate. This command will prompt for some - identifying information. Most of the fields don't matter, and the CN should - not be the same as the one we'll give the leaf certificate. You can choose a - CN for this such as "TripleO CA":: - - openssl req -new -x509 -key overcloud-ca-privkey.pem \ - -out overcloud-cacert.pem -days 365 - - Add the self-signed CA certificate to the undercloud's trusted certificate - store. Adding this file to the overcloud nodes will be discussed later:: - - sudo cp overcloud-cacert.pem /etc/pki/ca-trust/source/anchors/ - sudo update-ca-trust extract - - This certificate location needs to be added to the ``enabled-tls.yaml`` file - with the parameter ``PublicTLSCAFile`` like so:: - - parameter_defaults: - PublicTLSCAFile: '/etc/pki/ca-trust/source/anchors/overcloud-cacert.pem' - - ``PublicTLSCAFile`` ensures the CA Certificate will be added to the ``clouds.yaml`` - file for the ``cacert`` parameter. - - Generate the leaf certificate request and key that will be used for the - public VIP. To do this, we will create two files for the certificate - request. First, we create the server.csr.cnf:: - - [req] - default_bits = 2048 - prompt = no - default_md = sha256 - distinguished_name = dn - [dn] - C=AU - ST=Queensland - L=Brisbane - O=your-org - OU=admin - emailAddress=me@example.com - CN=openstack.example.com - - Create v3.ext:: - - authorityKeyIdentifier=keyid,issuer - basicConstraints=CA:FALSE - keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment - subjectAltName = @alt_names - [alt_names] - DNS.1=openstack.example.com - - Create the Key:: - - openssl req -new -sha256 -nodes -out server.csr \ - -newkey rsa:2048 -keyout server-key.pem \ - -config <( cat server.csr.cnf ) - - Create the certificate:: - - openssl x509 -req -in server.csr \ - -CA overcloud-cacert.pem \ - -CAkey overcloud-ca-privkey.pem \ - -CAcreateserial -out server-cert.pem \ - -days 500 -sha256 -extfile v3.ext - - The following is a list of which files generated in the previous steps - map to which parameters in the SSL environment files:: - - overcloud-cacert.pem: SSLRootCertificate - server-key.pem: SSLKey - server-cert.pem: SSLCertificate - -The contents of the private key and certificate files must be provided -to Heat as part of the deployment command. To do this, there is a sample -environment file in tripleo-heat-templates with fields for the file contents. - -It is generally recommended that the original copy of tripleo-heat-templates -in ``/usr/share/openstack-tripleo-heat-templates`` not be altered, since it -could be overwritten by a package update at any time. Instead, make a copy -of the templates:: - - cp -r /usr/share/openstack-tripleo-heat-templates ~/ssl-heat-templates - -Then edit the enable-tls.yaml environment file. If using the location from the -previous command, the correct file would be in -``~/ssl-heat-templates/environments/ssl/enable-tls.yaml``. Insert the contents of -the private key and certificate files in their respective locations. - -.. admonition:: Stable Branch - :class: stable - - In the Pike release the SSL environment files in the top-level environments - directory were deprecated and moved to the ``ssl`` subdirectory as - shown in the example paths. For Ocata and older the paths will still need - to refer to the top-level environments. The filenames are all the same, but - the ``ssl`` directory must be removed from the path. - -.. note:: The certificate and key will be multi-line values, and all of the lines - must be indented to the same level. - -An abbreviated version of how the file should look:: - - parameter_defaults: - SSLCertificate: | - -----BEGIN CERTIFICATE----- - MIIDgzCCAmugAwIBAgIJAKk46qw6ncJaMA0GCSqGSIb3DQEBCwUAMFgxCzAJBgNV - [snip] - sFW3S2roS4X0Af/kSSD8mlBBTFTCMBAj6rtLBKLaQbIxEpIzrgvp - -----END CERTIFICATE----- - [rest of file snipped] - -``SSLKey`` should look similar, except with the value of the private key. - -``SSLIntermediateCertificate`` can be set in the same way if the certificate -signer uses an intermediate certificate. Note that the ``|`` character must -be added as in the other values to indicate that this is a multi-line value. - -When using a self-signed certificate or a signer whose certificate is -not in the default trust store on the overcloud image it will be necessary -to inject the certificate as part of the deploy process. This can be done -with the environment file ``~/ssl-heat-templates/environments/ssl/inject-trust-anchor.yaml``. -Insert the contents of the signer's root CA certificate in the appropriate -location, in a similar fashion to what was done for the certificate and key -above. - -.. admonition:: Self-Signed SSL - :class: selfsigned - - Injecting the root CA certificate is required for self-signed SSL. The - correct value to use is the contents of the ``overcloud-cacert.pem`` file. - -DNS Endpoint Configuration -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When deploying with DNS endpoint addresses, two additional parameters must be -passed in a Heat environment file. These are ``CloudName`` and ``DnsServers``. -To do so, create a new file named something like ``cloudname.yaml``:: - - parameter_defaults: - CloudName: my-overcloud.my-domain.com - DnsServers: 10.0.0.100 - -Replace the values with ones appropriate for the target environment. Note that -the configured DNS server(s) must have an entry for the configured ``CloudName`` -that matches the public VIP. - -In addition, when a DNS endpoint is being used, make sure to pass the -``tls-endpoints-public-dns.yaml`` environment to your deploy command. See the examples -below. - -Deploying an SSL Environment -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The ``enable-tls.yaml`` file must always be passed to use SSL on the public -endpoints. Depending on the specific configuration, additional files will -also be needed. Examples of the necessary parameters for different scenarios -follow. - -IP-based certificate:: - - -e ~/ssl-heat-templates/environments/ssl/enable-tls.yaml -e ~/ssl-heat-templates/environments/ssl/tls-endpoints-public-ip.yaml - -Self-signed IP-based certificate:: - - -e ~/ssl-heat-templates/environments/ssl/enable-tls.yaml -e ~/ssl-heat-templates/environments/ssl/tls-endpoints-public-ip.yaml -e ~/ssl-heat-templates/environments/ssl/inject-trust-anchor.yaml - -DNS-based certificate:: - - -e ~/ssl-heat-templates/environments/ssl/enable-tls.yaml -e ~/ssl-heat-templates/environments/ssl/tls-endpoints-public-dns.yaml -e ~/cloudname.yaml - -Self-signed DNS-based certificate:: - - -e ~/ssl-heat-templates/environments/ssl/enable-tls.yaml -e ~/ssl-heat-templates/environments/ssl/tls-endpoints-public-dns.yaml -e ~/cloudname.yaml -e ~/ssl-heat-templates/environments/ssl/inject-trust-anchor.yaml - -It is also possible to get all your certificates from a CA. For this you need -to include the **environments/services/haproxy-public-tls-certmonger.yaml** -environment file. - -.. _ca-trust: - -Getting the overcloud to trust CAs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As mentioned above, it is possible to get the overcloud to trust a CA by using -the ``~/ssl-heat-templates/environments/ssl/inject-trust-anchor.yaml`` environment -and adding the necessary details there. However, that environment has the -restriction that it will only allow you to inject one CA. However, the -file ``~/ssl-heat-templates/environments/ssl/inject-trust-anchor-hiera.yaml`` is an -alternative that actually supports as many CA certificates as you need. - -.. note:: This is only available since Newton. Older versions of TripleO don't - support this. - -This file is a template of how you should fill the ``CAMap`` parameter which is -passed via parameter defaults. It looks like this:: - - CAMap: - first-ca-name: - content: | - The content of the CA cert goes here - second-ca-name: - content: | - The content of the CA cert goes here - -where ``first-ca-name`` and ``second-ca-name`` will generate the files -``first-ca-name.pem`` and ``second-ca-name.pem`` respectively. These files will -be stored in the ``/etc/pki/ca-trust/source/anchors/`` directory in each node -of the overcloud and will be added to the trusted certificate chain of each of -the nodes. You must be careful that the content is a block string in yaml and -is in PEM format. - -.. admonition:: Stable Branch - :class: stable - - As of Rocky, the undercloud now defaults to using TLS through the - autogenerated certificate. If you're upgrading your undercloud and - had the ``generate_service_certificate``, it also automatically passes - the CA certificate via the ``CAMap`` parameter. - -.. note:: In some cases, such as when using Ceph, the overcloud needs to trust - the undercloud's CA certificate. If you're using the default CA in - the undercloud, and autogenerated your certificates, you'll need to - copy the contents of - ``/etc/pki/ca-trust/source/anchors/cm-local-ca.pem`` into the - aforementioned ``CAMap`` parameter. diff --git a/deploy-guide/source/features/swift_external.rst b/deploy-guide/source/features/swift_external.rst deleted file mode 100644 index 07650a64..00000000 --- a/deploy-guide/source/features/swift_external.rst +++ /dev/null @@ -1,85 +0,0 @@ -Use an external Swift Proxy with the Overcloud -=============================================== - -|project| supports use of an external Swift (or Ceph RadosGW) proxy, already -available to the operator. - -Use of an external Swift proxy can be configured using a particular environment file -when deploying the overcloud, specifically `environments/swift-external.yaml`. - -In the environment file above user must adjust the parameters to fit -its setup by creating a custom environment file (i.e. -*~/my-swift-settings.yaml*):: - - parameter_defaults: - ExternalSwiftPublicUrl: 'http://:9024/v1/AUTH_%(tenant_id)s' - ExternalSwiftInternalUrl: 'http://:9024/v1/AUTH_%(tenant_id)s' - ExternalSwiftAdminUrl: 'http://:9024' - ExternalSwiftUserTenant: 'service' - SwiftPassword: 'choose_a_random_password' - -.. note:: - - When the external Swift is implemented by Ceph RadosGW, the endpoint will be - different; the /v1/ part needs to be replaced with /swift/v1, for example: - `http://:9024/v1/AUTH_%(tenant_id)s` - becomes - `http://:9024/swift/v1/AUTH_%(tenant_id)s` - -The user can create an environment file with the required settings -and add the files above to the deploy commandline:: - - openstack overcloud deploy --templates -e /usr/share/openstack-tripleo-heat-templates/environments/swift-external.yaml -e ~/my-swift-settings.yaml - -Once the deploy has succeeded, user has to complete the -configuration on the external swift proxy, configuring it to use the -keystone authentication provider. This environment file creates also -a service user called *swift* that can be used for this purpose. The -password for this user is defined by using the *SwiftPassword* -parameter, as shown above. - -The external Swift proxy must use Keystone from the overcloud, otherwise -authentication will fail. The public Keystone endpoint must be -accessible from the proxy therefore. - -The following snippet from `/etc/swift/proxy-server.conf` is an example -how to configure the Swift proxy to use Keystone from the overcloud:: - - [pipeline:main] - pipeline = [... other middlewares ...] authtoken keystone [... other middlewares ...] - - [filter:keystone] - use = egg:swift#keystoneauth - operator_roles = admin, SwiftOperator - cache = swift.cache - - [filter:authtoken] - paste.filter_factory = keystonemiddleware.auth_token:filter_factory - signing_dir = /tmp/keystone-signing-swift - www_authenticate_uri = http://:5000/ - auth_url = http://:5000/ - password = - auth_plugin = password - project_domain_id = default - user_domain_id = default - project_name = service - username = swift - cache = swift.cache - include_service_catalog = False - delay_auth_decision = True - -For Ceph RadosGW instead, the following settings can be used:: - - rgw_keystone_api_version: 3 - rgw_keystone_url: http://:5000/ - rgw_keystone_accepted_roles: 'member, Member, admin' - rgw_keystone_accepted_admin_roles: ResellerAdmin, swiftoperator - rgw_keystone_admin_domain: default - rgw_keystone_admin_project: service - rgw_keystone_admin_user: swift - rgw_keystone_admin_password: - rgw_keystone_implicit_tenants: 'true' - rgw_keystone_revocation_interval: '0' - rgw_s3_auth_use_keystone: 'true' - rgw_swift_versioning_enabled: 'true' - rgw_swift_account_in_url: 'true' diff --git a/deploy-guide/source/features/tls-everywhere.rst b/deploy-guide/source/features/tls-everywhere.rst deleted file mode 100644 index 94c558a6..00000000 --- a/deploy-guide/source/features/tls-everywhere.rst +++ /dev/null @@ -1,405 +0,0 @@ -Deploying TLS-everywhere -======================== - -Setting up *TLS-everywhere* primarily consists of a few additional steps you -need to take on the undercloud and FreeIPA server. These steps consist of -installing additional packages and enrolling the undercloud host as a FreeIPA -client. - -The OpenStack release you are deploying affects which tools you can use to -deploy *TLS-everywhere*. For deployments using Queens through Stein you must -use Novajoin. For deployments using Train or Ussuri, you can use either -Novajoin or tripleo-ipa. For deployments using Victoria or newer releases you -must use tripleo-ipa. Deployments :ref:`deployed_server` must also use -tripleo-ipa. We recommend using tripleo-ipa whenever possible. Let's walk -through each step using both tripleo-ipa and Novajoin. - -You can find a primer on the various TLS deployment strategies and components -in the :doc:`tls-introduction` documentation. - -TLS-everywhere with tripleo-ipa -------------------------------- - -.. note:: - - This deployment strategy is only supported on Train and newer releases. If - you're deploying a version older than Train, you'll need to use Novajoin to - accomplish *TLS-everywhere*, which is documented below. - -Do the following steps before deploying your undercloud. - -Configure DNS -~~~~~~~~~~~~~ - -*TLS-everywhere* deployments use FreeIPA as the DNS server. You need to set the -proper search domain and nameserver on the undercloud. To do this, you need to -know the deployment domain, the domain of the FreeIPA server, and the FreeIPA -server's IP address. For example, if the deployment domain is `example.com` and -the FreeIPA server domain is `bigcorp.com`, you should set the following in -`/etc/resolv.conf`:: - - search example.com bigcorp.com - nameserver $FREEIPA_IP_ADDRESS - -This step ensures the undercloud can resolve newly added hosts and services -after TripleO enrolls them as FreeIPA clients. You only need to add both search -domains if they're different. If the FreeIPA server is using the same domain as -the deployment you only need to specify the deployment domain. - -Configure FreeIPA -~~~~~~~~~~~~~~~~~ - -.. note:: - This section assumes you have permissions to make writeable changes to your - FreeIPA server. If you don't have those permissions or direct access to the - FreeIPA server, you'll need to contact your FreeIPA administrator and have - them perform the following steps either using ansible scripts or manually. - -Before you configure the undercloud, you need to ensure FreeIPA is configured -with the correct principal and privileges. This allows the undercloud to add -new hosts, services, and DNS records in FreeIPA during the overcloud -installation. - -The undercloud will enroll itself as a FreeIPA client and download a keytab to -use for authentication during the installation process. To do this, it needs a -one-time password (OTP) from FreeIPA that you configure in ``undercloud.conf``. - -You can generate the OTP manually if you have the correct permissions to add -hosts, modify permissions, update roles, and create principals in FreeIPA. You -need to perform these actions from an existing FreeIPA client. Note, the -FreeIPA server itself is enrolled as a client. - -You can find a set of `playbooks -`_ -in tripleo-ipa that automate creating permissions, hosts, and principals for -the undercloud. These playbooks expect the ``IPA_PRINCIPAL``, which is a user -in FreeIPA, to have the necessary permissions to perform the tasks in each -playbook (e.g., ``ipa privilege-add-permission``, ``ipa host-add``, etc). They -also expect you to generate a kerberos token before executing each playbook. - -Create a FreeIPA role -^^^^^^^^^^^^^^^^^^^^^ - -First, you need to create a new FreeIPA role with the appropriate permissions -for managing hosts, principals, services, and DNS entries:: - - $ kinit - $ export IPA_PASSWORD=$IPA_PASSWORD - $ export IPA_PRINCIPAL=$IPA_USER - $ export UNDERCLOUD_FQDN=undercloud.example.com - $ ansible-playbook /usr/share/ansible/tripleo-playbooks/ipa-server-create-role.yaml - -Register the undercloud -^^^^^^^^^^^^^^^^^^^^^^^ - -Next, you need to register the undercloud as a FreeIPA client and generate a -OTP that the undercloud will use for enrollment, which is necessary before it -can manage entities in FreeIPA:: - - $ export IPA_PASSWORD=$IPA_PASSWORD - $ export IPA_PRINCIPAL=$IPA_USER - $ export UNDERCLOUD_FQDN=undercloud.example.com - $ ansible-playbook /usr/share/ansible/tripleo-playbooks/ipa-server-register-undercloud.yaml - -If successful, the ansible output will contain an OTP. Save this OTP because -you will need it when you configure the undercloud. - -Create a principal -^^^^^^^^^^^^^^^^^^ - -Finally, create a FreeIPA principal and grant it the necessary permissions to -manage hosts, services, and DNS entries in FreeIPA:: - - $ export IPA_PASSWORD=$IPA_PASSWORD - $ export IPA_PRINCIPAL=$IPA_USER - $ export UNDERCLOUD_FQDN=undercloud.example.com - $ ansible-playbook /usr/share/ansible/tripleo-playbooks/ipa-server-create-principal.yaml - -Configure the Undercloud -~~~~~~~~~~~~~~~~~~~~~~~~ - -.. warning:: - This section only provides guidance for configuring *TLS-everywhere*. You - need to make sure your undercloud configuration is complete before starting - the undercloud installation process. - -Set the following variables in `undercloud.conf`:: - - ipa_otp = $OTP - overcloud_domain_name = example.com - undercloud_nameservers = $FREEIPA_IP_ADDRESS - -Your undercloud configuration is ready to be deployed and has the necessary -changes to allow you to deploy *TLS-everywhere* for the overcloud. - -Undercloud Install -~~~~~~~~~~~~~~~~~~ - -After you've had an opportunity to verify all undercloud configuration options, -including the options listed above, start the undercloud installation process:: - - $ openstack undercloud install - -Undercloud Verification -~~~~~~~~~~~~~~~~~~~~~~~ - -You should verify that the undercloud was enrolled properly by listing the -hosts in FreeIPA:: - - $ sudo kinit - $ sudo ipa host-find - -You should also confirm that ``/etc/novajoin/krb5.keytab`` exists on the -undercloud. The ``novajoin`` directory name is purely for legacy naming -reasons. The keytab is placed in this directory regardless of using novajoin -to enroll the undercloud as a FreeIPA client. - -You can proceed with the :ref:`Overcloud TLS-everywhere` if the undercloud -installation was successful. - -TLS-everywhere with Novajoin ----------------------------- - -.. warning:: This deployment strategy is only supported up to the Train release. We - recommend using tripleo-ipa to accomplish *TLS-everywhere* in newer - releases. Steps for using tripleo-ipa are documented above. This deployment - strategy has been removed in Victoria. - -Do the following steps before deploying your undercloud. - -Configure DNS -~~~~~~~~~~~~~ - -*TLS-everywhere* deployments use FreeIPA as the DNS server. You need to set the -proper search domain and nameserver on the undercloud. To do this, you need to -know the deployment domain, the domain of the FreeIPA server, and the FreeIPA -server's IP address. For example, if the deployment domain is `example.com` and -the FreeIPA server domain is `bigcorp.com`, you should set the following in -`/etc/resolv.conf`:: - - search example.com bigcorp.com - nameserver $FREEIPA_IP_ADDRESS - -This step ensures the undercloud can resolve newly added hosts and services -after TripleO enrolls them as FreeIPA clients. You only need to add both search -domains if they're different. If the FreeIPA server is using the same domain as -the deployment you only need to specify the deployment domain. - -Add Undercloud as a FreeIPA host -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Next, you need to add the undercloud as a host in FreeIPA. This will generate a -one-time password that TripleO uses to enroll the undercloud as a FreeIPA -client, giving the undercloud the permissions it needs to add new hosts, -services, and DNS records. You can use the following command-line utility to -add the undercloud as a FreeIPA host:: - - novajoin-ipa-setup \ - --principal $IPA_USER \ - --password $IPA_PASSWORD \ - --server ipa.bigcorp.com \ - --realm BIGCORP.COM \ - --domain example.com \ - --hostname undercloud.example.com \ - --precreate - -If successful, the command will return a one-time password. Save this password -because you will need it later to configure the undercloud. - -Configure the Undercloud -~~~~~~~~~~~~~~~~~~~~~~~~ - -.. warning:: - This section only provides guidance for configuring *TLS-everywhere*. You - need to make sure your undercloud configuration is complete before starting - the undercloud installation process. - -Set the following variables in `undercloud.conf`:: - - enable_novajoin = True - ipa_otp = $IPA_OTP - overcloud_domain_name = example.com - -Your undercloud configuration is ready to be deployed and has the necessary -changes to allow you to deploy *TLS-everywhere* for the overcloud. - -Undercloud Install -~~~~~~~~~~~~~~~~~~ - -After you've had an opportunity to verify all undercloud configuration options, -including the options listed above, start the undercloud installation process:: - - $ openstack undercloud install - -Undercloud Verification -~~~~~~~~~~~~~~~~~~~~~~~ - -You should verify that the undercloud was enrolled properly by listing the -hosts in FreeIPA:: - - $ sudo kinit - $ sudo ipa host-find - -You should also confirm that ``/etc/novajoin/krb5.keytab`` exists on the -undercloud and that the ``novajoin`` and ``novajoin-notifier`` services are -running. - -You can proceed with the :ref:`Overcloud TLS-everywhere` if the undercloud -installation was successful. - -.. _Overcloud TLS-everywhere: - -Configuring the Overcloud -------------------------- - -*TLS-everywhere* requires you to set extra parameters and templates before you -deploy, or update, your overcloud. These changes consist of settings domain -information and including additional heat templates in your deploy command. -Let's walk through each step individually. - -Set Parameters -~~~~~~~~~~~~~~ - -Next, you need to set parameters so that TripleO knows where to find your -FreeIPA server and configures DNS. You need to set these variables so that -TripleO adds DNS records that map to the correct hosts. Let's continue assuming -we have a file called ``tls-parameters.yaml`` and it contains the following -parameter_defaults section:: - - parameter_defaults: - DnsSearchDomains: ["example.com"] - DnsServers: ["192.168.1.13"] - CloudDomain: example.com - CloudName: overcloud.example.com - CloudNameInternal: overcloud.internalapi.example.com - CloudNameStorage: overcloud.storage.example.com - CloudNameStorageManagement: overcloud.storagemgmt.example.com - CloudNameCtlplane: overcloud.ctlplane.example.com - -.. note:: - If you are using deployed servers, you must also specify the following - parameters:: - - IdMInstallClientPackages: True - - This option is required to install packages needed to enroll overcloud - hosts as FreeIPA clients. Deployments using Novajoin do not require this - option since the necessary packages are built into the overcloud images. If - you do not specify this argument, you need to ensure dependencies for - ansible-freeipa are present on the overcloud servers before deploying the - overcloud. - -The ``DnsServers`` value above assumes we have FreeIPA available at -192.168.1.13. - -It's important to note that you will need to update the `DnsSearchDomains` to -include the domain of the IPA server if it's different than the `CloudDomain`. -For example, if your `CloudDomain` is `example.com` and your IPA server is -located at `ipa.bigcorp.com`, then you need to include `bigcorp.com` as an -additional search domain:: - - DnsSearchDomains: ["example.com", "bigcorp.com"] - -Composable Services -~~~~~~~~~~~~~~~~~~~ - -In addition to the parameters above, you might need to update the -``resource_registry`` in ``tls-parameters.yaml`` to include a composable -service. There are two composable services, one for Novajoin and the other is -for tripleo-ipa. TripleO uses the Novajoin composable service for deploying -*TLS-everywhere* by default. If you need or want to use tripleo-ipa, you'll -need to update the registry to use a different composable service. Both options -are described below. - -Novajoin Composable Service -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This was the default option until Ussuri. As of Victoria, this option has -been removed, and deployers upgrading to Victoria will be migrated to tripleo-ipa. - -For reference, the Novajoin based composable service is located at -/usr/share/openstack-tripleo-heat-templates/deployment/ipa/ipaclient-baremetal-ansible.yaml - -tripleo-ipa Composable Service -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you're deploying *TLS-everywhere* with tripleo-ipa prior to Victoria, you need to -override the default Novajoin composable service. Add the following composable service to -the ``resource_registry`` in ``tls-parameters.yaml``:: - - resource_registry: - OS::TripleO::Services::IpaClient: /usr/share/openstack-tripleo-heat-templates/deployment/ipa/ipaservices-baremetal-ansible.yaml - -As of Victoria, this is the only method for deploying *TLS-everywhere*. - -Specify Templates -~~~~~~~~~~~~~~~~~ - -At this point, you should have all the settings configured for a successful -*TLS-everywhere* deployment. The only remaining step is to include the -following templates in your overcloud deploy command:: - - $ openstack overcloud deploy \ - -e /usr/share/openstack-tripleo-heat-templates/environments/ssl/tls-everywhere-endpoints-dns.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/services/haproxy-public-tls-certmonger.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/ssl/enable-internal-tls.yaml \ - -e tls-parameters.yaml - -Remember, ``tls-parameters.yaml`` is the file containing the parameters above. - -Overcloud Verification ----------------------- - -After the overcloud is deployed, you can confirm each endpoint is using HTTPS -by querying keystone's endpoints:: - - $ openstack --os-cloud overcloud endpoint list - -Deleting Overclouds -------------------- - -.. note:: - This functionality is only invoked when you use the ``openstack overcloud - delete`` command using Train or newer releases. The overcloud is - technically a heat stack, but using ``openstack stack delete`` will not - clean up FreeIPA. - -.. note:: - This section is only applicable to deployments using tripleo-ipa. Novajoin - cleans up FreeIPA after consuming notifications about instance deletion. - -The python-tripleoclient CLI cleans up hosts, services, and DNS records in -FreeIPA when you delete an overcloud:: - - $ openstack overcloud delete overcloud - -You can verify the hosts, services, DNS records were removed by querying -FreeIPA:: - - $ kinit - $ ipa host-find - $ ipa service-find - $ ipa dnsrecord-find example.com. - -The undercloud host, service, and DNS records are untouched when deleting -overclouds. Overcloud hosts, services, and DNS records are re-added to FreeIPA -during subsequent deployments. - -If you don't want to clean up FreeIPA when you delete your overcloud, you can -use the ``openstack overcloud delete --skip-ipa-cleanup`` parameter. This -option leaves all overcloud hosts, services, and DNS records in FreeIPA. You -might find this useful if your FreeIPA server is unreachable or if you plan to -clean up FreeIPA later. - -To clean up FreeIPA manually, you need the Ansible inventory file that -describes your deployment. If you don't have it handy, you can generate one -from the undercloud using:: - - $ source stackrc - $ tripleo-ansible-inventory --static-yaml-inventory generated-inventory.yaml - -The utility will generate an inventory file and store it as -``generated-inventory.yaml``. You can invoke the playbook that cleans up -FreeIPA using:: - - $ ansible-playbook -i generated-inventory.yaml /usr/share/ansible/tripleo-playbooks/cli-cleanup-ipa.yml diff --git a/deploy-guide/source/features/tls-introduction.rst b/deploy-guide/source/features/tls-introduction.rst deleted file mode 100644 index b92fa735..00000000 --- a/deploy-guide/source/features/tls-introduction.rst +++ /dev/null @@ -1,159 +0,0 @@ -.. _tls-introduction: - -TLS Introduction -================ - -Depending on your deployment's security requirements, you might be required to -encrypt network traffic. TripleO helps you accomplish this by supporting -various TLS deployment options. Let's start by understanding the different ways -we can deploy TLS. - -The first option is to only encrypt traffic between clients and public -endpoints. This approach results in fewer certificates to manage, and we refer -to it as *public TLS*. Public endpoints, in this sense, are endpoints only -exposed to end-users. Traffic between internal endpoints is not encrypted. - -The second option leverages TLS for all endpoints in the entire deployment, -including the overcloud, undercloud, and any systems that natively support TLS. -We typically refer to this approach as *TLS-everywhere* because we use TLS -everywhere we can, encrypting as much network traffic as possible. Certificate -management automation is critical with this approach because the number of -certificates scales linearly with the number of services in your deployment. -TripleO uses several components to help ease the burden of managing -certificates. This option is desirable for deployments susceptible to industry -regulation or those who have a higher security risk. Healthcare, -telecommunications, and the public sector are but a few industries that make -extensive use of *TLS-everywhere*. You can think of *public TLS* as a subset of -what *TLS-everywhere* offers. - -TripleO uses the following components to implement *public TLS* and -*TLS-everywhere*. - -Certmonger ----------- - -`Certmonger`_ is a daemon that helps simplify certificate management between -endpoints and certificate authorities (CAs). You can use it to generate key -pairs and certificate signing requests (CSRs). It can self-sign CSRs or send -them to external CAs for signing. Certmonger also tracks the expiration of each -certificate it manages. When a certificate is about to expire, Certmonger -requests a new certificate, updates it accordingly, and may restart a service. -This automation keeps the node enrolled as a client of the certificate -authority so that you don’t have to update hundreds, or thousands, of -certificates manually. Certmonger runs on each node that provides an endpoint -in your deployment. - -.. _Certmonger: https://pagure.io/certmonger - -FreeIPA -------- - -`FreeIPA`_ is a multi-purpose system that includes a certificate authority -(DogTag Certificate System), LDAP (389 Directory Server), MIT Kerberos, NTP -server, and DNS. TripleO uses all of these subsystems to implement TLS across -OpenStack. For example, if you use FreeIPA in your deployment, you can sign -CSRs with DogTag, as opposed to self-signing CSRs with certmonger locally. - -FreeIPA runs on a supplemental node in your deployment, and it is kept separate -from other infrastructure. - -.. _FreeIPA: https://www.freeipa.org/page/Main_Page - -Installing FreeIPA -~~~~~~~~~~~~~~~~~~ - -Similar to setting up the undercloud node, you need to set the hostname -properly for the FreeIPA server. For this example, let's assume we're using -``example.com`` as the domain name for the deployment.:: - - sudo hostnamectl set-hostname ipa.example.come - sudo hostnamectl set-hostname --transient ipa.example.com - -Collect and install the FreeIPA packages:: - - sudo yum install -y ipa-server ipa-server-dns - -Configure FreeIPA:: - - sudo ipa-server-install --realm EXAMPLE.COM / - --ds-password $DIRECTORY_MANAGER_PASSWORD / - --admin-password $ADMIN_PASSWORD / - --hostname ipa.example.com / - --setup-dns / - --auto-forwarders / - --auto-reverse / - --unattended - -By default, FreeIPA does not public it's Certificate Revocation List (CRL) -on startup. As the CRL is retrieved when the overcloud nodes retrieve -certificates from FreeIPA, we should configure it to do so and restart -FreeIPA.:: - - sed -i -e \ - 's/ca.crl.MasterCRL.publishOnStart=.*/ca.crl.MasterCRL.publishOnStart=true/' \ - /etc/pki/pki-tomcat/ca/CS.cfg - systemctl restart ipa - -If your IPA server is not at 4.8.5 or higher, you will need to add an -ACL to allow for the proper generation of certificates with a IP SAN.:: - - cat << EOF | ldapmodify -x -D "cn=Directory Manager" -w $DIRECTORY_MANAGER_PASSWORD - dn: cn=dns,dc=example,dc=com - changetype: modify - add: aci - aci: (targetattr = "aaaarecord || arecord || cnamerecord || idnsname || objectclass || ptrrecord")(targetfilter = "(&(objectclass=idnsrecord)(|(aaaarecord=*)(arecord=*)(cnamerecord=*)(ptrrecord=*)(idnsZoneActive=TRUE)))")(version 3.0; acl "Allow hosts to read DNS A/AAA/CNAME/PTR records"; allow (read,search,compare) userdn = "ldap:///fqdn=*,cn=computers,cn=accounts,dc=example,dc=com";) - EOF - -If you are upgrading to Victoria and you have been using novajoin, an additional permission -must be added to the Nova Host Manager role to allow the creation of DNS zone entries. -As an admin user:: - - ipa privilege-add-permission 'Nova Host Management' --permission \ - 'System: Modify Realm Domains' - -Please refer to ``ipa-server-install --help`` for specifics on each argument or -reference the `FreeIPA documentation`_. The directions above are only a guide. -You may need to adjust certain values and configuration options to use FreeIPA, -depending on your requirements. - -.. _FreeIPA documentation: https://www.freeipa.org/page/Documentation - -Novajoin --------- - -`Novajoin`_ is a vendor data service that extends nova's config drive -functionality and you use it when you want to deploy *TLS-everywhere*. When the -undercloud creates new nodes for the overcloud, novajoin creates a host entry -in FreeIPA to enable the overcloud node to enroll as a FreeIPA client. - -If you want to use novajoin, you must have nova deployed in your undercloud. -Novajoin isn't supported for deployments :doc:`deployed_server`. - -Novajoin was introduced in the Queens release and is supported through Train. -The `tripleo-ipa`_ project, described below, effectively replaced novajoin in -the Train release. - -As of Victoria, novajoin is not longer supported. If you are updating -from Ussuri, tripleo will automatically migrate your deployment from novajoin -to tripleo-ipa. Tripleo will stop and remove the novajoin containers from -the undercloud. If in-flight validations are enabled, tripleo will run a -pre-upgrade validation to verify that the needed ACI and permissions have been -added to the FreeIPA server. See the previous section on "Installing FreeIPA" -for more details. - -.. _Novajoin: https://opendev.org/x/novajoin - -tripleo-ipa ------------ - -`tripleo-ipa`_ is a collection of Ansible roles used to integrate FreeIPA into -TripleO deployments and you use it when you want to deploy *TLS-everywhere*. -These playbooks support deployments using nova and ironic in the undercloud as -well as :doc:`deployed_server`. This project was introduced in Train and -effectively replaces the novajoin metadata service. - -We recommend using tripleo-ipa for all *TLS-everywhere* deployments as of the -Train release. As of Victoria, tripleo-ipa is the only supported method to -configure and deploy *TLS-everywhere*. - -.. _tripleo-ipa: https://opendev.org/x/tripleo-ipa diff --git a/deploy-guide/source/features/tolerated_failure.rst b/deploy-guide/source/features/tolerated_failure.rst deleted file mode 100644 index 7c7f3d29..00000000 --- a/deploy-guide/source/features/tolerated_failure.rst +++ /dev/null @@ -1,46 +0,0 @@ -Tolerate deployment failures -============================ - -When proceeding to large scale deployments, it happens very often to have -infrastructure problems such as network outages, wrong configurations applied -on hardware, hard drive issues, etc. - -It is unpleasant to deploy hundred of nodes and only have a few of them which -failed. On most of large-scale use-cases, deployers would not care about -these nodes, as long as the cloud can already be used with the successfully -deployed servers. - -For that purpose, it is possible in |project| to specify a percentage value, -per role, that will tell how much failures we tolerate. - -Example: We deploy 50 compute nodes with the role "Compute". If I set the -following environment, my deployment will go until the end even if up to 5 -nodes fail to deploy:: - - parameter_defaults: - ComputeMaxFailPercentage: 10 - -At the end of the deployment, a report will be printed and if nodes failed to -deploy, it'll be shown like this:: - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ~~~~~~~~~~~~~~~~~~~~~~~~~~ State Information ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ~~~~~~~~~ Number of nodes which did not deploy successfully: 3 ~~~~~~~~~~~~~~ - This or these node(s) failed to deploy: compute3, compute24, compute29 - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If one or multiple node(s) failed to deploy, the tripleoclient return code -won't be 0 and an error will be printed with a Python trace. Very often the -problem can be read from the Ansible logs by searching for the nodes which -didn't deploy successfully. - -If you want to target all the compute nodes in our deployment and you have more -than one role to deploy computes, then you'll probably want to allocate one -value per role and distribute it based on your expectations and needs. - -.. Warning:: - - For now, this only works for the execution of the deployment steps - from config-download playbooks. Minor updates, major upgrades, fast forward - upgrades and baremetal provisioning operations aren't supported yet, but - will certainly be in the future. diff --git a/deploy-guide/source/features/tuned.rst b/deploy-guide/source/features/tuned.rst deleted file mode 100644 index 89ddd3d1..00000000 --- a/deploy-guide/source/features/tuned.rst +++ /dev/null @@ -1,61 +0,0 @@ -Deploying custom tuned profiles -=============================== - -TripleO can be used to deploy Overcloud nodes with different tuned -profiles in addition to custom tuned profiles. - -Deploying with existing tuned profiles --------------------------------------- - -Create an environment file, e.g. `~/tuned.yaml`, with the following -content: - -.. code-block:: yaml - - parameter_defaults: - TunedProfileName: throughput-performance - -Deploy the Overcloud as usual using the :doc:`CLI -<../deployment/install_overcloud>` and pass the environment -file using the `-e` option: - -.. code-block:: bash - - openstack overcloud deploy --templates -e ~/tuned.yaml - -In the above example, the `throughput-performance` tuned profile will -be applied to the overcloud nodes. The TunedProfileName parameter may -be set to any tuned profile already on the node. - -Deploying with custom tuned profiles ------------------------------------- - -If the tuned profile you wish to apply is not already on the overcloud -node being deployed, then TripleO can create the tuned profile for -you and will set the name of the new profile to whatever -TunedProfileName parameter you supply. - -The following example creates a custom tuned profile called -`my_profile` which inherits from the existing throughput-performance -tuned profile and then adds a few extra tunings: - -.. code-block:: yaml - - parameter_defaults: - TunedCustomProfile: | - [main] - summary=my profile - include=throughput-performance - [sysctl] - vm.dirty_ratio = 10 - vm.dirty_background_ratio = 3 - [sysfs] - /sys/kernel/mm/ksm/run=0 - TunedProfileName: my_profile - -The above will create the file `/etc/tuned/my_profile/tuned.conf` -on the overcloud nodes and tuned.conf will contain the tuned -directives defined by the TunedCustomProfile parameter. The -TunedCustomProfile parameter should be set to a multiline string using -YAML's literal block scalar (i.e. the pipe '|') and that string should -contain valid tuned directives in INI format. diff --git a/deploy-guide/source/features/undercloud_minion.rst b/deploy-guide/source/features/undercloud_minion.rst deleted file mode 100644 index 2d65f1ec..00000000 --- a/deploy-guide/source/features/undercloud_minion.rst +++ /dev/null @@ -1,152 +0,0 @@ -(DEPRECATED) Installing a Undercloud Minion -=========================================== - -.. note:: - The minion functionality is deprecated starting in Wallaby. - -.. note:: - This is optional functionality that is helpful for large scale related - deployments. - -.. note:: - The minion functionality is only available starting from the Train cycle. - -The undercloud can be scaled horizontally by installing and configuring undercloud -minions. The minions can expand the number of heat-engine and ironic-conductors -available the overall undercloud installation. The undercloud minions can be -added and removed as necessary to scale processing during a deployment. - -Installation Steps ------------------- - -.. note:: - The minion requires an undercloud has been installed. The undercloud - installation process has two output files that we will need to install the - minion. - -#. Log in to your machine (baremetal or VM) where you want to install the - minion as a non-root user (such as the stack user):: - - ssh @ - - .. note:: - If you don't have a non-root user created yet, log in as root and create - one with following commands:: - - sudo useradd stack - sudo passwd stack # specify a password - - echo "stack ALL=(root) NOPASSWD:ALL" | sudo tee -a /etc/sudoers.d/stack - sudo chmod 0440 /etc/sudoers.d/stack - - su - stack - - .. note:: - The minion is intended to work correctly with SELinux enforcing. - Installations with the permissive/disabled SELinux are not recommended. - The ``minion_enable_selinux`` config option controls that setting. - - .. note:: - vlan tagged interfaces must follow the if_name.vlan_id convention, like for - example: eth0.vlan100 or bond0.vlan120. - -#. Enable needed repositories: - - .. admonition:: RHEL - :class: rhel - - Enable optional repo:: - - sudo yum install -y yum-utils - sudo yum-config-manager --enable rhelosp-rhel-7-server-opt - - .. include:: ../repositories.rst - -.. We need to manually continue our list numbering here since the above - "include" directive breaks the numbering. - -3. Install the TripleO CLI, which will pull in all other necessary packages as dependencies:: - - sudo yum install -y python-tripleoclient - -#. Copy the `tripleo-undercloud-outputs.yaml` and `tripleo-undercloud-passwords.yaml` - from the undercloud to the node being provisioned as a minion:: - - scp tripleo-undercloud-outputs.yaml tripleo-undercloud-passwords.yaml @: - -#. (Optional) Copy Undercloud CA certificate if SSL is enabled. - - On the undercloud:: - - scp /etc/pki/ca-trust/source/anchors/cm-local-ca.pem @: - - On the minion:: - - sudo update-ca-trust enable - sudo cp cm-local-ca.pem /etc/pki/ca-trust/source/anchors/undercloud-ca.pem - sudo update-ca-trust extract - -#. Prepare the configuration file:: - - cp /usr/share/python-tripleoclient/minion.conf.sample ~/minion.conf - - Update the settings in this file to match the desired configuration. The - options in the minion.conf are similarly configured as the undercloud.conf - on the undercloud node. It is important to configure the `minion_local_ip` - and the `minion_local_interface` to match the available interfaces on the - minion system. - - .. note:: - The minion configured interface and ip must be on the control plane network. - -#. Run the command to install the minion: - - To deploy a minion:: - - openstack undercloud minion install - -#. Verify services - - - Heat Engine - - By default only the heat-engine service is configured. To verify it has - been configured correctly, run the following on the undercloud:: - - source ~/stackrc - openstack orchestration service list - - Example output:: - - (undercloud) [stack@undercloud ~]$ openstack orchestration service list - +------------------------+-------------+--------------------------------------+------------------------+--------+----------------------------+--------+ - | Hostname | Binary | Engine ID | Host | Topic | Updated At | Status | - +------------------------+-------------+--------------------------------------+------------------------+--------+----------------------------+--------+ - | undercloud.localdomain | heat-engine | b1af4e18-6859-4b73-b1cf-87674bd0ce1f | undercloud.localdomain | engine | 2019-07-25T23:19:34.000000 | up | - | minion.localdomain | heat-engine | 3a0d7080-06a9-4049-bb00-dbdcafbce0fc | minion.localdomain | engine | 2019-07-25T23:19:24.000000 | up | - | undercloud.localdomain | heat-engine | f6ccea46-2b30-4869-b06f-935c342a9ed6 | undercloud.localdomain | engine | 2019-07-25T23:19:34.000000 | up | - | minion.localdomain | heat-engine | eef759de-f7d3-472a-afbc-878eb6a3b9c0 | minion.localdomain | engine | 2019-07-25T23:19:24.000000 | up | - | minion.localdomain | heat-engine | 7f076afe-5116-45ad-9f08-aab7fbfda40b | minion.localdomain | engine | 2019-07-25T23:19:24.000000 | up | - | undercloud.localdomain | heat-engine | 038ead61-91f1-4739-8537-df63a9e2c917 | undercloud.localdomain | engine | 2019-07-25T23:19:34.000000 | up | - | undercloud.localdomain | heat-engine | f16a4f55-b053-4650-9202-781aef55698e | undercloud.localdomain | engine | 2019-07-25T23:19:36.000000 | up | - | minion.localdomain | heat-engine | e853d9c9-9f75-4958-ad9b-49e4b63b79b2 | minion.localdomain | engine | 2019-07-25T23:19:24.000000 | up | - +------------------------+-------------+--------------------------------------+------------------------+--------+----------------------------+--------+ - - - - Ironic Conductor - - If the ironic conductor service has been enabled, run the following on the - undercloud:: - - source ~/stackrc - baremetal conductor list - - Example output:: - - (undercloud) [stack@undercloud ~]$ baremetal conductor list - +------------------------+-----------------+-------+ - | Hostname | Conductor Group | Alive | - +------------------------+-----------------+-------+ - | undercloud.localdomain | | True | - | minion.localdomain | | True | - +------------------------+-----------------+-------+ - diff --git a/deploy-guide/source/features/vdpa_deployment.rst b/deploy-guide/source/features/vdpa_deployment.rst deleted file mode 100644 index 8d9868fa..00000000 --- a/deploy-guide/source/features/vdpa_deployment.rst +++ /dev/null @@ -1,440 +0,0 @@ -Deploying with vDPA Support -=============================== - -TripleO can deploy Overcloud nodes with vDPA support. A new role ``ComputeVdpa`` -has been added to create a custom ``roles_data.yaml`` with composable vDPA role. - -vDPA is very similar to SR-IOV and leverages the same Openstack components. It's -important to note that vDPA can't function without OVS Hardware Offload. - -Mellanox is the only NIC vendor currently supported with vDPA. - -CentOS9/RHEL9 with a kernel of 5.14 or higher is required. - -Execute below command to create the ``roles_data.yaml``:: - - openstack overcloud roles generate -o roles_data.yaml Controller ComputeVdpa - -Once a roles file is created, the following changes are required: - -- Deploy Command -- Parameters -- Network Config -- Network and Port creation - -Deploy Command ----------------- -Deploy command should include the generated roles data file from the above -command. - -Deploy command should also include the SR-IOV environment file to include the -``neutron-sriov-agent`` service. All the required parameters are also specified -in this environment file. The parameters has to be configured according to the -baremetal on which vDPA needs to be enabled. - -Also, vDPA requires mandatory kernel parameters to be set, like -``intel_iommu=on iommu=pt`` on Intel machines. In order to enable the -configuration of kernel parameters to the host, The ``KernelArgs`` role -parameter has to be defined accordingly. - -Adding the following arguments to the ``openstack overcloud deploy`` command -will do the trick:: - - openstack overcloud deploy --templates \ - -r roles_data.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-sriov.yaml \ - ... - -Parameters ----------- - -Unlike SR-IOV, vDPA devices shouldn't be added to ``NeutronPhysicalDevMappings`` but to the -``NovaPCIPassthrough``. The vDPA bridge should also be added to the ``NeutronBridgeMappings`` -and the ``physical_network`` to the ``NeutronNetworkVLANRanges``. - -The parameter ``KernelArgs`` should be provided in the deployment environment -file, with the set of kernel boot parameters to be applied on the -``ComputeVdpa`` role where vDPA is enabled. - -The ``PciPassthroughFilter`` is required for vDPA. The ``NUMATopologyFilter`` will become -optional when ``libvirt`` will support the locking of the guest memory. At this time, it -is mandatory to have it:: - - parameter_defaults: - NeutronTunnelTypes: '' - NeutronNetworkType: 'vlan' - NeutronNetworkVLANRanges: - - tenant:1300:1399 - NovaSchedulerDefaultFilters: - - PciPassthroughFilter - - NUMATopologyFilter - - ... - ComputeVdpaParameters: - NovaPCIPassthrough: - - vendor_id: "15b3" - product_id: "101e" - address: "06:00.0" - physical_network: "tenant" - - vendor_id: "15b3" - product_id: "101e" - address: "06:00.1" - physical_network: "tenant" - KernelArgs: "[...] iommu=pt intel_iommu=on" - NeutronBridgeMappings: - - tenant:br-tenant - -.. note:: - It's important to use the ``product_id`` of a VF device and not a PF - - 06:00.1 Ethernet controller [0200]: Mellanox Technologies MT2892 Family [ConnectX-6 Dx] [15b3:101d] - 06:00.2 Ethernet controller [0200]: Mellanox Technologies ConnectX Family mlx5Gen Virtual Function [15b3:101e] - - - - -Network Config --------------- -vDPA supported network interfaces should be specified in the network config -templates as sriov_pf type. It should also be under an OVS bridge with a ``link_mode`` -set to ``switchdev`` - -Example:: - - - type: ovs_bridge - name: br-tenant - members: - - type: sriov_pf - name: enp6s0f0 - numvfs: 8 - use_dhcp: false - vdpa: true - link_mode: switchdev - - type: sriov_pf - name: enp6s0f1 - numvfs: 8 - use_dhcp: false - vdpa: true - link_mode: switchdev - - -Network and Port Creation -------------------------- - -When creating the network, it has to be mapped to the physical network:: - - $ openstack network create \ - --provider-physical-network tenant \ - --provider-network-type vlan \ - --provider-segment 1337 \ - vdpa_net1 - - $ openstack subnet create \ - --network vdpa_net1 \ - --subnet-range 192.0.2.0/24 \ - --dhcp \ - vdpa_subnet1 - -To allocate a port from a vdpa-enabled NIC, create a neutron port and set the -``--vnic-type`` to ``vdpa``:: - - $ openstack port create --network vdpa_net1 \ - --vnic-type=vdpa \ - vdpa_direct_port1 - -Scheduling instances --------------------- - -Normally, the ``PciPassthroughFilter`` is sufficient to ensure that a vDPA instance will -land on a vDPA host. If we want to prevent other instances from using a vDPA host, we need -to setup the `isolate-aggregate feature -`_. - -Example:: - - $ openstack --os-placement-api-version 1.6 trait create CUSTOM_VDPA - $ openstack aggregate create \ - --zone vdpa-az1 \ - vdpa_ag1 - $ openstack hypervisor list -c ID -c "Hypervisor Hostname" -f value | grep vdpa | \ - while read l - do UUID=$(echo $l | cut -f 1 -d " ") - H_NAME=$(echo $l | cut -f 2 -d " ") - echo $H_NAME $UUID - openstack aggregate add host vdpa_ag1 $H_NAME - traits=$(openstack --os-placement-api-version 1.6 resource provider trait list \ - -f value $UUID | sed 's/^/--trait /') - openstack --os-placement-api-version 1.6 resource provider trait set \ - $traits --trait CUSTOM_VDPA $UUID - done - $ openstack --os-compute-api-version 2.53 aggregate set \ - --property trait:CUSTOM_VDPA=required \ - vdpa_ag1 - -The flavor will map to that new aggregate with the ``trait:CUSTOM_VDPA`` property:: - - $ openstack --os-compute-api-version 2.86 flavor create \ - --ram 4096 \ - --disk 10 \ - --vcpus 2 \ - --property hw:cpu_policy=dedicated \ - --property hw:cpu_realtime=True \ - --property hw:cpu_realtime_mask=^0 \ - --property trait:CUSTOM_VDPA=required \ - vdpa_pinned - -.. note:: - It's also important to have the ``hw:cpu_realtime*`` properties here since - ``libvirt`` doesn't currently support the locking of guest memory. - - -This should launch an instance on one of the vDPA hosts:: - - $ openstack server create \ - --image cirros \ - --flavor vdpa_pinned \ - --nic port-id=vdpa_direct_port1 \ - vdpa_test_1 - -Validations ------------ - -Confirm that a PCI device is in switchdev mode:: - - [root@computevdpa-0 ~]# devlink dev eswitch show pci/0000:06:00.0 - pci/0000:06:00.0: mode switchdev inline-mode none encap-mode basic - [root@computevdpa-0 ~]# devlink dev eswitch show pci/0000:06:00.1 - pci/0000:06:00.1: mode switchdev inline-mode none encap-mode basic - -Verify if offload is enabled in OVS:: - - [root@computevdpa-0 ~]# ovs-vsctl get Open_vSwitch . other_config:hw-offload - "true" - -Validate the interfaces are added to the tenant bridge:: - - [root@computevdpa-0 ~]# ovs-vsctl show - be82eb5b-94c3-449d-98c8-0961b6b6b4c4 - Manager "ptcp:6640:127.0.0.1" - is_connected: true - [...] - Bridge br-tenant - Controller "tcp:127.0.0.1:6633" - is_connected: true - fail_mode: secure - datapath_type: system - Port br-tenant - Interface br-tenant - type: internal - Port enp6s0f0 - Interface enp6s0f0 - Port phy-br-tenant - Interface phy-br-tenant - type: patch - options: {peer=int-br-tenant} - Port enp6s0f1 - Interface enp6s0f1 - [...] - - -Verify if the NICs have ``hw-tc-offload`` enabled:: - - [root@computevdpa-0 ~]# for i in {0..1};do ethtool -k enp6s0f$i | grep tc-offload;done - hw-tc-offload: on - hw-tc-offload: on - -Verify that the udev rules have been created:: - - [root@computevdpa-0 ~]# cat /etc/udev/rules.d/80-persistent-os-net-config.rules - # This file is autogenerated by os-net-config - SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}!="", ATTR{phys_port_name}=="pf*vf*", ENV{NM_UNMANAGED}="1" - SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="0000:06:00.0", NAME="enp6s0f0" - SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}=="80ecee0003723f04", ATTR{phys_port_name}=="pf0vf*", IMPORT{program}="/etc/udev/rep-link-name.sh $attr{phys_port_name}", NAME="enp6s0f0_$env{NUMBER}" - SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNELS=="0000:06:00.1", NAME="enp6s0f1" - SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}=="80ecee0003723f04", ATTR{phys_port_name}=="pf1vf*", IMPORT{program}="/etc/udev/rep-link-name.sh $attr{phys_port_name}", NAME="enp6s0f1_$env{NUMBER}" - - -Validate that the ``numvfs`` are correctly defined:: - - [root@computevdpa-0 ~]# cat /sys/class/net/enp6s0f0/device/sriov_numvfs - 8 - [root@computevdpa-0 ~]# cat /sys/class/net/enp6s0f1/device/sriov_numvfs - 8 - -Validate that the ``pci/passthrough_whitelist`` contains all the PFs:: - - [root@computevdpa-0 ~]# grep ^passthrough_whitelist /var/lib/config-data/puppet-generated/nova_libvirt/etc/nova/nova.conf - passthrough_whitelist={"address":"06:00.0","physical_network":"tenant","product_id":"101d","vendor_id":"15b3"} - passthrough_whitelist={"address":"06:00.1","physical_network":"tenant","product_id":"101d","vendor_id":"15b3"} - -Verify the ``nodedev-list`` from ``libvirt``:: - - [root@computevdpa-0 ~]# podman exec -u0 nova_virtqemud virsh -c qemu:///system nodedev-list | grep -P "pci_0000_06|enp6|vdpa" - net_enp6s0f0np0_04_3f_72_ee_ec_84 - net_enp6s0f0np0_0_1a_c1_a5_25_94_ef - net_enp6s0f0np0_1_3a_dc_1d_36_85_af - net_enp6s0f0np0_2_6a_95_0c_e9_8f_1a - net_enp6s0f0np0_3_ba_c8_5b_f5_70_cc - net_enp6s0f0np0_4_9e_03_86_23_cd_65 - net_enp6s0f0np0_5_0a_5c_8b_c4_00_7a - net_enp6s0f0np0_6_2e_f6_bc_e6_6f_cd - net_enp6s0f0np0_7_ce_1e_b2_20_5e_15 - net_enp6s0f1np1_04_3f_72_ee_ec_85 - net_enp6s0f1np1_0_a6_04_9e_5a_cd_3b - net_enp6s0f1np1_1_56_5d_59_b0_df_17 - net_enp6s0f1np1_2_de_ac_7c_3f_19_b1 - net_enp6s0f1np1_3_16_0c_8c_47_40_5c - net_enp6s0f1np1_4_0e_a6_15_f5_68_77 - net_enp6s0f1np1_5_e2_73_dc_f9_c2_46 - net_enp6s0f1np1_6_e6_13_57_c9_cf_0f - net_enp6s0f1np1_7_62_10_4f_2b_1b_ae - net_vdpa06p00vf2_42_11_c8_97_aa_43 - net_vdpa06p00vf3_2a_59_5e_32_3e_b7 - net_vdpa06p00vf4_9a_5c_3f_c9_cc_42 - net_vdpa06p00vf5_26_73_2a_e3_db_f9 - net_vdpa06p00vf6_9a_bf_a9_e9_6b_06 - net_vdpa06p00vf7_d2_1f_cc_00_a9_95 - net_vdpa06p01vf0_ba_81_cb_7e_01_1d - net_vdpa06p01vf1_56_95_fa_5e_4a_51 - net_vdpa06p01vf2_72_53_64_8d_12_98 - net_vdpa06p01vf3_9e_ff_1d_6d_c1_4e - net_vdpa06p01vf4_96_20_f3_b1_69_ef - net_vdpa06p01vf5_ea_0c_8b_0b_3f_ff - net_vdpa06p01vf6_0a_53_4e_94_e0_8b - net_vdpa06p01vf7_16_84_48_e6_74_59 - net_vdpa06p02vf0_b2_cc_fa_16_f0_52 - net_vdpa06p02vf1_0a_12_1b_a2_1a_d3 - pci_0000_06_00_0 - pci_0000_06_00_1 - pci_0000_06_00_2 - pci_0000_06_00_3 - pci_0000_06_00_4 - pci_0000_06_00_5 - pci_0000_06_00_6 - pci_0000_06_00_7 - pci_0000_06_01_0 - pci_0000_06_01_1 - pci_0000_06_01_2 - pci_0000_06_01_3 - pci_0000_06_01_4 - pci_0000_06_01_5 - pci_0000_06_01_6 - pci_0000_06_01_7 - pci_0000_06_02_0 - pci_0000_06_02_1 - vdpa_0000_06_00_2 - vdpa_0000_06_00_3 - vdpa_0000_06_00_4 - vdpa_0000_06_00_5 - vdpa_0000_06_00_6 - vdpa_0000_06_00_7 - vdpa_0000_06_01_0 - vdpa_0000_06_01_1 - vdpa_0000_06_01_2 - vdpa_0000_06_01_3 - vdpa_0000_06_01_4 - vdpa_0000_06_01_5 - vdpa_0000_06_01_6 - vdpa_0000_06_01_7 - vdpa_0000_06_02_0 - vdpa_0000_06_02_1 - - -Validate that the vDPA devices have been created, this should match the vdpa -devices from ``virsh nodedev-list``:: - - [root@computevdpa-0 ~]# ls -tlra /dev/vhost-vdpa-* - crw-------. 1 root root 241, 0 Jun 30 12:52 /dev/vhost-vdpa-0 - crw-------. 1 root root 241, 1 Jun 30 12:52 /dev/vhost-vdpa-1 - crw-------. 1 root root 241, 2 Jun 30 12:52 /dev/vhost-vdpa-2 - crw-------. 1 root root 241, 3 Jun 30 12:52 /dev/vhost-vdpa-3 - crw-------. 1 root root 241, 4 Jun 30 12:52 /dev/vhost-vdpa-4 - crw-------. 1 root root 241, 5 Jun 30 12:53 /dev/vhost-vdpa-5 - crw-------. 1 root root 241, 6 Jun 30 12:53 /dev/vhost-vdpa-6 - crw-------. 1 root root 241, 7 Jun 30 12:53 /dev/vhost-vdpa-7 - crw-------. 1 root root 241, 8 Jun 30 12:53 /dev/vhost-vdpa-8 - crw-------. 1 root root 241, 9 Jun 30 12:53 /dev/vhost-vdpa-9 - crw-------. 1 root root 241, 10 Jun 30 12:53 /dev/vhost-vdpa-10 - crw-------. 1 root root 241, 11 Jun 30 12:53 /dev/vhost-vdpa-11 - crw-------. 1 root root 241, 12 Jun 30 12:53 /dev/vhost-vdpa-12 - crw-------. 1 root root 241, 13 Jun 30 12:53 /dev/vhost-vdpa-13 - crw-------. 1 root root 241, 14 Jun 30 12:53 /dev/vhost-vdpa-14 - crw-------. 1 root root 241, 15 Jun 30 12:53 /dev/vhost-vdpa-15 - -Validate the ``pci_devices`` table in the database from one of the controllers:: - - [root@controller-2 neutron]# podman exec -u0 $(podman ps -q -f name=galera) mysql -t -D nova -e "select address,product_id,vendor_id,dev_type,dev_id from pci_devices where address like '0000:06:%' and deleted=0;" - +--------------+------------+-----------+----------+------------------+ - | address | product_id | vendor_id | dev_type | dev_id | - +--------------+------------+-----------+----------+------------------+ - | 0000:06:01.1 | 101e | 15b3 | vdpa | pci_0000_06_01_1 | - | 0000:06:00.2 | 101e | 15b3 | vdpa | pci_0000_06_00_2 | - | 0000:06:00.3 | 101e | 15b3 | vdpa | pci_0000_06_00_3 | - | 0000:06:00.4 | 101e | 15b3 | vdpa | pci_0000_06_00_4 | - | 0000:06:00.5 | 101e | 15b3 | vdpa | pci_0000_06_00_5 | - | 0000:06:00.6 | 101e | 15b3 | vdpa | pci_0000_06_00_6 | - | 0000:06:00.7 | 101e | 15b3 | vdpa | pci_0000_06_00_7 | - | 0000:06:01.0 | 101e | 15b3 | vdpa | pci_0000_06_01_0 | - | 0000:06:01.2 | 101e | 15b3 | vdpa | pci_0000_06_01_2 | - | 0000:06:01.3 | 101e | 15b3 | vdpa | pci_0000_06_01_3 | - | 0000:06:01.4 | 101e | 15b3 | vdpa | pci_0000_06_01_4 | - | 0000:06:01.5 | 101e | 15b3 | vdpa | pci_0000_06_01_5 | - | 0000:06:01.6 | 101e | 15b3 | vdpa | pci_0000_06_01_6 | - | 0000:06:01.7 | 101e | 15b3 | vdpa | pci_0000_06_01_7 | - | 0000:06:02.0 | 101e | 15b3 | vdpa | pci_0000_06_02_0 | - | 0000:06:02.1 | 101e | 15b3 | vdpa | pci_0000_06_02_1 | - | 0000:06:00.2 | 101e | 15b3 | vdpa | pci_0000_06_00_2 | - | 0000:06:00.3 | 101e | 15b3 | vdpa | pci_0000_06_00_3 | - | 0000:06:00.4 | 101e | 15b3 | vdpa | pci_0000_06_00_4 | - | 0000:06:00.5 | 101e | 15b3 | vdpa | pci_0000_06_00_5 | - | 0000:06:00.6 | 101e | 15b3 | vdpa | pci_0000_06_00_6 | - | 0000:06:00.7 | 101e | 15b3 | vdpa | pci_0000_06_00_7 | - | 0000:06:01.0 | 101e | 15b3 | vdpa | pci_0000_06_01_0 | - | 0000:06:01.1 | 101e | 15b3 | vdpa | pci_0000_06_01_1 | - | 0000:06:01.2 | 101e | 15b3 | vdpa | pci_0000_06_01_2 | - | 0000:06:01.3 | 101e | 15b3 | vdpa | pci_0000_06_01_3 | - | 0000:06:01.4 | 101e | 15b3 | vdpa | pci_0000_06_01_4 | - | 0000:06:01.5 | 101e | 15b3 | vdpa | pci_0000_06_01_5 | - | 0000:06:01.6 | 101e | 15b3 | vdpa | pci_0000_06_01_6 | - | 0000:06:01.7 | 101e | 15b3 | vdpa | pci_0000_06_01_7 | - | 0000:06:02.0 | 101e | 15b3 | vdpa | pci_0000_06_02_0 | - | 0000:06:02.1 | 101e | 15b3 | vdpa | pci_0000_06_02_1 | - +--------------+------------+-----------+----------+------------------+ - -The ``vdpa`` command:: - - [root@computevdpa-0 ~]# vdpa dev - 0000:06:01.0: type network mgmtdev pci/0000:06:01.0 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:00.6: type network mgmtdev pci/0000:06:00.6 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:00.4: type network mgmtdev pci/0000:06:00.4 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:00.2: type network mgmtdev pci/0000:06:00.2 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:01.1: type network mgmtdev pci/0000:06:01.1 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:00.7: type network mgmtdev pci/0000:06:00.7 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:00.5: type network mgmtdev pci/0000:06:00.5 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:00.3: type network mgmtdev pci/0000:06:00.3 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:02.0: type network mgmtdev pci/0000:06:02.0 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:01.6: type network mgmtdev pci/0000:06:01.6 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:01.4: type network mgmtdev pci/0000:06:01.4 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:01.2: type network mgmtdev pci/0000:06:01.2 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:02.1: type network mgmtdev pci/0000:06:02.1 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:01.7: type network mgmtdev pci/0000:06:01.7 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:01.5: type network mgmtdev pci/0000:06:01.5 vendor_id 5555 max_vqs 16 max_vq_size 256 - 0000:06:01.3: type network mgmtdev pci/0000:06:01.3 vendor_id 5555 max_vqs 16 max_vq_size 256 - -Validating the OVN agents:: - - (overcloud) [stack@undercloud-0 ~]$ openstack network agent list --host computevdpa-0.home.arpa - +--------------------------------------+----------------------+-------------------------+-------------------+-------+-------+----------------------------+ - | ID | Agent Type | Host | Availability Zone | Alive | State | Binary | - +--------------------------------------+----------------------+-------------------------+-------------------+-------+-------+----------------------------+ - | ef2e6ced-e723-449c-bbf8-7513709f33ea | OVN Controller agent | computevdpa-0.home.arpa | | :-) | UP | ovn-controller | - | 7be39049-db5b-54fc-add1-4a0687160542 | OVN Metadata agent | computevdpa-0.home.arpa | | :-) | UP | neutron-ovn-metadata-agent | - +--------------------------------------+----------------------+-------------------------+-------------------+-------+-------+----------------------------+ - - -Other useful commands for troubleshooting:: - - [root@computevdpa-0 ~]# ovs-appctl dpctl/dump-flows -m type=offloaded - [root@computevdpa-0 ~]# ovs-appctl dpctl/dump-flows -m - [root@computevdpa-0 ~]# tc filter show dev enp6s0f1_1 ingress - [root@computevdpa-0 ~]# tc -s filter show dev enp6s0f1_1 ingress - [root@computevdpa-0 ~]# tc monitor diff --git a/deploy-guide/source/index.rst b/deploy-guide/source/index.rst deleted file mode 100644 index 29b73c9f..00000000 --- a/deploy-guide/source/index.rst +++ /dev/null @@ -1,19 +0,0 @@ -======================== -TripleO Deployment Guide -======================== - -TripleO is a project aimed at installing, upgrading and operating OpenStack -clouds using OpenStack's own cloud facilities as the foundation - building on -Nova, Ironic, Neutron and Heat to automate cloud management at datacenter -scale. - -.. toctree:: - :maxdepth: 2 - :includehidden: - - environments/index - provisioning/index - features/index - deployment/index - post_deployment/index - troubleshooting/index diff --git a/deploy-guide/source/post_deployment/backup_and_restore/00_index.rst b/deploy-guide/source/post_deployment/backup_and_restore/00_index.rst deleted file mode 100644 index cde9186e..00000000 --- a/deploy-guide/source/post_deployment/backup_and_restore/00_index.rst +++ /dev/null @@ -1,26 +0,0 @@ -TripleO backup and restore (Undercloud and Overcloud control plane) -=================================================================== - -This documentation section will describe a method to backup and restore both Undercloud and Overcloud -control plane. - -The use case involved in the creation and restore of these procedures are related to the -possible failures of a minor update or major upgrade for both Undercloud and Overcloud. - -The general approach to recover from failures during the minor update or major upgrade workflow -is to fix the environment and restart services before re-running the last executed step. - -There are specific cases in which rolling back to previous steps in the upgrades -workflow can lead to general failures in the system, i.e. -when executing `yum history` to rollback the upgrade of certain packages, -the dependencies resolution might select to remove critical packages like `systemd`. - -.. toctree:: - :maxdepth: 2 - :includehidden: - - 01_undercloud_backup - 02_overcloud_backup - 03_undercloud_restore - 04_overcloud_restore - 05_rear diff --git a/deploy-guide/source/post_deployment/backup_and_restore/01_undercloud_backup.rst b/deploy-guide/source/post_deployment/backup_and_restore/01_undercloud_backup.rst deleted file mode 100644 index 432edd6e..00000000 --- a/deploy-guide/source/post_deployment/backup_and_restore/01_undercloud_backup.rst +++ /dev/null @@ -1,125 +0,0 @@ -Backing up the Undercloud -========================= - -In order to backup your Undercloud you need to -make sure a set of files and databases are stored -correctly to be used in case of an issue running -the updates or upgrades workflows. - -The following sections will describe how to -execute an Undercloud backup. - -NTP service ------------ - -OpenStack services are time sensitive, users need to -be sure their environment have the time synchronized -correctly before proceeding with any backup task. - -By default, both Undercloud and Overcloud should have -configured correctly the NTP service as there are -parameters specifically defined to manage this service. - -The user is responsible to ensure that the Undercloud -restore is consistent in time. For example, a user -installs the Undercloud at the time 'm', then they deploy -the Undercloud and the Overcloud at the time 'n', and -they create an Undercloud backup at the time 'o'. When the user -restore the Undercloud it needs to be sure is restored -at a time later than 'o'. So, before and after restoring the Undercloud -node is important to have all the deployment with the time -updated and synchronized correctly. - -In case this is done manually, execute: - -:: - - sudo yum install -y ntp - sudo chkconfig ntpd on - sudo service ntpd stop - sudo ntpdate pool.ntp.org - sudo service ntpd restart - -After ensuring the environment have the time synchronized correctly -you can continue with the backup tasks. - -CLI driven backups ------------------- - -There is an automated way of creating an Undercloud backup, -this CLI option allows the operator to run a database and filesystem backup. -By default, all databases are included in the backup, also, the folder `/home/stack`. - -The command usage is:: - - openstack undercloud backup [--add-path ADD_FILES_TO_BACKUP] [--exclude-path EXCLUDE_FILES_TO_BACKUP] - -For example, we can run a full MySQL backup with additional paths as:: - - openstack undercloud backup --add-path /etc/ \ - --add-path /var/log/ \ - --add-path /root/ \ - --add-path /var/lib/glance/ \ - --add-path /var/lib/docker/ \ - --add-path /var/lib/certmonger/ \ - --add-path /var/lib/registry/ \ - --add-path /srv/node/ \ - --exclude-path /home/stack/ - -Note that we are excluding the folder `/home/stack/` -from the backup, but this folder is not included using the ``--add-path``, -CLI option, this is due to the fact that the `/home/stack/` folder is -added by default in any backup as it contains necessary files -to restore correctly the Undercloud. -You can exclude that folder and add specific files if you are required to -do so. - -When executing the Undercloud backup via the OpenStack -CLI, the backup is stored in a temporary folder called -`/var/tmp/`. -After this operation, the result of the backup procedure -is stored in the swift container called `undercloud-backups` -and it will expire after 24 hours of its creation. - -Manual backups --------------- - -If the user needs to run the backup manually, -the following steps must be executed. - -Database backups -~~~~~~~~~~~~~~~~ - -The operator needs to backup all databases in the Undercloud node - -.. admonition:: Train - :class: stable - - :: - - /bin/hiera -c /etc/puppet/hiera.yaml mysql::server::root_password - podman exec mysql bash -c "mysqldump -uroot -pPASSWORD --opt --all-databases" > /root/undercloud-all-databases.sql - -Filesystem backups -~~~~~~~~~~~~~~~~~~ - -* MariaDB configuration file on undercloud (so we can restore databases accurately). -* All glance image data in /var/lib/glance/images. -* All swift data in /srv/node. -* All data in stack users home directory. -* Also the DB backup created in the previous step. - -The following command can be used to perform a backup of all data from the undercloud node:: - - sudo tar --xattrs --ignore-failed-read -cf \ - UC-backup-`date +%F`.tar \ - /root/undercloud-all-databases.sql \ - /etc \ - /var/log \ - /root \ - /var/lib/glance \ - /var/lib/docker \ - /var/lib/certmonger \ - /var/lib/registry \ - /srv/node \ - /home/stack diff --git a/deploy-guide/source/post_deployment/backup_and_restore/02_overcloud_backup.rst b/deploy-guide/source/post_deployment/backup_and_restore/02_overcloud_backup.rst deleted file mode 100644 index 8b21b736..00000000 --- a/deploy-guide/source/post_deployment/backup_and_restore/02_overcloud_backup.rst +++ /dev/null @@ -1,156 +0,0 @@ -Backing up the Overcloud control plane services -=============================================== - -This backup guide is meant to backup services based on a HA + containers deployment. - -Prerequisites -------------- - -There is a need to backup the control plane services in the Overcloud, to do so, we need -to apply the same approach from the Undercloud, which is, running a backup of the databases -and create a filesystem backup. - -Databases backup ----------------- - -MySQL backup -~~~~~~~~~~~~ - -If using HA the operator can run the database backup in any controller node -using the ``--single-transaction`` option when executing the mysqldump. - -If the deployment is using containers the hieradata file containing the mysql -root password is located in the folder `/var/lib/config-data/mysql/etc/puppet/hieradata/`. - -The file containing the mysql root password is `service_configs.json` and the key is -`mysql::server::root_password`. - -Create a temporary folder to store the backups:: - - sudo -i - mkdir -p /var/tmp/mysql_backup/ - -Store the MySQL root password to be added to further queries:: - - MYSQLDBPASS=$(cat /var/lib/config-data/mysql/etc/puppet/hieradata/service_configs.json | grep mysql | grep root_password | awk -F": " '{print $2}' | awk -F"\"" '{print $2}') - -Execute from any controller:: - - mysql -uroot -p$MYSQLDBPASS -e "select distinct table_schema from information_schema.tables where engine='innodb' and table_schema != 'mysql';" \ - -s -N | xargs mysqldump -uroot -p$MYSQLDBPASS --single-transaction --databases > /var/tmp/mysql_backup/openstack_databases-`date +%F`-`date +%T`.sql - -This will dump a database backup called /var/tmp/mysql_backup/openstack_databases-.sql - -Then backup all the users and permissions information:: - - mysql -uroot -p$MYSQLDBPASS -e "SELECT CONCAT('\"SHOW GRANTS FOR ''',user,'''@''',host,''';\"') FROM mysql.user where (length(user) > 0 and user NOT LIKE 'root')" \ - -s -N | xargs -n1 mysql -uroot -p$MYSQLDBPASS -s -N -e | sed 's/$/;/' > /var/tmp/mysql_backup/openstack_databases_grants-`date +%F`-`date +%T`.sql - -This will dump a database backup called `/var/tmp/mysql_backup/openstack_databases_grants-.sql` - -MongoDB backup (only needed until Ocata) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Since OpenStack Pike, there is no support for MongoDB, so be sure you backup the data from -your telemetry backend. - -If telemetry services are used, then its needed to backup the data stored in the MongoDB instance. -Connect to any controller and get the IP of the MongoDB primary instance:: - - MONGOIP=$(cat /etc/mongod.conf | grep bind_ip | awk '{print $3}') - -Now, create the backup:: - - mkdir -p /var/tmp/mongo_backup/ - mongodump --oplog --host $MONGOIP --out /var/tmp/mongo_backup/ - -Be sure the files were created successfully. - -Redis backup -~~~~~~~~~~~~~~ - -If telemetry services are used, then it's needed to backup the data stored in the Redis instance. - -Let's get the Redis endpoint to get the backup, open `/var/lib/config-data/haproxy/etc/haproxy/haproxy.cfg` -and get the bind IP in the `listen redis` section, should have a string of this form `bind transparent`:: - - grep -A1 'listen redis' /var/lib/config-data/haproxy/etc/haproxy/haproxy.cfg - REDISIP=$(grep -A1 'listen redis' /var/lib/config-data/haproxy/etc/haproxy/haproxy.cfg | grep bind | awk '{print $2}' | awk -F":" '{print $1}') - -Let's store the master auth password to connect to the Redis cluster, the config file should be -`/var/lib/config-data/redis/etc/redis.conf` and the password under the `masterauth` parameter. -Let's store it in a variable:: - - REDISPASS=$(cat /var/lib/config-data/redis/etc/redis.conf | grep masterauth | grep -v \# | awk '{print $2}') - -Let's check connectivity to the Redis cluster:: - - redis-cli -a $REDISPASS -h $REDISIP ping - -Now, create a database dump by executing:: - - redis-cli -a $REDISPASS -h $REDISIP bgsave - -Now the database backup should be stored in the -default directory `/var/lib/redis/` directory. - -Filesystem backup ------------------ - -We need to backup all files that can be used to recover -from a possible failure in the Overcloud controllers when -executing a minor update or a major upgrade. - -The option ``--ignore-failed-read`` is added to the `tar` -command because the list of files to backup might be -different on each environment and we make the list of -paths to backup is as much general as possible. - -The following folders should be backed up:: - - mkdir -p /var/tmp/filesystem_backup/ - tar --xattrs --ignore-failed-read \ - -zcvf /var/tmp/filesystem_backup/fs_backup-`date '+%Y-%m-%d-%H-%M-%S'`.tar.gz \ - /etc/nova \ - /var/log/nova \ - /var/lib/nova \ - --exclude /var/lib/nova/instances \ - /etc/glance \ - /var/log/glance \ - /var/lib/glance \ - /etc/keystone \ - /var/log/keystone \ - /var/lib/keystone \ - /etc/httpd \ - /etc/cinder \ - /var/log/cinder \ - /var/lib/cinder \ - /etc/heat \ - /var/log/heat \ - /var/lib/heat \ - /var/lib/heat-config \ - /var/lib/heat-cfntools \ - /etc/rabbitmq \ - /var/log/rabbitmq \ - /var/lib/rabbitmq \ - /etc/neutron \ - /var/log/neutron \ - /var/lib/neutron \ - /etc/corosync \ - /etc/haproxy \ - /etc/logrotate.d/haproxy \ - /var/lib/haproxy \ - /etc/openvswitch \ - /var/log/openvswitch \ - /var/lib/openvswitch \ - /etc/ceilometer \ - /var/lib/redis \ - /etc/sysconfig/memcached \ - /etc/gnocchi \ - /var/log/gnocchi \ - /etc/aodh \ - /var/log/aodh \ - /etc/panko \ - /var/log/panko \ - /etc/ceilometer \ - /var/log/ceilometer diff --git a/deploy-guide/source/post_deployment/backup_and_restore/03_undercloud_restore.rst b/deploy-guide/source/post_deployment/backup_and_restore/03_undercloud_restore.rst deleted file mode 100644 index 42b1c795..00000000 --- a/deploy-guide/source/post_deployment/backup_and_restore/03_undercloud_restore.rst +++ /dev/null @@ -1,204 +0,0 @@ -Restoring the Undercloud -======================== - -The following restore process assumes you are recovering from a failed Undercloud node where you have to reinstall it from scratch. -It assumes that the hardware layout is the same, and the hostname and Undercloud settings of the machine will be the same as well. -Once the machine is installed and is in a clean state, re-enable all the subscriptions/repositories needed to install and run TripleO. - -Note that unless specified, all commands should run as the stack user. - -NTP service ------------ - -OpenStack services are time sensitive, users need to -be sure their environment have the time synchronized -correctly before proceeding with any backup task. - -By default, both Undercloud and Overcloud should have -configured correctly the NTP service as there are -parameters specifically defined to manage this service. - -The user is responsible to ensure that the Undercloud -restore is consistent in time. For example, a user -installs the Undercloud at the time 'm', then they deploy -the Undercloud and the Overcloud at the time 'n', and -they create an Undercloud backup at the time 'o'. When the user -restore the Undercloud it needs to be sure is restored -at a time later than 'o'. So, before and after restoring the Undercloud -node is important to have all the deployment with the time -updated and synchronized correctly. - -In case this is done manually, execute: - -:: - - sudo yum install -y ntp - sudo chkconfig ntpd on - sudo service ntpd stop - sudo ntpdate pool.ntp.org - sudo service ntpd restart - -After ensuring the environment have the time synchronized correctly -you can continue with the restore tasks. - -Downloading automated Undercloud backups ----------------------------------------- - -If the user has executed the Undercloud backup from the -TripleO CLI, it will need to download it to a local folder -and from there execute the restore steps. - -:: - - # From the Undercloud - source stackrc - mkdir /var/tmp/test_bk_down - cd /var/tmp/test_bk_down - openstack container save undercloud-backups - -Now, in the `restore_uc_backup` folder there must be a file with the -following naming convention `UC-backup-.tar`. - -After getting the backup file and unzipping it in any -selected folder, the user can proceed with the Undercloud restore. - -The following is an example of how to extract the Undercloud -backup content: - -:: - - sudo tar -xvf /var/tmp/test_bk_down/UC-backup-*.tar -C /var/tmp/test_bk_down || true - -There, the user will have a tar file with the content of the file system backup -and another gz file with the content of the database backup. - -The user can proceed to unzip the database -and filesystem backup by executing: - -:: - - sudo gunzip /var/tmp/test_bk_down/*.gz -c > /var/tmp/test_bk_down/all-databases.sql - sudo tar -xvf /var/tmp/test_bk_down/filesystem-*.tar -C /var/tmp/test_bk_down --xattrs - -Restoring a backup of your Undercloud on a Fresh Machine --------------------------------------------------------- - -Assuming that the user has a fresh installed Undercloud -node, the user is able to log in as the stack user, and -have the Backup restored in the folder -`/var/tmp/test_bk_down`, follow the next steps. - -Synchronize the stack home directory, haproxy configuration, -certificates and hieradata with the backup content: - -:: - - sudo rsync -aX /var/tmp/test_bk_down/home/stack/ /home/stack - sudo rsync -aX /var/tmp/test_bk_down/etc/haproxy/ /etc/haproxy/ - sudo rsync -aX /var/tmp/test_bk_down/etc/pki/instack-certs/ /etc/pki/instack-certs/ - sudo mkdir -p /etc/puppet/hieradata/ - sudo rsync -aX /var/tmp/test_bk_down/etc/puppet/hieradata/ /etc/puppet/hieradata/ - sudo rsync -aX /var/tmp/test_bk_down/srv/node/ /srv/node/ - sudo rsync -aX /var/tmp/test_bk_down/var/lib/glance/ /var/lib/glance/ - -The Keystone configuration files need to be synchronized -before reinstalling the Undercloud node. This is needed -because we need to have the same keys in the folders -`credential-keys` and `fernet-keys` so they don't get regenerated -when running the puppet Undercloud configuration. -Take into account that the package `openstack-keystone` needs to be installed -before synchronizing its configuration data: - -:: - - sudo rsync -a /var/tmp/test_bk_down/etc/keystone/ /etc/keystone/ - -If the user is using SSL, you need to refresh the CA certificate: - -:: - - sudo mkdir -p /etc/pki/instack-certs || true - sudo cp /home/stack/undercloud.pem /etc/pki/instack-certs - sudo cp /home/stack/cacert.pem /etc/pki/ca-trust/source/anchors/ - sudo cp /home/stack/overcloud-cacert.pem /etc/pki/ca-trust/source/anchors/ - sudo semanage fcontext -a -t etc_t "/etc/pki/instack-certs(/.*)?" - sudo restorecon -R /etc/pki/instack-certs - sudo update-ca-trust extract - -Install the required packages with: - -:: - - sudo yum install -y mariadb mariadb-server python-tripleoclient - -If you are using Pike and Ceph will be used in the Overcloud, install -ceph-ansible on the Undercloud: - -:: - - sudo yum install -y ceph-ansible - -Restart MySQL: - -:: - - sudo systemctl restart mariadb - -Allow restore big dump DB files: - -:: - - mysql -uroot -e"set global max_allowed_packet = 1073741824;" - - -Restore the DB backup: - -:: - - mysql -u root < /var/tmp/test_bk_down/all-databases.sql - -Restart Mariadb to refresh the permissions from the backup file: - -:: - - sudo systemctl restart mariadb - -Register the root password from the configuration file and clean -the DB password to be able to reinstall the Undercloud: - -:: - - oldpassword=$(sudo cat /var/tmp/test_bk_down/root/.my.cnf | grep -m1 password | cut -d'=' -f2 | tr -d "'") - mysqladmin -u root -p$oldpassword password '' - -Remove old user permissions if it exists, replace with the host related to each user. - -:: - - mysql -e 'select host, user, password from mysql.user;' - for i in ceilometer glance heat ironic keystone neutron nova mistral zaqar;do mysql -e "drop user $i@" || true ;done - mysql -e 'flush privileges' - -We have to now install the swift and glance base packages, and then restore their data: - -:: - - sudo yum install -y openstack-glance openstack-swift - # Restore data from the Backup to: srv/node and var/lib/glance/images - # Confirm data is owned by correct user - sudo chown -R swift: /srv/node - sudo chown -R glance: /var/lib/glance/images - -Finally, we rerun the Undercloud installation from the stack user, making sure to run it in the stack user home dir: - -:: - - # Double check hostname is correctly set in /etc/hosts - openstack undercloud install - -Reconnect the restored Undercloud to the Overcloud --------------------------------------------------- -Having completed the steps above, the Undercloud can be expected to automatically -restore its connection to the Overcloud. The nodes will continue to poll -Orchestration (heat) for pending tasks, using a simple HTTP request issued every -few seconds. diff --git a/deploy-guide/source/post_deployment/backup_and_restore/04_overcloud_restore.rst b/deploy-guide/source/post_deployment/backup_and_restore/04_overcloud_restore.rst deleted file mode 100644 index a1cc820a..00000000 --- a/deploy-guide/source/post_deployment/backup_and_restore/04_overcloud_restore.rst +++ /dev/null @@ -1,185 +0,0 @@ -Restoring the Overcloud control plane services -============================================== - -Restoring the Overcloud control plane from a failed state -depends on the specific issue the operator is facing. - -This section provides a restore method for -the backups created in previous steps. - -The general strategy of restoring an Overcloud control plane -will be to have the services working back again to -re-run the update/upgrade tasks. - -YUM update rollback -------------------- - -Depending on the updated packages, running a yum rollback -based on the `yum history` command might not be a good idea. -In the specific case of an OpenStack minor update or a major upgrade -will be harder as there will be several dependencies and packages -to downgrade based on the number of transactions yum had to run to upgrade -all the node packages. -Also, using `yum history` to rollback transactions -can lead to target to remove packages needed for the -system to work correctly. - - -Database restore ----------------- - -In the case we have updated the packages correctly, and the user has an -issue with updating the database schemas, we might need to restore the -database cluster. - -With all the services stopped in the Overcloud controllers (except MySQL), go through -the following procedure: - -On all the controller nodes, drop connections to the database port via the VIP by running:: - - MYSQLIP=$(grep -A1 'listen mysql' /var/lib/config-data/haproxy/etc/haproxy/haproxy.cfg | grep bind | awk '{print $2}' | awk -F":" '{print $1}') - sudo nft add rule inet filter TRIPLEO_INPUT tcp dport 3306 ip daddr $MYSQLIP drop - -This will isolate all the MySQL traffic to the nodes. - -On only one controller node, unmanage galera so that it is out of pacemaker's control:: - - pcs resource unmanage galera - -Remove the wsrep_cluster_address option from `/var/lib/config-data/mysql/etc/my.cnf.d/galera.cnf`. -This needs to be executed on all nodes:: - - grep wsrep_cluster_address /var/lib/config-data/mysql/etc/my.cnf.d/galera.cnf - vi /var/lib/config-data/mysql/etc/my.cnf.d/galera.cnf - -On all the controller nodes, stop the MariaDB database:: - - mysqladmin -u root shutdown - -On all the controller nodes, move existing MariaDB data directories and prepare new data directories:: - - sudo -i - mv /var/lib/mysql/ /var/lib/mysql.old - mkdir /var/lib/mysql - chown mysql:mysql /var/lib/mysql - chmod 0755 /var/lib/mysql - mysql_install_db --datadir=/var/lib/mysql --user=mysql - chown -R mysql:mysql /var/lib/mysql/ - restorecon -R /var/lib/mysql - -On all the controller nodes, move the root configuration to a backup file:: - - sudo mv /root/.my.cnf /root/.my.cnf.old - sudo mv /etc/sysconfig/clustercheck /etc/sysconfig/clustercheck.old - -On the controller node we previously set to `unmanaged`, bring the galera cluster up with pacemaker:: - - pcs resource manage galera - pcs resource cleanup galera - -Wait for the galera cluster to come up properly and run the following -command to wait and see all nodes set as masters as follows:: - - pcs status | grep -C3 galera - # Master/Slave Set: galera-master [galera] - # Masters: [ overcloud-controller-0 overcloud-controller-1 overcloud-controller-2 ] - -NOTE: If the cleanup does not show all controller nodes as masters, re-run the following command:: - - pcs resource cleanup galera - -On the controller node we previously set to `unmanaged` which is managed back -by pacemaker, restore the OpenStack database that was backed up in a previous section. -This will be replicated to the other controllers by Galera:: - - mysql -u root < openstack_database.sql - -On the same controller node, restore the users and permissions:: - - mysql -u root < grants.sql - -Pcs status will show the galera resource in error because it's now using the wrong user/password to connect to poll the database status. -On all the controller nodes, restore the root/clustercheck configuration to a backup file:: - - sudo mv /root/.my.cnf.old /root/.my.cnf - sudo mv /etc/sysconfig/clustercheck.old /etc/sysconfig/clustercheck - -Test the clustercheck locally for each controller node:: - - /bin/clustercheck - -Perform a cleanup in pacemaker to reprobe the state of the galera nodes:: - - pcs resource cleanup galera - -Test clustercheck on each controller node via xinetd.d:: - - curl overcloud-controller-0:9200 - # curl overcloud-controller-1:9200 - # curl overcloud-controller-2:9200 - -Remove the firewall rule from each node for the services to restore access to the database:: - - sudo nft -a list chain inet filter TRIPLEO_INPUT | grep mysql - [...] - tcp dport 3306 ip daddr $MYSQLIP drop # handle 499 - sudo nft delete rule inet filter TRIPLEO_INPUT handle 499 - -Filesystem restore ------------------- - -On all overcloud nodes, copy the backup tar file to a temporary -directory and uncompress all the data:: - - mkdir /var/tmp/filesystem_backup/data/ - cd /var/tmp/filesystem_backup/data/ - mv . - tar --xattrs -xvzf .tar.gz - -NOTE: Untarring directly on the / directory will -override your current files. Its recommended to -untar the file in a different directory. - -Cleanup the redis resource --------------------------- - -Run:: - - pcs resource cleanup redis - -Start up the services on all the controller nodes -------------------------------------------------- - -The operator must check that all services are starting correctly, -the services installed in the controllers depend on the operator -needs so the following commands might not apply completely. -The goal of this section is to show that all services must be -started correctly before proceeding to retry an update, upgrade or -use the Overcloud on a regular basis. - -Non containerized environment -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Command to start services:: - - sudo -i ;systemctl start openstack-ceilometer-central; systemctl start memcached; pcs resource enable rabbitmq; systemctl start openstack-nova-scheduler; systemctl start openstack-heat-api; systemctl start mongod; systemctl start redis; systemctl start httpd; systemctl start neutron-ovs-cleanup - -Once all the controller nodes are up, start the compute node services on all the compute nodes:: - - sudo -i; systemctl start openstack-ceilometer-compute.service; systemctl start openstack-nova-compute.service - -Containerized environment -~~~~~~~~~~~~~~~~~~~~~~~~~ - -The operator must check all containerized services are running correctly, please identify those stopped services by running:: - - sudo docker ps - -Once the operator finds a stopped service, proceed to start it by running:: - - sudo docker start - - - - - diff --git a/deploy-guide/source/post_deployment/backup_and_restore/05_rear.rst b/deploy-guide/source/post_deployment/backup_and_restore/05_rear.rst deleted file mode 100644 index 68db73b4..00000000 --- a/deploy-guide/source/post_deployment/backup_and_restore/05_rear.rst +++ /dev/null @@ -1,212 +0,0 @@ -Creating backups and restores using ReaR ----------------------------------------- - - -ReaR is a disaster recovery solution for Linux. -Relax-and-Recover, creates both a bootable rescue -image and a backup of the associated files you choose. - -When doing disaster recovery of a system, this Rescue -Image plays the files back from the backup and so in -very quickly to the latest state. - -Various configuration options are available for the rescue -image. For example, slim ISO files, USB sticks or even images -for PXE servers are generated. As many backup options are -possible. Starting with a simple archive file (eg * .tar.gz), -various backup technologies such as IBM Tivoli Storage -Manager (TSM), EMC NetWorker (Legato), Bacula or even Bareos -can be addressed. - -ReaR is written in Bash and it enables the skillful distribution -of Rescue Images and if necessary archive files via NFS, CIFS -(SMB) or another transport method in the network. -The actual recovery process then takes place via this transport -route. - -In this specific case, due to the nature of the OpenStack deployment -we will choose those protocols that are allowed by default in the -Iptables rules (SSH, SFTP in particular). - -We will apply this specific use of ReaR to recover -a failed control plane after a critical maintenance -task (like an upgrade). - -1. Prepare the Undercloud backup bucket. - -We need to prepare the place to store the backups from -the Overcloud. From the Undercloud, check you have enough -space to make the backups and prepare the environment. -We will also create a user in the Undercloud with no shell -access to be able to push the backups from the controllers -or the compute nodes:: - - groupadd backup - mkdir /data - useradd -m -g backup -d /data/backup backup - echo "backup:backup" | chpasswd - chown -R backup:backup /data - chmod -R 755 /data - -2. Run the backup from the Overcloud nodes. - -Let's install some required packages and run some previous -configuration steps:: - - # Install packages - sudo yum install rear genisoimage syslinux lftp wget -y - - # Make sure you are able to use sshfs to store the ReaR backup - sudo yum install fuse -y - sudo yum groupinstall "Development tools" -y - wget http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/f/fuse-sshfs-2.10-1.el7.x86_64.rpm - sudo rpm -i fuse-sshfs-2.10-1.el7.x86_64.rpm - - sudo mkdir -p /data/backup - sudo sshfs -o allow_other backup@undercloud-0:/data/backup /data/backup - # Use backup password, which is... backup - -Now, let's configure ReaR config file.:: - - #Configure ReaR - sudo tee -a "/etc/rear/local.conf" > /dev/null <<'EOF' - OUTPUT=ISO - OUTPUT_URL=sftp://backup:backup@undercloud-0/data/backup/ - BACKUP=NETFS - BACKUP_URL=sshfs://backup@undercloud-0/data/backup/ - BACKUP_PROG_COMPRESS_OPTIONS=( --gzip ) - BACKUP_PROG_COMPRESS_SUFFIX=".gz" - BACKUP_PROG_EXCLUDE=( '/tmp/*' '/data/*' ) - EOF - -Now run the backup, this should create an ISO image in -the Undercloud node (/data/backup/). - -**You will be asked for the backup user password**:: - - sudo rear -d -v mkbackup - -Now, we can proceed to simulate a failure in any node we want -to restore for testing the procedure.:: - - sudo rm -rf /lib - -After the ISO image is created, we can proceed to -verify we can restore it from the Hypervisor. - -3. Prepare the hypervisor. - -We will run in the Hypervisor some pre backup steps in -order to have the correct configuration to mount the -backup bucket from the Undercloud node:: - - # Enable the use of fusefs for the VMs on the hypervisor - setsebool -P virt_use_fusefs 1 - - # Install some required packages - sudo yum install -y fuse-sshfs - - # Mount the Undercloud backup folder to access the images - mkdir -p /data/backup - sudo sshfs -o allow_other root@undercloud-0:/data/backup /data/backup - ls /data/backup/* - -4. Stop the damaged controller node. - -In this step we will proceed to edit the VM definition -to be able to boot the rescue image.:: - - virsh shutdown controller-0 - # virsh destroy controller-0 - - # Wait until is down - watch virsh list --all - - # Backup the guest definition - virsh dumpxml controller-0 > controller-0.xml - cp controller-0.xml controller-0.xml.bak - -Now, we need to change the guest definition to boot from the ISO file. - -Edit controller-0.xml and update it to boot from the ISO file. - -Find the OS section,add the cdrom device and enable the boot menu.:: - - - - - - - -Edit the devices section and add the CDROM.:: - - - - - - -

- - -Update the guest definition.:: - - virsh define controller-0.xml - -Restart and connect to the guest:: - - virsh start controller-0 - virsh console controller-0 - -You should be able to see the boot menu to start the recover -process, select Recover controller-0 and follow the instructions. - -Now, before proceeding to run the controller restore, it's -possible that the host undercloud-0 can't be resolved, -just execute.:: - - echo "192.168.24.1 undercloud-0" >> /etc/hosts - -Having resolved the Undercloud host, we just need to follow the -wizard and wait to have the environment restored. - -You should see a message like: :: - - Welcome to Relax-and-Recover. Run "rear recover" to restore your system ! - RESCUE controller-0:~ # rear recover - -The image restore should progress quickly. - -Now, each time you reboot the node will have the ISO file -as the first boot option so it's something we need to fix. -In the mean time let's check if the restore went fine. - -Reboot the guest booting from the hard disk. - -Now we can see that the guest VM started successfully. - -Now we need to restore the guest to it's original definition, -so from the Hypervisor we need to restore the `controller-0.xml.bak` -file we created.:: - - # From the Hypervisor - virsh shutdown controller-0 - watch virsh list --all - virsh define controller-0.xml.bak - virsh start controller-0 - -Considerations: -~~~~~~~~~~~~~~~ - -- Space. -- Multiple protocols supported but we might then to update - firewall rules, that's why we choose SFTP. -- Network load when moving data. -- Shutdown/Starting sequence for HA control plane. -- Do we need to backup the data plane? -- User workloads should be handled by a third party backup software. - -References -~~~~~~~~~~ - -#. https://www.anstack.com/blog/2019/05/20/relax-and-recover-backups.html -#. http://relax-and-recover.org/ diff --git a/deploy-guide/source/post_deployment/delete_nodes.rst b/deploy-guide/source/post_deployment/delete_nodes.rst deleted file mode 100644 index 2575bb14..00000000 --- a/deploy-guide/source/post_deployment/delete_nodes.rst +++ /dev/null @@ -1,71 +0,0 @@ -.. _delete_nodes: - -Deleting Overcloud Nodes -======================== - -There may be situations where it's necessary to remove specific Compute nodes -from the overcloud. In those situations, it is possible to remove specific nodes -by following the process outlined in on this page. - -.. note:: - If you're just scaling down nodes and plan to re-use them. Use :ref:`scale_roles` - instead. For temporary issues with nodes, they can be blacklisted temporarily - using ``DeploymentServerBlacklist``. - This guide is specifically for removing nodes from the environment. - -.. note:: - If your Compute node is still hosting VM's, ensure they are migrated to - another Compute node before continuing. - -.. note:: - If you are using :ref:`baremetal_provision` then follow those - scale-down instructions to call ``openstack overcloud node delete`` with a - ``--baremetal-deployment`` argument instead of passing a list of nodes to - delete as arguments. - -To delete a specific node from the Overcloud. We use the following command:: - - openstack overcloud node delete --stack $STACK_NAME - -.. note:: - This command uses the hostnames as it's referring to nodes from the Ansible - inventory. While there is currently a process to translate Nova UUID's to - the hostname. This may be removed in future releases. As such, it is - recommended to use the hostname instead of Nova UUIDs. - -This command updates the heat stack with updated numbers and list of resource -IDs (which represent nodes) to be deleted. - -.. admonition:: Train - :class: train - - In Train, we added a user confirmation to the scale down command to - prevent accidental node removal. - To skip it, please use "--yes". - -.. admonition:: Train - :class: train - - Starting in Train and onward, `openstack overcloud node delete` can take - a list of server hostnames instead of instance ids. However they can't be - mixed while running the command. Example: if you use hostnames, it would - have to be for all the nodes to delete. - -.. note:: - Before deleting a compute node or a cephstorage node, please make sure that - the node is quiesced, see :ref:`quiesce_compute` or - :ref:`quiesce_cephstorage`. - -.. note:: - You can generate the list of hostname in the Ansible inventory using:: - - . stackrc - tripleo-ansible-inventory --stack --static-yaml-inventory overcloud-inv.yaml - - This file will contain the Ansible inventory in use and help to identify the - hostname that needs to be passed to the `node delete` command. - -.. note:: - Once the node deletion has completed. Be sure to decrement the node count in your templates. - For example, if removing a compute node, then the ``ComputeCount:`` value needs to be updated - to reflect the new correct number of nodes in the environment. diff --git a/deploy-guide/source/post_deployment/fernet_key_rotation.rst b/deploy-guide/source/post_deployment/fernet_key_rotation.rst deleted file mode 100644 index 90983466..00000000 --- a/deploy-guide/source/post_deployment/fernet_key_rotation.rst +++ /dev/null @@ -1,24 +0,0 @@ -.. _fernet_key_rotation: - -Rotation Keystone Fernet Keys from the Overcloud -================================================ - -Like most passwords in your overcloud deployment, keystone fernet keys are also -stored as part of the deployment plan in mistral. The overcloud deployment's -fernet keys can be rotated with the following command:: - - openstack workflow execution create \ - tripleo.fernet_keys.v1.rotate_fernet_keys \ - '{"container": "overcloud"}' - -Where the value for "container" is the name of the plan (which defaults to -"overcloud"). - -After waiting some time you can verify the output by taking the execution ID -from that was the output of the previous command, and issuing the following -command:: - - openstack workflow execution output show EXECUTION_UUID - -Please note that there must be an overcloud deployment ready and accessible in -order to execute this action. diff --git a/deploy-guide/source/post_deployment/index.rst b/deploy-guide/source/post_deployment/index.rst deleted file mode 100644 index 06cf676e..00000000 --- a/deploy-guide/source/post_deployment/index.rst +++ /dev/null @@ -1,36 +0,0 @@ -Post Cloud Deployment -===================== - -This section describes additional items that can be performed or configured -post cloud deployment. - -.. toctree:: - :maxdepth: 1 - - backup_and_restore/00_index.rst - delete_nodes - fernet_key_rotation - scale_roles - tempest/index - update_undercloud_ssh_keys - updating-stacks-notes - upgrade/index - validations/index - - - -Post Cloud Deployment Advanced Topics -===================================== - -This section describes advanced post deployment tasks that can be performed -or configured post cloud deployment. - -.. toctree:: - :maxdepth: 1 - - migration - quiesce_cephstorage - quiesce_compute - updating_network_configuration_post_deployment - vm_snapshot - pre_cache_images diff --git a/deploy-guide/source/post_deployment/migration.rst b/deploy-guide/source/post_deployment/migration.rst deleted file mode 100644 index 1bd49cad..00000000 --- a/deploy-guide/source/post_deployment/migration.rst +++ /dev/null @@ -1,53 +0,0 @@ -Migrating Workloads from an existing OpenStack cloud -==================================================== - -|project| provides the ability to manage changes over time to a cloud that it -has deployed. However, it cannot automatically take over the management of -existing OpenStack clouds deployed with another installer. Since there can be -no one-size-fits-all procedure for upgrading an existing cloud to use -|project|, it is recommended that a new cloud be deployed with |project| and -any workloads running on an existing cloud be migrated off. - -Migrating User Workloads ------------------------- - -Since the best way of avoiding or handling any downtime associated with moving -an application from one cloud to another is application-dependent, it is -preferable to have end users migrate their own applications at a time and in -the manner of their choosing. This can also help to spread out the network -bandwidth requirements, rather than copying a large number of snapshots in -bulk. - -Ideally applications can be re-created from first principles (an Orchestration -tool such as Heat can help make this repeatable) and any data populated after -the fact. This allows the new VMs to be backed by a copy-on-write disk image -overlaid on the original base image. The alternative is to :doc:`export and -then import <./vm_snapshot>` snapshots of the VM images. This may require -considerably more disk space as each VM's base image becomes its snapshot, -where previously multiple VMs may have shared the same base image. - -Reclaiming Excess Capacity --------------------------- - -As workloads are migrated off the previous cloud, compute node hardware can be -freed up to reallocate to the new cloud. Since there is likely no guarantee as -to the order in which users will migrate, it will be necessary to consolidate -the remaining VMs onto a smaller number of machines as utilization drops. This -can be done by performing live migration within the old cloud. - -Select a compute node to remove from service and follow the procedure for -:doc:`quiesce_compute`. Once this is done, the node can be removed from the old -cloud and the hardware reused, possibly by adding it to the new cloud. - -Adding New Capacity -------------------- - -As utilization of the new cloud increases and hardware becomes available from -the old cloud, additional compute nodes can be added to the new cloud with -|project|. - -First, register and introspect the additional hardware with Ironic just as you -would have done when :doc:`initially deploying -<../deployment/install_overcloud>` the cloud with |project|. Then -:doc:`scale out ` the 'Compute' role in the new overcloud to start -making use of the additional capacity. diff --git a/deploy-guide/source/post_deployment/pre_cache_images.rst b/deploy-guide/source/post_deployment/pre_cache_images.rst deleted file mode 100644 index 607f61ea..00000000 --- a/deploy-guide/source/post_deployment/pre_cache_images.rst +++ /dev/null @@ -1,215 +0,0 @@ -.. _precache_image: - -Pre-caching images on Compute Nodes -=================================== - -Fetching an image from Glance is often the most time consuming step when -booting an instance. This can be particularly significant in cases where the -data must traverse a high latency or limited bandwidth network, for example -with :doc:`../features/distributed_compute_node`. - -An ansible playbook is available to ensure images are already cached in cases -where instance creation times must be minimized. - -.. admonition:: Ussuri - :class: ussuri - - Since Ussuri Nova also provides an API to pre-cache images on Compute nodes. - See the `Nova Image pre-caching documentation `_. - -.. note:: The Nova Image Cache is not used when using Ceph RBD for Glance images and Nova ephemeral disk. See `Nova Image Caching documentation `_. - -Image Cache Cleanup -------------------- - -The nova-compute service remains responsible for cleaning up old unused images -on a compute node. -A periodic job examines each of the images that are not currently used by an -instance on the host. -If an image is older than the configured maximum age it will be removed. - -When an image is pre-cached the modification time is set to the current -time. This effectively sets the image age back to 0. -Therefore the pre-caching task should be repeated on an interval that is less -than the maximum image age to ensure images remain cached. - -Configuring the maximum image age ---------------------------------- - -The default maximum image age is 86400 seconds (24 hours). -This can be increased for all computes by setting `NovaImageCacheTTL` in the -deployment parameters:: - - [stack@undercloud-0 ~]$ cat nova-cache-environment.yaml - parameter_defaults: - # Set the max image age to 30 days - NovaImageCacheTTL: 2592000 - -Alternatively `NovaImageCacheTTL` can be set for individual compute roles:: - - [stack@undercloud-0 ~]$ cat nova-cache-environment.yaml - parameter_defaults: - # Set the max image age to 30 days for the ComputeSite1 role - ComputeSite1Parameters: - NovaImageCacheTTL: 2592000 - # Set the max image age to 7 days for the ComputeSite2 role - ComputeSite2Parameters: - NovaImageCacheTTL: 604800 - # Any other Compute roles default to 86400 - -.. _cache_all_computes: - -Pre-caching a list of images on all Compute nodes -------------------------------------------------- - -Get an ansible inventory for the stack name (default `overcloud`): - -.. admonition:: Wallaby - :class: wallaby - - ``tripleo-ansible-inventory`` is deprecated as of Wallaby. - - .. code-block:: bash - - [stack@undercloud-0 ~]$ mkdir -p inventories - [stack@undercloud-0 ~]$ . stackrc - (undercloud) [stack@undercloud-0 ~]$ tripleo-ansible-inventory \ - --plan overcloud --static-yaml-inventory inventories/inventory.yaml - -.. code-block:: bash - - [stack@undercloud-0 ~]$ find ~/overcloud-deploy/*/config-download \ - -name tripleo-ansible-inventory.yaml |\ - while read f; do cp $f inventories/$(basename $(dirname $f)).yaml; done - -Determine the list of image IDs to pre-cache:: - - [stack@undercloud-0 ~]$ . overcloudrc - (overcloud) [stack@undercloud-0 ~]$ openstack image list - +--------------------------------------+---------+--------+ - | ID | Name | Status | - +--------------------------------------+---------+--------+ - | 07bc2424-753b-4f65-9da5-5a99d8383fe6 | image_0 | active | - | d5187afa-c821-4f22-aa4b-4e76382bef86 | image_1 | active | - +--------------------------------------+---------+--------+ - -Add the image ids to an argument file for the ansible playbook:: - - (overcloud) [stack@undercloud-0 ~]$ cat < nova_cache_args.yml - tripleo_nova_image_cache_images: - - id: 07bc2424-753b-4f65-9da5-5a99d8383fe6 - - id: d5187afa-c821-4f22-aa4b-4e76382bef86 - EOF - -Source the overcloud rc file to provide the necessary credentials for image download:: - - [stack@undercloud-0 ~]$ . overcloudrc - -Run the `tripleo_nova_image_cache` playbook:: - - (overcloud) [stack@undercloud-0 ~]$ ansible-playbook -i inventories --extra-vars "@nova_cache_args.yml" /usr/share/ansible/tripleo-playbooks/tripleo_nova_image_cache.yml - - PLAY [TripleO Nova image cache management] *************************************************************************************************************************************************************************************************** - - TASK [tripleo-nova-image-cache : Cache image 07bc2424-753b-4f65-9da5-5a99d8383fe6] *********************************************************************************************************************************************************** - changed: [compute-0] - changed: [compute-1] - - TASK [tripleo-nova-image-cache : Cache image d5187afa-c821-4f22-aa4b-4e76382bef86] *********************************************************************************************************************************************************** - changed: [compute-0] - changed: [compute-1] - -.. note:: If the image already exists in cache then no change is reported however the image modification time is updated - -.. warning:: The ansible `forks` config option (default=5) will affect the number of concurrent image downloads. Consider the load on the image service if adjusting this. - -Multi-stacks inventory ----------------------- - -When a multi-stack deployment is used, such as in -:doc:`../features/distributed_compute_node` and -:doc:`../features/deploy_cellv2`, a merged inventory allows images to be cached -on all compute nodes with a single playbook run. - -For each deployed stack, its ansible inventory is generated in -``overcloud-deploy//config-download/tripleo-ansible-inventory.yaml``. -Collect all inventories under the ``inventories`` directory: - -.. admonition:: Wallaby - :class: wallaby - - ``tripleo-ansible-inventory`` is deprecated as of Wallaby. A multi-stack - inventory can be created by specifying a comma separated list of stacks: - - .. code-block:: bash - - [stack@undercloud-0 ~]$ mkdir -p inventories - [stack@undercloud-0 ~]$ . stackrc - (undercloud) [stack@undercloud-0 ~]$ tripleo-ansible-inventory \ - --plan overcloud,site1,site2 \ - --static-yaml-inventory inventories/multiinventory.yaml - -.. code-block:: bash - - [stack@undercloud-0 ~]$ mkdir -p inventories - [stack@undercloud-0 ~]$ find ~/overcloud-deploy/*/config-download \ - -name tripleo-ansible-inventory.yaml |\ - while read f; do cp $f inventories/$(basename $(dirname $f)).yaml; done - -When all inventory files are stored in a single directory, ansible merges it. -The playbook can then be run once as in :ref:`cache_all_computes` to pre-cache on all compute nodes. - -.. _scp_distribution: - -Pre-caching on one node and distributing to remaining nodes ------------------------------------------------------------ - -In the case of a :doc:`../features/distributed_compute_node` it may be desirable to transfer an image to a single compute node at a remote site and then redistribute it from that node to the remaining compute nodes. -The SSH/SCP configuration that exists between the compute nodes to support cold migration/resize is reused for this purpose. - -.. warning:: SSH/SCP is inefficient over high latency networks. The method should only be used when the compute nodes targeted by the playbook are all within the same site. To ensure this is the case set tripleo_nova_image_cache_plan to the stack name of the site. Multiple runs of ansible-playbook are then required, targeting a different site each time. - -To enable this simply set `tripleo_nova_image_cache_use_proxy: true` in the arguments file. -The image is distributed from the first compute node by default. To use a specific compute node also set `tripleo_nova_image_cache_proxy_hostname`. - -For example:: - - (central) [stack@undercloud-0 ~]$ cat < dcn1_nova_cache_args.yml - tripleo_nova_image_cache_use_proxy: true - tripleo_nova_image_cache_proxy_hostname: dcn1-compute-1 - tripleo_nova_image_cache_images: - - id: 07bc2424-753b-4f65-9da5-5a99d8383fe6 - tripleo_nova_image_cache_plan: dcn1 - EOF - - (central) [stack@undercloud-0 ~]$ ansible-playbook -i inventories --extra-vars "@dcn1_nova_cache_args.yml" /usr/share/ansible/tripleo-playbooks/tripleo_nova_image_cache.yml - - PLAY [TripleO Nova image cache management] *************************************************************************************************************************************************************************************************** - - TASK [tripleo-nova-image-cache : Show proxy host] ******************************************************************************************************************************************************************************************** - ok: [dcn-compute-0] => { - "msg": "Proxy host is dcn-compute-1" - } - - TASK [tripleo-nova-image-cache : Cache image 07bc2424-753b-4f65-9da5-5a99d8383fe6] *********************************************************************************************************************************************************** - skipping: [dcn1-compute-0] - changed: [dcn1-compute-1] - - TASK [tripleo-nova-image-cache : Cache image (via proxy) 07bc2424-753b-4f65-9da5-5a99d8383fe6] *********************************************************************************************************************************************** - skipping: [dcn1-compute-1] - changed: [dcn1-compute-0] - - (central) [stack@undercloud-0 ~]$ cat < dcn2_nova_cache_args.yml - tripleo_nova_image_cache_use_proxy: true - tripleo_nova_image_cache_images: - - id: 07bc2424-753b-4f65-9da5-5a99d8383fe6 - tripleo_nova_image_cache_plan: dcn2 - EOF - - (central) [stack@undercloud-0 ~]$ ansible-playbook -i inventories --extra-vars "@dcn2_nova_cache_args.yml" /usr/share/ansible/tripleo-playbooks/tripleo_nova_image_cache.yml - - PLAY [TripleO Nova image cache management] *************************************************************************************************************************************************************************************************** - ... - ... - -.. warning:: The ansible `forks` config option (default=5) will affect the number of concurrent SCP transfers. Consider the load on the proxy compute node if adjusting this. diff --git a/deploy-guide/source/post_deployment/quiesce_cephstorage.rst b/deploy-guide/source/post_deployment/quiesce_cephstorage.rst deleted file mode 100644 index 7a7cb4e6..00000000 --- a/deploy-guide/source/post_deployment/quiesce_cephstorage.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. _quiesce_cephstorage: - -Quiescing a CephStorage Node -============================ - -The process of quiescing a cephstorage node means to inform the Ceph -cluster that one or multiple OSDs will be permanently removed so that -the node can be shut down without affecting the data availability. - -Take the OSDs out of the cluster --------------------------------- - -Before you remove an OSD, you need to take it out of the cluster so that Ceph -can begin rebalancing and copying its data to other OSDs. Running the following -commands on a given cephstorage node will take all data out of the OSDs hosted -on it:: - - OSD_IDS=$(ls /var/lib/ceph/osd | awk 'BEGIN { FS = "-" } ; { print $2 }') - for OSD_ID in $OSD_IDS; do ceph crush reweight osd.$OSD_ID 0.0; done - -Ceph will begin rebalancing the cluster by migrating placement groups out of -the OSDs. You can observe this process with the ceph tool:: - - ceph -w - -You should see the placement group states change from active+clean to active, -some degraded objects, and finally active+clean when migration completes. - -Removing the OSDs ------------------ - -After the rebalancing, the OSDs will still be running. Running the following on -that same cephstorage node will stop all OSDs hosted on it, remove them from the -CRUSH map, from the OSDs map and delete the authentication keys:: - - OSD_IDS=$(ls /var/lib/ceph/osd | awk 'BEGIN { FS = "-" } ; { print $2 }') - for OSD_ID in $OSD_IDS; do - ceph osd out $OSD_ID - systemctl stop ceph-osd@$OSD_ID - ceph osd crush remove osd.$OSD_ID - ceph auth del osd.$OSD_ID - ceph osd rm $OSD_ID - done - -You are now free to reboot or shut down the node (using the Ironic API), or -even remove it from the overcloud altogether by scaling down the overcloud -deployment, see :ref:`delete_nodes`. diff --git a/deploy-guide/source/post_deployment/quiesce_compute.rst b/deploy-guide/source/post_deployment/quiesce_compute.rst deleted file mode 100644 index a9b915a1..00000000 --- a/deploy-guide/source/post_deployment/quiesce_compute.rst +++ /dev/null @@ -1,83 +0,0 @@ -.. _quiesce_compute: - -Quiescing a Compute Node -======================== - -The process of quiescing a compute node means to migrate workload off the node -so that it can be shut down without affecting the availability of end-users' -VMs. You might want to perform this procedure when rebooting a compute node to -ensure that package updates are applied (e.g. after a kernel update); to -consolidate workload onto a smaller number of machines when scaling down an -overcloud; or when replacing the compute node hardware. - -Setting up Keys ---------------- - -Assuming that the backing files for Nova VMs are not hosted on a shared storage -volume (with all compute nodes having access), the compute nodes will need to -be configured with ssh keys so that the `nova` user on each compute node has -ssh access to the corresponding account on the other compute nodes. - -First, generate an ssh key:: - - ssh-keygen -t rsa -f nova_id_rsa - -Then, on each compute node, run the following script to set up the keys:: - - NOVA_SSH=/var/lib/nova/.ssh - mkdir ${NOVA_SSH} - - cp nova_id_rsa ${NOVA_SSH}/id_rsa - chmod 600 ${NOVA_SSH}/id_rsa - cp nova_id_rsa.pub ${NOVA_SSH}/id_rsa.pub - cp nova_id_rsa.pub ${NOVA_SSH}/authorized_keys - - chown -R nova.nova ${NOVA_SSH} - - # enable login for nova user on compute hosts: - usermod -s /bin/bash nova - - # add ssh keys of overcloud nodes into known hosts: - ssh-keyscan -t rsa `os-apply-config --key hosts --type raw --key-default '' | awk '{print $1}'` >>/etc/ssh/ssh_known_hosts - - -Initiating Migration --------------------- - -First, obtain a list of the current Nova services:: - - source ~/overcloudrc # admin credentials for the overcloud - nova service-list - -Disable the `nova-compute` service on the node you wish to quiesce, to prevent -new VMs being scheduled on it:: - - nova service-disable nova-compute - - -Begin the process of migrating VMs off the node:: - - nova host-servers-migrate - -Completing Migration --------------------- - -The current status of the migration process can be retrieved with the command:: - - nova migration-list - -When migration of each VM completes, its state in Nova will change to -`VERIFY_RESIZE`. This gives you an opportunity to confirm that the migration -completed successfully, or to roll it back. To confirm the migration, use the -command:: - - nova resize-confirm - -Finally, once all migrations are complete and confirmed, remove the service -running (but disabled) on the compute node from Nova altogether:: - - nova service-delete - -You are now free to reboot or shut down the node (using the Ironic API), or -even remove it from the overcloud altogether by scaling down the overcloud -deployment, see :ref:`delete_nodes`. diff --git a/deploy-guide/source/post_deployment/scale_roles.rst b/deploy-guide/source/post_deployment/scale_roles.rst deleted file mode 100644 index c770f4e8..00000000 --- a/deploy-guide/source/post_deployment/scale_roles.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. _scale_roles: - -Scaling overcloud roles -======================= -If you want to increase or decrease resource capacity of a running overcloud, -you can start more servers of a selected role or delete some servers if -capacity should be decreased. This is now covered by the new Baremetal -provisioning process. Please refer to the following document for this node -scaling procedure :doc:`../provisioning/baremetal_provision` diff --git a/deploy-guide/source/post_deployment/tempest/index.rst b/deploy-guide/source/post_deployment/tempest/index.rst deleted file mode 100644 index f6b99805..00000000 --- a/deploy-guide/source/post_deployment/tempest/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -Tempest -======= - -This section describes tempest related items. - -.. toctree:: - :maxdepth: 1 - - os_tempest - tempest - tempest_plugins diff --git a/deploy-guide/source/post_deployment/tempest/os_tempest.rst b/deploy-guide/source/post_deployment/tempest/os_tempest.rst deleted file mode 100644 index d0ee3e9c..00000000 --- a/deploy-guide/source/post_deployment/tempest/os_tempest.rst +++ /dev/null @@ -1,168 +0,0 @@ -os_tempest -========== - -os_tempest is the unified ansible role for installing, configuring and running tempest -tests as well as processing tempest results using stackviz. - -TripleO CI group collaborates on `os_tempest` development. To see what -`os_tempest` is and the reasons why it was started have a look -`at the os-tempest documentation `_. - -Installation on a manually deployed TripleO Standalone Deployment ------------------------------------------------------------------ -Follow the `os_tempest Installation guide -`_. - -If the installation was successful you can expect ansible-galaxy to list the following roles: config_template, python_venv_build, os_tempest. - -.. code-block:: shell - - $ ansible-galaxy list - - config_template, master - - python_venv_build, master - - os_tempest, (unknown version) - -Running os_tempest role using the playbook ------------------------------------------- -In order to run os_tempest role on target host, you must first ensure you have a working clouds.yaml. - -Then, we can create a `tempest.yaml` playbook with the following vars: - -.. code-block:: yaml - - --- - - hosts: localhost - name: Run Tempest on Standalone - vars: - ansible_become: true - tempest_run: 'yes' - tempest_install_method: 'distro' - tempest_cloud_name: 'standalone' - tempest_workspace: "/home/centos/tempest" - tempest_services: - - neutron - tempest_public_net_physical_type: 'datacentre' - tempest_private_net_provider_type: 'geneve' - tempest_service_setup_host: '{{ inventory_hostname }}' - tempest_public_subnet_cidr: '192.168.0.0/24' - tempest_public_subnet_gateway_ip: '{{ tempest_public_subnet_cidr|nthhost(1) }}' - tempest_public_subnet_allocation_pools: '{{ tempest_public_subnet_cidr|nthhost(100) ~ "-" ~ tempest_public_subnet_cidr|nthhost(120) }}' - tempest_use_tempestconf: true - tempest_run_stackviz: false - tempest_tempest_conf_overrides: - auth.tempest_roles: "Member" - tempest_test_includelist: - - 'tempest.api.identity.v3' - gather_facts: true - roles: - - os_tempest - -What are these above vars: -++++++++++++++++++++++++++ - -* `ansible_become: true`: os_tempest requires root permission for installation and creation of tempest related directories -* `tempest_run: 'yes'`: For running os_tempest role, by default, It is set to `no`. -* `tempest_install_method: 'distro'`: Set to `distro` for installing tempest and it's plugins from distro packages -* `tempest_workspace`: It is the full directory path where we want to create tempest workspace. -* `tempest_cloud_name: 'standalone'`: Name of the cloud name from clouds.yaml file for using to create tempest related resources on target host. -* `tempest_services`: For installing tempest plugins as well as creating pre tempest resources like networks for tempest tests. -* `tempest_public_net_physical_type`: - The name of public physical network. For standalone tripleo deployment, it can found under `/var/lib/config-data/ - puppet-generated/neutron/etc/neutron/plugins/ml2/ml2_conf.ini` and then look for the value of `flat_networks`. -* `tempest_private_net_provider_type`: - The Name of the private network provider type, in case of ovn deployment, it should be `geneve`. - It can be found under `/var/lib/config-data/puppet-generated/neutron/etc/neutron/plugins/ml2/ml2_conf.ini` and then look for `type_drivers`. -* `tempest_service_setup_host`: It should be set to ansible inventory hostname. For some operation, the ansible role delegates to inventory hostname. -* `tempest_public_subnet_cidr`: Based on the standalone deployment IP, we need to pass a required cidr. -* `tempest_public_subnet_gateway_ip and tempest_public_subnet_allocation_pools`: - Subnet Gateway IP and allocation pool can be calculated based on the value of `tempest_public_subnet_cidr` nthhost value. -* `tempest_use_tempestconf`: For generating tempest.conf, we use python-tempestconf tool. By default It is set to false. Set it to `true` for using it -* `tempest_run_stackviz`: Stackviz is very useful in CI for analyzing tempest results, for local use, we set it to false. By default it is set to true. -* `tempest_tempest_conf_overrides`: In order to pass additional tempest configuration to python-tempestconf tool, we can pass a dictionary of values. -* `tempest_test_includelist`: We need to pass a list of tests which we wish to run on the target host as a list. -* `tempest_test_excludelist`: In order to skip tempest tests, we can pass the list here. -* `gather_facts`: We need to set gather_facts to true as os_tempest rely on targeted environment facts for installing stuff. - - -Here are the `defaults vars of os_tempest role `_. - -How to run it? -++++++++++++++ -We can use `ansible-playbook` command to run the `tempest.yaml` playbook. - -.. code-block:: shell - - $ ansible-playbook tempest.yaml - -Once the playbook run finishes, we can find the tempest related directories in the tempest workspace. -within `tempest_workspace/etc/` dir, we can find following files: - -* tempest.conf -* tempest_includelist.txt -* tempest_excludelist.txt - -within `/var/log/tempest` dir, we can find the tempest tests results in html format. - -* stestr_results.html -* test_list.txt - -Create your own os_tempest job -------------------------------- - -We are going to use `tripleo-ci-centos-7-standalone-os-tempest` job, which -uses the role for validating the cloud. - -Create a job definition in your `.zuul.yaml` file putting -`tripleo-ci-centos-7-standalone-os-tempest` as a parent of the job: - -.. code-block:: yaml - - - job: - name: our-tripleo-os-tempest-job - parent: tripleo-ci-centos-7-standalone-os-tempest - -.. note:: - - More about Zuul job definitions can be found in - `the official Zuul documentation `_. - -.. note:: - - This page assumes that the reader is familiar with - `TripleO CI jobs `_ - and with the procedures of - `adding new TripleO jobs `_. - -By default, `tripleo-ci-centos-7-standalone-os-tempest` sets the following -variables for controlling behaviour of `os_tempest`: - -.. code-block:: yaml - - vars: - tempest_install_method: distro - tempest_cloud_name: 'standalone' - -It runs `tempest.yaml` playbook which sets the rest of the `os_tempest` -variables needed for execution on top of an environment deployed by one of the -TripleO CI jobs. The -`content of the playbook can be seen here `_. - -If you want to set some of the variables mentioned above differently you need -to override them by adding those variables to your job definition. - -Let's say you would like to change `tempest_cloud_name` and -`tempest_public_net_physical_type`. After setting the variables your job -definition should look like: - -.. code-block:: yaml - - - job: - name: our-tripleo-os-tempest-job - parent: tripleo-ci-centos-7-standalone-os-tempest - vars: - tempest_cloud_name: - tempest_public_net_physical_type: - -To see configuration options, please, follow -`this page `_ -of official documentation of `os_tempest` role. diff --git a/deploy-guide/source/post_deployment/tempest/tempest.rst b/deploy-guide/source/post_deployment/tempest/tempest.rst deleted file mode 100644 index 32b76863..00000000 --- a/deploy-guide/source/post_deployment/tempest/tempest.rst +++ /dev/null @@ -1,703 +0,0 @@ -Tempest -======= - -This is a set of integration tests to be run against a live OpenStack cluster. -Tempest has batteries of tests for OpenStack API validation, scenarios, and -other specific tests useful in validating an OpenStack deployment. - -Current State of Tempest ------------------------- - -Source code : https://opendev.org/openstack/tempest/ - -Tempest Version release wise: -+++++++++++++++++++++++++++++ -* Ocata : 16.1.0 -* Pike : 17.2.0 -* Queens : 18.0.0 -* Master : master - -What Tempest provides? ----------------------- - -* Tempest provides a set of stable apis/interfaces which are used in tempest - tests and tempest plugins to keep backward compatibility. - - * Below is the list of stable interfaces: - - * tempest.lib.* - * tempest.config - * tempest.test_discover.plugins - * tempest.common.credentials_factory - * tempest.clients - * tempest.test - -* Tempest contains API tests for Nova, Glance, Cinder, Swift, Keystone as well - as scenario tests for covering these components and these tests are used for - InterOp certifications as validating the OpenStack deployment for the above - services. - -* The test which do not fit within the Tempest testsuite will go under - respective service specific tempest plugins. - -Tempest Plugins ---------------- - -Tempest plugins contain the API and scenario tests for specific OpenStack -services. -Here is the detailed list of `tempest plugins consumed`_ in a TripleO deployment. - -.. _tempest plugins consumed: ./tempest_plugins.html - -Packages provided by RDO ------------------------- - -* Tempest related RPMs - - * python-tempest: this package contains the tempest python library and is - consumed as a dependency for out of tree tempest plugins i.e. for Horizon - and Designate tempest plugins. - * python-tempestconf: It provides the :command:`discover-tempest-config` - utility through which we can generate tempest config. - * openstack-tempest: this package contains a set of integration tests to be - run against a live OpenStack cluster and required executables for running - tempest. Packages `python-tempest` and `python-tempestconf` mentioned above - are dependencies of `openstack-tempest` package. - * openstack-tempest-all: It will install openstack-tempest as well as all - the tempest plugins on the system. - -* Test Runners: - - * python-stestr: It is a parallel python test runner built around subunit. - It is used by Tempest to run tempest tests under the hood. - * python-os-testr: It is another test runner wrapped around stestr. It is - also used to run tempest tests. - -* Kolla based tempest container - - * RDO also provides Kolla based container images for Tempest. It has - openstack-tempest and all the required tempest plugins installed in it. - * Run the following command to pull the tempest container Image:: - - $ sudo docker pull docker.io/tripleomaster/centos-binary-tempest - - -Some housekeeping rules ------------------------ - -* **Always** install tempest and its dependencies from **RPM**. -* Make sure the right package with **correct version** is installed - (openstack-tempest RPM and its plugins are well tested in CI). -* **Never ever** mix pip and RPM in an openstack deployment. -* Please **read** the documentation fully before running tempest. -* openstack-tempest rpm **does not** install tempest plugins, they need to be - installed separately. -* Additional configuration for tempest plugins **may need** to be set. -* **python-tempestconf** is installed by **openstack-tempest** rpm itself. It's - not needed to install it separately. -* openstack-tempest is installed **on the undercloud**. -* Source **openstackrc file** for undercloud or overcloud when running Tempest - from undercloud. -* openstack-tempest is currently used **to validate** undercloud as well as - overcloud. -* Use Tempest **container image** to avoid installing tempest plugins on the - deployed cloud. - - -Using TripleO-QuickStart to run Tempest ---------------------------------------- - -TripleO project provides validate-tempest ansible role through which Tempest is -used to validate undercloud and overcloud. -Set your workspace and path to a config file that contains the node -configuration, the following is the default:: - - CONFIG=config/general_config/minimal.yml - WORKSPACE=/home/centos/.quickstart - -* Running tempest against overcloud:: - - $ cd - - $ bash quickstart.sh \ - --bootstrap \ - --tags all \ - --config $CONFIG \ - --working-dir $WORKSPACE/ \ - --no-clone \ - --release master-tripleo-ci \ - --extra-vars test_ping=False \ - --extra-vars run_tempest=True \ - $VIRTHOST - - The above command will run smoke tests on overcloud and use tempest rpm. - -* Running tempest against undercloud:: - - $ bash quickstart.sh \ - --bootstrap \ - --tags all \ - --config $CONFIG \ - --working-dir $WORKSPACE/ \ - --no-clone \ - --release master-tripleo-ci \ - --extra-vars test_ping=False \ - --extra-vars run_tempest=True \ - --extra-vars tempest_overcloud=False \ - --extra-vars tempest_undercloud=True \ - --extra-vars tempest_white_regex='tempest.api.(identity|compute|network|image)' \ - $VIRTHOST - - The above command will run Identity, Compute, Network and Image api tests on - undercloud. - -* Running Tempest against undercloud using containerized tempest:: - - $ bash quickstart.sh \ - --bootstrap \ - --tags all \ - --config $CONFIG \ - --working-dir $WORKSPACE/ \ - --no-clone \ - --release master-tripleo-ci \ - --extra-vars test_ping=False \ - --extra-vars run_tempest=True \ - --extra-vars tempest_overcloud=False \ - --extra-vars tempest_undercloud=True \ - --extra-vars tempest_format=container \ - --extra-vars tempest_white_regex='tempest.api.(identity|compute|network|image)' \ - $VIRTHOST - - The above command will run Identity, Compute, Network and Image api tests on - undercloud using containerized tempest. - -.. note:: - Here is the list of - `validate-tempest role variables `_ - which can be modified using extra-vars. - - -Running Tempest manually ------------------------- - -Required resources before running Tempest -+++++++++++++++++++++++++++++++++++++++++ - -The following resources are needed to be created, only if Tempest is run -manually. - -* If Tempest is run against undercloud, then source the stackrc file:: - - $ source stackrc - - $ export OS_AUTH_URL="$OS_AUTH_URL/v$OS_IDENTITY_API_VERSION" - -* If Tempest is run against overcloud, then source the overcloudrc file:: - - $ source overcloudrc - -* Create *Member* role for undercloud/overcloud, it will be used by tempest - tests:: - - $ openstack role create --or-show Member - -* Create a public network having external connectivity, will be used by tempest - tests when running tempest tests against overcloud - - * Create a public network:: - - $ openstack network create public \ - --external \ - --provider-network-type flat \ - --provider-physical-network datacentre - - * Create/Attach subnet to it:: - - $ openstack subnet create ext-subnet \ - --subnet-range 192.168.24.0/24 \ - --allocation-pool start=192.168.24.150,end=192.168.24.250 \ - --gateway 192.168.24.1 \ - --no-dhcp \ - --network public - - -Installing Tempest RPM and its plugins -++++++++++++++++++++++++++++++++++++++ - -Install openstack-tempest:: - - $ sudo yum -y install openstack-tempest - -Install tempest plugins - -* Find out what are the openstack services configured on overcloud/undercloud. -* Then install the respective plugins on undercloud using yum command. - -Getting the list of tempest rpms and tempest plugins installed on undercloud:: - - $ rpm -qa | grep tempest - - -Tempest workspace -+++++++++++++++++ - -Create a tempest workspace:: - - $ tempest init tempest_workspace - -tempest_workspace directory will be created automatically in the location where -the above command is executed. -It will create three folders within tempest_workspace directory. - -* etc - tempest configuration file tempest.conf will resides here. -* logs - tempest.log file will be here -* tempest_lock - It holds the lock for tempest workspace. -* .stestr.conf - It is used to load all the tempest tests. - -List tempest workspaces:: - - $ tempest workspace list - -The tempest workspace information is found in ~/.tempest folder. - - -Generating tempest.conf using discover-tempest-config -+++++++++++++++++++++++++++++++++++++++++++++++++++++ - -For running Tempest a tempest configuration file called ``tempest.conf`` needs -to be created. Thanks to that file Tempest knows the configuration of the -environment it will be run against and can execute the proper set of tests. - -The tempest configuration file can be generated automatically by -:command:`discover-tempest-config` binary, which is provided by -``python-tempestconf`` package installed by ``openstack-tempest`` rpm. -:command:`discover-tempest-config` queries the cloud and discovers cloud -configuration. - -.. note:: - To know more about ``python-tempestconf`` visit - `python-tempestconf's documentation. `_ - -.. note:: - Not all of the configuration may be discovered by - :command:`discover-tempest-config`, therefore the tempest.conf needs to be - rechecked for correctness or tuned so that it better suits the user's needs. - -All the below operations will be performed from undercloud. - -For undercloud -************** - -Source the stackrc file:: - - $ source stackrc - -Use :command:`discover-tempest-config` to generate ``tempest.conf`` -automatically:: - - $ cd - - $ discover-tempest-config --out etc/tempest.conf \ - --image \ - --debug \ - --create \ - auth.use_dynamic_credentials true \ - auth.tempest_roles Member \ - network-feature-enabled.port_security true \ - compute-feature-enabled.attach_encrypted_volume False \ - validation.image_ssh_user cirros \ - validation.ssh_user cirros \ - compute-feature-enabled.console_output true - - -For overcloud -************* - -Source the overcloudrc file:: - - $ source overcloudrc - -Use :command:`discover-tempest-config` to generate tempest.conf automatically:: - - $ cd - - $ discover-tempest-config --out etc/tempest.conf \ - --deployer-input ~/tempest-deployer-input.conf \ - --network-id $(openstack network show public -f value -c id) \ - --image \ - --debug \ - --remove network-feature-enabled.api_extensions=dvr \ - --create \ - auth.use_dynamic_credentials true \ - auth.tempest_roles Member \ - network-feature-enabled.port_security true \ - compute-feature-enabled.attach_encrypted_volume False \ - network.tenant_network_cidr 192.168.0.0/24 \ - compute.build_timeout 500 \ - volume-feature-enabled.api_v1 False \ - validation.image_ssh_user cirros \ - validation.ssh_user cirros \ - network.build_timeout 500 \ - volume.build_timeout 500 \ - object-storage-feature-enabled.discoverability False \ - service_available.swift False \ - compute-feature-enabled.console_output true \ - orchestration.stack_owner_role Member - -On the successful execution of above command, the tempest.conf will be get -generated in /etc/tempest.conf. - -Things to keep in mind while using discover-tempest-config -********************************************************** -* tempest.conf values may be overridden by passing [section].[key] [value] - arguments. - For example: when **compute.allow_tenant_isolation true** is passed to - :command:`discover-tempest-config` that value will be set in tempest.conf and will - override the value set by discovery. - `More about override options. `_ - -* If OpenStack was deployed using TripleO/Director, pass the deployment input - file tempest-deployer-input.conf to the :command:`discover-tempest-config` command with - ``--deployer-input`` option. The file contains some version specific values set - by the installer. More about the argument can be found in - `python-tempestconf's CLI documentation. `_ - -* ``--remove`` option can be used to remove values from tempest.conf, - for example: ``--remove network-feature-enabled.api_extensions=dvr``. - The feature is useful when some values in tempest.conf are automatically - set by the discovery, but they are not wanted to be printed to tempest.conf. - More about the feature can be found - `here `_. - - -Always save the state of resources before running tempest tests -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -In order to be able to use tempest utility to clean up resources after running -tests, it's needed to initialize the state of resources before running the -tests:: - - $ tempest cleanup --init-saved-state - -It will create **saved_state.json** file in tempest workspace containing all -the tenants and resources information present on the system under test. More -about the feature can be found in -`Tempest documentation `_. - -List tempest plugins installed on undercloud -++++++++++++++++++++++++++++++++++++++++++++ - -Since we install the required tempest plugins on undercloud, use tempest -command to find out:: - - $ tempest list-plugins - -List tempest tests -++++++++++++++++++ - -Go to tempest workspace and run the following command to get the list:: - - $ cd - $ tempest run -l - -To grep a list of specific tests like all compute tests:: - - $ tempest run -l | grep compute - -Running Tempest tests -+++++++++++++++++++++ - -**tempest run** utility is used to run tempest tests. It will use the configs -defined in tempest.conf to run tests against the targeted host. - -* For running all api/scenario tempest tests:: - - $ tempest run -r '(api|scenario)' - -* For running smoke tests for basic sanity of the deployed cloud:: - - $ tempest run --smoke - -* For running specific tempest plugin tests like: keystone_tempest_plugin tests:: - - $ tempest run --regex '(keystone_tempest_plugin)' - -* Running multiple tests:: - - $ tempest run --regex '(test_regex1 | test_regex2 | test_regex 3)' - -* Use ``--black-regex`` argument to skip specific tests:: - - $ tempest run -r '(api|scenario)' --black-regex='(keystone_tempest_plugin)' - - The above will skip all keystone_tempest_plugin tests. - -Using whitelist file for running selective tests -++++++++++++++++++++++++++++++++++++++++++++++++ - -Writing long test regex seems to be boring, let's create a simple whitelist file -and use the same with tempest run to run those specific whitelist tests. - -* Create a whitelist.txt file in tempest workspace:: - - $ touch whitelist.txt - -* Append all the all tests in a newline which we want to run in whitelist.txt - file:: - - $ cat whitelist.txt - keystone_tempest_plugin.* - # networking bgpvpn tempest tests - networking_bgpvpn_tempest.tests* - - .. note:: - Use **#** to add comments in the whitelist/blacklist file. - -* Running tempest tests present in whitelist file:: - - $ tempest run -w - - -Using blacklist file to skipping multiple tests -+++++++++++++++++++++++++++++++++++++++++++++++ - -If we want to skip multiple tests, we can blacklist file for the same. - -* Create a skip_test.txt file in tempest workspace:: - - $ touch skip_test.txt - - -* Append all the all tests in a newline which we want to skip in skip_test.txt - file:: - - $ cat whitelist.txt - keystone_tempest_plugin.* - # networking bgpvpn tempest tests - networking_bgpvpn_tempest.tests* - -* Use *-b* optuon with tempest run to skip/blacklist tests:: - - $ tempest run -w -b - -Running Tempest tests serially as well as in parallel -+++++++++++++++++++++++++++++++++++++++++++++++++++++ - -* All test methods within a TestCase are assumed to be executed serially. -* To run tempest tests serially:: - - $ tempest run --serial - -* Run the tests in parallel (this is the default):: - - $ tempest run --parallel - -* Specify the number of workers to use when running tests in parallel:: - - $ tempest run -r '(test_regex)' --concurrency - -* The default number of workers is equal to the number of CPUs on the system - under test. - -Generating HTML report of tempest tests -+++++++++++++++++++++++++++++++++++++++ - -* In order to generate tempest subunit files in v2 format, use ``--subunit`` - flag with tempest run:: - - $ tempest run -r '(test_regex)' --subunit - -* Generating html output from it:: - - $ subunit2html .stestr/ tempest.html - -* subunit2html command is provided by python-subunit rpm package. - - -Where are my tempest tests results? -+++++++++++++++++++++++++++++++++++ - -Once tempest run finishes, All the tests results are stored in subunit file -format under **.stestr** folder under tempest workspace. - -* 0,1, files contains the tempest run output. -* **failing** contains the list of failed tests with detailed api responses. -* All the tests executions api responses is logged in **tempest.log** file in - tempest workspace. - - -Status of Tempest tests after tempest run -+++++++++++++++++++++++++++++++++++++++++ - -After the execution of tempest tests, It will generate 3 status - -* **PASSED**: The test successfully run. -* **FAILED**: The test got failed due to specific reasons. -* **SKIPPED**: If a tempest tests is skipped, it will give a reason why it is - skipped. - - -Cleaning up environment after tempest run -+++++++++++++++++++++++++++++++++++++++++ -More about this feature can be found in -`Tempest documentation ` - -* Get a report of resources and tenants which got created/modified after tempest tests run:: - - $ tempest cleanup --dry-run - - It will create a dry_run.json file in tempest workspace. -* Cleaning up the environment:: - - $ tempest cleanup - -* We can force delete the tempest resources and as well as associated admin - tenants:: - - $ tempest cleanup --delete-tempest-conf-object - - -Running containerized Tempest manually --------------------------------------- -This section shows how to run Tempest from a container against overcloud or -undercloud on undercloud. The required resources for running containerized -Tempest are the same as for running the non-containerized one. -To find out which resources are needed, see -`Required resources before running Tempest`_. - -All the steps below use **stack user** as an example. You may be ssh-ed as a -different user but in that case you **have to** change all of the paths below -accordingly (instead of stack user, use your $USER) - -Prepare the tempest container -+++++++++++++++++++++++++++++ -* Change to `/home/stack` directory:: - - $ cd /home/stack - -* Download a container:: - - $ docker pull docker.io/tripleomaster/centos-binary-tempest:current-tripleo-rdo - -* Create directories which will be used for exchanging data between the host - machine and the container:: - - $ mkdir container_tempest tempest_workspace - -* We'll use container_tempest as a source of files for the container, so let's - copy there all needed files:: - - $ cp stackrc overcloudrc tempest-deployer-input.conf container_tempest - -* List available images:: - - $ docker image list - - or:: - - $ docker images - - you should see something like:: - - REPOSITORY TAG IMAGE ID CREATED SIZE - docker.io/tripleomaster/centos-binary-tempest current-tripleo-rdo 881f7ac24d8f 10 days ago 1.09 GB - - -How to execute commands within the container? -+++++++++++++++++++++++++++++++++++++++++++++ -In order to make it easier, create an alias as follows:: - - $ alias docker-tempest="docker run -i \ - -v "$(pwd)"/container_tempest:/home/stack/container_tempest \ - -v "$(pwd)"/tempest_workspace:/home/stack/tempest_workspace \ - docker.io/tripleomaster/centos-binary-tempest:current-tripleo-rdo \ - /bin/bash" - -When mounting the directories, make sure that **absolute** paths are used. - -* If you want to check available tempest plugins in the container, run:: - - $ docker-tempest -c "tempest list-plugins" - -* For getting a list of tempest related rpms installed within the tempest - container run:: - - $ docker-tempest -c "rpm -qa | grep tempest" - - -Generate tempest.conf and run tempest tests within the container -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -* Let's create a tempest script which will be later executed within the - container in order to generate tempest.conf and run tempest tests:: - - $ cat <<'EOF'>> /home/stack/container_tempest/tempest_script.sh - # Set the exit status for the command - set -e - - # if you want to run tempest against overcloud, overcloudrc file needs - # to be sourced and in case of undercloud it's stackrc - # NOTE: the files need to be copied to /home/stack/container_tempest - # directory in order to have it accessible from the container - source /home/stack/container_tempest/overcloudrc - - # Create a tempest workspace, use the shared directory so that the files - # in it are accessible from the host as well. - tempest init /home/stack/tempest_workspace - - # change directory to tempest_workspace - pushd /home/stack/tempest_workspace - - # export TEMPESTCONF environment variable for easier later usage - export TEMPESTCONF="/usr/bin/discover-tempest-config" - # Execute the discover-tempest-config in order to generate tempest.conf - # Set --out to /home/stack/tempest_workspace/tempest.conf so that the - # tempest.conf file is later accessible from host machine as well. - # Set --deployer-input to point to the tempest-deployer-input.conf - # located in the shared directory. - $TEMPESTCONF \ - --out /home/stack/tempest_workspace/etc/tempest.conf \ - --deployer-input /home/stack/container_tempest/tempest-deployer-input.conf \ - --debug \ - --create \ - object-storage.reseller_admin ResellerAdmin - - # Run for example smoke tests - tempest run --smoke - - EOF - - .. note:: - - * Apart from arguments passed to python-tempestconf showed above, any other - wanted arguments can be specified there. See - `Generating tempest.conf using discover-tempest-config`_. - * Instead of running smoke tests, other types of tests can be ran, - see `Running Tempest tests`_ section. - * `Always save the state of resources before running tempest tests`_. - * If you **already have** a `tempest.conf` file and you want to just run - tempest tests, **omit** TEMPESTCONF from the script above and replace it - with a command which copies your `tempest.conf` from `container_tempest` - directory to `tempest_workspace/etc` directory:: - - $ cp /home/stack/container_tempest/tempest.conf /home/stack/tempest_workspace/etc/tempest.conf - -* Set executable privileges to the `tempest_script.sh` script:: - - $ chmod +x container_tempest/tempest_script.sh - -* Run the tempest script from the container as follows:: - - $ docker run -i \ - -v "$(pwd)"/container_tempest:/home/stack/container_tempest \ - -v "$(pwd)"/tempest_workspace:/home/stack/tempest_workspace \ - docker.io/tripleomaster/centos-binary-tempest:current-tripleo-rdo \ - /bin/bash \ - -c 'set -e; /home/stack/container_tempest/tempest_script.sh' - -* In case you want to rerun the tempest tests, clean tempest workspace first:: - - $ sudo rm -rf /home/stack/tempest_workspace - $ mkdir /home/stack/tempest_workspace - - .. note:: - It's done with sudo because tempest in containers creates the files - as root. diff --git a/deploy-guide/source/post_deployment/tempest/tempest_plugins.rst b/deploy-guide/source/post_deployment/tempest/tempest_plugins.rst deleted file mode 100644 index f8bb96a9..00000000 --- a/deploy-guide/source/post_deployment/tempest/tempest_plugins.rst +++ /dev/null @@ -1,64 +0,0 @@ -Tempest Plugins -=============== - -Below is the detailed list of openstack services wise tempest plugins. - -* Keystone - * RPM package name: python3-keystone-tests-tempest - * Source Code: https://opendev.org/openstack/keystone-tempest-plugin - -* Neutron - * RPM package name: python3-neutron-tests-tempest - * Source Code: https://opendev.org/openstack/neutron-tempest-plugin - -* Designate - * RPM package name: python3-designate-tests-tempest - * Source Code: https://opendev.org/openstack/designate-tempest-plugin - -* Octavia - * RPM package name: python3-octavia-tests-tempest - * Source Code: https://opendev.org/openstack/octavia-tempest-plugin - -* Kuryr - * RPM package: python3-kuryr-tests-tempest - * Source Code: https://opendev.org/openstack/kuryr-tempest-plugin - -* patrole - * RPM package: python3-patrole-tests-tempest - * Source Code: https://opendev.org/openstack/patrole - -* Barbican - * RPM Package: python3-barbican-tests-tempest - * Source Code: https://opendev.org/openstack/barbican-tempest-plugin - -* nova-join - * RPM Package: python3-novajoin-tests-tempest - * Source Code: https://opendev.org/openstack/novajoin-tempest-plugin - -* zaqar - * RPM Package: python3-zaqar-tests-tempest - * Source Code: https://opendev.org/openstack/zaqar-tempest-plugin - -* Heat - * RPM Package: python3-heat-tests-tempest - * Source Code: https://opendev.org/openstack/heat-tempest-plugin - -* Mistral - * RPM package: python3-mistral-tests-tempest - * Source Code: https://opendev.org/openstack/mistral-tempest-plugin - -* Manila - * RPM Package: python3-manila-tests-tempest - * Source Code: https://opendev.org/openstack/manila-tempest-plugin - -* Telemetry - * RPM Package: python3-telemetry-tests-tempest - * Source Code: https://opendev.org/openstack/telemetry-tempest-plugin - -* Cinder - * RPM package: python3-cinder-tests-tempest - * Source Code: https://opendev.org/openstack/cinder-tempest-plugin - -* Ironic - * RPM Package: python3-ironic-tests-tempest - * Source Code: https://opendev.org/openstack/ironic-tempest-plugin diff --git a/deploy-guide/source/post_deployment/update_undercloud_ssh_keys.rst b/deploy-guide/source/post_deployment/update_undercloud_ssh_keys.rst deleted file mode 100644 index 477c335f..00000000 --- a/deploy-guide/source/post_deployment/update_undercloud_ssh_keys.rst +++ /dev/null @@ -1,41 +0,0 @@ -Updating undercloud user's ssh key -================================== - -In order to update the ssh key for the user on the undercloud, a few steps must -be done to ensure you do not lock yourself out of the overcloud nodes. When -the undercloud is installed, an ssh key is created and added to Nova running -on the undercloud for provisioning the overcloud nodes. This key is uploaded -into Nova as the `default` keypair. To view the keypair run:: - - source stackrc - openstack keypair list - -Process to rotate ssh key -^^^^^^^^^^^^^^^^^^^^^^^^^ - -The process to rotate the user key is as follows: - -1. Generate new key and do not replace the existing key. For example:: - - ssh-keygen -t rsa -N '' -f ~/new_ssh_key - -2. Copy ssh key to all existing hosts for the heat-admin user:: - - for HOST in $(openstack server list -f value -c Networks | sed -e 's/ctlplane=//'); do - ssh-copy-id -i ~/new_ssh_key heat-admin@$HOST - done - -3. Update the Undercloud's Nova default keypair:: - - openstack keypair delete default - openstack keypair create --public-key ~/new_ssh_key.pub default - -4. Backup old key and replace it with the new keys:: - - mkdir ~/.ssh/old_keys - mv ~/.ssh/id_rsa ~/.ssh/old_keys/id_rsa.backup-$(date +'%Y-%m-%d') - mv ~/.ssh/id_rsa.pub ~/.ssh/old_keys/id_rsa.pub.backup-$(date +'%Y-%m-%d') - mv ~/new_ssh_key ~/.ssh/id_rsa - mv ~/new_ssh_key.pub ~/.ssh/id_rsa.pub - -5. Remove old key from the allowed hosts on the nodes. diff --git a/deploy-guide/source/post_deployment/updating-stacks-notes.rst b/deploy-guide/source/post_deployment/updating-stacks-notes.rst deleted file mode 100644 index cfa01aea..00000000 --- a/deploy-guide/source/post_deployment/updating-stacks-notes.rst +++ /dev/null @@ -1,41 +0,0 @@ -.. _notes-for-stack-updates: - -Understanding undercloud/standalone stack updates -================================================= - -To update a service password or a secret when upgrading from a -non-containerized undercloud, you should edit ``undercloud.conf``. -Then you should use the ``openstack undercloud upgrade`` command. - -.. note:: ``undercloud.conf`` takes priority over - ``tripleo-undercloud-passwords.yaml`` only when running the undercloud - upgrade command. For the undercloud install command, you should edit - ``tripleo-undercloud-passwords.yaml`` instead. - -In order to apply changes for an existing containerized undercloud or -standalone installation, there is an important thing to remember. - -Undercloud and standalone heat installers create one-time ephemeral stacks. -Unlike the normal overcloud stacks, they cannot be updated via the regular -stack update procedure. Instead, the created heat stacks may be updated -virtually. For the most of the cases, the installer will take care of it -automatically via the `StackAction` heat parameter overrides. - -You can enforce the virtual update/create of the heat stack via -the ``--force-stack-update`` and ``--force-stack-create`` options. - -And the recommended command to apply changes for an existing containerized -undercloud installation is: - -.. code-block:: bash - - openstack undercloud install --force-stack-update - -Otherwise, start a new installation with ``--force-stack-create``. New -passwords will be generated in ``tripleo-undercloud-passwords.yaml``. - -It is better to be always explicit. - -.. note:: The console log for these operations will always have heat reporting - the STACK_CREATED status. Check the deployment logs for the actual virtual - create or update actions taken. diff --git a/deploy-guide/source/post_deployment/updating_network_configuration_post_deployment.rst b/deploy-guide/source/post_deployment/updating_network_configuration_post_deployment.rst deleted file mode 100644 index a7315abd..00000000 --- a/deploy-guide/source/post_deployment/updating_network_configuration_post_deployment.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. _update_network_configuration_post_deployment: - -Updating network configuration on the Overcloud after a deployment -================================================================== - -By default, subsequent change(s) made to network configuration templates -(bonding options, mtu, bond type, etc) are not applied on existing nodes when -the overcloud stack is updated. - -.. Warning:: Network configuration updates are disabled by default to avoid - issues that may arise from network reconfiguration. - - Network configuration updates should only be enabled when needed. - -To push an updated network configuration add ``UPDATE`` to list of actions set -in the ``NetworkDeploymentActions`` parameter. (The default is ``['CREATE']``, -to enable network configuration on stack update it must be changed to: -``['CREATE','UPDATE']``.) - -* Enable update of the network configuration for all roles by adding the - following to ``parameter_defaults`` in an environment file:: - - parameter_defaults: - NetworkDeploymentActions: ['CREATE','UPDATE'] - -* Limit the network configuration update to nodes of a specific role by using a - role-specific parameter, i.e: ``{role.name}NetworkDeploymentActions``. For - example to update the network configuration on the nodes in the Compute role, - add the following to ``parameter_defaults`` in an environment file:: - - parameter_defaults: - ComputeNetworkDeploymentActions: ['CREATE','UPDATE'] diff --git a/deploy-guide/source/post_deployment/upgrade/fast_forward_upgrade.rst b/deploy-guide/source/post_deployment/upgrade/fast_forward_upgrade.rst deleted file mode 100644 index 5cc0376f..00000000 --- a/deploy-guide/source/post_deployment/upgrade/fast_forward_upgrade.rst +++ /dev/null @@ -1,897 +0,0 @@ -.. _ffu-docs: - -Fast Forward Upgrade - Upgrading from Newton to Queens -====================================================== - -Upgrading a TripleO deployment from Newton to Queens is done by first -executing a minor update in both undercloud and overcloud, to ensure that the -system is using the latest Newton release. After that, the undercloud is -upgraded to the target version Queens. This will then be used to upgrade the -overcloud. - -.. note:: - - Before upgrading the undercloud to Queens, make sure you have created a valid - backup of the current undercloud and overcloud. The complete backup - procedure can be found on: - :doc:`undercloud backup<../backup_and_restore/00_index>` - -Undercloud FFU upgrade ----------------------- - -.. note:: - - Fast Forward Upgrade testing cannot cover all possible deployment - configurations. Before performing the Fast Forward Upgrade of the undercloud - in production, test it in a matching staging environment, and create a backup - of the undercloud in the production environment. Please refer to - :doc:`undercloud backup<../backup_and_restore/01_undercloud_backup>` - for proper documentation on undercloud backups. - -The undercloud FFU upgrade consists of 3 consecutive undercloud upgrades to -Ocata, Pike and Queens. - -Undercloud upgrade to Ocata -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: bash - - ## Install tripleo-repos - TRIPLEO_REPOS_RPM=$(curl -L --silent https://trunk.rdoproject.org/centos7/current/ | grep python2-tripleo-repos | awk -F "href" {'print $2'} | awk -F '"' {'print $2'}) - sudo yum localinstall -y https://trunk.rdoproject.org/centos7/current/${TRIPLEO_REPOS_RPM} - - ## Deploy repos via tripleo-repos - sudo tripleo-repos -b ocata current ceph - - ## Pre-upgrade stop services and update specific packages - sudo systemctl stop openstack-* neutron-* httpd - sudo yum update -y instack-undercloud openstack-puppet-modules openstack-tripleo-common python-tripleoclient - openstack undercloud upgrade - -Undercloud upgrade to Pike -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: bash - - ## Deploy repos via tripleo-repos - sudo tripleo-repos -b pike current ceph - - ## Update tripleoclient and install ceph-ansible - sudo yum -y install ceph-ansible - sudo yum -y update python-tripleoclient - openstack undercloud upgrade - -Undercloud upgrade to Queens -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. code-block:: bash - - ## Deploy repos via tripleo-repos - sudo tripleo-repos -b queens current ceph - - ## Update tripleoclient - sudo yum -y update python-tripleoclient - openstack undercloud upgrade - -Maintaining the system while the undercloud is on Queens and overcloud on Newton --------------------------------------------------------------------------------- - -After upgrading undercloud to Queens, the system is expected to be stable and -allow normal management operations of the overcloud nodes that are still on -Newton. However, to ensure that compatibility, several steps need to be -performed. - -1. You need to use the newer introspection images, because of incompatible - changes in the newer versions of ironic client. - - .. code-block:: bash - - mkdir /home/stack/images - cd /home/stack/images - wget https://images.rdoproject.org/queens/delorean/current-tripleo/ironic-python-agent.tar - tar -xvf ironic-python-agent.tar - - source /home/stack/stackrc - openstack overcloud image upload --image-path /home/stack/images/ \ - --update-existing - -2. Remember to keep the old Newton templates. When the undercloud is upgraded, - the new Queens templates are installed. The Newton templates can be used to - perform any needed configuration or management of the overcloud nodes. Be - sure that you have copied your old templates. Or if you didn't have a local - copy, clone the Newton templates under a new directory: - - .. code-block:: bash - - git clone -b stable/newton \ - https://git.opendev.org/openstack/tripleo-heat-templates tripleo-heat-templates-newton - -3. Use a new `plan-environment.yaml` file. As undercloud CLI calls have been - upgraded, they will request that file. It needs to be on - /home/stack/tripleo-heat-templates-newton, and have the following content: - - - .. code-block:: yaml - - version: 1.0 - - name: overcloud - description: > - Default Deployment plan - template: overcloud.yaml - passwords: {} - environments: - - path: overcloud-resource-registry-puppet.yaml - - Create a new docker-ha.yaml env file, based on the puppet-pacemaker one: - - .. code-block:: bash - - cp /home/stack/tripleo-heat-templates-newton/environments/puppet-pacemaker.yaml \ - /home/stack/tripleo-heat-templates-newton/environments/docker-ha.yaml - - Create an empty docker.yaml env file, replacing the one that is currently on - newton: - - .. code-block:: bash - - : > /home/stack/tripleo-heat-templates-newton/environments/docker.yaml - - After all these steps have been performed, the Queens undercloud can be used - successfully to provide and manage a Newton overcloud. - -Upgrading the overcloud from Newton to Queens ---------------------------------------------- - -.. note:: - - Generic Fast Forward Upgrade testing in the overcloud cannot cover all - possible deployment configurations. Before performing Fast Forward Upgrade - testing in the overcloud, test it in a matching staging environment, and - create a backup of the production environment (your controller nodes and your - workloads). - -The Queens upgrade workflow essentially consists of the following steps: - -#. `Prepare your environment - get container images`_, backup. - Generate any environment files you need for the upgrade such as the - references to the latest container images or commands used to switch repos. - -#. `openstack overcloud ffwd-upgrade prepare`_ $OPTS. - Run a heat stack update to generate the upgrade playbooks. - -#. `openstack overcloud ffwd-upgrade run`_. Run the ffwd upgrade tasks on all - nodes. - -#. `openstack overcloud upgrade run`_ $OPTS. - Run the upgrade on specific nodes or groups of nodes. Repeat until all nodes - are successfully upgraded. - -#. `openstack overcloud ceph-upgrade run`_ $OPTS. (optional) - Not necessary unless a TripleO managed Ceph cluster is deployed in the - overcloud; this step performs the upgrade of the Ceph cluster. - -#. `openstack overcloud ffwd-upgrade converge`_ $OPTS. - Finally run a heat stack update, unsetting any upgrade specific variables - and leaving the heat stack in a healthy state for future updates. - -.. _queens-upgrade-dev-docs: https://docs.openstack.org/tripleo-docs/latest/install/developer/upgrades/major_upgrade.html # WIP @ https://review.opendev.org/#/c/569443/ - -Prepare your environment - Get container images -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When moving from Newton to Queens, the setup will be changing from baremetal to -containers. So as a part of the upgrade the container images for the target -release should be downloaded to the Undercloud. -Please see the `openstack overcloud container image prepare` -:doc:`../../deployment/install_overcloud` for more information. - -The output of this step will be a Heat environment file that contains -references to the latest container images. You will need to pass this file -into the **upgrade prepare** command using the -e flag to include the -generated file. - -You may want to populate a local docker registry in your undercloud, to make the -deployment faster and more reliable. In that case you need to use the 8787 port, -and the ip needs to be the `local_ip` parameter from the `undercloud.conf` file. - -.. code-block:: bash - - openstack overcloud container image prepare \ - --namespace=192.0.2.1:8787/tripleoqueens --tag current-tripleo \ - --output-env-file /home/stack/container-default-parameters.yaml \ - --output-images-file overcloud_containers.yaml \ - --push-destination 192.0.2.1:8787 - -In place of the `` token should go all parameters that you used with -previous `openstack overcloud deploy` command. - -After that, upload your images. - -.. code-block:: bash - - openstack overcloud container image upload \ - --config-file /home/stack/overcloud_containers.yaml \ - -e /home/stack/container-default-parameters.yaml - -Prepare your environment - New templates -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You will also need to create an environment file to override the -`FastForwardCustomRepoScriptContent` and `FastForwardRepoType` -tripleo-heat-templates parameters, that can be used to switch the yum repos in -use by the nodes during the upgrade. -This will likely be the same commands that were used to switch repositories -on the undercloud. - -.. code-block:: yaml - - cat < init-repo.yaml - parameter_defaults: - FastForwardRepoType: custom-script - FastForwardCustomRepoScriptContent: | - set -e - case $1 in - ocata) - - ;; - pike) - - ;; - queens) - - ;; - *) - echo "unknown release $1" >&2 - exit 1 - esac - yum clean all - EOF - -The resulting init-repo.yaml will then be passed into the upgrade prepare using -the -e option. - -.. _Upgradeinitcommand: https://github.com/openstack/tripleo-heat-templates/blob/1d9629ec0b3320bcbc5a4150c8be19c6eb4096eb/puppet/role.role.j2.yaml#L468-L493 - -You will also need to create a cli_opts_params.yaml file, that will contain the -number of nodes for each role, and the flavor to be used. See that sample: - -.. code-block:: bash - - cat < cli_opts_params.yaml - parameter_defaults: - ControllerCount: 3 - ComputeCount: 1 - CephStorageCount: 1 - NtpServer: clock.redhat.com - EOF - -Prepare your environment - Adapt your templates -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Before running Fast Forward Upgrade, it is important that you ensure that the -custom templates that you are using in your deploy (Newton version), are -adapted to the syntax needed for the new stable release (Queens version). -Please check the annex in this document, and the changelogs of all the -different versions to get a detailed list of the templates that need to be -changed. - - -openstack overcloud ffwd-upgrade prepare -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. note:: - - Before running the overcloud upgrade prepare ensure you have a valid backup - of the current state, including the **undercloud** since there will be a - Heat stack update performed here. The complete backup procedure can be - found on: - :doc:`undercloud backup<../backup_and_restore/00_index>` - - -.. note:: - - After running the ffwd-upgrade prepare and until successful completion - of the ffwd-upgrade converge operation, stack updates to the deployment - Heat stack are expected to fail. That is, operations such as scaling to - add a new node or to apply any new TripleO configuration via Heat stack - update **must not** be performed on a Heat stack that has been prepared - for upgrade with the 'prepare' command. Only consider doing so after - running the converge step. See the queens-upgrade-dev-docs_ for more. - -Run **overcloud ffwd-upgrade prepare**. This command expects the full set -of environment files that were passed into the deploy command, as well as the -roles_data.yaml file used to deploy the overcloud you are about to upgrade. The -environment file should point to the file that was output by the image -prepare command you ran to get the latest container image references. - -.. note:: - - It is especially important to remember that you **must** include all - environment files that were used to deploy the overcloud that you are about - to upgrade. - -.. code-block:: bash - - openstack overcloud ffwd-upgrade prepare --templates \ - -e /home/stack/containers-default-parameters.yaml \ - \ - -e init-repo.yaml - -e cli_opts_params.yaml - -r /path/to/roles_data.yaml - - -In place of the `` token should go all parameters that you used with -previous `openstack overcloud deploy` command. - -This will begin an update on the overcloud Heat stack but without -applying any of the TripleO configuration, as explained above. Once this -`ffwd-upgrade prepare` operation has successfully completed the heat stack will -be in the UPDATE_COMPLETE state. At that point you can use `config download` to -download and inspect the configuration ansible playbooks that will be used -to deliver the upgrade in the next step: - -.. code-block:: bash - - openstack overcloud config download --config-dir SOMEDIR - # playbooks will be downloaded to SOMEDIR directory - -openstack overcloud ffwd-upgrade run -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This will execute the ffwd-upgrade initial steps in all nodes. - -.. code-block:: bash - - openstack overcloud ffwd-upgrade run --yes - -After this step, the upgrade commands can be executed in all nodes. - -openstack overcloud upgrade run -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This will run the ansible playbooks to deliver the upgrade configuration. -By default, 3 playbooks are executed: the upgrade_steps_playbook, then the -deploy_steps_playbook and finally the post_upgrade_steps_playbook. These -playbooks are invoked on those overcloud nodes specified by the ``--limit`` -parameter. - -.. code-block:: bash - - openstack overcloud upgrade run --limit Controller - - -.. note:: - - *Optionally* you can specify ``--playbook`` to manually step through the upgrade - playbooks: You need to run all three in this order and as specified below - (no path) for a full upgrade to Queens. - - -.. code-block:: bash - - openstack overcloud upgrade run --limit Controller --playbook upgrade_steps_playbook.yaml - openstack overcloud upgrade run --limit Controller --playbook deploy_steps_playbook.yaml - openstack overcloud upgrade run --limit Controller --playbook post_upgrade_steps_playbook.yaml - -After all three playbooks have been executed without error on all nodes of -the controller role the controlplane will have been fully upgraded to Queens. -At a minimum an operator should check the health of the pacemaker cluster - -.. admonition:: Stable Branch - :class: stable - - The ``--limit`` was introduced in the Stein release. In previous versions, - use ``--nodes`` or ``--roles`` parameters. - -For control plane nodes, you are expected to upgrade all nodes within a role at -the same time: pass a role name to ``--limit``. For non-control-plane nodes, -you often want to specify a single node or a list of nodes to ``--limit``. - -The controller nodes need to be the first upgraded, following by the compute -and storage ones. - -.. code-block:: bash - - [root@overcloud-controller-0 ~]# pcs status | grep -C 10 -i "error\|fail\|unmanaged" - -The operator may also want to confirm that openstack and related service -containers are all in a good state and using the image references passed -during upgrade prepare with the ``--container-registry-file`` parameter. - -.. code-block:: bash - - [root@overcloud-controller-0 ~]# docker ps -a - -.. warning:: - - When the upgrade has been applied on the Controllers, but not on the other - nodes, it is important to don't execute any operation on the overcloud. The - nova, neutron.. commands will be up at this point but users are not advised - to use them, until all the steps of Fast Forward Upgrade have been - completed, or it may drive unexpected results. - -For non controlplane nodes, such as Compute or ObjectStorage, you can use -``--limit overcloud-compute-0`` to upgrade particular nodes, or even -"compute0,compute1,compute3" for multiple nodes. Note these are again -upgraded in parallel. Also note that you can pass roles names to upgrade all -nodes in a role at the same time is preferred. - -.. code-block:: bash - - openstack overcloud upgrade run --limit overcloud-compute-0 - -Use of ``--limit`` allows the operator to upgrade some subset, perhaps just -one, compute or other non controlplane node and verify that the upgrade is -successful. One may even migrate workloads onto the newly upgraded node and -confirm there are no problems, before deciding to proceed with upgrading the -remaining nodes that are still on Newton. - -Again you can optionally step through the upgrade playbooks if you prefer. Be -sure to run upgrade_steps_playbook.yaml then deploy_steps_playbook.yaml and -finally post_upgrade_steps_playbook.yaml in that order. - -For re-run, you can specify ``--skip-tags validation`` to skip those step 0 -ansible tasks that check if services are running, in case you can't or -don't want to start them all. - -.. code-block:: bash - - openstack overcloud upgrade run --limit Controller --skip-tags validation - -openstack overcloud ceph-upgrade run -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This step is only necessary if Ceph was deployed in the Overcloud. It triggers -an upgrade of the Ceph cluster which will be performed without taking down -the cluster. - - .. note:: - - It is especially important to remember that you **must** include all - environment files that were used to deploy the overcloud that you are about - to upgrade. - - .. code-block:: bash - - openstack overcloud ceph-upgrade run --templates \ - --container-registry-file /home/stack/containers-default-parameters.yaml \ - -r /path/to/roles_data.yaml - -In place of the `` token should go all parameters that you used with -previous `openstack overcloud deploy` command. - -At the end of the process, Ceph will be upgraded from Jewel to Luminous so -there will be new containers for the `ceph-mgr` service running on the -controlplane node. - -openstack overcloud ffwd-upgrade converge -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Finally, run the converge heat stack update. This will re-apply all Queens -configuration across all nodes and unset all variables that were used during -the upgrade. Until you have successfully completed this step, heat stack -updates against the overcloud stack are expected to fail. You can read more -about why this is the case in the queens-upgrade-dev-docs_. - -.. note:: - - It is especially important to remember that you **must** include all - environment files that were used to deploy the overcloud that you are about - to upgrade converge, including the list of Queens container image references - and the roles_data.yaml roles and services definition. You should omit - any repo switch commands and ensure that none of the environment files - you are about to use is specifying a value for UpgradeInitCommand. - -.. note:: - - The Queens container image references that were passed into the - `openstack overcloud ffwd-upgrade prepare`_ with the - ``--container-registry-file`` parameter **must** be included as an - environment file, with the -e option to the openstack overcloud - ffwd-upgrade run command, together with all other environment files - for your deployment. - -.. code-block:: bash - - openstack overcloud ffwd-upgrade converge --templates - -e /home/stack/containers-default-parameters.yaml \ - -e cli_opts_params.yaml \ - -r /path/to/roles_data.yaml - - -In place of the `` token should go all parameters that you used with -previous `openstack overcloud deploy` command. - -The Heat stack will be in the **UPDATE_IN_PROGRESS** state for the duration of -the openstack overcloud upgrade converge. Once converge has completed -successfully the Heat stack should also be in the **UPDATE_COMPLETE** state. - -Annex: Template changes needed from Newton to Queens ----------------------------------------------------- -In order to reuse the Newton templates when the cloud has been upgraded to -Queens, several changes are needed. Those changes need to be done before -starting Fast Forward Upgrade on the overcloud. - -Following there is a list of all the changes needed: - - -1. Remove those deprecated services from your custom roles_data.yaml file: - -* OS::TripleO::Services::Core -* OS::TripleO::Services::GlanceRegistry -* OS::TripleO::Services::VipHosts - - -2. Add the following new services to your custom roles_data.yaml file: - -* OS::TripleO::Services::MySQLClient -* OS::TripleO::Services::NovaPlacement -* OS::TripleO::Services::PankoApi -* OS::TripleO::Services::Sshd -* OS::TripleO::Services::CertmongerUser -* OS::TripleO::Services::Docker -* OS::TripleO::Services::MySQLClient -* OS::TripleO::Services::ContainersLogrotateCrond -* OS::TripleO::Services::Securetty -* OS::TripleO::Services::Tuned -* OS::TripleO::Services::Clustercheck (just required on roles that also uses - OS::TripleO::Services::MySQL) -* OS::TripleO::Services::Iscsid (to configure iscsid on Controller, Compute - and BlockStorage roles) -* OS::TripleO::Services::NovaMigrationTarget (to configure migration on - Compute roles) - - -3. Update any additional parts of the overcloud that might require these new - services such as: - -* Custom ServiceNetMap parameter - ensure to include the latest - ServiceNetMap for the new services. You can locate in - network/service_net_map.j2.yaml file -* External Load Balancer - if using an external load balancer, include - these new services as a part of the external load balancer configuration - - -4. A new feature for composable networks was introduced on Pike. If using a - custom roles_data file, edit the file to add the composable networks to each - role. For example, for Controller nodes: - - :: - - - name: Controller - networks: - - External - - InternalApi - - Storage - - StorageMgmt - - Tenant - - Check the default networks on roles_data.yaml for further examples of syntax. - - -5. The following parameters are deprecated and have been replaced with - role-specific parameters: - -* from controllerExtraConfig to ControllerExtraConfig -* from OvercloudControlFlavor to OvercloudControllerFlavor -* from controllerImage to ControllerImage -* from NovaImage to ComputeImage -* from NovaComputeExtraConfig to ComputeExtraConfig -* from NovaComputeServerMetadata to ComputeServerMetadata -* from NovaComputeSchedulerHints to ComputeSchedulerHints -* from NovaComputeIPs to ComputeIPs -* from SwiftStorageServerMetadata to ObjectStorageServerMetadata -* from SwiftStorageIPs to ObjectStorageIPs -* from SwiftStorageImage to ObjectStorageImage -* from OvercloudSwiftStorageFlavor to OvercloudObjectStorageFlavor - - -6. Some composable services include new parameters that configure Puppet - hieradata. If you used hieradata to configure these parameters in the past, - the overcloud update might report a Duplicate declaration error. - If this situation, use the composable service parameter. - For example, instead of the following: - - :: - - parameter_defaults: - controllerExtraConfig: - heat::config::heat_config: - DEFAULT/num_engine_workers: - value: 1 - - Use the following: - - :: - - parameter_defaults: - HeatWorkers: 1 - - -7. In your resource_registry, check that you are using the containerized - services from the deployment subdirectory of your core Heat template - collection. For example: - - :: - - resource_registry: - OS::TripleO::Services::CephMon: ../deployment/ceph-ansible/ceph-mon.yaml - OS::TripleO::Services::CephOSD: ../deployment/ceph-ansible/ceph-osd.yaml - OS::TripleO::Services::CephClient: ../deployment/ceph-ansible/ceph-client.yaml - - -8. When upgrading to Queens, if Ceph has been deployed in the Overcloud, then - use the `ceph-ansible.yaml` environment file **instead of** - `storage-environment.yaml`. Make sure to move any customization into - `ceph-ansible.yaml` (or a copy of ceph-ansible.yaml) - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/docker.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-composable-steps-docker.yaml \ - -e overcloud-repos.yaml - - Customizations for the Ceph deployment previously passed as hieradata via - \*ExtraConfig should be removed as they are ignored, specifically the - deployment will stop if ``ceph::profile::params::osds`` is found to - ensure the devices list has been migrated to the format expected by - ceph-ansible. It is possible to use the ``CephAnsibleExtraConfig`` and - `CephAnsibleDisksConfig`` parameters to pass arbitrary variables to - ceph-ansible, like ``devices`` and ``dedicated_devices``. - - The other parameters (for example ``CinderRbdPoolName``, - ``CephClientUserName``, ...) will behave as they used to with puppet-ceph - with the only exception of ``CephPools``. This can be used to create - additional pools in the Ceph cluster but the two tools expect the list - to be in a different format. Specifically while puppet-ceph expected it - in this format:: - - { - "mypool": { - "size": 1, - "pg_num": 32, - "pgp_num": 32 - } - } - - with ceph-ansible that would become:: - - [{"name": "mypool", "pg_num": 32, "rule_name": ""}] - -9. If using custom nic-configs, the format has changed, and it is using an - script to generate the entries now. So you will need to convert your old - syntax from: - - :: - - resources: - OsNetConfigImpl: - properties: - config: - os_net_config: - network_config: - - type: interface - name: nic1 - mtu: 1350 - use_dhcp: false - addresses: - - ip_netmask: - list_join: - - / - - - {get_param: ControlPlaneIp} - - {get_param: ControlPlaneSubnetCidr} - routes: - - ip_netmask: 169.254.169.254/32 - next_hop: {get_param: EC2MetadataIp} - - type: ovs_bridge - name: br-ex - dns_servers: {get_param: DnsServers} - use_dhcp: false - addresses: - - ip_netmask: {get_param: ExternalIpSubnet} - routes: - - ip_netmask: 0.0.0.0/0 - next_hop: {get_param: ExternalInterfaceDefaultRoute} - members: - - type: interface - name: nic2 - mtu: 1350 - primary: true - - type: interface - name: nic3 - mtu: 1350 - use_dhcp: false - addresses: - - ip_netmask: {get_param: InternalApiIpSubnet} - - type: interface - name: nic4 - mtu: 1350 - use_dhcp: false - addresses: - - ip_netmask: {get_param: StorageIpSubnet} - - type: interface - name: nic5 - mtu: 1350 - use_dhcp: false - addresses: - - ip_netmask: {get_param: StorageMgmtIpSubnet} - - type: ovs_bridge - name: br-tenant - dns_servers: {get_param: DnsServers} - use_dhcp: false - addresses: - - ip_netmask: {get_param: TenantIpSubnet} - members: - - type: interface - name: nic6 - mtu: 1350 - primary: true - group: os-apply-config - type: OS::Heat::StructuredConfig - - - To - - :: - - resources: - OsNetConfigImpl: - type: OS::Heat::SoftwareConfig - properties: - group: script - config: - str_replace: - template: - get_file: ../../../../../network/scripts/run-os-net-config.sh - params: - $network_config: - network_config: - - type: interface - name: nic1 - mtu: 1350 - use_dhcp: false - addresses: - - ip_netmask: - list_join: - - / - - - {get_param: ControlPlaneIp} - - {get_param: ControlPlaneSubnetCidr} - routes: - - ip_netmask: 169.254.169.254/32 - next_hop: {get_param: EC2MetadataIp} - - type: ovs_bridge - name: br-ex - dns_servers: {get_param: DnsServers} - use_dhcp: false - addresses: - - ip_netmask: {get_param: ExternalIpSubnet} - routes: - - ip_netmask: 0.0.0.0/0 - next_hop: {get_param: ExternalInterfaceDefaultRoute} - members: - - type: interface - name: nic2 - mtu: 1350 - primary: true - - type: interface - name: nic3 - mtu: 1350 - use_dhcp: false - addresses: - - ip_netmask: {get_param: InternalApiIpSubnet} - - type: interface - name: nic4 - mtu: 1350 - use_dhcp: false - addresses: - - ip_netmask: {get_param: StorageIpSubnet} - - type: interface - name: nic5 - mtu: 1350 - use_dhcp: false - addresses: - - ip_netmask: {get_param: StorageMgmtIpSubnet} - - type: ovs_bridge - name: br-tenant - dns_servers: {get_param: DnsServers} - use_dhcp: false - addresses: - - ip_netmask: {get_param: TenantIpSubnet} - members: - - type: interface - name: nic6 - mtu: 1350 - primary: true - - -10. If using a modified version of the core Heat template collection from - Newton, you need to re-apply your customizations to a copy of the Queens - version. To do this, use a git version control system or similar tooling - to compare. - - -Annex: NFV template changes needed from Newton to Queens --------------------------------------------------------- -Following there is a list of general changes needed into NFV context: - -1. Fixed VIP addresses for overcloud networks use new parameters as syntax: - - :: - - parameter_defaults: - ... - # Predictable VIPs - ControlFixedIPs: [{'ip_address':'192.168.201.101'}] - InternalApiVirtualFixedIPs: [{'ip_address':'172.16.0.9'}] - PublicVirtualFixedIPs: [{'ip_address':'10.1.1.9'}] - StorageVirtualFixedIPs: [{'ip_address':'172.18.0.9'}] - StorageMgmtVirtualFixedIPs: [{'ip_address':'172.19.0.9'}] - RedisVirtualFixedIPs: [{'ip_address':'172.16.0.8'}] - - -For DPDK environments: - -1. Modify HostCpuList and NeutronDpdkCoreList to match your configuration. - Ensure that you use only double quotation marks in the yaml file for these - parameters: - - :: - - HostCpusList: "0,16,8,24" - NeutronDpdkCoreList: "1,17,9,25" - -2. Modify NeutronDpdkSocketMemory to match your configuration. Ensure that you - use only double quotation marks in the yaml file for this parameter: - - :: - - NeutronDpdkSocketMemory: "2048,2048" - -3. Modify NeutronVhostuserSocketDir as follows: - - :: - - NeutronVhostuserSocketDir: "/var/lib/vhost_sockets" - -4. Modify VhostuserSocketGroup as follows, mapping to the right compute role: - - :: - - parameter_defaults: - Parameters: - VhostuserSocketGroup: "hugetlbfs" - -5. In the parameter_defaults section, add a network deployment parameter to run - os-net-config during the upgrade process to associate OVS PCI address with - DPDK ports: - - :: - - parameter_defaults: - ComputeNetworkDeploymentActions: ['CREATE', 'UPDATE'] - - The parameter name must match the name of the role you use to deploy DPDK. - In this example, the role name is Compute so the parameter name is - ComputeNetworkDeploymentActions. - -6. In the resource_registry section, override the - ComputeNeutronOvsDpdk service to the neutron-ovs-dpdk-agent docker service: - - :: - - resource_registry: - OS::TripleO::Services::ComputeNeutronOvsDpdk: ../deployment/neutron/neutron-ovs-dpdk-agent-container-puppet.yaml - -For SR-IOV environments: - -1. In the resource registry section, override the NeutronSriovAgent service - to the neutron-sriov-agent docker service: - - :: - - resource_registry: - OS::TripleO::Services::NeutronSriovAgent: ../deployment/neutron/neutron-sriov-agent-container-puppet.yaml diff --git a/deploy-guide/source/post_deployment/upgrade/index.rst b/deploy-guide/source/post_deployment/upgrade/index.rst deleted file mode 100644 index b83d0dd7..00000000 --- a/deploy-guide/source/post_deployment/upgrade/index.rst +++ /dev/null @@ -1,12 +0,0 @@ -Upgrades -======== - -This section describes upgrade related items. - -.. toctree:: - :maxdepth: 1 - - minor_update - undercloud - major_upgrade - fast_forward_upgrade diff --git a/deploy-guide/source/post_deployment/upgrade/major_upgrade.rst b/deploy-guide/source/post_deployment/upgrade/major_upgrade.rst deleted file mode 100644 index 56d515a0..00000000 --- a/deploy-guide/source/post_deployment/upgrade/major_upgrade.rst +++ /dev/null @@ -1,913 +0,0 @@ -Upgrading to a Next Major Release -================================= - -Upgrading a TripleO deployment to the next major release is done by first -upgrading the undercloud and using it to upgrade the overcloud. - -Note that there are version specific caveats and notes which are pointed out -as below: - -.. note:: - - You can use the "Limit Environment Specific Content" in the left hand nav - bar to restrict content to the upgrade you are performing. - -.. note:: - - Generic upgrade testing cannot cover all possible deployment - configurations. Before performing the upgrade in production, test - it in a matching staging environment, and create a backup of the - production environment. - -.. Undercloud upgrade section -.. include:: undercloud.rst - -Upgrading the Overcloud to Queens and later -------------------------------------------- - -The overcloud upgrade workflow is mainly delivered through the -`openstack overcloud upgrade` command, in particular one of its -subcommands: **prepare**, **run** and **converge**. Each subcommand -has its own set of options which you can explore with ``--help``: - -.. code-block:: bash - - source /home/stack/stackrc - openstack overcloud upgrade run --help - -The upgrade workflow essentially consists of the following steps: - -#. `Prepare your environment files`_. - Generate any environment files you need for the upgrade such as the - references to the latest container images or commands used to - switch repos. - -#. `openstack overcloud upgrade prepare`_. - Run a heat stack update to generate the upgrade playbooks. - -#. `openstack overcloud external-upgrade run (for container images)`_. - Generate any environment files you need for the upgrade such as the - references to the latest container images or commands used to switch repos. - -#. `openstack overcloud upgrade run`_. - Run the upgrade on specific nodes or groups of nodes. Repeat until all nodes - are successfully upgraded. - -#. `openstack overcloud external-upgrade run (for services)`_. (optional) - This step is only necessary if your deployment contains services - which are managed using external installers, e.g. Ceph. - -#. `openstack overcloud external-upgrade run (for online upgrades)`_ - Run the part of service upgrades which can run while the cloud is - fully operational, e.g. online data migrations. - -#. `openstack overcloud upgrade converge`_. - Finally run a heat stack update, unsetting any upgrade specific variables - and leaving the heat stack in a healthy state for future updates. - -Detailed information and pointers can be found in the relevant the -queens-upgrade-dev-docs_. - -.. _queens-upgrade-dev-docs: https://docs.openstack.org/tripleo-docs/latest/install/developer/upgrades/major_upgrade.html # WIP @ https://review.opendev.org/#/c/569443/ - -Prepare your environment files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -First we prepare an environment file for new container images: - -.. admonition:: Pike to Queens - :class: ptoq - - As part of the upgrade to Queens, the container images for the - target release should be downloaded to the Undercloud. Please see - the `openstack overcloud container image prepare`. - :doc:`../../deployment/install_overcloud` for more information. - - The output of this step will be a Heat environment file that contains - references to the latest container images. You will need to pass the path to - this file into the **upgrade prepare** command using the -e option as you would - any other environment file. - -.. admonition:: Queens to Rocky - :class: qtor - - In Rocky we only generate a new environment file with - ``ContainerImagePrepare`` parameter at this point in the workflow. See - :doc:`container image preparation documentation<../../deployment/container_image_prepare>`. - for details how to generate this environment file. - - The file is then passed to the `upgrade prepare` command, and - images will be uploaded to the local registry in a separate - `external-upgrade run` step afterwards. - -You will also need to create an environment file to override the -UpgradeInitCommand_ tripleo-heat-templates parameter, that can be used to -switch the yum repos in use by the nodes during the upgrade. This will likely -be the same commands that were used to switch repositories on the undercloud. - -.. code-block:: bash - - cat < init-repo.yaml - parameter_defaults: - UpgradeInitCommand: | - set -e - # -- REPLACE LINES WITH YOUR REPO SWITCH COMMANDS -- - curl -L -o /etc/yum.repos.d/delorean.repo https://trunk.rdoproject.org/centos7-queens/current/delorean.repo - curl -L -o /etc/yum.repos.d/delorean-deps.repo https://trunk.rdoproject.org/centos7-queens/delorean-deps.repo - yum clean all - EOF - -The resulting init-repo.yaml will then be passed into the upgrade prepare using -the -e option. - -.. _Upgradeinitcommand: https://github.com/openstack/tripleo-heat-templates/blob/1d9629ec0b3320bcbc5a4150c8be19c6eb4096eb/puppet/role.role.j2.yaml#L468-L493 - -openstack overcloud upgrade prepare -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. note:: - - Before running the overcloud upgrade prepare ensure you have a valid backup - of the current state, including the **undercloud** since there will be a - Heat stack update performed here. - -.. note:: - - If you have enabled neutron_DVR_ in your deployment you must ensure that - compute nodes are connected to the External network via the - roles_data.yaml that you will pass using the -r parameter to upgrade prepare. - This is necessary to allow floating IP connectivity via the external api network. - -.. note:: - - After running the upgrade prepare and until successful completion - of the upgrade converge operation, stack updates to the deployment Heat - stack are expected to fail. That is, operations such as scaling to add - a new node or to apply any new TripleO configuration via Heat stack - update **must not** be performed on a Heat stack that has been prepared - for upgrade with the 'prepare' command and only consider doing so after - running the converge step. See the queens-upgrade-dev-docs_ for more. - -Run **overcloud upgrade prepare**. This command expects the full set -of environment files that were passed into the deploy command, as well -as the roles_data.yaml and network_data.yaml, if you've customized -those. Be sure to include environment files with the new container -image parameter and Yum repository switch parameter. - -.. note:: - - It is especially important to remember that you **must** include all - environment files that were used to deploy the overcloud including the - container image references file for the target version container images - -.. code-block:: bash - - openstack overcloud upgrade prepare --templates \ - -r /path/to/roles_data.yaml \ - -n /path/to/network_data.yaml \ - -e \ - -e init-repo.yaml \ - -e containers-prepare-parameter.yaml - -This will begin an update on the overcloud Heat stack but without -applying any of the TripleO configuration. Once this `upgrade prepare` -operation has successfully completed the heat stack will be in the -UPDATE_COMPLETE state. At that point you can use `config download` to -download and inspect the configuration ansible playbooks that will be -used to deliver the upgrade in the next step: - -.. code-block:: bash - - openstack overcloud config download --config-dir SOMEDIR - # playbooks will be downloaded to SOMEDIR directory - -.. _neutron_DVR: https://specs.openstack.org/openstack/neutron-specs/specs/juno/neutron-ovs-dvr.html - - -openstack overcloud external-upgrade run (for container images) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. admonition:: Rocky - :class: qtor - - In Rocky and beyond, container images will need to be uploaded to - the local registry after we've run `upgrade prepare`. Run: - - .. code-block:: bash - - openstack overcloud external-update run --tags container_image_prepare - -.. _openstack-overcloud-upgrade-run: - -openstack overcloud upgrade run -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The `upgrade run` command runs the Ansible playbooks to deliver the upgrade configuration. -By default, 3 playbooks are executed: the upgrade_steps_playbook, then the -deploy_steps_playbook and finally the post_upgrade_steps_playbook. These -playbooks are invoked on those overcloud nodes specified by the ``--limit`` -parameter. - -.. code-block:: bash - - openstack overcloud upgrade run --limit Controller - -**Optionally** specify ``--playbook`` to manually step through the upgrade -playbooks: You need to run all three in this order and as specified below -(no path) for a full upgrade. - -.. code-block:: bash - - openstack overcloud upgrade run --limit Controller --playbook upgrade_steps_playbook.yaml - openstack overcloud upgrade run --limit Controller --playbook deploy_steps_playbook.yaml - openstack overcloud upgrade run --limit Controller --playbook post_upgrade_steps_playbook.yaml - -After all three playbooks have been executed without error on all nodes of -the controller role the controlplane will have been fully upgraded to Queens. -At a minimum an operator should check the health of the pacemaker cluster. - -.. code-block:: bash - - [root@overcloud-controller-0 ~]# pcs status | grep -C 10 -i "error\|fail" - -The operator may also want to confirm that openstack and related service -containers are all in a good state and using the target version (new) images -passed during upgrade prepare. - -.. code-block:: bash - - [root@overcloud-controller-0 ~]# docker ps -a - -For non controlplane nodes, such as Compute or ObjectStorage, you can use -``--limit overcloud-compute-0`` to upgrade particular nodes, or even -"compute0,compute1,compute3" for multiple nodes. Note these are again -upgraded in parallel. Also note that you can pass roles names to upgrade all -nodes in a role at the same time is preferred. - -.. code-block:: bash - - openstack overcloud upgrade run --limit overcloud-compute-0 - -Use of ``--limit`` allows the operator to upgrade some subset, perhaps just one, -compute or other non controlplane node and verify that the upgrade is -successful. One may even migrate workloads onto the newly upgraded node and -confirm there are no problems, before deciding to proceed with upgrading the -remaining nodes. - -For re-run, you can specify ``--skip-tags`` validation to skip those step 0 -ansible tasks that check if services are running, in case you can't or -don't want to start them all. - -.. code-block:: bash - - openstack overcloud upgrade run --limit Controller --skip-tags validation - -.. admonition:: Stable Branch - :class: stable - - The --limit was introduced in the Stein release. In previous versions, use - --nodes or --roles parameters. - -openstack overcloud external-upgrade run (for services) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This step is only necessary a service using an external installer was -deployed in the Overcloud. Most typically this is the case of -overclouds with Ceph. - -.. admonition:: Pike to Queens - :class: ptoq - - Among the services with external installers, only upgrade of Ceph - is supported in the Queens release cycle. It has a specific - `ceph-upgrade` command. Run it as follows: - - .. note:: - - It is especially important to remember that you **must** include all - environment files that were used to deploy the overcloud. - - .. code-block:: bash - - openstack overcloud ceph-upgrade run --templates \ - -r /path/to/roles_data.yaml \ - -n /path/to/network_data.yaml \ - -e \ - -e containers-prepare-parameter.yaml - -.. admonition:: Queens to Rocky - :class: qtor - - More services with external installers can be upgraded to - Rocky. The `external-upgrade run` command accepts a ``--tags`` - parameter which allows to limit the scope of the upgrade to - particular services. It is recommended to always use this - parameter for accurately scoping the upgrade. - - For example, to upgrade Ceph, run the following command: - - .. code-block:: bash - - openstack overcloud external-upgrade run --tags ceph - - .. note:: - - The `external-upgrade run` command does not update the Heat - stack, and as such it does not accept any environment files as - parameters. It uses playbooks generated during `upgrade - prepare`. - -openstack overcloud external-upgrade run (for online upgrades) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. admonition:: Queens to Rocky - :class: qtor - - The offline (downtime inducing) part of upgrade has finished at this - point, and the cloud should be fully operational. Some services have - an online component to their upgrade procedure -- operations which - don't induce downtime and can run while the cloud operates - normally. For OpenStack services these are e.g. online data - migrations. Run all these online upgrade operations by executing the - following command: - - .. code-block:: bash - - openstack overcloud external-upgrade run --tags online_upgrade - - .. note:: - - If desired, the online upgrades can be run per-service. E.g. to run - only Nova online data migrations, execute: - - .. code-block:: bash - - openstack overcloud external-upgrade run --tags online_upgrade_nova - - However, when executing online upgrades in selective parts like - this, extra care must be taken to not miss any necessary online - upgrade operations. - -openstack overcloud upgrade converge -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Finally, run the upgrade converge step. This will re-apply all -configuration across all nodes and unset all variables that were used -during the upgrade. Successful completion of this step is required to -assert that the overcloud state is in sync with the latest TripleO -Heat templates, which is a prerequisite for any further overcloud -management (e.g. scaling). - -.. note:: - - It is especially important to remember that you **must** include - all environment files that were used to deploy the overcloud, - including the new container image parameter file. You should - omit any repo switch commands and ensure that none of the - environment files you are about to use is specifying a value for - UpgradeInitCommand. - -.. code-block:: bash - - openstack overcloud upgrade converge --templates - -r /path/to/roles_data.yaml \ - -n /path/to/network_data.yaml \ - -e \ - -e containers-prepare-parameter.yaml - -Successful completion of the `upgrade converge` command concludes the -major version upgrade. - -Upgrading the Overcloud to Ocata or Pike ----------------------------------------- - -As of the Ocata release, the upgrades workflow in tripleo has changed -significantly to accommodate the operators' new ability to deploy custom roles -with the Newton release (see the Composable Service Upgrade spec_ for more -info). The new workflow uses ansible upgrades tasks to define the upgrades -workflow on a per-service level. The Pike release upgrade uses a similar -mechanism and the steps are invoked with the same cli. A big difference however -is that after upgrading to Pike most of the overcloud services will be running -in containers. - -.. note:: - - Upgrades to Pike and further will only be tested with containers. Baremetal - deployments, which don't use containers, will be deprecated in Queens and - have full support removed in Rocky. - -The operator starts the upgrade with a ``openstack overcloud deploy`` that -includes the major-upgrade-composable-steps.yaml_ environment file (or the -docker variant for the `containerized upgrade to Pike`__) -as well as all environment files used on the initial deployment. This will -collect the ansible upgrade tasks for all roles, except those that have the -``disable_upgrade_deployment`` flag set ``True`` in roles_data.yaml_. The -tasks will be executed in a series of steps, for example (and not limited to): -step 0 for validations or other pre-upgrade tasks, step 1 to stop the -pacemaker cluster, step 2 to stop services, step 3 for package updates, -step 4 for cluster startup, step 5 for any special case db syncs or post -package update migrations. The Pike upgrade tasks are in general much simpler -than those used in Ocata since for Pike these tasks are mainly for stopping -and disabling the systemd services, since they will be containerized as part -of the upgrade. - -After the ansible tasks have run the puppet (or docker, for Pike containers) -configuration is also applied in the 'normal' manner we do on an initial -deploy, to complete the upgrade and bring services back up, or start the -service containers, as the case may be for Ocata or Pike. - -For those roles with the ``disable_upgrade_deployment`` flag set True, the -operator will upgrade the corresponding nodes with the -upgrade-non-controller.sh_. The operator uses that script to invoke the -tripleo_upgrade_node.sh_ which is delivered during the -major-upgrade-composable-steps that come first, as described above. - -#. Run the major upgrade composable ansible steps - - This step will upgrade the nodes of all roles that do not explicitly set the - ``disable_upgrade_deployment`` flag to ``True`` in the roles_data.yaml_ - (this is an operator decision, and the current default is for the **Compute** - and **ObjectStorage** roles to have this set). - - The ansible upgrades tasks are collected from all service manifests_ and - executed in a series of steps as described in the introduction above. - Even before the invocation of these ansible tasks however, this upgrade - step also delivers the tripleo_upgrade_node.sh_ and role specific puppet - manifest to allow the operator to upgrade those nodes after this step has - completed. - - From Ocata to Pike, the Overcloud will be upgraded to a containerized - environment. All OpenStack related services will run in containers. - - If you deploy TripleO with custom roles, you want to synchronize them with - `roles_data.yaml` visible in default roles and make sure parameters and new - services are present in your roles. - - .. admonition:: Newton - :class: newton - - Newton roles_data.yaml is available here: - https://github.com/openstack/tripleo-heat-templates/blob/stable/newton/roles_data.yaml - - .. admonition:: Ocata - :class: ocata - - Ocata roles_data.yaml is available here: - https://github.com/openstack/tripleo-heat-templates/blob/stable/ocata/roles_data.yaml - - .. admonition:: Pike - :class: pike - - Pike roles_data.yaml is available here: - https://github.com/openstack/tripleo-heat-templates/blob/stable/pike/roles_data.yaml - - .. admonition:: Queens - :class: queens - - Queens roles_data.yaml is available here: - https://github.com/openstack/tripleo-heat-templates/blob/stable/queens/roles_data.yaml - - - Create an environment file with commands to switch OpenStack repositories to - a new release. This will likely be the same commands that were used to switch - repositories on the undercloud - - .. code-block:: bash - - cat > overcloud-repos.yaml < \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-composable-steps.yaml \ - -e overcloud-repos.yaml - - .. note:: - - Before upgrading your deployment to containers, you must perform the - actions mentioned here to prepare your environment. In particular - *image prepare* to generate the docker registry which you must include - as one of the environment files specified below: - * :doc:`../../deployment/install_overcloud` - - .. __: - - Run `overcloud deploy`, passing in full set of environment - files plus `major-upgrade-composable-steps-docker.yaml` and - `overcloud-repos.yaml` (and docker registry if upgrading to containers) - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/docker.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-composable-steps-docker.yaml \ - -e overcloud-repos.yaml - - .. note:: - - It is especially important to remember that you **must** include all - environment files that were used to deploy the overcloud that you are about - to upgrade. - - .. note:: - - If the Overcloud has been deployed with Pacemaker, then add the - `docker-ha.yaml` environment file to the upgrade command - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/docker.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/docker-ha.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-composable-steps-docker.yaml \ - -e overcloud-repos.yaml - - .. admonition:: Ceph - :class: ceph - - When upgrading to Pike, if Ceph has been deployed in the Overcloud, then - use the `ceph-ansible.yaml` environment file **instead of** - `storage-environment.yaml`. Make sure to move any customization into - `ceph-ansible.yaml` (or a copy of ceph-ansible.yaml) - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/docker.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/ceph-ansible/ceph-ansible.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-composable-steps-docker.yaml \ - -e overcloud-repos.yaml - - Customizations for the Ceph deployment previously passed as hieradata - via \*ExtraConfig should be removed as they are ignored, specifically - the deployment will stop if ``ceph::profile::params::osds`` is found to - ensure the devices list has been migrated to the format expected by - ceph-ansible. It is possible to use the ``CephAnsibleExtraConfig`` and - ``CephAnsibleDisksConfig`` parameters to pass arbitrary variables to - ceph-ansible, like ``devices`` and ``dedicated_devices``. - - The other parameters (for example ``CinderRbdPoolName``, - ``CephClientUserName``, ...) will behave as they used to with puppet-ceph - with the only exception of ``CephPools``. This can be used to create - additional pools in the Ceph cluster but the two tools expect the list - to be in a different format. Specifically while puppet-ceph expected it - in this format:: - - { - "mypool": { - "size": 1, - "pg_num": 32, - "pgp_num": 32 - } - } - - with ceph-ansible that would become:: - - [{"name": "mypool", "pg_num": 32, "rule_name": ""}] - - .. note:: - - The first step of the ansible tasks is to validate that the deployment is - in a good state before performing any other upgrade operations. Each - service manifest in the tripleo-heat-templates includes a check that it is - running and if any of those checks fail the upgrade will exit early at - ansible step 0. - - If you are re-running the upgrade after an initial failed attempt, you may - need to disable these checks in order to allow the upgrade to proceed with - services down. This is done with the SkipUpgradeConfigTags parameter to - specify that tasks with the 'validation' tag should be skipped. You can - include this in any of the environment files you are using:: - - SkipUpgradeConfigTags: [validation] - -#. Upgrade remaining nodes for roles with ``disable_upgrade_deployment: True`` - - It is expected that the operator will want to upgrade the roles that have the - ``openstack-nova-compute`` and ``openstack-swift-object`` services deployed - to allow for pre-upgrade migration of workloads. For this reason the default - ``Compute`` and ``ObjectStorage`` roles in the roles_data.yaml_ have the - ``disable_upgrade_deployment`` set ``True``. - - Note that unlike in previous releases, this operator driven upgrade step - includes a full puppet configuration run as happens after the ansible - steps on the roles those are executed on. The significance is that nodes - are 'fully' upgraded after each step completes, rather than having to wait - for the final converge step as has previously been the case. In the case of - Ocata to Pike the full puppet/docker config is applied to bring up the - overcloud services in containers. - - The tripleo_upgrade_node.sh_ script and puppet configuration are delivered to - the nodes with ``disable_upgrade_deployment`` set ``True`` during the initial - major upgrade composable steps in step 1 above. - - For Ocata to Pike, the tripleo_upgrade_node.sh_ is still delivered to the - ``disable_upgrade_deployment`` nodes but is now empty. Instead, the - `upgrade_non_controller.sh` downloads ansible playbooks and those are - executed to deliver the upgrade. See the Queens-upgrade-spec_ for more - information on this mechanism. - - To upgrade remaining roles (at your convenience) - - .. code-block:: bash - - upgrade-non-controller.sh --upgrade overcloud-compute-0 - - for i in $(seq 0 2); do - upgrade-non-controller.sh --upgrade overcloud-objectstorage-$i & - done - -#. Converge to unpin Nova RPC - - The final step is required to unpin Nova RPC version. Unlike in previous - releases, for Ocata the puppet configuration has already been applied to - nodes as part of each upgrades step, i.e. after the ansible tasks or when - invoking the tripleo_upgrade_node.sh_ script to upgrade compute nodes. Thus - the significance of this step is somewhat diminished compared to previously. - However a re-application of puppet configuration across all nodes here will - also serve as a sanity check and hopefully show any issues that an operator - may have missed during any of the previous upgrade steps. - - To converge, run the deploy command with `major-upgrade-converge-docker.yaml` - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/docker.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-converge-docker.yaml - - .. admonition:: Newton to Ocata - :class: ntoo - - For Newton to Ocata, run the deploy command with - `major-upgrade-pacemaker-converge.yaml` - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-pacemaker-converge.yaml - - .. note:: - - If the Overcloud has been deployed with Pacemaker, then add the - `docker-ha.yaml` environment file to the upgrade command - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/docker.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/docker-ha.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-converge-docker.yaml - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-converge.yaml - - .. note:: - - It is especially important to remember that you **must** include all - environment files that were used to deploy the overcloud. - -.. _spec: https://specs.openstack.org/openstack/tripleo-specs/specs/ocata/tripleo-composable-upgrades.html -.. _major-upgrade-composable-steps.yaml: https://github.com/openstack/tripleo-heat-templates/blob/master/environments/major-upgrade-composable-steps.yaml -.. _roles_data.yaml: https://github.com/openstack/tripleo-heat-templates/blob/master/roles_data.yaml -.. _tripleo_upgrade_node.sh: https://github.com/openstack/tripleo-heat-templates/blob/master/extraconfig/tasks/tripleo_upgrade_node.sh -.. _upgrade-non-controller.sh: https://github.com/openstack/tripleo-common/blob/master/scripts/upgrade-non-controller.sh -.. _manifests: https://github.com/openstack/tripleo-heat-templates/tree/master/puppet/services -.. _Queens-upgrade-spec: https://specs.openstack.org/openstack/tripleo-specs/specs/queens/tripleo_ansible_upgrades_workflow.html -.. _ceph-ansible scenarios: https://github.com/ceph/ceph-ansible/blob/stable-3.0/docs/source/testing/scenarios.rst - - -Upgrading the Overcloud to Newton and earlier ---------------------------------------------- - -.. note:: - - The `openstack overcloud deploy` calls in upgrade steps below are - non-blocking. Make sure that the overcloud is `UPDATE_COMPLETE` in - `openstack stack list` and `sudo pcs status` on a controller reports - everything running fine before proceeding to the next step. - -.. admonition:: Mitaka to Newton - :class: mton - - **Deliver the migration for ceilometer to run under httpd.** - - This is to deliver the migration for ceilometer to be run under httpd (apache) - rather than eventlet as was the case before. To execute this step run - `overcloud deploy`, passing in the full set of environment files plus - `major-upgrade-ceilometer-wsgi-mitaka-newton.yaml` - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-ceilometer-wsgi-mitaka-newton.yaml - -#. Upgrade initialization - - The initialization step switches to new repositories on overcloud nodes, and - it delivers upgrade scripts to nodes which are going to be upgraded - one-by-one (this means non-controller nodes, except any stand-alone block - storage nodes). - - Create an environment file with commands to switch OpenStack repositories to - a new release. This will likely be the same commands that were used to - switch repositories on the undercloud - - .. code-block:: bash - - cat > overcloud-repos.yaml < \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-pacemaker-init.yaml \ - -e overcloud-repos.yaml - -#. Object storage nodes upgrade - - If the deployment has any standalone object storage nodes, upgrade them - one-by-one using the `upgrade-non-controller.sh` script on the undercloud - node - - .. code-block:: bash - - upgrade-non-controller.sh --upgrade - - This is ran before controller node upgrade because swift storage services - should be upgraded before swift proxy services. - -#. Upgrade controller and block storage nodes - - .. admonition:: Mitaka to Newton - :class: mton - - **Explicitly disable sahara services if so desired:** - As discussed at bug1630247_ sahara services are disabled by default in - the Newton overcloud deployment. This special case is handled for the - duration of the upgrade by defaulting to 'keep sahara-\*'. - - That is by default sahara services are restarted after the mitaka to - newton upgrade of controller nodes and sahara config is re-applied during - the final upgrade converge step. - - If an operator wishes to **disable** sahara services as part of the - mitaka to newton upgrade they need to include the - major-upgrade-remove-sahara.yaml_ environment file during the controller - upgrade step as well as during the converge step later - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-pacemaker.yaml - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-remove-sahara.yaml - - All controllers will be upgraded in sync in order to make services only talk - to DB schema versions they expect. Services will be unavailable during this - operation. Standalone block storage nodes are automatically upgraded in this - step too, in sync with controllers, because block storage services don't - have a version pinning mechanism. - - Run the deploy command with `major-upgrade-pacemaker.yaml` - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-pacemaker.yaml - - Services of the compute component on the controller nodes are now pinned to - communicate like the older release, ensuring that they can talk to the - compute nodes which haven't been upgraded yet. - - .. note:: - - If this step fails, it may leave the pacemaker cluster stopped (together - with all OpenStack services on the controller nodes). The root cause and - restoration procedure may vary, but in simple cases the pacemaker cluster - can be started by logging into one of the controllers and running ``sudo - pcs cluster start --all``. - - .. note:: - - After this step, or if this step failed with the error: `ERROR: upgrade - cannot start with some cluster nodes being offlineAfter`, it's possible - that some pacemaker resources needs to be clean. Check the failed - actions and clean them by running on `only one` controller node as root - - .. code-block:: bash - - pcs status - pcs resource cleanup - - It can take few minutes for the cluster to go back to a “normal” state as - displayed by `crm_mon`. This is expected. - -#. Upgrade ceph storage nodes - - If the deployment has any ceph storage nodes, upgrade them one-by-one using - the `upgrade-non-controller.sh` script on the undercloud node - - .. code-block:: bash - - upgrade-non-controller.sh --upgrade - -#. Upgrade compute nodes - - Upgrade compute nodes one-by-one using the `upgrade-non-controller.sh` - script on the undercloud node - - .. code-block:: bash - - upgrade-non-controller.sh --upgrade - -#. Apply configuration from upgraded tripleo-heat-templates - - .. admonition:: Mitaka to Newton - :class: mton - - **Explicitly disable sahara services if so desired:** - As discussed at bug1630247_ sahara services are disabled by default in - the Newton overcloud deployment. This special case is handled for the - duration of the upgrade by defaulting to 'keep sahara-\*'. - - That is by default sahara services are restarted after the mitaka to - newton upgrade of controller nodes and sahara config is re-applied during - the final upgrade converge step. - - If an operator wishes to **disable** sahara services as part of the - mitaka to newton upgrade they need to include the - major-upgrade-remove-sahara.yaml_ environment file during the controller - upgrade earlier and converge step here - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-pacemaker-converge.yaml - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-remove-sahara.yaml - - .. _bug1630247: https://bugs.launchpad.net/tripleo/+bug/1630247 - .. _major-upgrade-remove-sahara.yaml: https://github.com/openstack/tripleo-heat-templates/blob/2e6cc07c1a74c2dd7be70568f49834bace499937/environments/major-upgrade-remove-sahara.yaml - - - This step unpins compute services communication (upgrade level) on - controller and compute nodes, and it triggers configuration management - tooling to converge the overcloud configuration according to the new release - of `tripleo-heat-templates`. - - Make sure that all overcloud nodes have been upgraded to the new release, - and then run the deploy command with `major-upgrade-pacemaker-converge.yaml` - - .. code-block:: bash - - openstack overcloud deploy --templates \ - -e \ - -e /usr/share/openstack-tripleo-heat-templates/environments/major-upgrade-pacemaker-converge.yaml - - - .. note:: - - After the converge step, it's possible that some pacemaker resources - needs to be cleaned. Check the failed actions and clean them by running - on **only one** controller as root - - .. code-block:: bash - - pcs status - pcs resource cleanup - - It can take few minutes for the cluster to go back to a “normal” state as - displayed by ``crm_mon``. This is expected. - - diff --git a/deploy-guide/source/post_deployment/upgrade/minor_update.rst b/deploy-guide/source/post_deployment/upgrade/minor_update.rst deleted file mode 100644 index 416fd094..00000000 --- a/deploy-guide/source/post_deployment/upgrade/minor_update.rst +++ /dev/null @@ -1,237 +0,0 @@ -.. _package_update: - -Updating Content on Overcloud Nodes -=================================== - -The update of overcloud packages and containers to the latest version -of the current release is referred to as the 'minor update' in TripleO -(distinguishing it from the 'major upgrade' to the next release). In -the Queens cycle the minor update workflow was changed compared to -previous cycles. There are thus version specific sections below. - -Updating your Overcloud - Queens and beyond -------------------------------------------- - -The Queens release brought common CLI and workflow conventions to the -main deployment lifecycle operations (minor updates, major upgrades, -and fast forward upgrades). This means that the minor update workflow -has changed compared to previous releases, and it should now be easier -to learn and reason about the lifecycle operations in general. - -To update your overcloud to the latest packages / container images of -the OpenStack release that you currently operate, perform these steps: - -#. **Software sources setup** - - In case you use pinned repositories (e.g. to some DLRN hash), make - sure to update your repository files on overcloud to get the latest - RPMs. If you use stable RDO repositories, you don't need to change - anything. - -#. **Update preparation** - - To prepare the overcloud for the update, run: - - .. code-block:: bash - - openstack overcloud update prepare \ - \ - -e containers-prepare-parameter.yaml - - In place of the `` token should go all parameters that you - used with previous `openstack overcloud deploy` command. - - The last argument `containers-prepare-parameter.yaml` differs in - content depending on release. In Queens and before, it was a list - of individual container image parameters, pointing to images you've - already uploaded to local registry in previous step. In Rocky and - beyond, this file contains the ``ContainerImagePrepare`` parameter. - The upload of images to local registry is yet to happen, in a - separate step after `update prepare`. - - .. note:: - - The `update prepare` command performs a Heat stack update, and - as such it should be passed all parameters currently used by the - Heat stack (most notably environment files, role counts, roles - data, and network data). This is crucial in order to keep - correct state of the stack. - - .. note:: - - The `containers-prepare-parameter.yaml` file is intended to - replace any previous container parameters file. You should drop - the previous container parameter file and pass the new one for - any subsequent stack update operations. - - The `update prepare` command updates the Heat stack outputs with - Ansible snippets used in the next steps of the update. - -#. **Container image upload** - - Since Rocky, we will need to upload the container images - to the local registry at this point. Run: - - .. code-block:: bash - - openstack overcloud external-update run --tags container_image_prepare - -#. **Update run** - - Run the update procedure on a subset of nodes selected via the - ``--limit`` parameter: - - .. code-block:: bash - - openstack overcloud update run --limit overcloud-controller-0 - - You can specify a role name, e.g. 'Compute', to execute the minor - update on all nodes of that role in a rolling fashion (`serial: 1` - is used on the playbooks). - - There is no required node ordering for performing the minor update - on the overcloud, but it's a good practice to keep some consistency - in the process. E.g. all controllers first, then all computes, etc. - - Do this for all the overcloud nodes before proceeding to next step. - -#. **Ceph update (optional)** - - If your environment includes Ceph managed by TripleO (i.e. *not* - what TripleO calls "external Ceph"), you'll want to update Ceph at - this point too. - -#. **Update convergence** - - .. note:: - - Update Converge is only required for version less than Wallaby. - Converge has been removed for Wallaby and above. - - To finish the update procedure, run: - - .. code-block:: bash - - openstack overcloud update converge - - In place of the `` token should go all parameters that you - used with previous `openstack overcloud update prepare` command - (including the new `-e container-params.yaml`). - - .. note:: - - The `update converge` command performs a Heat stack update, and - as such it should be passed all parameters currently used by the - Heat stack (most notably environment files, role counts, roles - data, and network data). This is crucial in order to keep - correct state of the stack. - - The `update converge` command updates Heat stack outputs with - Ansible snippets the same way as `overcloud deploy` would, and it - runs the config management operations to assert that the overcloud - state matches the used overcloud templates. - -Updating your Overcloud - Pike ------------------------------- - -.. note:: - The minor update workflow described below is generally not well tested for - *non* containerized Pike environments. The main focus for the TripleO - upgrades engineering and QE teams has been on testing the minor update - within a containerized Pike environment. - - In particular there are currently no pacemaker update_tasks for the non - containerized cluster services (i.e., `puppet/services/pacemaker`_) and - those will need to be considered and added. You should reach out to the - TripleO community if this is an important feature for you and you'd like - to contribute to it. - -For the Pike cycle the minor update workflow is significantly different to -previous cycles. In particular, rather than using a static yum_update.sh_ -we now use service specific ansible update_tasks_ (similar to the upgrade_tasks -used for the major upgrade workflow since Ocata). Furthermore, these are not -executed directly via a Heat stack update, but rather, together with the -docker/puppet config, collected and written to ansible playbooks. The operator -then invokes these to deliver the minor update to particular nodes. - -There are essentially two steps: first perform a (relatively short) Heat stack -update against the overcloud to generate the "config" ansible playbooks, and -then execute these. See bug 1715557_ for more information about this mechanism -and its implementation. - - -1. Confirm that your `$HOME/containers-prepare-parameter.yaml` -`ContainerImagePrepare` parameter includes a `tag_from_label` value, so that -the latest images are discovered on update, otherwise edit the `tag` value -to specify what image versions to update to. - - -2. Perform a heat stack update to generate the ansible playbooks, specifying -the registry file generated from the first step above:: - - openstack overcloud update --init-minor-update --container-registry-file latest-images.yaml - -3. Invoke the minor update on the nodes specified with the ``--limit`` -parameter:: - - openstack overcloud update --limit controller-0 - -.. admonition:: Stable Branch - :class: stable - - The `--limit` was introduced in the Stein release, previous versions used - `--nodes` or `--roles` parameters. - -You can specify a role name, e.g. 'Compute', to execute the minor update on -all nodes of that role in a rolling fashion (serial:1 is used on the playbooks). - -.. _yum_update.sh: https://github.com/openstack/tripleo-heat-templates/blob/53db241cfbfc1b6a237b7f33486a051aa6934579/extraconfig/tasks/yum_update.sh -.. _update_tasks: https://github.com/openstack/tripleo-heat-templates/blob/e1a9638732290c247e5dac10392bc8702b531981/puppet/services/tripleo-packages.yaml#L59 -.. _1715557: https://bugs.launchpad.net/tripleo/+bug/1715557 -.. _puppet/services/pacemaker: https://github.com/openstack/tripleo-heat-templates/tree/2e182bffeeb099cb5e0b1747086fb0e0f57b7b5d/puppet/services/pacemaker - -Updating your Overcloud - Ocata and earlier -------------------------------------------- - -Updating packages on all overcloud nodes involves two steps. The first one -makes sure that the overcloud plan is updated (a new tripleo-heat-templates rpm -might have brought fixes/changes to the templates):: - - openstack overcloud deploy --update-plan-only \ - --templates \ - -e - -By using the parameter ``--update-plan-only`` we make sure we update only the -stored overcloud plan and not the overcloud itself. Make sure you pass the -exact same environment parameters that were used at deployment time. - -The second step consists in updating the packages themselves on all overcloud -nodes with a command similar to the following:: - - openstack overcloud update stack -i overcloud - -This command updates the ``UpdateIdentifier`` parameter and triggers stack update -operation. If this parameter is set, ``yum update`` command is executed on each -node. Because running update on all nodes in parallel might be unsafe (an -update of a package might involve restarting a service), the command above -sets breakpoints on each overcloud node so nodes are updated one by one. When -the update is finished on a node the command will prompt for removing -breakpoint on next one. - -.. note:: - Make sure you use the ``-i`` parameter, otherwise update runs on background - and does not prompt for removing of breakpoints. - -.. note:: - Multiple breakpoints can be removed by specifying list of nodes with a - regular expression. - -.. note:: - If the update command is aborted for some reason you can always continue - in the process by re-running same command. - -.. note:: - The ``--templates`` and ``--environment-file`` (``-e``) are now deprecated. - They can still be passed to the command, but they will be silently ignored. - This is due to the plan now used for deployment should only be modified via - plan modification commands. diff --git a/deploy-guide/source/post_deployment/upgrade/undercloud.rst b/deploy-guide/source/post_deployment/upgrade/undercloud.rst deleted file mode 100644 index 34613183..00000000 --- a/deploy-guide/source/post_deployment/upgrade/undercloud.rst +++ /dev/null @@ -1,149 +0,0 @@ -Updating Undercloud Components ------------------------------- - -.. note:: - Instack-undercloud is deprecated as of the Rocky cycle. Instack undercloud - can only be upgraded to a containerized undercloud. See - :doc:`../../deployment/undercloud` - for backward compatibility related information. - -.. note:: - When updating the existing containerized undercloud installation, - keep in mind the special cases described in :ref:`notes-for-stack-updates`. - -#. Before upgrading the undercloud, it is highly suggested to perform - a :doc:`backup <../backup_and_restore/01_undercloud_backup>` - of the undercloud and validate that a restore works fine. - -#. Remove all Delorean repositories: - - .. note:: - - You may wish to backup your current repos before disabling them - - .. code-block:: bash - - mkdir -p /home/stack/REPOBACKUP - sudo mv /etc/yum.repos.d/delorean* /home/stack/REPOBACKUP - - .. code-block:: bash - - sudo rm /etc/yum.repos.d/delorean* - - -#. Enable new Delorean repositories: - - .. include:: ../../repositories.rst - -.. We need to manually continue our list numbering here since the above - "include" directive breaks the numbering. - -#. Clean the yum cache to ensure only the new repos are used - - .. code-block:: bash - - sudo dnf clean all - sudo rm -rf /var/cache/yum - -#. Update required package: - - .. admonition:: Validations - :class: validations - - It is strongly recommended that you validate the state of your undercloud - before starting any upgrade operations. The tripleo-validations_ repo has - some 'pre-upgrade' validations that you can execute by following the - instructions at validations_ to execute the "pre-upgrade" group - - .. code-block:: bash - - openstack tripleo validator run --group pre-upgrade - - .. admonition:: Newton to Ocata - :class: ntoo - - The following commands need to be run before the undercloud upgrade:: - - sudo systemctl stop openstack-* - sudo systemctl stop neutron-* - sudo systemctl stop openvswitch - sudo systemctl stop httpd - sudo yum update instack-undercloud openstack-puppet-modules openstack-tripleo-common - - .. admonition:: Ocata to Pike - :class: otop - - .. admonition:: Ceph - :class: ceph - - Prior to Pike, TripleO deployed Ceph with puppet-ceph. With the - Pike release it is possible to use TripleO to deploy Ceph with - either ceph-ansible or puppet-ceph, though puppet-ceph is - deprecated. To use ceph-ansible, the CentOS Storage SIG Ceph - repository must be enabled on the undercloud and the - ceph-ansible package must then be installed:: - - sudo yum install --enablerepo=extras centos-release-ceph-jewel - sudo yum install ceph-ansible - - Ceph clusters deployed with Ocata via puppet-ceph will be migrated - so that all of the existing Ceph services are run inside of containers. - This migration will be managed not by puppet-ceph, but by ceph-ansible, - which TripleO will use to control updates to the same ceph cluster after - the Ocata to Pike upgrade. - - - Update TripleO CLI and dependencies - - .. code-block:: bash - - sudo dnf update python3-tripleoclient* openstack-tripleo-common openstack-tripleo-heat-templates - -#. As part of the undercloud install, an image registry is configured on port - `8787`. This is used to increase reliability of overcloud image pulls, and - minimise overall network transfers. First it is highly suggested to perform - a backup of the initial `containers-prepare-parameter.yaml` file. Then - update the new `containers-prepare-parameter.yaml` file with the same - modifications made in the initial one:: - - openstack tripleo container image prepare default \ - --local-push-destination \ - --output-env-file ~/containers-prepare-parameter.yaml - - .. note:: - This command is available since Rocky. - -#. Run the undercloud upgrade command. This command will upgrade all packages - and use puppet to apply new configuration and restart all OpenStack - services - - .. code-block:: bash - - openstack undercloud upgrade - - .. note:: - The undercloud is containerized by default as of Rocky. Therefore, - an undercloud deployed on Queens (non-containerized) will be upgraded - to a containerized undercloud on Rocky, by default. - To upgrade with instack undercloud in Rocky, you'll need to upgrade with - ``--use-heat=False`` option. Note this isn't tested and not supported. - - .. note:: - In order to obtain the ansible command used for the installation of the - Undercloud in the artifacts directory, it is necessary to pass the option - ``--reproduce-command`` in the Undercloud upgrade command. - - .. note:: - It's possible to enable verbose logging with ``--verbose`` option. - To cleanup an undercloud after its upgrade, you'll need to set - upgrade_cleanup to True in undercloud.conf. It'll remove the rpms - that were deployed by instack-undercloud, after the upgrade to a - containerized undercloud. - - .. note:: - - If you added custom OVS ports to the undercloud (e.g. in a virtual - testing environment) you may need to re-add them at this point. - - .. _validations: ../validations/index.html - .. _tripleo-validations: https://github.com/openstack/tripleo-validations/tree/master/validations diff --git a/deploy-guide/source/post_deployment/validations/ansible.rst b/deploy-guide/source/post_deployment/validations/ansible.rst deleted file mode 100644 index 4f7084b8..00000000 --- a/deploy-guide/source/post_deployment/validations/ansible.rst +++ /dev/null @@ -1,46 +0,0 @@ - -Running validations using Ansible ---------------------------------- - -Validations -^^^^^^^^^^^ - -You can run the ``prep`` validations to verify the hardware. Later in -the process, the validations will be run by the undercloud processes. - -However, the undercloud is not set up yet. You can install Ansible on -your local machine (that has SSH connectivity to the undercloud) and -validate the undercloud from there. - -You need Ansible version 2 and the hostname/IP address of the -undercloud (referred to ``$UNDERCLOUD_HOST`` here): - -.. code-block:: bash - - $ sudo yum install ansible - $ git clone https://git.openstack.org/openstack/tripleo-validations - $ cd tripleo-validations - $ printf "[undercloud]\n$UNDERCLOUD_HOST" > hosts - $ export ANSIBLE_STDOUT_CALLBACK=validation_output - $ export ANSIBLE_CALLBACK_PLUGINS="${PWD}/callback_plugins" - $ export ANSIBLE_ROLES_PATH="${PWD}/roles" - $ export ANSIBLE_LOOKUP_PLUGINS="${PWD}/lookup_plugins" - $ export ANSIBLE_LIBRARY="${PWD}/library" - -Then get the ``prep`` validations: - -.. code-block:: bash - - $ grep -l '^\s\+-\s\+prep' -r playbooks - -And run them one by one: - -.. code-block:: bash - - $ ansible-playbook -i hosts playbooks/validation-name.yaml - -Or run them all in one shot: - -.. code-block:: bash - - $ for PREP_VAL in `grep -l '^\s\+-\s\+prep' -r playbooks`; do echo "=== $PREP_VAL ==="; ansible-playbook -i hosts $PREP_VAL; done diff --git a/deploy-guide/source/post_deployment/validations/cli.rst b/deploy-guide/source/post_deployment/validations/cli.rst deleted file mode 100644 index 6dcf4c4d..00000000 --- a/deploy-guide/source/post_deployment/validations/cli.rst +++ /dev/null @@ -1,239 +0,0 @@ -CLI support for validations -=========================== - -The following section describes the options when running or listing the existing -validations. - -Running validations -^^^^^^^^^^^^^^^^^^^ - -Validations can be executed by groups or individually. The current CLI -implementation allows to run them using the following CLI options: - -.. code-block:: bash - - $ openstack tripleo validator run [options] - -``--plan, --stack``: This option allows to execute the validations overriding the -default plan name. The default value is set to ``overcloud``. To override this -options use for example: - -.. code-block:: bash - - $ openstack tripleo validator run --plan mycloud - -``--validation``: This options allows to execute a set of specific -validations. Specify them as [,,...] which means a -comma separated list. The default value for this option is []. - -For example you can run this as: - -.. code-block:: bash - - $ openstack tripleo validator run --validation check-ftype,512e - -.. _running_validation_group: - -Running validation groups -------------------------- - -``--group``: This option allows to run specific group validations, if more than -one group is required, then separate the group names with commas. The default -value for this option is ['pre-deployment']. - -Run this option for example like: - -.. code-block:: bash - - $ openstack tripleo validator run --group pre-upgrade,prep - -``--extra-vars``: This option allows to add a dictionary of extra variables to a -run of a group or specific validations. - -.. code-block:: bash - - $ openstack tripleo validator run \ - --extra-vars '{"min_undercloud_ram_gb": 24, "min_undercloud_cpu_count": 8}' \ - --validation undercloud-ram,undercloud-cpu - -``--extra-vars-file``: This -option allows to add a valid ``JSON`` or ``YAML`` -file containing extra variables to a run of a group or specific validations. - -.. code-block:: bash - - $ openstack tripleo validator run \ - --extra-vars-file /home/stack/envvars.json \ - --validation undercloud-ram,undercloud-cpu - -``--workers, -w``: This option will configure the maximum of threads that can be -used to execute the given validation. - -.. code-block:: bash - - $ openstack tripleo validator run \ - --extra-vars-file /home/stack/envvars.json \ - --validation undercloud-ram,undercloud-cpu \ - --workers 3 - -Getting the list of the Groups of validations -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To get the list of all groups used by tripleo-validations and get their -description, the user can type the following command: - -.. code-block:: bash - - $ openstack tripleo validator group info - -``--format, -f``: This option allows to change the default output for listing -the validations. The options are csv, value, json, yaml or table. - -.. code-block:: bash - - $ openstack tripleo validator group info --format json - -Getting a list of validations -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Validations can be listed by groups and depending which validations will be -listed, the output might be configured as a table, json or yaml. The user can -list the validations using the following command: - -.. code-block:: bash - - $ openstack tripleo validator list [options] - -``--group``: This option allows to list specific group validations, if more than -one group is required, then separate the group names with commas. - -.. code-block:: bash - - $ openstack tripleo validator list --group prep,pre-introspection - -``--format, -f``: This option allows to change the default output for listing -the validations. The options are csv, value, json, yaml or table. - -.. code-block:: bash - - $ openstack tripleo validator list --format json - -Getting detailed information about a validation -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To get a full description of a validation, the user can run the following -command: - -.. code-block:: bash - - $ openstack tripleo validator show dns - -Getting the parameters list for a validation or a group of validations -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To get all the available ``Ansible`` variables for one or more validations: - -``--validation``: This options allows to execute a set of specific -validations. Specify them as [,,...] which means a -comma separated list. The default value for this option is []. - -.. code-block:: bash - - openstack tripleo validator show parameter --validation undercloud-ram,undercloud-cpu - { - "undercloud-cpu": { - "parameters": { - "min_undercloud_cpu_count": 8 - } - }, - "undercloud-ram": { - "parameters": { - "min_undercloud_ram_gb": 24 - } - } - } - -``--group``: This option allows to list specific group validations, if more than -one group is required, then separate the group names with commas. - -.. code-block:: bash - - openstack tripleo validator show parameter --group prep - { - "512e": { - "parameters": {} - }, - "service-status": { - "parameters": {} - }, - "tls-everywhere-prep": { - "parameters": {} - }, - "undercloud-cpu": { - "parameters": { - "min_undercloud_cpu_count": 8 - } - }, - "undercloud-disk-space": { - "parameters": { - "volumes": [ - { - "min_size": 10, - "mount": "/var/lib/docker" - }, - { - "min_size": 3, - "mount": "/var/lib/config-data" - }, - { - "min_size": 3, - "mount": "/var/log" - }, - { - "min_size": 5, - "mount": "/usr" - }, - { - "min_size": 20, - "mount": "/var" - }, - { - "min_size": 25, - "mount": "/" - } - ] - } - }, - "undercloud-ram": { - "parameters": { - "min_undercloud_ram_gb": 24 - } - }, - "undercloud-selinux-mode": { - "parameters": {} - } - } - -``--download``: This option allows to generate a valid ``JSON`` or -``YAML`` file containing the available ``Ansible`` variables for the validations. - -To generate a ``JSON`` or ``YAML`` file containing for the variables of the -``undercloud-ram`` and ``undercloud-cpu`` validations: - -.. code-block:: bash - - openstack tripleo validator show parameter \ - --download [json|yaml] /home/stack/envvars \ - --validation undercloud-ram,undercloud-cpu - -To generate a ``JSON`` or ``YAML`` file containing for the variables of the -validations belonging to the ``prep`` and ``pre-introspection`` groups: - -.. code-block:: bash - - openstack tripleo validator show parameter \ - --download [json|yaml] /home/stack/envvars \ - --group prep,pre-introspection - -``--format, -f``: This option allows to change the default output for listing -the validations parameters. The options are json or yaml. diff --git a/deploy-guide/source/post_deployment/validations/in-flight.rst b/deploy-guide/source/post_deployment/validations/in-flight.rst deleted file mode 100644 index dd354292..00000000 --- a/deploy-guide/source/post_deployment/validations/in-flight.rst +++ /dev/null @@ -1,96 +0,0 @@ -In-flight validations -===================== - -The What --------- -In-flight validations are launched during the deploy, usually at the beginning -of a step, in order to ensure a service deployed at previous step does actually -work. - -The Why -------- -Being able to validate services early also ensures we get early failures. For -instance, if "service-one" is deployed at step 2 and never used until step 4, -we won't notice its failed state before step 4. - -Adding a validation at the beginning of step 3 would prevent this issue, by -failing early with a human readable message. - -The How -------- -The in-flight validations can be added directly in `the service template`_, -either at the end of the step we want to check, or at the beginning of the -next step. - -Since steps are launched with ansible, order does matter. - -Tagging -_______ -In order to ensure we can actually deactivate validations, we have to tag -validation related tasks with, at least, two tags:: - - - opendev-validation - - opendev-validation-SERVICE_NAME - -Plain ansible task -__________________ -The following example will ensure rabbitmq service is running after its -deployment: - -.. code-block:: YAML - - deploy_steps_tasks: - # rabbitmq container is supposed to be started during step 1 - # so we want to ensure it's running during step 2 - - name: validate rabbitmq state - when: step|int == 2 - tags: - - opendev-validation - - opendev-validation-rabbitmq - wait_for_connection: - host: {get_param: [ServiceNetMap, RabbitmqNetwork]} - port: 5672 - delay: 10 - -Validation Framework import -___________________________ -We can also include already existing validations from the -`Validation Framework`_ roles. This can be archived like this: - -.. code-block:: YAML - - deploy_steps_tasks: - - name: some validation - when: step|int == 2 - tags: - - opendev-validation - - opendev-validation-rabbitmq - include_role: - role: rabbitmq-limits - # We can pass vars to included role, in this example - # we override the default min_fd_limit value: - vars: - min_fd_limit: 32768 - -You can find the definition of the ``rabbitmq-limits`` role `here`_. - -Use existing health checks -__________________________ -We can also go for a simple thing, and use the existing service health check: - -.. code-block:: YAML - - deploy_steps_tasks: - # rabbitmq container is supposed to be started during step 1 - # so we want to ensure it's running during step 2 - - name: validate rabbitmq state - when: step|int == 2 - tags: - - opendev-validation - - opendev-validation-rabbitmq - command: > - podman exec rabbitmq /openstack/healthcheck - -.. _the service template: https://github.com/openstack/tripleo-heat-templates/tree/master/deployment -.. _Validation Framework: https://docs.openstack.org/tripleo-validations/latest/readme.html -.. _here: https://github.com/openstack/tripleo-validations/tree/master/roles/rabbitmq-limits diff --git a/deploy-guide/source/post_deployment/validations/index.rst b/deploy-guide/source/post_deployment/validations/index.rst deleted file mode 100644 index 92cf3427..00000000 --- a/deploy-guide/source/post_deployment/validations/index.rst +++ /dev/null @@ -1,77 +0,0 @@ -Validations guide -================= - -Since the Newton release, TripleO ships with extensible checks for -verifying the Undercloud configuration, hardware setup, and the -Overcloud deployment to find common issues early. - -Since Stein, it is possible to run the validations using the TripleO CLI. - -Validations are used to efficiently and reliably verify various facts about -the cloud on the level of individual nodes and hosts. - -Validations are non-intrusive by design, and recommended when performing large -scale changes to the cloud, for example upgrades, or to aid in the diagnosis -of various issues. Detailed docs for both the CLI and the API are provided -by the Validations Framework project. - -* tripleo-validations: https://docs.openstack.org/tripleo-validations/latest/ -* validations-common: https://docs.openstack.org/validations-common/latest/ -* validations-libs: https://docs.openstack.org/validations-libs/latest/ - -The validations are assigned into various groups that indicate when in -the deployment workflow they are expected to run: - -* **no-op** validations will run a no-op operation to verify that - the workflow is working as it supposed to, it will run in both - the Undercloud and Overcloud nodes. - -* **openshift-on-openstack** validations will check that the - environment meets the requirements to be able to deploy OpenShift - on OpenStack. - -* **prep** validations check the hardware configuration of the - Undercloud node and should be run before ``openstack undercloud - install``. Running prep validations should not rely on Mistral - because it might not be installed yet. - -* **pre-introspection** should be run before we introspect nodes using - Ironic Inspector. - -* **pre-deployment** validations should be executed before ``openstack - overcloud deploy`` - -* **post-deployment** should be run after the Overcloud deployment has - finished. - -* **pre-upgrade** try to validate your OpenStack deployment before you upgrade it. - -* **post-upgrade** try to validate your OpenStack deployment after you upgrade it. - -.. note:: - In case of the most validations, a failure does not mean that - you'll be unable to deploy or run OpenStack. But it can indicate - potential issues with long-term or production setups. If you're - running an environment for developing or testing TripleO, it's okay - that some validations fail. In a production setup, they should not. - -The list of all existing validations and the specific documentation -for the project can be found on the `tripleo-validations documentation page`_. - -With implementation specifics described in docs for the `validations-libs`_, -and `validations-common`_. - -The following sections describe the different ways of running and listing the -currently installed validations. - -.. toctree:: - :maxdepth: 2 - :includehidden: - - cli - ansible - in-flight - -.. _tripleo-validations documentation page: https://docs.openstack.org/tripleo-validations/latest/ -.. _validations-libs: https://docs.openstack.org/validations-libs/latest/ -.. _validations-common: https://docs.openstack.org/validations-common/latest/ \ No newline at end of file diff --git a/deploy-guide/source/post_deployment/vm_snapshot.rst b/deploy-guide/source/post_deployment/vm_snapshot.rst deleted file mode 100644 index c9a54c73..00000000 --- a/deploy-guide/source/post_deployment/vm_snapshot.rst +++ /dev/null @@ -1,26 +0,0 @@ -Import/Export of VM Snapshots -============================= - -Create a snapshot of a running server -------------------------------------- -Create a new image by taking a snapshot of a running server and download the -image. - -:: - - nova image-create instance_name image_name - glance image-download image_name --file exported_vm.qcow2 - -Import an image into Overcloud and launch an instance ------------------------------------------------------ -Upload the exported image into glance in Overcloud and launch a new instance. - -:: - - glance image-create --name imported_image --file exported_vm.qcow2 --disk-format qcow2 --container-format bare - nova boot --poll --key-name default --flavor m1.demo --image imported_image --nic net-id=net_id imported - -.. note:: - **Warning**: disadvantage of using glance image for export/import VMs is - that each VM disk has to be copied in and out into glance in source and - target clouds. Also by making snapshot qcow layering system is lost. diff --git a/deploy-guide/source/provisioning/ansible_deploy_interface.rst b/deploy-guide/source/provisioning/ansible_deploy_interface.rst deleted file mode 100644 index 786c8174..00000000 --- a/deploy-guide/source/provisioning/ansible_deploy_interface.rst +++ /dev/null @@ -1,157 +0,0 @@ -Extending overcloud nodes provisioning -====================================== - -Starting with the Queens release, the *ansible* deploy interface became -available in Ironic. Unlike the default `iSCSI deploy interface`_, it is -highly customizable through operator-provided Ansible playbooks. These -playbooks will run on the target image when Ironic boots the deploy ramdisk. - -.. TODO(dtantsur): link to ansible interface docs when they merge - -.. note:: - This feature is not related to the ongoing work of switching overcloud - configuration to Ansible. - -Enabling Ansible deploy ------------------------ - -The *ansible* deploy interface is enabled by default starting with Queens. -However, additional configuration is required when installing an undercloud. - -Custom ansible playbooks -~~~~~~~~~~~~~~~~~~~~~~~~ - -To avoid modifying playbooks, provided by the distribution, you must copy -them to a new location that is accessible by Ironic. In this guide it is -``/var/lib/ironic``. - -.. note:: - Use of the ``/var/lib`` directory is not fully compliant to FHS. We do it - because for containerized undercloud this directory is shared between - the host and the ironic-conductor container. - -#. Set up repositories and install the Ironic common package, if it is not - installed yet:: - - sudo yum install -y openstack-ironic-common - -#. Copy the files to the new location (``/var/lib/ironic/playbooks``):: - - sudo cp -R /usr/lib/python2.7/site-packages/ironic/drivers/modules/ansible/playbooks/ \ - /var/lib/ironic - -Installing undercloud -~~~~~~~~~~~~~~~~~~~~~ - -#. Generate an SSH key pair, for example:: - - ssh-keygen -t rsa -b 2048 -f ~/ipa-ssh -N '' - - .. warning:: The private part should not be password-protected or Ironic - will not be able to use it. - -#. Create a custom hieradata override. Pass the **public** SSH key for the - deploy ramdisk to the common PXE parameters, and set the new playbooks path. - - For example, create a file called ``ansible-deploy.yaml`` with the - following content: - - .. code-block:: yaml - - ironic::drivers::ansible::default_username: 'root' - ironic::drivers::ansible::default_key_file: '/var/lib/ironic/ipa-ssh' - ironic::drivers::ansible::playbooks_path: '/var/lib/ironic/playbooks' - ironic::drivers::pxe::pxe_append_params: 'nofb nomodeset vga=normal selinux=0 sshkey=""' - -#. Link to this file in your ``undercloud.conf``: - - .. code-block:: ini - - hieradata_override=/home/stack/ansible-deploy.yaml - -#. Deploy or update your undercloud as usual. - -#. Move the private key to ``/var/lib/ironic`` and ensure correct ACLs:: - - sudo mv ~/ipa-ssh /var/lib/ironic - sudo chown ironic:ironic /var/lib/ironic/ipa-ssh - sudo chmod 0600 /var/lib/ironic/ipa-ssh - -Enabling temporary URLs -~~~~~~~~~~~~~~~~~~~~~~~ - -#. First, enable the ``admin`` user access to other Swift accounts:: - - $ openstack role add --user admin --project service ResellerAdmin - -#. Check if the ``service`` account has a temporary URL key generated in the - Object Store service. Look for ``Temp-Url-Key`` properties in the output - of the following command:: - - $ openstack --os-project-name service object store account show - +------------+---------------------------------------+ - | Field | Value | - +------------+---------------------------------------+ - | Account | AUTH_97ae97383424400d8ee1a54c3a2c41a0 | - | Bytes | 2209530996 | - | Containers | 5 | - | Objects | 42 | - +------------+---------------------------------------+ - -#. If the property is not present, generate a value and add it:: - - $ openstack --os-project-name service object store account set \ - --property Temp-URL-Key=$(uuidgen | sha1sum | awk '{print $1}') - -Configuring nodes ------------------ - -Nodes have to be explicitly configured to use the Ansible deploy. For example, -to configure all nodes, use:: - - for node in $(baremetal node list -f value -c UUID); do - baremetal node set $node --deploy-interface ansible - done - -Editing playbooks ------------------ - -.. TODO(dtantsur): link to ansible interface docs when they merge - -Example: kernel arguments -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Let's modify the playbooks to include additional kernel parameters for some -nodes. - -#. Update ``/var/lib/ironic/playbooks/roles/configure/tasks/grub.yaml`` from - - .. code-block:: yaml - - - name: create grub config - become: yes - command: chroot {{ tmp_rootfs_mount }} /bin/sh -c '{{ grub_config_cmd }} -o {{ grub_config_file }}' - - to - - .. code-block:: yaml - - - name: append kernel params - become: yes - lineinfile: - dest: "{{ tmp_rootfs_mount }}/etc/default/grub" - state: present - line: 'GRUB_CMDLINE_LINUX+=" {{ ironic_extra.kernel_params | default("") }}"' - - name: create grub config - become: yes - command: chroot {{ tmp_rootfs_mount }} /bin/sh -c '{{ grub_config_cmd }} -o {{ grub_config_file }}' - -#. Set the newly introduced ``kernel_params`` extra variable to the desired - kernel parameters. For example, to update only compute nodes use:: - - for node in $(baremetal node list -c Name -f value | grep compute); do - baremetal node set $node \ - --extra kernel_params='param1=value1 param2=value2' - done - -.. _iSCSI deploy interface: https://docs.openstack.org/ironic/latest/admin/interfaces/deploy.html#iscsi-deploy diff --git a/deploy-guide/source/provisioning/baremetal_provision.rst b/deploy-guide/source/provisioning/baremetal_provision.rst deleted file mode 100644 index b8393180..00000000 --- a/deploy-guide/source/provisioning/baremetal_provision.rst +++ /dev/null @@ -1,710 +0,0 @@ -.. _baremetal_provision: - -Provisioning Baremetal Before Overcloud Deploy -============================================== - -Baremetal provisioning is a feature which interacts directly with the -Bare Metal service to provision baremetal before the overcloud is deployed. -This adds a new provision step before the overcloud deploy, and the output of -the provision is a valid :doc:`../features/deployed_server` configuration. - -In the Wallaby release the baremetal provisioning was extended to also manage -the neutron API resources for :doc:`../features/network_isolation` and -:doc:`../features/custom_networks`, and apply network configuration on the -provisioned nodes using os-net-config. - -Undercloud Components For Baremetal Provisioning ------------------------------------------------- - -A new YAML file format is introduced to describe the baremetal required for -the deployment, and the new command ``openstack overcloud node provision`` -will consume this YAML and make the specified changes. The provision command -interacts with the following undercloud components: - -* A baremetal provisioning workflow which consumes the YAML and runs to - completion - -* The `metalsmith`_ tool which deploys nodes and associates ports. This tool is - responsible for presenting a unified view of provisioned baremetal while - interacting with: - - * The Ironic baremetal node API for deploying nodes - - * The Ironic baremetal allocation API which allocates nodes based on the YAML - provisioning criteria - - * The Neutron API for managing ports associated with the node's NICs - - -In a future release this will become the default way to deploy baremetal, as -the Nova compute service and the Glance image service will be switched off on -the undercloud. - -Baremetal Provision Configuration ---------------------------------- - -A declarative YAML format specifies what roles will be deployed and the -desired baremetal nodes to assign to those roles. Defaults can be relied on -so that the simplest configuration is to specify the roles, and the count of -baremetal nodes to provision for each role - -.. code-block:: yaml - - - name: Controller - count: 3 - - name: Compute - count: 100 - -Often it is desirable to assign specific nodes to specific roles, and this is -done with the ``instances`` property - -.. code-block:: yaml - - - name: Controller - count: 3 - instances: - - hostname: overcloud-controller-0 - name: node00 - - hostname: overcloud-controller-1 - name: node01 - - hostname: overcloud-controller-2 - name: node02 - - name: Compute - count: 100 - instances: - - hostname: overcloud-novacompute-0 - name: node04 - -Here the instance ``name`` refers to the logical name of the node, and the -``hostname`` refers to the generated hostname which is derived from the -overcloud stack name, the role, and an incrementing index. In the above -example, all of the Controller servers are on predictable nodes, as well as -one of the Compute servers. The other 99 Compute servers are on nodes -allocated from the pool of available nodes. - -The properties in the ``instances`` entries can also be set in the -``defaults`` section so that they do not need to be repeated in every entry. -For example, the following are equivalent - -.. code-block:: yaml - - - name: Controller - count: 3 - instances: - - hostname: overcloud-controller-0 - name: node00 - image: - href: overcloud-full-custom - - hostname: overcloud-controller-1 - name: node01 - image: - href: overcloud-full-custom - - hostname: overcloud-controller-2 - name: node02 - image: - href: overcloud-full-custom - - - name: Controller - count: 3 - defaults: - image: - href: overcloud-full-custom - instances: - - hostname: overcloud-controller-0 - name: node00 - - hostname: overcloud-controller-1 - name: node01 - - hostname: overcloud-controller-2 - name: node02 - -When using :doc:`../features/network_isolation`, -:doc:`../features/custom_networks` or a combination of the two the **networks** -and **network_configuration** must either be set in the ``defaults`` for the -role or for each specific node (instance). The following example extends the -first simple configuration example adding typical TripleO network isolation by -setting defaults for each role - -.. code-block:: yaml - - - name: Controller - count: 3 - defaults: - networks: - - network: ctlplane - vif: true - - network: external - subnet: external_subnet - - network: internalapi - subnet: internal_api_subnet01 - - network: storage - subnet: storage_subnet01 - - network: storagemgmt - subnet: storage_mgmt_subnet01 - - network: tenant - subnet: tenant_subnet01 - network_config: - template: /home/stack/nic-config/controller.j2 - default_route_network: - - external - - name: Compute - count: 100 - defaults: - networks: - - network: ctlplane - vif: true - - network: internalapi - subnet: internal_api_subnet02 - - network: tenant - subnet: tenant_subnet02 - - network: storage - subnet: storage_subnet02 - network_config: - template: /home/stack/nic-config/compute.j2 - - -Role Properties -^^^^^^^^^^^^^^^ - -Each role entry supports the following properties: - -* ``name``: Mandatory role name - -* ``hostname_format``: Override the default hostname format for this role. The - default format uses the lower case role name, so for the ``Controller`` role the - default format is ``%stackname%-controller-%index%``. Only the ``Compute`` role - doesn't follow the role name rule, the ``Compute`` default format is - ``%stackname%-novacompute-%index%`` - -* ``count``: Number of nodes to provision for this role, defaults to 1 - -* ``defaults``: A dict of default values for ``instances`` entry properties. An - ``instances`` entry property will override a default specified here See - :ref:`instance-defaults-properties` for supported properties - -* ``instances``: A list of dict for specifying attributes for specific nodes. - See :ref:`instance-defaults-properties` for supported properties. The length - of this list must not be greater than ``count`` - -* ``ansible_playbooks``: A list of dict for Ansible playbooks and Ansible vars, - the playbooks are run against the role instances after node provisioning, - prior to the node network configuration. See - :ref:`ansible-playbook-properties` for more details and examples. - -.. _instance-defaults-properties: - -Instance and Defaults Properties -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These properties serve three purposes: - -* Setting selection criteria when allocating nodes from the pool of available nodes - -* Setting attributes on the baremetal node being deployed - -* Setting network configuration properties for the deployed nodes - -Each ``instances`` entry and the ``defaults`` dict support the following properties: - -* ``capabilities``: Selection criteria to match the node's capabilities - -* ``config_drive``: Add data and first-boot commands to the config-drive passed - to the node. See :ref:`config-drive` - -* ``hostname``: If this complies with the ``hostname_format`` pattern then - other properties will apply to the node allocated to this hostname. - Otherwise, this allows a custom hostname to be specified for this node. - (Cannot be specified in ``defaults``) - -* ``image``: Image details to deploy with. See :ref:`image-properties` - -* ``managed``: Boolean to determine whether the instance is actually - provisioned with metalsmith, or should be treated as preprovisioned. - -* ``name``: The name of a node to deploy this instance on (Cannot be specified - in ``defaults``) - -* ``nics``: (**DEPRECATED:** Replaced by ``networks`` in Wallaby) List of - dicts representing requested NICs. See :ref:`nics-properties` - -* ``networks``: List of dicts representing instance networks. See - :ref:`networks-properties` - -* ``network_config``: Network configuration details. See - :ref:`network-config-properties` - -* ``profile``: Selection criteria to use :doc:`./profile_matching` - -* ``provisioned``: Boolean to determine whether this node is provisioned or - unprovisioned. Defaults to ``true``, ``false`` is used to unprovision a node. - See :ref:`scaling-down` - -* ``resource_class``: Selection criteria to match the node's resource class, - defaults to ``baremetal``. See :doc:`./profile_matching` - -* ``root_size_gb``: Size of the root partition in GiB, defaults to 49 - -* ``swap_size_mb``: Size of the swap partition in MiB, if needed - -* ``traits``: A list of traits as selection criteria to match the node's ``traits`` - -.. _image-properties: - -Image Properties -________________ - -* ``href``: Glance image reference or URL of the root partition or whole disk - image. URL schemes supported are ``file://``, ``http://``, and ``https://``. - If the value is not a valid URL, it is assumed to be a Glance image reference - -* ``checksum``: When the ``href`` is a URL, the ``MD5`` checksum of the root - partition or whole disk image - -* ``kernel``: Glance image reference or URL of the kernel image (partition images only) - -* ``ramdisk``: Glance image reference or URL of the ramdisk image (partition images only) - - -.. _networks-properties: - -Networks Properties -___________________ - -The ``instances`` ``networks`` property supports a list of dicts, one dict per -network. - -* ``network``: Neutron network to create the port for this network: - -* ``fixed_ip``: Specific IP address to use for this network - -* ``network``: Neutron network to create the port for this network - -* ``subnet``: Neutron subnet to create the port for this network - -* ``port``: Existing Neutron port to use instead of creating one - -* ``vif``: When ``true`` the network is attached as VIF (virtual-interface) by - metalsmith/ironic. When ``false`` the baremetal provisioning workflow creates - the Neutron API resource, but no VIF attachment happens in metalsmith/ironic. - (Typically only the provisioning network (``ctlplane``) has this set to - ``true``.) - -By default there is one network representing - -.. code-block:: yaml - - - network: ctlplane - vif: true - -Other valid network entries would be - -.. code-block:: yaml - - - network: ctlplane - fixed_ip: 192.168.24.8 - vif: true - - port: overcloud-controller-0-ctlplane - - network: internal_api - subnet: internal_api_subnet01 - -.. _network-config-properties: - -Network Config Properties -_________________________ - -The ``network_config`` property contains os-net-config related properties. - -* ``template``: The ansible j2 nic config template to use when - applying node network configuration. (default: - ``templates/net_config_bridge.j2``) - -* ``physical_bridge_name``: Name of the OVS bridge to create for accessing - external networks. (default: ``br-ex``) - -* ``public_interface_name``: Which interface to add to the public bridge - (default: ``nic1``) - -* ``network_config_update``: Whether to apply network configuration changes, - on update or not. Boolean value. (default: ``false``) - -* ``net_config_data_lookup``: Per node and/or per node group os-net-config nic - mapping config. - -* ``default_route_network``: The network to use for the default route (default: - ``ctlplane``) - -* ``networks_skip_config``: List of networks that should be skipped when - configuring node networking - -* ``dns_search_domains``: A list of DNS search domains to be added (in order) - to resolv.conf. - -* ``bond_interface_ovs_options``: The ovs_options or bonding_options string for - the bond interface. Set things like lacp=active and/or bond_mode=balance-slb - for OVS bonds or like mode=4 for Linux bonds using this option. - -.. _nics-properties: - -Nics Properties -_______________ - -The ``instances`` ``nics`` property supports a list of dicts, one dict per NIC. - -* ``fixed_ip``: Specific IP address to use for this NIC - -* ``network``: Neutron network to create the port for this NIC - -* ``subnet``: Neutron subnet to create the port for this NIC - -* ``port``: Existing Neutron port to use instead of creating one - -By default there is one NIC representing - -.. code-block:: yaml - - - network: ctlplane - -Other valid NIC entries would be - -.. code-block:: yaml - - - subnet: ctlplane-subnet - fixed_ip: 192.168.24.8 - - port: overcloud-controller-0-ctlplane - -.. _config-drive: - -Config Drive -____________ - -The ``instances`` ``config_drive`` property supports two sub-properties: - -* ``cloud_config``: Dict of cloud-init `cloud-config`_ data for tasks to run on - node boot. A task specified in an ``instances`` ``cloud_config`` will - overwrite a task with the same name in ``defaults`` ``cloud_config``. - -* ``meta_data``: Extra metadata to include with the config-drive cloud-init - metadata. This will be added to the generated metadata ``public_keys``, - ``uuid``, ``name``, ``hostname``, and ``instance-type`` which is set to - the role name. Cloud-init makes this metadata available as `instance-data`_. - A key specified in an ``instances`` ``meta_data`` entry will overwrite the - same key in ``defaults`` ``meta_data``. - -Below are some examples of what can be done with ``config_drive``. - -Run arbitrary scripts on first boot: - -.. code-block:: yaml - - config_drive: - cloud_config: - bootcmd: - # temporary workaround to allow steering in ConnectX-3 devices - - echo "options mlx4_core log_num_mgm_entry_size=-1" >> /etc/modprobe.d/mlx4.conf - - /sbin/dracut --force - -Enable and configure ntp: - -.. code-block:: yaml - - config_drive: - cloud_config: - enabled: true - ntp_client: chrony # Uses cloud-init default chrony configuration - -Allow root ssh login (for development environments only): - -.. code-block:: yaml - - config_drive: - cloud_config: - ssh_pwauth: true - disable_root: false - chpasswd: - list: |- - root:sekrit password - expire: False - -Use values from custom metadata: - -.. code-block:: yaml - - config_drive: - meta_data: - foo: bar - cloud_config: - runcmd: - - echo The value of foo is `jq .foo < /run/cloud-init/instance-data.json` - - -.. _ansible-playbook-properties: - -Ansible Playbooks ------------------ - -The role ``ansible_playbooks`` takes a list of playbook definitions, supporting -the ``playbook`` and ``extra_vars`` sub-properties. - -* ``playbook``: The path (relative to the roles definition YAML file) to the - ansible playbook. - -* ``extra_vars``: Extra Ansible variables to set when running the playbook. - -.. note:: Playbooks only run if '--network-config' is enabled. - -Run arbitrary playbooks: - -.. code-block:: yaml - - ansible_playbooks: - - playbook: a_playbook.yaml - - playbook: b_playbook.yaml - -Run arbitrary playbooks with extra variables defined for one of the playbooks: - -.. code-block:: yaml - - ansible_playbooks: - - playbook: a_playbook.yaml - extra_vars: - param1: value1 - param2: value2 - - playbook: b_playbook.yaml - -Grow volumes playbook -^^^^^^^^^^^^^^^^^^^^^ - -After custom playbooks are run, an in-built playbook is run to grow the LVM -volumes of any node deployed with the whole-disk overcloud image -`overcloud-hardened-uefi-full.qcow2`. The implicit `ansible_playbooks` would be: - -.. code-block:: yaml - - ansible_playbooks: - - playbook: /usr/share/ansible/tripleo-playbooks/cli-overcloud-node-growvols.yaml - extra_vars: - growvols_args: > - /=8GB - /tmp=1GB - /var/log=10GB - /var/log/audit=2GB - /home=1GB - /var=100% - -Each LVM volume is grown by the amount specified until the disk is 100% -allocated, and any remaining space is given to the `/` volume. In some cases it -may be necessary to specify different `growvols_args`. For example the -`ObjectStorage` role deploys swift storage which stores state in `/srv`, so this -volume needs the remaining space instead of `/var`. The playbook can be -explicitly written to override the default `growvols_args` value, for example: - -.. code-block:: yaml - - ansible_playbooks: - - playbook: /usr/share/ansible/tripleo-playbooks/cli-overcloud-node-growvols.yaml - extra_vars: - growvols_args: > - /=8GB - /tmp=1GB - /var/log=10GB - /var/log/audit=2GB - /home=1GB - /var=1GB - /srv=100% - -Set kernel arguments playbook -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Features such as DPDK require that kernel arguments are set and the node is -rebooted before the network configuration is run. A playbook is provided to -allow this. Here it is run with the default variables set: - -.. code-block:: yaml - - ansible_playbooks: - - playbook: /usr/share/ansible/tripleo-playbooks/cli-overcloud-node-kernelargs.yaml - extra_vars: - kernel_args: '' - reboot_wait_timeout: 900 - defer_reboot: false - tuned_profile: 'throughput-performance' - tuned_isolated_cores: '' - -Here is an example for a specific DPDK deployment: - -.. code-block:: yaml - - ansible_playbooks: - - playbook: /usr/share/ansible/tripleo-playbooks/cli-overcloud-node-kernelargs.yaml - extra_vars: - kernel_args: 'default_hugepagesz=1GB hugepagesz=1G hugepages=64 intel_iommu=on iommu=pt' - tuned_isolated_cores: '1-11,13-23' - tuned_profile: 'cpu-partitioning' - -.. _deploying-the-overcloud: - -Deploying the Overcloud ------------------------ - -This example assumes that the baremetal provision configuration file has the -filename ``~/overcloud_baremetal_deploy.yaml`` and the resulting deployed -server environment file is ``~/overcloud-baremetal-deployed.yaml``. It also -assumes overcloud networks are pre-deployed using the ``openstack overcloud -network provision`` command and the deployed networks environment file is -``~/overcloud-networks-deployed.yaml``. - -The baremetal nodes are provisioned with the following command:: - - openstack overcloud node provision \ - --stack overcloud \ - --network-config \ - --output ~/overcloud-baremetal-deployed.yaml \ - ~/overcloud_baremetal_deploy.yaml - -.. note:: Removing the ``--network-config`` argument will disable the management - of non-VIF networks and post node provisioning network configuration - with os-net-config via ansible. - -The overcloud can then be deployed using the output from the provision command:: - - openstack overcloud deploy \ - -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-environment.yaml \ - -e ~/overcloud-networks-deployed.yaml \ - -e ~/templates/vips-deployed-environment.yaml \ - -e ~/overcloud-baremetal-deployed.yaml \ - --deployed-server \ - --disable-validations \ # optional, see note below - # other CLI arguments - -.. note:: - The validation which is part of `openstack overcloud node - provision` may fail with the default overcloud image unless the - Ironic node has more than 4 GB of RAM. For example, a VBMC node - provisioned with 4096 MB of memory failed because the image size - plus the reserved RAM size were not large enough (Image size: 4340 - MiB, Memory size: 3907 MiB). - -Viewing Provisioned Node Details --------------------------------- - -The commands ``baremetal node list`` and ``baremetal node show`` continue to -show the details of all nodes, however there are some new commands which show a -further view of the provisioned nodes. - -The `metalsmith`_ tool provides a unified view of provisioned nodes, along with -allocations and neutron ports. This is similar to what Nova provides when it -is managing baremetal nodes using the Ironic driver. To list all nodes -managed by metalsmith, run:: - - metalsmith list - -The baremetal allocation API keeps an association of nodes to hostnames, -which can be seen by running:: - - baremetal allocation list - -The allocation record UUID will be the same as the Instance UUID for the node -which is allocated. The hostname can be seen in the allocation record, but it -can also be seen in the ``baremetal node show`` property -``instance_info``, ``display_name``. - - -Scaling the Overcloud ---------------------- - -Scaling Up -^^^^^^^^^^ - -To scale up an existing overcloud, edit ``~/overcloud_baremetal_deploy.yaml`` -to increment the ``count`` in the roles to be scaled up (and add any desired -``instances`` entries) then repeat the :ref:`deploying-the-overcloud` steps. - -.. _scaling-down: - -Scaling Down -^^^^^^^^^^^^ - -Scaling down is done with the ``openstack overcloud node delete`` command but -the nodes to delete are not passed as command arguments. - -To scale down an existing overcloud edit -``~/overcloud_baremetal_deploy.yaml`` to decrement the ``count`` in the roles -to be scaled down, and also ensure there is an ``instances`` entry for each -node being unprovisioned which contains the following: - -* The ``name`` of the baremetal node to remove from the overcloud - -* The ``hostname`` which is assigned to that node - -* A ``provisioned: false`` property - -* A YAML comment explaining the reason for making the node unprovisioned (optional) - -For example the following would remove ``overcloud-compute-1`` - -.. code-block:: yaml - - - name: Compute - count: 1 - instances: - - hostname: overcloud-compute-0 - name: node10 - # Removed from deployment due to disk failure - provisioned: false - - hostname: overcloud-compute-1 - name: node11 - -Then the delete command will be called with ``--baremetal-deployment`` -instead of passing node arguments:: - - openstack overcloud node delete \ - --stack overcloud \ - --baremetal-deployment ~/overcloud_baremetal_deploy.yaml - -Before any node is deleted, a list of nodes to delete is displayed -with a confirmation prompt. - -What to do when scaling back up depends on the situation. If the scale-down -was to temporarily remove baremetal which is later restored, then the -scale-up can increment the ``count`` and set ``provisioned: true`` on nodes -which were previously ``provisioned: false``. If that baremetal node is not -going to be re-used in that role then the ``provisioned: false`` can remain -indefinitely and the scale-up can specify a new ``instances`` entry, for -example - -.. code-block:: yaml - - - name: Compute - count: 2 - instances: - - hostname: overcloud-compute-0 - name: node10 - # Removed from deployment due to disk failure - provisioned: false - - hostname: overcloud-compute-1 - name: node11 - - hostname: overcloud-compute-2 - name: node12 - - -Unprovisioning All Nodes -^^^^^^^^^^^^^^^^^^^^^^^^ - -After ``openstack overcloud delete`` is called, all of the baremetal nodes -can be unprovisioned without needing to edit -``~/overcloud_baremetal_deploy.yaml`` by running the unprovision command with -the ``--all`` argument:: - - openstack overcloud node unprovision --all \ - --stack overcloud \ - --network-ports \ - ~/overcloud_baremetal_deploy.yaml - -.. note:: Removing the ``--network-ports`` argument will disable the management - of non-VIF networks, non-VIF ports will _not_ be deleted in that - case. - -.. _metalsmith: https://docs.openstack.org/metalsmith/ - -.. _cloud-config: https://cloudinit.readthedocs.io/en/latest/topics/examples.html - -.. _instance-data: https://cloudinit.readthedocs.io/en/latest/topics/instancedata.html diff --git a/deploy-guide/source/provisioning/bios_settings.rst b/deploy-guide/source/provisioning/bios_settings.rst deleted file mode 100644 index 7501c236..00000000 --- a/deploy-guide/source/provisioning/bios_settings.rst +++ /dev/null @@ -1,51 +0,0 @@ -BIOS Settings -============= - -Tripleo can support BIOS configuration for bare metal nodes via node manual -:doc:`cleaning`. Several commands are added to allow administrator to apply -and reset BIOS settings. - -Apply BIOS settings -------------------- - -#. To apply given BIOS configuration to all manageable nodes:: - - openstack overcloud node bios configure --configuration <..> --all-manageable - -#. To apply given BIOS configuration to specified nodes:: - - openstack overcloud node bios configure --configuration <..> node_uuid1 node_uuid2 .. - -The configuration parameter passed to above commands must be YAML/JSON string -or a file name which contains YAML/JSON string of BIOS settings, for example:: - - { - "settings": [ - { - "name": "setting name", - "value": "setting value" - }, - { - "name": "setting name", - "value": "setting value" - }, - .. - ] - } - -With the parameter ``--all-manageable``, the command applies given BIOS -settings to all manageable nodes. - -With the parameter ``node_uuid1 node_uuid2``, the command applies given BIOS -settings to nodes which uuid equal to ``node_uuid1`` and ``node_uuid2``. - -Reset BIOS settings -------------------- - -#. To reset the BIOS configuration to factory default on specified nodes:: - - openstack overcloud node bios reset --all-manageable - -#. To reset the BIOS configuration on specified nodes:: - - openstack overcloud node bios reset node_uuid1 node_uuid2 .. diff --git a/deploy-guide/source/provisioning/cleaning.rst b/deploy-guide/source/provisioning/cleaning.rst deleted file mode 100644 index a56874e9..00000000 --- a/deploy-guide/source/provisioning/cleaning.rst +++ /dev/null @@ -1,58 +0,0 @@ -Node cleaning -============= - -In Ironic *cleaning* is a process of preparing a bare metal node for -provisioning. There are two types of cleaning: *automated* and *manual*. -See `cleaning documentation -`_ for more -details. - -.. warning:: - It is highly recommended to at least wipe metadata (partitions and - partition table(s)) from all disks before deployment. - -Automated cleaning ------------------- - -*Automated cleaning* runs before a node gets to the ``available`` state (see -:doc:`node_states` for more information on provisioning states). It happens -after the first enrollment and after every unprovisioning. - -In the TripleO undercloud automated cleaning is **disabled** by default. -Starting with the Ocata release, it can be enabled by setting the following -option in your ``undercloud.conf``: - -.. code-block:: ini - - [DEFAULT] - clean_nodes = True - -Alternatively, you can use `Manual cleaning`_ as described below. - -Manual cleaning ---------------- - -*Manual cleaning* is run on request for nodes in the ``manageable`` state. - -If you have *automated cleaning* disabled, you can use the following procedure -to wipe the node's metadata starting with the Rocky release: - -#. If the node is not in the ``manageable`` state, move it there:: - - baremetal node manage - -#. Run manual cleaning on a specific node:: - - openstack overcloud node clean - - or all manageable nodes:: - - openstack overcloud node clean --all-manageable - -#. Make the node available again:: - - openstack overcloud node provide - - or provide all manageable nodes:: - - openstack overcloud node provide --all-manageable diff --git a/deploy-guide/source/provisioning/index.rst b/deploy-guide/source/provisioning/index.rst deleted file mode 100644 index 0423ad05..00000000 --- a/deploy-guide/source/provisioning/index.rst +++ /dev/null @@ -1,22 +0,0 @@ -Baremetal Node Configuration -============================ - -Documentation on how to do advanced configuration of baremetal nodes in -|project|. - -.. toctree:: - - node_states - cleaning - bios_settings - node_discovery - root_device - introspect_single_node - profile_matching - node_placement - ready_state - introspection_data - whole_disk_images - uefi_boot - ansible_deploy_interface - baremetal_provision \ No newline at end of file diff --git a/deploy-guide/source/provisioning/introspect_single_node.rst b/deploy-guide/source/provisioning/introspect_single_node.rst deleted file mode 100644 index 65397ffd..00000000 --- a/deploy-guide/source/provisioning/introspect_single_node.rst +++ /dev/null @@ -1,28 +0,0 @@ -Introspecting a Single Node -=========================== - -In addition to bulk introspection, you can also introspect nodes one by one. -When doing so, you must take care to set the correct node states manually. -Use ``baremetal node show UUID`` command to figure out whether nodes -are in ``manageable`` or ``available`` state. For all nodes in ``available`` -state, start with putting a node to ``manageable`` state (see -:doc:`node_states` for details):: - - baremetal node manage - -Then you can run introspection:: - - baremetal introspection start UUID - -This command won't poll for the introspection result, use the following command -to check the current introspection state:: - - baremetal introspection status UUID - -Repeat it for every node until you see ``True`` in the ``finished`` field. -The ``error`` field will contain an error message if introspection failed, -or ``None`` if introspection succeeded for this node. - -Do not forget to make nodes available for deployment afterwards:: - - baremetal node provide diff --git a/deploy-guide/source/provisioning/introspection_data.rst b/deploy-guide/source/provisioning/introspection_data.rst deleted file mode 100644 index 344d7e19..00000000 --- a/deploy-guide/source/provisioning/introspection_data.rst +++ /dev/null @@ -1,172 +0,0 @@ -.. _introspection_data: - -Accessing Introspection Data ----------------------------- - -Every introspection run (as described in -:doc:`../deployment/install_overcloud`) collects a lot of facts about -the hardware and puts them as JSON in Swift. Starting with -``python-ironic-inspector-client`` version 1.4.0 there is a command to retrieve -this data:: - - baremetal introspection data save - -You can provide a ``--file`` argument to save the data in a file instead of -displaying it. - -If you don't have a new enough version of ``python-ironic-inspector-client``, -you can use cURL to access the API:: - - token=$(openstack token issue -f value -c id) - curl -H "X-Auth-Token: $token" http://127.0.0.1:5050/v1/introspection//data - -Accessing raw additional data -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Extra hardware data can be collected using the python-hardware_ library. If -you have enabled this, by setting ``inspection_extras`` to ``True`` in your -``undercloud.conf`` (enabled by default starting with the Mitaka release), -then even more data is available. - -The command above will display it in a structured format under the ``extra`` -key in the resulting JSON object. This format is suitable for using in -the **ironic-inspector** introspection rules (see e.g. -:ref:`auto-profile-tagging`). However, if you want to access it in its -original format (list of lists instead of nested objects), you can query -Swift for it directly. - -The Swift container name is ``ironic-inspector``, which can be modified in -**/etc/ironic-inspector/inspector.conf**. The Swift object is called -``extra_hardware-`` where ```` is a node UUID. In the default -configuration you have to use the ``service`` tenant to access this object. - -As an example, to download the Swift data for all nodes to a local directory -and use that to collect a list of node mac addresses:: - - # You will need the ironic-inspector user password - # from the [swift] section of /etc/ironic-inspector/inspector.conf: - export IRONIC_INSPECTOR_PASSWORD=xxxxxx - - # Download the extra introspection data from swift: - for node in $(baremetal node list -f value -c UUID); - do swift -U service:ironic -K $IRONIC_INSPECTOR_PASSWORD download ironic-inspector extra_hardware-$node; - done - - # Use jq to access the local data - for example gather macs: - for f in extra_hardware-*; - do cat $f | jq -r 'map(select(.[0]=="network" and .[2]=="serial"))'; - done - -Running benchmarks -~~~~~~~~~~~~~~~~~~ - -Benchmarks for CPU, memory and hard drive can be run during the introspection -process. However, they are time consuming, and thus are disabled by default. -To enable benchmarks set ``inspection_runbench`` to ``true`` in the -``undercloud.conf`` (also requires ``inspection_extras`` set to ``true``), -then (re)run ``openstack undercloud install``. - -Extra data examples -~~~~~~~~~~~~~~~~~~~ - -Here is an example of CPU extra data, including benchmark results:: - - $ baremetal introspection data save | jq '.extra.cpu' - { - "physical": { - "number": 1 - }, - "logical": { - "number": 1, - "loops_per_sec": 636 - }, - "logical_0": { - "bandwidth_4K": 3657, - "bandwidth_1G": 6775, - "bandwidth_128M": 8353, - "bandwidth_2G": 7221, - "loops_per_sec": 612, - "bogomips": "6983.57", - "bandwidth_1M": 10781, - "bandwidth_16M": 9808, - "bandwidth_1K": 1204, - "cache_size": "4096KB" - }, - "physical_0": - { - "physid": 400, - "product": "QEMU Virtual CPU version 2.3.0", - "enabled_cores": 1, - "vendor": "Intel Corp.", - "threads": 1, - "flags": "fpu fpu_exception wp de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx x86-64 rep_good nopl pni cx16 x2apic hypervisor lahf_lm abm", - "version": "RHEL 7.2.0 PC (i440FX + PIIX, 1996)", - "frequency": 2e+09, - "cores": 1 - } - } - -Here is an example of disk extra data, including benchmark results:: - - $ baremetal introspection data save | jq '.extra.disk' - { - "logical": { - "count": 1 - }, - "sda": { - "SMART/Raw_Read_Error_Rate(1)/value": 100, - "SMART/Spin_Up_Time(3)/thresh": 0, - "model": "QEMU HARDDISK", - "SMART/Power_Cycle_Count(12)/when_failed": "NEVER", - "SMART/Reallocated_Sector_Ct(5)/worst": 100, - "SMART/Power_Cycle_Count(12)/raw": 0, - "standalone_read_1M_KBps": 1222758, - "SMART/Power_On_Hours(9)/worst": 100, - "Read Cache Disable": 0, - "SMART/Power_On_Hours(9)/raw": 1, - "rotational": 1, - "SMART/Start_Stop_Count(4)/thresh": 20, - "SMART/Start_Stop_Count(4)/raw": 100, - "SMART/Power_Cycle_Count(12)/thresh": 0, - "standalone_randread_4k_KBps": 52491, - "physical_block_size": 512, - "SMART/Reallocated_Sector_Ct(5)/value": 100, - "SMART/Reallocated_Sector_Ct(5)/when_failed": "NEVER", - "SMART/Power_Cycle_Count(12)/value": 100, - "SMART/Spin_Up_Time(3)/when_failed": "NEVER", - "size": 44, - "SMART/Power_On_Hours(9)/thresh": 0, - "id": "ata-QEMU_HARDDISK_QM00005", - "SMART/Reallocated_Sector_Ct(5)/raw": 0, - "SMART/Raw_Read_Error_Rate(1)/when_failed": "NEVER", - "SMART/Airflow_Temperature_Cel(190)/worst": 69, - "SMART/Airflow_Temperature_Cel(190)/when_failed": "NEVER", - "SMART/Spin_Up_Time(3)/value": 100, - "standalone_read_1M_IOps": 1191, - "SMART/Airflow_Temperature_Cel(190)/thresh": 50, - "SMART/Power_On_Hours(9)/when_failed": "NEVER", - "SMART/firmware_version": "2.3.0", - "optimal_io_size": 0, - "SMART/Raw_Read_Error_Rate(1)/thresh": 6, - "SMART/Raw_Read_Error_Rate(1)/raw": 0, - "SMART/Raw_Read_Error_Rate(1)/worst": 100, - "SMART/Power_Cycle_Count(12)/worst": 100, - "standalone_randread_4k_IOps": 13119, - "rev": 0, - "SMART/Start_Stop_Count(4)/worst": 100, - "SMART/Start_Stop_Count(4)/when_failed": "NEVER", - "SMART/Spin_Up_Time(3)/worst": 100, - "SMART/Reallocated_Sector_Ct(5)/thresh": 36, - "SMART/device_model": "QEMU HARDDISK", - "SMART/Airflow_Temperature_Cel(190)/raw": " 31 (Min/Max 31/31)", - "SMART/Start_Stop_Count(4)/value": 100, - "SMART/Spin_Up_Time(3)/raw": 16, - "Write Cache Enable": 1, - "vendor": "ATA", - "SMART/serial_number": "QM00005", - "SMART/Power_On_Hours(9)/value": 100, - "SMART/Airflow_Temperature_Cel(190)/value": 69 - } - } - -.. _python-hardware: https://github.com/redhat-cip/hardware diff --git a/deploy-guide/source/provisioning/node_discovery.rst b/deploy-guide/source/provisioning/node_discovery.rst deleted file mode 100644 index 98b7da7e..00000000 --- a/deploy-guide/source/provisioning/node_discovery.rst +++ /dev/null @@ -1,147 +0,0 @@ -Node Discovery -============== - -As an alternative to creating an inventory file (``instackenv.json``) and -enrolling nodes from it, you can discover and enroll the nodes automatically. - -TripleO supports two approaches to the discovery process: - -* `Automatic enrollment of new nodes`_ -* `Scanning BMC range`_ - -Automatic enrollment of new nodes ---------------------------------- - -You can enable **ironic-inspector** to automatically enroll all unknown nodes -that boot the introspection ramdisk. See `ironic-inspector discovery -documentation`_ for more details on the process. - -Configuration -~~~~~~~~~~~~~ - -Set the following in your ``undercloud.conf`` before installing the undercloud: - -.. code-block:: ini - - enable_node_discovery = True - -Make sure to get (or build) and upload the introspection image, as described -in :doc:`../deployment/install_overcloud`. - -Basic usage -~~~~~~~~~~~ - -After the discovery is enabled, any node that boots the introspection ramdisk -and posts back to **ironic-inspector** will be enrolled in **ironic**. Make -sure the nodes are connected to the provisioning network, and default to -booting from PXE. Power them on using any available means (e.g. by pushing the -power button on them). - -New nodes appear in the ``enroll`` state by default and use the -``pxe_ipmitool`` driver (configurable via the ``discovery_default_driver`` -option in ``undercloud.conf``). You have to set the power credentials -for these nodes and make them available. See :doc:`node_states` for details. - -Using introspection rules -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Alternatively, you can use **ironic-inspector** introspection rules to -automatically set the power credentials based on certain properties. - -For example, to set the same credentials for all new nodes, you can use -the following rules: - -.. code-block:: json - - [ - { - "description": "Set default IPMI credentials", - "conditions": [ - {"op": "eq", "field": "data://auto_discovered", "value": true} - ], - "actions": [ - {"action": "set-attribute", "path": "driver_info/ipmi_username", - "value": "admin"}, - {"action": "set-attribute", "path": "driver_info/ipmi_password", - "value": "paSSw0rd"} - ] - } - ] - -To set specific credentials for a certain vendor, use something like: - -.. code-block:: json - - [ - { - "description": "Set default IPMI credentials", - "conditions": [ - {"op": "eq", "field": "data://auto_discovered", "value": true}, - {"op": "ne", "field": "data://inventory.system_vendor.manufacturer", - "value": "Dell Inc."} - ], - "actions": [ - {"action": "set-attribute", "path": "driver_info/ipmi_username", - "value": "admin"}, - {"action": "set-attribute", "path": "driver_info/ipmi_password", - "value": "paSSw0rd"} - ] - }, - { - "description": "Set the vendor driver for Dell hardware", - "conditions": [ - {"op": "eq", "field": "data://auto_discovered", "value": true}, - {"op": "eq", "field": "data://inventory.system_vendor.manufacturer", - "value": "Dell Inc."} - ], - "actions": [ - {"action": "set-attribute", "path": "driver", "value": "pxe_drac"}, - {"action": "set-attribute", "path": "driver_info/drac_username", - "value": "admin"}, - {"action": "set-attribute", "path": "driver_info/drac_password", - "value": "paSSw0rd"}, - {"action": "set-attribute", "path": "driver_info/drac_address", - "value": "{data[inventory][bmc_address]}"} - ] - } - ] - -The rules should be put to a file and uploaded to **ironic-inspector** before -the discovery process: - -.. code-block:: console - - baremetal introspection rule import /path/to/rules.json - -See :doc:`profile_matching` for more examples on introspection rules. - -.. _ironic-inspector discovery documentation: https://docs.openstack.org/ironic-inspector/usage.html#discovery - -Scanning BMC range ------------------- - -You can discover new nodes by scanning an IP range for accessible BMCs. -You need to provide a set of credentials to try, and optionally a list of -ports. Use the following command to run the scan: - -.. code-block:: console - - openstack overcloud node discover --range \ - --credentials --credentials - -Here, ```` is an IP range, e.g. ``10.0.0.0/24``. Credentials are -provided separated by a colon, e.g. ``root:calvin``. - -With this approach, new nodes end up in ``manageable`` state, and will already -have the deploy properties, such as deploy kernel/ramdisk, assigned. - -You can use the same command to introspect the nodes and make them available -for deployment: - -.. code-block:: console - - openstack overcloud node discover --range \ - --credentials --credentials \ - --introspect --provide - -The resulting node UUIDs will be printed on the screen. diff --git a/deploy-guide/source/provisioning/node_placement.rst b/deploy-guide/source/provisioning/node_placement.rst deleted file mode 100644 index 836fe717..00000000 --- a/deploy-guide/source/provisioning/node_placement.rst +++ /dev/null @@ -1,172 +0,0 @@ -Controlling Node Placement and IP Assignment -============================================ - -By default, nodes are assigned randomly via the Nova scheduler, either from -a generic pool of nodes, or from a subset of nodes identified via specific -profiles which are mapped to Nova flavors (See -:doc:`../environments/baremetal` and :doc:`./profile_matching` -for further information). - -However in some circumstances, you may wish to control node placement more -directly, which is possible by combining the same capabilities mechanism used -for per-profile placement with per-node scheduler hints. - - -Assign per-node capabilities ----------------------------- - -The first step is to assign a unique per-node capability which may be matched -by the Nova scheduler on deployment. - -This can either be done via the nodes json file when registering the nodes, or -alternatively via manual adjustment of the node capabilities, e.g:: - - baremetal node set --property capabilities='node:controller-0' - -This has assigned the capability ``node:controller-0`` to the node, and this -must be repeated (using a unique continuous index, starting from 0) for all -nodes. - -If this approach is used, all nodes for a given role (e.g Controller, Compute -or each of the Storage roles) must be tagged in the same way, or the Nova -scheduler will be unable to match the capabilities correctly. - -.. note:: Profile matching is redundant when precise node placement is used. - To avoid scheduling failures you should use the default "baremetal" - flavor for deployment in this case, not the flavors designed for - profile matching ("compute", "control", etc). - -Create an environment file with Scheduler Hints ------------------------------------------------ - -The next step is simply to create a heat environment file, which matches the -per-node capabilities created for each node above:: - - parameter_defaults: - ControllerSchedulerHints: - 'capabilities:node': 'controller-%index%' - -This is then passed via ``-e scheduler_hints_env.yaml`` to the overcloud -deploy command. - -The same approach is possible for each role via these parameters: - -* ControllerSchedulerHints -* ComputeSchedulerHints -* BlockStorageSchedulerHints -* ObjectStorageSchedulerHints -* CephStorageSchedulerHints - -For custom roles (defined via roles_data.yaml) the parameter will be named -RoleNameSchedulerHints, where RoleName is the name specified in roles_data.yaml. - -.. note:: - - Previously the parameter for Compute nodes was named - `NovaComputeSchedulerHints`. If - you are updating a deployment which used the old parameter, all - values previously passed to `NovaComputeSchedulerHints` should be - passed to `ComputeSchedulerHints` instead, and - `NovaComputeSchedulerHints: {}` should be explicitly set in - `parameter_defaults`, to ensure that values from the old parameter - will not be used anymore. - -Custom Hostnames ----------------- - -In combination with the custom placement configuration above, it is also -possible to assign a specific baremetal node a custom hostname. This may -be used to denote where a system is located (e.g. rack2-row12), to make -the hostname match an inventory identifier, or any other situation where -a custom hostname is desired. - -To customize node hostnames, the ``HostnameMap`` parameter can be used. For -example:: - - parameter_defaults: - HostnameMap: - overcloud-controller-0: overcloud-controller-prod-123-0 - overcloud-controller-1: overcloud-controller-prod-456-0 - overcloud-controller-2: overcloud-controller-prod-789-0 - overcloud-novacompute-0: overcloud-novacompute-prod-abc-0 - -The environment file containing this configuration would then be passed to -the overcloud deploy command using ``-e`` as with all environment files. - -Note that the ``HostnameMap`` is global to all roles, and is not a top-level -Heat template parameter so it must be passed in the ``parameter_defaults`` -section. The first value in the map (e.g. ``overcloud-controller-0``) is the -hostname that Heat would assign based on the HostnameFormat parameters. The -second value (e.g. ``overcloud-controller-prod-123-0``) is the desired custom -hostname for that node. - -.. _predictable_ips: - -Predictable IPs ---------------- - -For further control over the resulting environment, overcloud nodes can be -assigned a specific IP on each network as well. This is done by -editing ``environments/ips-from-pool-all.yaml`` in tripleo-heat-templates. -Be sure to make a local copy of ``/usr/share/openstack-tripleo-heat-templates`` -before making changes so the packaged files are not altered, as they will -be overwritten if the package is updated. - -The parameter_defaults section in ``ips-from-pool-all.yaml``, is where the IP -addresses are assigned. Each node type has an associated parameter - -ControllerIPs for Controller nodes, ComputeIPs for Compute nodes, etc. Each -parameter is a map of network names to a list of addresses. Each network type -must have at least as many addresses as there will be nodes on that network. -The addresses will be assigned in order, so the first node of each type will -get the first address in each of the lists, the second node will get the second -address in each of the lists, and so on. - -For example, if three Ceph storage nodes were being deployed, the CephStorageIPs -parameter might look like:: - - CephStorageIPs: - storage: - - 172.16.1.100 - - 172.16.1.101 - - 172.16.1.102 - storage_mgmt: - - 172.16.3.100 - - 172.16.3.101 - - 172.16.3.102 - -The first Ceph node would have two addresses: 172.16.1.100 and 172.16.3.100. The -second would have 172.16.1.101 and 172.16.3.101, and the third would have -172.16.1.102 and 172.16.3.102. The same pattern applies to the other node types. - -.. important:: - Even if an overcloud node is deleted, its entry in the IP lists should - *not* be removed. The IP list is based on the underlying Heat indices, - which do not change even if nodes are deleted. To indicate that a given - entry in the list is no longer used, the IP value can be replaced with a - value such as "DELETED" or "UNUSED". - - In short, entries should never be removed from the IP lists, only changed - or added. - -To apply this configuration during a deployment, pass the environment file to the -deploy command. For example, if you copied tripleo-heat-templates to ~/my-templates, -the extra parameter would look like:: - - -e ~/my-templates/environments/ips-from-pool-all.yaml - -Predictable Virtual IPs ------------------------ - -You can also assign predictable Virtual IPs (VIPs) for services. To accomplish this, -edit the network environment file and add the VIP parameters in the -parameter_defaults section, for example:: - - ControlFixedIPs: [{'ip_address':'192.168.201.101'}] - InternalApiVirtualFixedIPs: [{'ip_address':'172.16.0.9'}] - PublicVirtualFixedIPs: [{'ip_address':'10.1.1.9'}] - StorageVirtualFixedIPs: [{'ip_address':'172.16.1.9'}] - StorageMgmtVirtualFixedIPs: [{'ip_address':'172.16.3.9'}] - RedisVirtualFixedIPs: [{'ip_address':'172.16.0.8'}] - -These IPs MUST come from outside their allocation range to prevent conflicts. -Do not use these parameters if deploying with an external load balancer. diff --git a/deploy-guide/source/provisioning/node_states.rst b/deploy-guide/source/provisioning/node_states.rst deleted file mode 100644 index e3f89970..00000000 --- a/deploy-guide/source/provisioning/node_states.rst +++ /dev/null @@ -1,54 +0,0 @@ -Bare Metal Node States -====================== - -This document provides a brief explanation of the bare metal node states that -TripleO uses or might use. Please refer to `the Ironic documentation -`_ for more details. - -enroll ------- - -In a typical Ironic workflow nodes begin their life in a state called ``enroll``. -Nodes in this state are not available for deployment, nor for most of other -actions. Ironic does not touch such nodes in any way. - -In the TripleO workflow the nodes start their life in the ``manageable`` state -and only see the ``enroll`` state if their power management fails to validate:: - - openstack overcloud import instackenv.json - -Nodes can optionally be introspected in this step by passing the --provide flag -which will progress them through the manageable_ state and eventually to -the available_ state ready for deployment. - -manageable ----------- - -To make nodes alive an operator uses ``manage`` provisioning action to move -nodes to ``manageable`` state. During this transition the power and management -credentials (IPMI, SSH, etc) are validated to ensure that nodes in -``manageable`` state are actually manageable by Ironic. This state is still not -available for deployment. With nodes in this state an operator can execute -various pre-deployment actions, such as introspection, RAID configuration, etc. -So to sum it up, nodes in ``manageable`` state are being configured before -exposing them into the cloud. - -The ``manage`` action -can be used to bring nodes from enroll_ to ``manageable`` or nodes already -moved to available_ state back to ``manageable`` for configuration:: - - baremetal node manage - -available ---------- - -The last step before the deployment is to make nodes ``available`` using the -``provide`` provisioning action. Such nodes are exposed to nova, and can be -deployed to at any moment. No long-running configuration actions should be run -in this state. - -.. note:: - Nodes which failed introspection stay in ``manageable`` state and must be - reintrospected or made ``available`` manually:: - - baremetal node provide diff --git a/deploy-guide/source/provisioning/profile_matching.rst b/deploy-guide/source/provisioning/profile_matching.rst deleted file mode 100644 index 721b97de..00000000 --- a/deploy-guide/source/provisioning/profile_matching.rst +++ /dev/null @@ -1,188 +0,0 @@ -Node matching with resource classes and profiles -================================================ - -The `Baremetal Provision Configuration`_ describes all of the instance and -defaults properties which can be used as selection criteria for which node will -be assigned to a provisioned instance. Filtering on the ``resource_class`` property -is recommended for nodes which have special hardware for specific roles. The -``profile`` property is recommended for other matching requirements such as -placing specific roles to groups of nodes, or assigning instances to nodes based -on introspection data. - -Resource class matching ------------------------ - -As an example of matching on special hardware, this shows how to have a custom -``Compute`` role for PMEM equipped hardware, see :doc:`../features/compute_nvdimm`. - -By default all nodes are assigned the ``resource_class`` of ``baremetal``. Each -node which is PMEM enabled needs to have its ``resource_class`` changed to -``baremetal.PMEM``:: - - baremetal node set --resource-class baremetal.PMEM - -Assuming there is a custom role called ``ComputePMEM``, the -``~/overcloud_baremetal_deploy.yaml`` file will match on ``baremetal.PMEM`` -nodes with: - -.. code-block:: yaml - - - name: ComputePMEM - count: 3 - defaults: - resource_class: baremetal.PMEM - -Advanced profile matching -------------------------- -Profile matching allows a user to specify precisely which nodes provision with each -role (or instance). Here are additional setup steps to take advantage of the -profile matching. In this document ``profile`` is a capability that is assigned to -the ironic node, then matched in the ``openstack overcloud node provision`` yaml. - -After profile is specified in ``~/overcloud_baremetal_deploy.yaml``, metalsmith -will only deploy it on ironic nodes with the same profile. Deployment will fail -if not enough ironic nodes are tagged with a profile. - -There are two ways to assign a profile to a node. You can assign it directly -or specify one or many suitable profiles for the deployment command to choose -from. It can be done either manually or using the introspection rules. - -Manual profile tagging -~~~~~~~~~~~~~~~~~~~~~~ - -To assign a profile to a node directly, issue the following command:: - - baremetal node set --property capabilities=profile: - -To clean all profile information from a node use:: - - baremetal node unset --property capabilities - -.. note:: - We can not update only a single key from the capabilities dictionary, so if - it contained more then just the profile information then this will need to - be set for the node. - -Also see :ref:`instackenv` for details on how to set profile in the -``instackenv.json`` file. - -.. _auto-profile-tagging: - -Automated profile tagging -~~~~~~~~~~~~~~~~~~~~~~~~~ - -`Introspection rules`_ can be used to conduct automatic profile assignment -based on data received from the introspection ramdisk. A set of introspection -rules should be created before introspection that either set ``profile`` or -``_profile`` capabilities on a node. - -The exact structure of data received from the ramdisk depends on both ramdisk -implementation and enabled plugins, and on enabled *ironic-inspector* -processing hooks. The most basic properties are ``cpus``, ``cpu_arch``, -``local_gb`` and ``memory_mb``, which represent CPU number, architecture, -local hard drive size in GiB and RAM size in MiB. See -:ref:`introspection_data` for more details on what our current ramdisk -provides. - -Create a JSON file, for example ``rules.json``, with the introspection rules -to apply (see `Example of introspection rules`_). Before the introspection -load this file into *ironic-inspector*:: - - baremetal introspection rule import /path/to/rules.json - -Then (re)start the introspection. Check assigned profiles using command:: - - baremetal node list -c uuid -c name -c properties - -If you've made a mistake in introspection rules, you can delete them all:: - - baremetal introspection rule purge - -Then reupload the updated rules file and restart introspection. - -.. note:: - When you use introspection rules to assign the ``profile`` capability, it - will always override the existing value. On the contrary, - ``_profile`` capabilities are ignored for nodes with the existing - ``profile`` capability. - -Example of introspection rules -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Imagine we have the following hardware: with disk sizes > 1 TiB -for object storage and with smaller disks for compute and controller nodes. -We also need to make sure that no hardware with seriously insufficient -properties gets to the fleet at all. - -:: - - [ - { - "description": "Fail introspection for unexpected nodes", - "conditions": [ - {"op": "lt", "field": "memory_mb", "value": 4096} - ], - "actions": [ - {"action": "fail", "message": "Memory too low, expected at least 4 GiB"} - ] - }, - { - "description": "Assign profile for object storage", - "conditions": [ - {"op": "ge", "field": "local_gb", "value": 1024} - ], - "actions": [ - {"action": "set-capability", "name": "profile", "value": "swift-storage"} - ] - }, - { - "description": "Assign possible profiles for compute and controller", - "conditions": [ - {"op": "lt", "field": "local_gb", "value": 1024}, - {"op": "ge", "field": "local_gb", "value": 40} - ], - "actions": [ - {"action": "set-capability", "name": "compute_profile", "value": "1"}, - {"action": "set-capability", "name": "control_profile", "value": "1"}, - {"action": "set-capability", "name": "profile", "value": null} - ] - } - ] - -This example consists of 3 rules: - -#. Fail introspection if memory is lower is 4096 MiB. Such rules can be - applied to exclude nodes that should not become part of your cloud. - -#. Nodes with hard drive size 1 TiB and bigger are assigned the - ``swift-storage`` profile unconditionally. - -#. Nodes with hard drive less than 1 TiB but more than 40 GiB can be either - compute or control nodes. So we assign two capabilities ``compute_profile`` - and ``control_profile``, so that the ``openstack overcloud node provision`` - command can later make the final choice. For that to work, we remove the - existing ``profile`` capability, otherwise it will have priority. - -#. Other nodes are not changed. - -Provision with profile matching -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Assuming nodes have been assigned the profiles ``control_profile`` and -``compute_profile``, the ``~/overcloud_baremetal_deploy.yaml`` can be modified -with the following to match profiles during ``openstack overcloud node -provision``: - -.. code-block:: yaml - - - name: Controller - count: 3 - defaults: - profile: control_profile - - name: Compute - count: 100 - defaults: - profile: compute_profile - -.. _Introspection rules: https://docs.openstack.org/ironic-inspector/usage.html#introspection-rules -.. _Baremetal Provision Configuration: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/provisioning/baremetal_provision.html#baremetal-provision-configuration diff --git a/deploy-guide/source/provisioning/ready_state.rst b/deploy-guide/source/provisioning/ready_state.rst deleted file mode 100644 index 460a0617..00000000 --- a/deploy-guide/source/provisioning/ready_state.rst +++ /dev/null @@ -1,31 +0,0 @@ -Ready-state configuration -========================= - -.. note:: Ready-state configuration currently works only with Dell DRAC - machines. - -Ready-state configuration can be used to prepare bare-metal resources for -deployment. It includes BIOS configuration based on a predefined profile. - - -Define the target BIOS configuration ------------------------------------- - -To define a BIOS setting, list the name of the setting and its target -value for each profile:: - - { - "compute" :{ - "bios_settings": {"ProcVirtualization": "Enabled"} - } - } - - -Trigger the ready-state configuration -------------------------------------- - -Make sure the nodes have profiles assigned as described in -:doc:`profile_matching`. Create a JSON file with the target ready-state -configuration for each profile. Then trigger the configuration:: - - baremetal configure ready state ready-state.json diff --git a/deploy-guide/source/provisioning/root_device.rst b/deploy-guide/source/provisioning/root_device.rst deleted file mode 100644 index edb9621d..00000000 --- a/deploy-guide/source/provisioning/root_device.rst +++ /dev/null @@ -1,106 +0,0 @@ -.. _root_device: - -Setting the Root Device for Deployment --------------------------------------- - -If your hardware has several hard drives, it's highly recommended that you -specify the exact device to be used during introspection and deployment -as a root device. This is done by setting a ``root_device`` property on the -node in Ironic. Please refer to the `Ironic root device hints documentation`_ -for more details. - -For example:: - - baremetal node set --property root_device='{"wwn": "0x4000cca77fc4dba1"}' - -To remove a hint and fallback to the default behavior:: - - baremetal node unset --property root_device - -Note that the root device hints should be assigned *before* both introspection -and deployment. After changing the root device hints you should either re-run -introspection or manually fix the ``local_gb`` property for a node:: - - baremetal node set --property local_gb= - -Where the new value is calculated as a real disk size in GiB minus 1 GiB to -account for partitioning (the introspection process does this calculation -automatically). - -Setting root device hints automatically -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Starting with the Newton release it is possible to autogenerate root -device hints for all nodes instead of setting them one by one. Pass the -``--root-device`` argument to the ``openstack overcloud node -configure`` **after a successful introspection**. This argument can -accept a device list in the order of preference, for example:: - - openstack overcloud node configure --all-manageable --root-device=sdb,sdc,vda - -It can also accept one of two strategies: ``smallest`` will pick the smallest -device, ``largest`` will pick the largest one. By default only disk devices -larger than 4 GiB are considered at all, set the ``--root-device-minimum-size`` -argument to change. - -.. note:: - Subsequent runs of this command on the same set of nodes does nothing, - as root device hints are already recorded on nodes and are not overwritten. - If you want to change existing root device hints, first remove them manually - as described above. - -.. note:: - This command relies on introspection data, so if you change disk devices on - the machines, introspection must be rerun before rerunning this command. - -Using introspection data to find the root device -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you don't know the information required to make a choice, you can use -introspection to figure it out. First start with :ref:`introspection` as usual -without setting any root device hints. Then use the stored introspection data -to list all disk devices:: - - baremetal introspection data save fdf975ae-6bd7-493f-a0b9-a0a4667b8ef3 | jq '.inventory.disks' - -For **python-ironic-inspector-client** versions older than 1.4.0 you can use -the ``curl`` command instead, see :ref:`introspection_data` for details. - -This command will yield output similar to the following (some fields are empty -for a virtual node):: - - [ - { - "size": 11811160064, - "rotational": true, - "vendor": "0x1af4", - "name": "/dev/vda", - "wwn_vendor_extension": null, - "wwn_with_extension": null, - "model": "", - "wwn": null, - "serial": null - }, - { - "size": 11811160064, - "rotational": true, - "vendor": "0x1af4", - "name": "/dev/vdb", - "wwn_vendor_extension": null, - "wwn_with_extension": null, - "model": "", - "wwn": null, - "serial": null - } - ] - -You can use all these fields, except for ``rotational``, for the root device -hints. Note that ``size`` should be converted to GiB and that ``name``, -``wwn_with_extension`` and ``wwn_vendor_extension`` can only be used starting -with the Mitaka release. Also note that the ``name`` field, while convenient, -`may be unreliable and change between boots -`_. - -Do not forget to re-run the introspection after setting the root device hints. - -.. _Ironic root device hints documentation: https://docs.openstack.org/ironic/latest/install/advanced.html#specifying-the-disk-for-deployment-root-device-hints diff --git a/deploy-guide/source/provisioning/uefi_boot.rst b/deploy-guide/source/provisioning/uefi_boot.rst deleted file mode 100644 index 0efee34c..00000000 --- a/deploy-guide/source/provisioning/uefi_boot.rst +++ /dev/null @@ -1,73 +0,0 @@ -Booting in UEFI mode -==================== - -TripleO supports booting overcloud nodes in UEFI_ mode instead of the default -BIOS mode. This is required to use advanced features like *secure boot* (not -covered by this guide), and some hardware may only feature UEFI support. - -Configuring nodes ------------------ - -Depending on the driver, nodes have to be put in the UEFI mode manually or the -driver can put them in it. For example, manual configuration is required for -``ipmi`` (including ``pxe_ipmitool``) and ``idrac`` (including ``pxe_drac``) -drivers, while ``ilo`` (including ``pxe_ilo``) and ``irmc`` (starting with -the Queens release) drivers can set boot mode automatically. - -Independent of the driver, you have to configure the UEFI mode manually, if -you want introspection to run in it. - -Manual configuration is usually done by entering node's *system setup* and -changing boot setting there. - -Introspection -------------- - -The introspection process is flexible enough to automatically detect the boot -mode of the node. The only requirement is iPXE: TripleO currently does not -support using PXE with UEFI. Make sure the following options are enabled -in your ``undercloud.conf`` (they are on by default): - -.. code-block:: ini - - ipxe_enabled = True - -Then you can run introspection as usual. - -Deployment ----------- - -Starting with the Pike release, the introspection process configures bare -metal nodes to run in the same boot mode as it was run in. For example, if -introspection was run on nodes in UEFI mode, **ironic-inspector** will -configure introspected nodes to deploy in UEFI mode as well. - -Here is how the ``properties`` field looks for nodes configured in BIOS mode:: - - $ baremetal node show -f value -c properties - {u'capabilities': u'profile:compute,boot_mode:bios', u'memory_mb': u'6144', u'cpu_arch': u'x86_64', u'local_gb': u'49', u'cpus': u'1'} - -Note that ``boot_mode:bios`` capability is set. For a node in UEFI mode, it -will look like this:: - - $ baremetal node show -f value -c properties - {u'capabilities': u'profile:compute,boot_mode:uefi', u'memory_mb': u'6144', u'cpu_arch': u'x86_64', u'local_gb': u'49', u'cpus': u'1'} - -You can change the boot mode with the following command (required for UEFI -before the Pike release):: - - $ baremetal node set --property capabilities=profile:compute,boot_mode:uefi - -.. warning:: - Do not forget to copy all other capabilities, e.g. ``profile`` and - ``boot_option`` if present. - - -Finally, you may configure your flavors to explicitly request nodes that boot -in UEFI mode, for example:: - - $ openstack flavor set --property capabilities:boot_mode='uefi' compute - -Then proceed with the deployment as usual. - -.. _UEFI: https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface diff --git a/deploy-guide/source/provisioning/whole_disk_images.rst b/deploy-guide/source/provisioning/whole_disk_images.rst deleted file mode 100644 index 2f72821b..00000000 --- a/deploy-guide/source/provisioning/whole_disk_images.rst +++ /dev/null @@ -1,17 +0,0 @@ -Use whole disk images for overcloud ------------------------------------ - -By default, TripleO **overcloud-full** image is a *partition* image. Such images carry only the -root partition contents and no partition table. Alternatively, *whole disk* images can be used, -which carry all partitions, a partition table and a boot loader. - -Whole disk images can be built with **diskimage-builder** - see -`Ironic images documentation `_ -for details. Note that this does not affect **ironic-python-agent** images. - -Use the following command to treat **overcloud-full** as a whole disk image when uploading images:: - - openstack overcloud image upload --whole-disk - -In this case only ``overcloud-full.qcow2`` file is required, ``overcloud-full.initrd`` and -``overcloud-full.vmlinuz`` are not used. diff --git a/deploy-guide/source/repositories.rst b/deploy-guide/source/repositories.rst deleted file mode 100644 index f7d656ef..00000000 --- a/deploy-guide/source/repositories.rst +++ /dev/null @@ -1,34 +0,0 @@ -.. This should be changed to something more user-friendly like http://tripleo.org/tripleo-repos.rpm - -.. note:: - Python3 is required for current releases of OpenStack which is - supported on CentOS Stream 9. - -#. Download and install the python-tripleo-repos RPM from - the appropriate RDO repository - - .. admonition:: CentOS Stream 9 - :class: centos9 - - Current `Centos 9 RDO repository `_. - - .. code-block:: bash - - sudo dnf install -y https://trunk.rdoproject.org/centos9/component/tripleo/current/python3-tripleo-repos-.el9.noarch.rpm - - .. note:: - - tripleo-repos removes any repositories that it manages before each run. - This means all repositories must be specified in a single tripleo-repos - call. As an example, the correct way to install the current and ceph repos - is to run ``tripleo-repos current ceph``, not two separate calls. - -2. Run tripleo-repos to install the appropriate repositories. The option below - will enable the latest master TripleO packages, the latest promoted - packages for all other OpenStack services and dependencies and the latest - stable Ceph packages. There are other repository configurations available in - tripleo-repos, see its ``--help`` output for details. - - .. code-block:: bash - - sudo -E tripleo-repos current-tripleo-dev ceph diff --git a/deploy-guide/source/troubleshooting/index.rst b/deploy-guide/source/troubleshooting/index.rst deleted file mode 100644 index 8213494b..00000000 --- a/deploy-guide/source/troubleshooting/index.rst +++ /dev/null @@ -1,14 +0,0 @@ -Troubleshooting -=============== - -This section contains troubleshooting related topics for |project|. - -.. toctree:: - :maxdepth: 1 - - troubleshooting - troubleshooting-image-build - troubleshooting-log-and-status-capture - troubleshooting-nodes - troubleshooting-overcloud - troubleshooting-tripleo-heat-templates diff --git a/deploy-guide/source/troubleshooting/troubleshooting-image-build.rst b/deploy-guide/source/troubleshooting/troubleshooting-image-build.rst deleted file mode 100644 index 5d26438b..00000000 --- a/deploy-guide/source/troubleshooting/troubleshooting-image-build.rst +++ /dev/null @@ -1,16 +0,0 @@ -Troubleshooting Image Build ---------------------------- - -Images fail to build -^^^^^^^^^^^^^^^^^^^^ - -More space needed -^^^^^^^^^^^^^^^^^ - -Images are built in tmpfs by default, to speed up the builds. In case -your machine doesn't have enough free RAM, the image building step -can fail with a message like "At least 174MB more space needed on -the / filesystem". If freeing up more RAM isn't a possibility, -images can be built on disk by exporting an environment variable:: - - $ export DIB_NO_TMPFS=1 diff --git a/deploy-guide/source/troubleshooting/troubleshooting-log-and-status-capture.rst b/deploy-guide/source/troubleshooting/troubleshooting-log-and-status-capture.rst deleted file mode 100644 index 3559e947..00000000 --- a/deploy-guide/source/troubleshooting/troubleshooting-log-and-status-capture.rst +++ /dev/null @@ -1,67 +0,0 @@ -Performing Log and Status Capture ---------------------------------- - -The tripleoclient provides commands to allow operators to run sosreport on the -overcloud nodes and download the log and status log bundles with tripleoclient. -This can aide with troubleshooting problems as the results can be sent to an -external support for analysis. The `openstack overcloud support report -collect` command can be used to execute sosreport on select (or all) overcloud -nodes, upload the logs to swift running on the undercloud, and download the -logs to the host that the command is executed from. - - -Example: Download logs from all controllers -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The required `server_name` option for the command can be a partial name -match for the overcloud nodes. This means `openstack overcloud support report -collect controller` will match all the overcloud nodes that contain the word -`controller`. To download the run the command and download them to a local -directory, run the following command:: - - $ openstack overcloud support report collect controller - -.. note:: By default if -o is not specified, the logs will be downloaded to a folder - in the current working directory called `support_logs` - - -Example: Download logs from a single host -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To download logs from a specific host, you must specify the complete name as -reported by `openstack service list` from the undercloud:: - - $ openstack overcloud support report collect -o /home/stack/logs overcloud-novacompute-0 - - -Example: Leave logs in a swift container -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you want to perform a sosreport but do not currently wish to download the -logs, you can leave them in a swift container for later retrieval. The -``--collect-only`` and ``-c`` options can be leveraged to store the -logs in a swift container. For example:: - - $ openstack overcloud support report collect -c logs_20170601 --collect-only controller - -This will run sosreport on the nodes and upload the logs to a container named -`logs_20170601` on the undercloud. From which standard swift tooling can be -used to download the logs. Alternatively, you can then fetch the logs using -the `openstack overcloud support report collect` command by running:: - - $ openstack overcloud support report collect -c logs_20170601 --download-only -o /tmp/mylogs controller - -.. note:: There is a ``--skip-container-delete`` option that can be used if you - want to leave the logs in swift but still download them. This option - is ignored if ``--collect-only`` or ``--download-only`` options are - provided. - - -Additional Options -^^^^^^^^^^^^^^^^^^ - -The ``openstack overcloud support report collect`` command has additional -that can be passed to work with the log bundles. Run the command with -``--help`` to see additional options:: - - $ openstack overcloud support report collect --help diff --git a/deploy-guide/source/troubleshooting/troubleshooting-nodes.rst b/deploy-guide/source/troubleshooting/troubleshooting-nodes.rst deleted file mode 100644 index 75112471..00000000 --- a/deploy-guide/source/troubleshooting/troubleshooting-nodes.rst +++ /dev/null @@ -1,192 +0,0 @@ -Troubleshooting Node Management Failures -======================================== - -Where Are the Logs? -------------------- - -Some logs are stored in *journald*, but most are stored as text files in -``/var/log/containers``. They are only accessible by the root user. - -ironic-inspector -~~~~~~~~~~~~~~~~ - -The introspection logs (from ironic-inspector) are located in -``/var/log/containers/ironic-inspector``. If something fails during the introspection -ramdisk run, ironic-inspector stores the ramdisk logs in -``/var/log/ironic-inspector/ramdisk/`` as gz-compressed tar files. -File names contain date, time and IPMI address of the node if it was detected -(only for bare metal). - -To collect introspection logs on success as well, set -``always_store_ramdisk_logs = true`` in -``/etc/ironic-inspector/inspector.conf``, restart the -``openstack-ironic-inspector`` service and retry the introspection. - -.. _ironic_logs: - -ironic -~~~~~~ - -The deployment logs (from ironic) are located in ``/var/log/containers/ironic``. If -something goes wrong during deployment or cleaning, the ramdisk logs are -stored in ``/var/log/containers/ironic/deploy``. See `ironic logs retrieving documentation -`_ -for more details. - -.. _node_registration_problems: - -Node Registration and Management Problems ------------------------------------------ - -Nodes in enroll state after registration -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you see your nodes staying in the ``enroll`` provision state after the -registration process (which may hang due to this), it means that Ironic is -unable to verify power management credentials, and you need to fix them. -Check the ``pm_addr``, ``pm_user`` and ``pm_password`` fields in your -``instackenv.json``. In some cases (e.g. when using -:doc:`../environments/virtual`) you also need a correct ``pm_port``. -Update the node as explained in `Fixing invalid node information`_. - -Fixing invalid node information -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Any problems with node data registered into Ironic can be fixed using the -Ironic CLI. - -For example, a wrong MAC can be fixed in two steps: - -* Find out the assigned port UUID by running - :: - - $ baremetal port list --node - -* Update the MAC address by running - :: - - $ baremetal port set --address - -A Wrong IPMI address can be fixed with the following command:: - - $ baremetal node set --driver-info ipmi_address= - -Node power state is not enforced by Ironic -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default Ironic will not forcibly sync the power state of the nodes, -because in our HA (high availability) model Pacemaker is the -one responsible for controlling the power state of the nodes -when fencing. If you are using a non-HA setup and want Ironic -to take care of the power state of the nodes please change the -value of the ``force_power_state_during_sync`` configuration option -in the ``/etc/ironic/ironic.conf`` file to ``True`` and restart the -openstack-ironic-conductor service. - -Also, note that if ``openstack undercloud install`` is re-run the value of -the ``force_power_state_during_sync`` configuration option will be set back to -the default, which is ``False``. - -How do I repair broken nodes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Usually, the nodes should only be deleted when the hardware is decommissioned. -Before that, you're expected to remove instances from them using scale-down. -However, in some cases, it may be impossible to repair a node with e.g. broken -power management, and it gets stuck in an abnormal state. - -.. warning:: - Before proceeding with this section, always try to decommission a node - normally, by scaling down your cloud. Forcing node deletion may cause - unpredictable results. - -Ironic requires that nodes that cannot be operated normally are put in the -maintenance mode. It is done by the following command:: - - $ baremetal node maintenance set --reason "" - -Ironic will stop checking power and health state for such nodes, and Nova will -not pick them for deployment. Power command will still work on them, though. - -After a node is in the maintenance mode, you can attempt repairing it, e.g. by -`Fixing invalid node information`_. If you manage to make the node operational -again, move it out of the maintenance mode:: - - $ baremetal node maintenance unset - -If repairing is not possible, you can force deletion of such node:: - - $ baremetal node delete - -Forcing node removal will leave it powered on, accessing the network with -the old IP address(es) and with all services running. Before proceeding, make -sure to power it off and clean up via any means. - -After that, the associated Nova instance is orphaned, and must be deleted. -You can do it normally via the scale down procedure. - -.. _introspection_problems: - -Hardware Introspection Problems -------------------------------- - -Introspection hangs and times out -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -ironic-inspector times out introspection process after some time (defaulting to -1 hour) if it never gets response from the introspection ramdisk. This can be -a sign of a bug in the introspection ramdisk, but usually it happens due to -environment misconfiguration, particularly BIOS boot settings. Please refer to -`ironic-inspector troubleshooting documentation -`_ -for information on how to detect and fix such problems. - -Accessing the ramdisk -~~~~~~~~~~~~~~~~~~~~~ - -Note that the introspection ramdisk is by default built with the -`dynamic-login element -`_, -so you can set up an SSH key and log into it for debugging. - -First, think of a temporary root password. Generate a hash by feeding it -into ``openssl passwd -1`` command. Edit ``/httpboot/inspector.ipxe`` -manually. Find the line starting with "kernel" and append rootpwd="HASH" to it. -Do not append the real password. Alternatively, you can append -sshkey="PUBLIC_SSH_KEY" with your public SSH key. - -.. warning:: - In both cases quotation marks are required! - -When ramdisk is running, figure out its IP address by checking ``arp`` utility -or DHCP logs from - -:: - - $ sudo journalctl -u openstack-ironic-inspector-dnsmasq - -SSH as a root user with the temporary password or the SSH key. - -.. note:: - Some operating systems, such as RHEL and CentOS, require SELinux to be in permissive or disabled - mode so that you can log in to the image. This is achieved by building the - image with the selinux-permissive element for diskimage-builder or by - passing selinux=0 in the kernel command line. - -Refusing to introspect node with provision state "available" -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you're running introspection directly using ironic-inspector CLI (or in case -of bugs in our scripts), a node can be in the "AVAILABLE" state, which is meant -for deployment, not for introspection. You should advance node to the -"MANAGEABLE" state before introspection and move it back before deployment. -Please refer to `upstream node states documentation -`_ -for information on how to fix it. - -How can introspection be stopped? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Introspection for a node can be stopped with the following command:: - - $ baremetal introspection abort diff --git a/deploy-guide/source/troubleshooting/troubleshooting-overcloud.rst b/deploy-guide/source/troubleshooting/troubleshooting-overcloud.rst deleted file mode 100644 index 0c909f93..00000000 --- a/deploy-guide/source/troubleshooting/troubleshooting-overcloud.rst +++ /dev/null @@ -1,300 +0,0 @@ -Troubleshooting a Failed Overcloud Deployment ---------------------------------------------- - -If an Overcloud deployment has failed, the OpenStack clients and service log -files can be used to troubleshoot the failed deployment. The following commands -are all run on the Undercloud and assume a stackrc file has been sourced. - -Identifying Failed Component -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -In most cases, Heat will show the failed overcloud stack when a deployment -has failed:: - - $ openstack stack list - - +--------------------------------------+------------+--------------------+----------------------+ - | id | stack_name | stack_status | creation_time | - +--------------------------------------+------------+--------------------+----------------------+ - | 7e88af95-535c-4a55-b78d-2c3d9850d854 | overcloud | CREATE_FAILED | 2015-04-06T17:57:16Z | - +--------------------------------------+------------+--------------------+----------------------+ - -Occasionally, Heat is not even able to create the stack, so the ``openstack -stack list`` output will be empty. If this is the case, observe the message -that was printed to the terminal when ``openstack overcloud deploy`` or ``openstack -stack create`` was run. - -Next, there are a few layers on which the deployment can fail: - -* Orchestration (Heat and Nova services) -* Bare metal provisioning (Ironic service) -* Post-deploy configuration (Puppet) - -As Ironic service is in the middle layer, you can use its shell to guess the -failed layer. Issue ``baremetal node list`` command to see all -registered nodes and their current status, you will see something like:: - - +--------------------------------------+------+---------------+-------------+-----------------+-------------+ - | UUID | Name | Instance UUID | Power State | Provision State | Maintenance | - +--------------------------------------+------+---------------+-------------+-----------------+-------------+ - | f1e26112-5fbd-4fc4-9612-ecce7a1d86aa | None | None | power off | available | False | - | f0b8c105-f1d7-4059-a9a3-b050c3340340 | None | None | power off | available | False | - +--------------------------------------+------+---------------+-------------+-----------------+-------------+ - -Pay close attention to **Provision State** and **Maintenance** columns -in the resulting table. - -* If the command shows empty table or less nodes that you expect, or - **Maintenance** is ``True``, or **Provision State** is ``manageable`` - or ``enroll``, there was a problem during node enrolling and introspection. - - You can check the actual cause using the following command:: - - $ baremetal node show -f value -c maintenance_reason - - For example, **Maintenance** goes to ``True`` automatically, if wrong power - credentials are provided. - - Fix the cause of the failure, then move the node out of the maintenance - mode:: - - $ baremetal node maintenance unset - -* If **Provision State** is ``available`` then the problem occurred before - bare metal deployment has even started. Proceed with `Debugging Using Heat`_. - -* If **Provision State** is ``active`` and **Power State** is ``power on``, - then bare metal deployment has finished successfully, and problem happened - during the post-deployment configuration step. Again, refer to `Debugging - Using Heat`_. - -* If **Provision State** is ``wait call-back``, then bare metal deployment is - not finished for this node yet. You may want to wait until the status - changes. - -* If **Provision State** is ``error`` or ``deploy failed``, then bare metal - deployment has failed for this node. Look at the **last_error** field:: - - $ baremetal node show -f value -c last_error - - If the error message is vague, you can use logs to clarify it, see - :ref:`ironic_logs` for details. - - If you see wait timeout error, and node **Power State** is ``power on``, - then try to connect to the virtual console of the failed machine. Use - ``virt-manager`` tool for virtual machines and vendor-specific virtual - console (e.g. iDRAC for DELL) for bare metal machines. - -Showing deployment failures -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Deployment failures can be shown with the following command:: - - $ openstack overcloud failures --plan my-deployment - -The command will show any errors encountered when running ``ansible-playbook`` -to configure the overcloud during the ``config-download`` process. See -:ref:`config_download` for more information. - -Debugging Using Heat -^^^^^^^^^^^^^^^^^^^^ - -* Identifying the failed Heat resource - - List all the stack resources to see which one failed. - - :: - - $ openstack stack resource list overcloud - - +-----------------------------------+-----------------------------------------------+---------------------------------------------------+-----------------+----------------------+ - | resource_name | physical_resource_id | resource_type | resource_status | updated_time | - +-----------------------------------+-----------------------------------------------+---------------------------------------------------+-----------------+----------------------+ - | BlockStorage | 9e40a1ee-96d3-4920-868d-683d3788e129 | OS::Heat::ResourceGroup | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | BlockStorageAllNodesDeployment | 2c453f6b-7378-44c8-a0ad-57de57d9c57f | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | BlockStorageNodesPostDeployment | | OS::TripleO::BlockStoragePostDeployment | INIT_COMPLETE | 2015-04-06T21:15:20Z | - | CephClusterConfig | 1684e7a3-0e42-44fe-9db4-7543b742fbfc | OS::TripleO::CephClusterConfig::SoftwareConfig | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | CephStorage | 48b3460c-bf9a-4663-99fc-2b4fa01b8dc1 | OS::Heat::ResourceGroup | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | CephStorageAllNodesDeployment | 76beb3a9-8327-4d2e-a206-efe12f1613fb | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | CephStorageCephDeployment | af8fb02a-5bc6-468c-8fac-fbe7e5b2c689 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | CephStorageNodesPostDeployment | | OS::TripleO::CephStoragePostDeployment | INIT_COMPLETE | 2015-04-06T21:15:20Z | - | Compute | e5e6ec84-197f-4bf6-b8ac-eb11fe494cdf | OS::Heat::ResourceGroup | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ComputeAllNodesDeployment | e6d44fbf-9683-4765-acbb-4a3d31c8fd48 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControllerNodesPostDeployment | e551e472-f2db-4468-b586-0374678d71a3 | OS::TripleO::ControllerPostDeployment | CREATE_FAILED | 2015-04-06T21:15:20Z | - | ComputeCephDeployment | 673608d5-70d7-453a-ac78-7987bc2c0158 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ComputeNodesPostDeployment | 1078e3e3-9f6f-48b9-8961-a30f44098856 | OS::TripleO::ComputePostDeployment | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControlVirtualIP | 6402b396-84aa-4cf6-9849-305205755604 | OS::Neutron::Port | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | Controller | ffc45352-9708-486d-81ac-3b60efa8e8b8 | OS::Heat::ResourceGroup | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControllerAllNodesDeployment | f73c6e33-3dd2-46f1-9eca-0d2981a4a986 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControllerBootstrapNodeConfig | 01ce5b6a-794a-4828-bad9-49d5fbfd55bf | OS::TripleO::BootstrapNode::SoftwareConfig | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControllerBootstrapNodeDeployment | c963d53d-879b-4a41-a10a-9000ac9f02a1 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControllerCephDeployment | 2d4281df-31ea-4433-820d-984a6dca6eb1 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControllerClusterConfig | 719c0d30-a4b8-4f77-9ab6-b3c9759abeb3 | OS::Heat::StructuredConfig | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControllerClusterDeployment | d929aa40-1b73-429e-81d5-aaf966fa6756 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ControllerSwiftDeployment | cf28f9fe-025d-4eed-b3e5-3a5284a2aa60 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | HeatAuthEncryptionKey | overcloud-HeatAuthEncryptionKey-5uw6wo7kavnq | OS::Heat::RandomString | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | MysqlClusterUniquePart | overcloud-MysqlClusterUniquePart-vazyj2s4n2o5 | OS::Heat::RandomString | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | MysqlRootPassword | overcloud-MysqlRootPassword-nek2iky7zfdm | OS::Heat::RandomString | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ObjectStorage | 47327c98-533e-4cc2-b1f3-d8d0eedba822 | OS::Heat::ResourceGroup | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ObjectStorageAllNodesDeployment | 7bb691aa-fa93-4f10-833e-6edeccc61408 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ObjectStorageNodesPostDeployment | d4d16f39-384a-4d6a-9719-1dd9b2d4ff09 | OS::TripleO::ObjectStoragePostDeployment | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | ObjectStorageSwiftDeployment | afc87385-8b40-4097-b529-2a5bc81c94c8 | OS::Heat::StructuredDeployments | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | PublicVirtualIP | 4dd92878-8f29-49d8-9d3d-bc0cd44d26a9 | OS::Neutron::Port | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | RabbitCookie | overcloud-RabbitCookie-uthzbos3l66v | OS::Heat::RandomString | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | SwiftDevicesAndProxyConfig | e2141170-bb77-4509-b8bd-58447b2cd15f | OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - | allNodesConfig | cbd42692-fffa-4527-a519-bd4014ebf0fb | OS::TripleO::AllNodes::SoftwareConfig | CREATE_COMPLETE | 2015-04-06T21:15:20Z | - +-----------------------------------+-----------------------------------------------+---------------------------------------------------+-----------------+----------------------+ - - In this example, notice how the **ControllerNodesPostDeployment** resource - has failed. The **\*PostDeployment** resources are the configuration that is - applied to the deployed Overcloud nodes. When these resources have failed it - indicates that something went wrong during the Overcloud node configuration, - perhaps when Puppet was run. - -* Show the failed resource - - :: - - $ openstack stack resource show overcloud ControllerNodesPostDeployment - - +------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | Property | Value | - +------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | attributes | {} | - | description | | - | links | http://192.168.24.1:8004/v1/cea2a0c78d2447bc9a0f7caa35c9224c/stacks/overcloud/ec3e3251-f949-4df9-92be-dbd37c6992a1/resources/ControllerNodesPostDeployment (self) | - | | http://192.168.24.1:8004/v1/cea2a0c78d2447bc9a0f7caa35c9224c/stacks/overcloud/ec3e3251-f949-4df9-92be-dbd37c6992a1 (stack) | - | | http://192.168.24.1:8004/v1/cea2a0c78d2447bc9a0f7caa35c9224c/stacks/overcloud-ControllerNodesPostDeployment-6kcqm5zuymqu/e551e472-f2db-4468-b586-0374678d71a3 (nested) | - | logical_resource_id | ControllerNodesPostDeployment | - | physical_resource_id | e551e472-f2db-4468-b586-0374678d71a3 | - | required_by | BlockStorageNodesPostDeployment | - | | CephStorageNodesPostDeployment | - | resource_name | ControllerNodesPostDeployment | - | resource_status | CREATE_FAILED | - | resource_status_reason | ResourceUnknownStatus: Resource failed - Unknown status FAILED due to "None" | - | resource_type | OS::TripleO::ControllerPostDeployment | - | updated_time | 2015-04-06T21:15:20Z | - +------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - - The ``resource show`` doesn't always show a clear reason why the resource - failed. In these cases, logging into the Overcloud node is required to - further troubleshoot the issue. - -* Logging into Overcloud nodes - - Use the nova client to see the IP addresses of the Overcloud nodes. - - :: - - $ openstack server list - - +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------+ - | ID | Name | Status | Task State | Power State | Networks | - +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------+ - | 18014b02-b143-4ca2-aeb9-5553bec93cff | ov-4tvbtgpv7w-0-soqocxy2w4fr-NovaCompute-nlrxd3lgmmlt | ACTIVE | - | Running | ctlplane=192.168.24.13 | - | 96a57a46-1e48-4c66-adaa-342ee4e98972 | ov-rf4hby6sblk-0-iso3zlqmyzfe-Controller-xm2imjkzalhi | ACTIVE | - | Running | ctlplane=192.168.24.14 | - +--------------------------------------+-------------------------------------------------------+--------+------------+-------------+---------------------+ - - Login as the ``heat-admin`` user to one of the deployed nodes. In this - example, since the **ControllerNodesPostDeployment** resource failed, login - to the controller node. The ``heat-admin`` user has sudo access. - - :: - - $ ssh heat-admin@192.168.24.14 - - While logged in to the controller node, examine the log for the - ``os-collect-config`` log for a possible reason for the failure. - - :: - - $ sudo journalctl -u os-collect-config - -* Failed Nova Server ResourceGroup Deployments - - In some cases, Nova fails deploying the node in entirety. This situation - would be indicated by a failed ``OS::Heat::ResourceGroup`` for one of the - Overcloud role types such as Control or Compute. - - Use nova to see the failure in this case. - - :: - - $ openstack server list - $ openstack server show - - The most common error shown will reference the error message ``No valid host - was found``. Refer to `No Valid Host Found Error`_ below. - - In other cases, look at the following log files for further troubleshooting:: - - /var/log/containers/nova/* - /var/log/containers/heat/* - /var/log/containers/ironic/* - -* Using SOS - - SOS is a set of tools that gathers information about system hardware and - configuration. The information can then be used for diagnostic purposes and - debugging. SOS is commonly used to help support technicians and developers. - - SOS is useful on both the undercloud and overcloud. Install the ``sos`` - package and then generate a report:: - - $ sudo sosreport --all-logs - -.. _no-valid-host: - -No Valid Host Found Error -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Sometimes ``/var/log/containers/nova/nova-conductor.log`` contains the following error:: - - NoValidHost: No valid host was found. There are not enough hosts available. - -"No valid host was found" means that the Nova Scheduler could not find a bare -metal node suitable for booting the new instance. - -This in turn usually means some mismatch between resources that Nova expects -to find and resources that Ironic advertised to Nova. - -Start with checking `Ironic troubleshooting guide on this topic -`_. - -If you're using advanced profile matching with multiple flavors, make sure -you have enough nodes corresponding to each flavor/profile. Watch -``capabilities`` key in the output of - -:: - - $ baremetal node show --fields properties - -It should contain e.g. ``profile:compute`` for compute nodes. - - -Debugging OpenStack services -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Since Pike release, TripleO now offers an easy way to enable per-service debug -without relying on knowledge of the puppet interfaces. -Each OpenStack service has now its own Debug parameter. - -* Operators who want to enable Debug everywhere will set ``Debug`` to ``true``. -* Operators who want to disable Debug everywhere will set ``Debug`` to ``false``. -* Operators who want to disable Debug everywhere except for Glance will set ``Debug`` to - ``false`` and ``GlanceDebug`` to ``true``. -* Operators who want to enable Debug everywhere except for Glance will set ``Debug`` to - ``true`` and ``GlanceDebug`` to ``false``. - -Glance was an example, but all OpenStack services are supported. You can find their Debug -in the TripleO Heat Templates composable services. - -It is also possible to :ref:`toggle debug` for services after deployment. - -Manually Run the Deployment -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The deployment can be replicated by `manually running the config-download Ansible playbooks -`_. -This also allows the Ansible inventory, variables, playbooks, tasks, and more to be modified to -help narrow down issues. Consider using ``ansible-playbook --start-at-task`` to more quickly -troubleshooting an error. diff --git a/deploy-guide/source/troubleshooting/troubleshooting-tripleo-heat-templates.rst b/deploy-guide/source/troubleshooting/troubleshooting-tripleo-heat-templates.rst deleted file mode 100644 index 4ac6c7bb..00000000 --- a/deploy-guide/source/troubleshooting/troubleshooting-tripleo-heat-templates.rst +++ /dev/null @@ -1,8 +0,0 @@ -Debugging TripleO Heat Templates ------------------------------------ - -Useful Links -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Please follow this flow: -http://hardysteven.blogspot.co.uk/2015/04/debugging-tripleo-heat-templates.html diff --git a/deploy-guide/source/troubleshooting/troubleshooting.rst b/deploy-guide/source/troubleshooting/troubleshooting.rst deleted file mode 100644 index 575653a2..00000000 --- a/deploy-guide/source/troubleshooting/troubleshooting.rst +++ /dev/null @@ -1,14 +0,0 @@ -Troubleshooting -=============== - -At this chapter you will find answers for frequently asked questions and -help with troubleshooting when using |project|. - -.. toctree:: - :maxdepth: 2 - - troubleshooting-image-build - troubleshooting-nodes - troubleshooting-overcloud - troubleshooting-tripleo-heat-templates - troubleshooting-log-and-status-capture diff --git a/doc/requirements.txt b/doc/requirements.txt deleted file mode 100644 index 3f3c68f2..00000000 --- a/doc/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -sphinx>=2.0.0,!=2.1.0 # BSD -sphinxcontrib-svg2pdfconverter>=0.1.0 # BSD -sphinxcontrib-mermaid>=0.3.1,!=0.6.1 # BSD -requests -pyquery - -# needed because sphinxcontrib-mermaid calls it but doesn't require it -six diff --git a/doc/source/ci/_images/baremetal-jobs.svg b/doc/source/ci/_images/baremetal-jobs.svg deleted file mode 100644 index 64624875..00000000 --- a/doc/source/ci/_images/baremetal-jobs.svg +++ /dev/null @@ -1,2 +0,0 @@ - -
uc
[Not supported by viewer]
Undercloud
large VM
envE
[Not supported by viewer]
baremetal hardware pool
[Not supported by viewer]
overcloud deploy
[Not supported by viewer]
Overcloud
baremetal nodes
for envE
[Not supported by viewer]
Executor
Nodepool node
slave VM

[Not supported by viewer]
undercloud
install

[Not supported by viewer]
Zuul
Zuul
periodic job
[Not supported by viewer]
Internal Software Factory
<font color="#333333">Internal Software Factory</font>
oc
[Not supported by viewer]
\ No newline at end of file diff --git a/doc/source/ci/_images/grafana1.png b/doc/source/ci/_images/grafana1.png deleted file mode 100644 index 83a6e64d1f19905c82249fef0cb72976a0454523..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241376 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
SDO&6d}aTtx=kdT#i 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 M-BOb;l)d-(e~uceLjV8( diff --git a/doc/source/ci/_images/grafana2.png b/doc/source/ci/_images/grafana2.png deleted file mode 100644 index 275450caf9519851813001738a9476facb8e7fe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197457 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

+7tMCJNevqHKj7Y!m=c_blbLDLdV)yH8C_pgLZ3 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

EX_%bx_pa+U*RuzL8jSy13Td2kc}hiN_1~!* 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 z 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

bJv}kG^cF;Oz8laJCKnc$A#l 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 KjcEZ46ZJbmxc%z@ diff --git a/doc/source/ci/baremetal_jobs.rst b/doc/source/ci/baremetal_jobs.rst deleted file mode 100644 index 396af4d2..00000000 --- a/doc/source/ci/baremetal_jobs.rst +++ /dev/null @@ -1,279 +0,0 @@ -Baremetal jobs -============== - -This section gives an overview and some details on the baremetal CI jobs. The -baremetal deployment is intended as a multinode real world "production-like" -environment for TripleO. - see `Baremetal deploy guide `_ -for more information on setting up a baremetal environment. - -The baremetal jobs, previously running in the RDO Phase 2 of the promotion -pipeline from Jenkins servers, now are triggered from an internal Software -Factory instance of Zuul. These promotion jobs testing containers built on -tripleo-ci-testing hashes run on real baremetal hardware, report to dlrn and -can be included in the TripleO promotion criteria. - -The goal is to give developers feedback on real deployments and allow us to -have better coverage on issues seen in production environments. It also -allows an approximation of OVB jobs running in RDO cloud in order to get an -"apples-to-apples" comparison to eliminate infra issues. - -.. _baremetal_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/provisioning/index.html - -Where ------ - -The hardware is maintained internally and cannot be accessed by upstream -Zuul or RDO Cloud. The internal Software Factory instance provides a version -of infra upstream tools as Zuul, Gerrit and Nodepool for running the defined -baremetal jobs. Refer to `Software Factory Documentation `_ for more details. - -The jobs will use hardware_environments//instackenv.json file and the -hardware_environments//network_configs/single_nic_vlans settings file. -These configurations are explored in more detail below. - -.. _Software_Factory_documentation: https://softwarefactory-project.io/docs/index.html - - -How ---- - -The baremetal job workflow is described as follows: - - 1. The baremetal jobs are triggered in the periodic pipeline and initially - run on a Nodepool node that can be called as "executor", where the job - starts executing its playbooks and roles. - - 2. The job ssh's to the baremetal machine which will host the undercloud vm - and creates a new vm on which the undercloud will be installed and set - up. - - 3. Finally the undercloud VM deploys the overcloud on real baremetal nodes - defined in the instackenv.json configuration over pxe boot. - -This workflow for baremetal jobs is illustrated in the following figure: - -.. image:: ./_images/baremetal-jobs.svg - - -Parenting from upstream and RDO repos -------------------------------------- - -Jobs that run from internal Zuul can parent off, and use resources (jobs, -roles etc.) from, upstream (review.opendev.org) and RDO -(review.rdoproject.org) repos. As such, duplication can be kept to a minimum -and jobs that run internally on baremetal hardware can maintain parity with -OVB jobs run in RDO Cloud. - -For example, a base TripleO CI job in Zuul :: - - - job: - name: tripleo-ci-base-baremetal - abstract: true - description: | - Base abstract job for Baremetal TripleO - parent: tripleo-ci-base - nodeset: tripleo-baremetal-centos-7-primary - attempts: 1 - required-projects: - - rdo-jobs - roles: - - zuul: rdo-jobs - pre-run: - - playbooks/configure-mirrors.yaml - - playbooks/copy-env-vars-baremetal.yaml - vars: - # must be overridden - undercloud: - environment_infra: baremetal - environment_type: baremetal - playbooks: - - baremetal-prep-virthost.yml - - baremetal-full-undercloud.yml - - baremetal-full-overcloud-prep.yml - - baremetal-full-overcloud.yml - - baremetal-full-overcloud-validate.yml - tags: - - all - -Now adding the dlrn reporting :: - - - job: - name: tripleo-ci-base-baremetal-dlrn - parent: tripleo-ci-base-baremetal - abstract: true - description: | - Base abstract job to do DLRN reporting - required-projects: - - config - roles: - - zuul: config - pre-run: - - playbooks/dlrn/pre-dlrn.yaml - post-run: - - playbooks/dlrn/post-dlrn.yaml - secrets: - - dlrnapi - -Example of a specific hardware job in Zuul: - -Note that multiple jobs cannot be run on the hardware concurrently. -The base job is modified to include semaphore -https://zuul-ci.org/docs/zuul/user/config.html#semaphore to run -each only one at a time :: - - - job: - name: tripleo-ci-base-baremetal-dlrn-my_env - abstract: true - parent: tripleo-ci-base-baremetal-dlrn - vars: - baremetal_env_vars: >- - {{ local_working_dir }}/hardware_environments/my_env//env_settings.yml - undercloud: - semaphore: - name: my_env - - - job: - name: periodic-tripleo-ci-centos-7-baremetal-3ctlr_1comp-featureset001-master - parent: tripleo-ci-base-baremetal-dlrn-my_env - vars: - nodes: 3ctlr_1comp - featureset: '001' - release: master - - -Hardware Settings ------------------ - -An example of hardware settings for baremetal environment 'my_env' is shown -below: - -hardware_environments / my_env / network_configs / single_nic_vlans / - env_settings.yml :: - - environment_type: my_env - - # undercloud.conf settings - undercloud_network_cidr: 10.10.10.0/26 - undercloud_local_ip: 10.10.10.1/26 - undercloud_network_gateway: 10.10.10.100 - undercloud_undercloud_public_vip: 10.10.10.2 - undercloud_undercloud_admin_vip: 10.10.10.3 - undercloud_local_interface: eth1 - undercloud_masquerade_network: 10.10.10.0/26 - undercloud_dhcp_start: 10.10.10.5 - undercloud_dhcp_end: 10.10.10.24 - undercloud_inspection_iprange: 10.10.10.25,10.10.10.39 - undercloud_undercloud_nameservers: 10.10.10.200 - network_isolation_ipv4_cidr: 10.10.10.64/26 - undercloud_external_network_cidr: 10.10.10.64/26 - - # undercloud vm settings - virthost_provisioning_interface: eno2 - virthost_provisioning_ip: 10.10.10.4 - virthost_provisioning_netmask: 255.255.255.192 - virthost_provisioning_hwaddr: FF:FF:FF:FF:FF:FF - virthost_ext_provision_interface: eno1 - - undercloud_memory: 28672 - undercloud_disk: 80 - undercloud_vcpu: 8 - - undercloud_instackenv_template: >- - {{ local_working_dir }}/hardware_environments/my_env/instackenv.json - - undercloud_type: virtual - step_introspect: true - introspect: true - - # network-environment.yaml settings - network_environment_args: - InternalApiNetCidr: 172.21.33.0/24 - StorageNetCidr: 172.21.36.0/24 - StorageMgmtNetCidr: 172.21.35.0/24 - TenantNetCidr: 172.16.0.0/24 - ExternalNetCidr: 10.10.10.64/26 - BondInterfaceOvsOptions: "mode=4 lacp_rate=fast" - InternalApiAllocationPools: [{'start': '172.21.33.10', 'end': '172.21.33.200'}] - StorageAllocationPools: [{'start': '172.21.36.10', 'end': '172.21.36.200'}] - StorageMgmtAllocationPools: [{'start': '172.21.35.10', 'end': '172.21.35.200'}] - TenantAllocationPools: [{'start': '172.16.0.10', 'end': '172.16.0.200'}] - # Leave room for floating IPs starting at .128 - ExternalAllocationPools: [{'start': '10.10.10.101', 'end': '10.10.10.120'}] - ExternalInterfaceDefaultRoute: 10.10.10.130 - InternalApiNetworkVlanID: 1272 - StorageNetworkVlanID: 1273 - StorageMgmtNetworkVlanID: 1274 - ExternalNetworkVlanID: 113 - TenantNetworkVlanID: 1275 - NeutronExternalNetworkBridge: "''" - PublicVirtualFixedIPs: [{"ip_address": "10.10.10.90"}] - ControlPlaneSubnetCidr: "26" - ControlPlaneDefaultRoute: 10.10.10.1 - EC2MetadataIp: 10.10.10.1 - DnsServers: ["8.8.8.8", "8.8.4.4"] - NtpServer: ["216.239.35.12","time.google.com","0.north-america.pool.ntp.org"] - - step_root_device_size: false - step_install_upstream_ipxe: false - hw_env: my_env - enable_vbmc: false - -hardware_environments / my_env / instackenv.json :: - - { - "nodes": [ - { - "pm_password": "", - "pm_type": "ipmi", - "mac": [ - "FF:FF:FF:FF:FF:FF" - ], - "cpu": "12", - "memory": "32768", - "disk": "558", - "arch": "x86_64", - "pm_user": "Administrator", - "pm_addr": "10.1.1.11" - }, - { - "pm_password": "", - "pm_type": "ipmi", - "mac": [ - "FF:FF:FF:FF:FF:FF" - ], - "cpu": "12", - "memory": "32768", - "disk": "558", - "arch": "x86_64", - "pm_user": "Administrator", - "pm_addr": "10.1.1.12" - }, - { - "pm_password": "", - "pm_type": "ipmi", - "mac": [ - "FF:FF:FF:FF:FF:FF" - ], - "cpu": "12", - "memory": "32768", - "disk": "558", - "arch": "x86_64", - "pm_user": "Administrator", - "pm_addr": "10.1.1.13" - }, - { - "pm_password": "", - "pm_type": "ipmi", - "mac": [ - "FF:FF:FF:FF:FF:FF" - ], - "cpu": "12", - "memory": "32768", - "disk": "558", - "arch": "x86_64", - "pm_user": "Administrator", - "pm_addr": "10.1.1.14" - } - ] - } - diff --git a/doc/source/ci/chasing_promotions.rst b/doc/source/ci/chasing_promotions.rst deleted file mode 100644 index 1b685337..00000000 --- a/doc/source/ci/chasing_promotions.rst +++ /dev/null @@ -1,259 +0,0 @@ -Chasing CI promotions -===================== - -The purpose of this document is to go into more detail about the TripleO -promotion from the point of view of the ci-squad `ruck|rover`_. - -There is other documentation in this repo which covers the stages of the -Tripleo-CI promotion pipeline in promotion-stages-overview_ and also about -relevant tooling such as the dlrn-api-promoter_. - -Ensuring promotions are happening regularly (including for all current -stable/ branches) is one of the biggest responsibilities of the ruck|rover. As -explained in promotion-stages-overview_ the CI promotion represents the point -at which we test all the tripleo-* things against the rest of openstack. The -requirement is that there is a successful promotion (more on that below) at -least once a week. Otherwise the branch will be considered 'in the red' as in -"master promotion is red" or "we are red for stein promotion" meaning was no -promotion in (at least) 7 days for that branch. - -Successful promotion --------------------- - -So what does it actually mean to have a "successful promotion". In short: - - * The TripleO periodic jobs have to run to completion and - * The periodic jobs in the promotion criteria must pass and - * The promoter server must be running in order to actually notice - the job results and promote! - -Each of these is explained in more detail below. - -TripleO periodic jobs ---------------------- - -The TripleO periodic jobs are `ci jobs`_ that are executed in one of the TripleO -periodic pipelines. At time of writing we have four periodic pipelines defined -in the `config repo zuul pipelines`_:: - - * openstack-periodic-master - * openstack-periodic-latest-released - * openstack-periodic-24hr - * openstack-periodic-wednesday-weekend - -These pipelines are *periodic* because unlike the check and gate pipelines -(see `ci jobs`_ for more on those) jobs that run on each submitted code review, -periodic jobs are executed *periodically*, at an interval given in cron syntax -as you can see in the definitions at `config repo zuul pipelines`_):: - - - pipeline: - name: openstack-periodic-master - post-review: true - description: Jobs in this queue are triggered to run every few hours. - manager: independent - precedence: high - trigger: - timer: - - time: '10 0,12,18 * * *' - -As can be seen at time of writing the openstack-periodic-master jobs -will run three times every day, at 10 minutes after midnight, noon and 6pm. - -The four pipelines correspond to the four latest releases of OpenStack. -The openstack-periodic-master_ runs jobs for master promotion, -openstack-periodic-latest-released_ runs jobs for the latest stable branch -promotion, openstack-periodic-24hr_ runs jobs for the stable branch before that -and finally openstack-periodic-wednesday-weekend_ runs jobs for the stable -branch before that. - -You can see the full list of jobs that are executed in the pipelines -in the `rdo-infra periodic zuul layout`_. - -It is important to finally highlight a common pattern in the pipeline layout. -In each case the first job that must complete is the -'promote-consistent-to-tripleo-ci-testing' which is where we take the latest -consistent hash and mark it as tripleo-ci-testing to become our new candidate -(see promotion-stages-overview_) to be used by the rest of the jobs in our -pipeline. You will note that this is the only job that doesn't have any dependency:: - - ... - - periodic-tripleo-ci-rhel-8-ovb-3ctlr_1comp-featureset001-master: - dependencies: - - periodic-tripleo-rhel-8-buildimage-ironic-python-agent-master - - periodic-tripleo-rhel-8-master-containers-build-push - - periodic-tripleo-centos-7-master-promote-consistent-to-tripleo-ci-testing - ... - -Then the containers and overcloud image build jobs must complete and only then -we finally run the rest of the jobs. These ordering requirements are expressed -using dependencies in the layout:: - - ... - - periodic-tripleo-rhel-8-buildimage-overcloud-full-master: - dependencies: - - periodic-tripleo-centos-7-master-promote-consistent-to-tripleo-ci-testing - - periodic-tripleo-rhel-8-buildimage-ironic-python-agent-master: - dependencies: - - periodic-tripleo-centos-7-master-promote-consistent-to-tripleo-ci-testing - - periodic-tripleo-ci-centos-7-ovb-1ctlr_1comp-featureset002-master-upload: - dependencies: - - periodic-tripleo-centos-7-master-containers-build-push - .. - -As can be seen above the build image jobs depend on the promote-consistent job -and then everything else in the layout depends on the container build job. - -Promotion Server and Criteria ------------------------------ - -The promotion server is maintained by the Tripleo-CI squad at a secret location -(!) and it runs the code from the `DLRN API Promoter`_ as a service. In short, -the job of this service is to fetch the latest hashes from the `RDO delorean -service`_ and then query the state of the periodic jobs using that particular -hash. - -The main input to the promotion server is the configuration which defines -the `promotion criteria`_. This is the list of jobs that must pass so that we -can declare a successful promotion:: - - [current-tripleo] - periodic-tripleo-centos-7-master-containers-build-push - periodic-tripleo-ci-centos-7-ovb-3ctlr_1comp-featureset001-master - periodic-tripleo-ci-centos-7-ovb-1ctlr_1comp-featureset002-master-upload - periodic-tripleo-ci-centos-7-multinode-1ctlr-featureset010-master - periodic-tripleo-ci-centos-7-scenario001-standalone-master - periodic-tripleo-ci-centos-7-scenario002-standalone-master - periodic-tripleo-ci-centos-7-scenario003-standalone-master - ... - -The promoter service queries the delorean service for the results of those -jobs (for a given hash) and if they are all found to be in SUCCESS then the -hash can be promoted to become the new current-tripleo_. - -It is a common practice for TripleO CI ruck or rover to check the -`indexed promoter service logs`_ to see why a given promotion is not successful -for example or when debugging issues with the promotion code itself. - -Hack the promotion with testproject ------------------------------------ - -Finally testproject_ and the ability to run individual periodic jobs on -demand is an important part of the ruck|rover toolbox. In some cases you may -want to run a job for verification of a given launchpad bug that affects -periodic jobs. - -However another important use is when the ruck|rover notice that one of the -jobs in criteria failed on something they (now) know how to fix, or on some -unrelated/transient issue. Instead of waiting another 6 or however many hours -for the next periodic to run, you can try to run the job yourself using -testproject. If the job is successful in testproject and -it is the only job missing from criteria then posting the testproject review -can also mean directly causing the promotion to happen. - -You first need to checkout testproject:: - - git clone https://review.rdoproject.org/r/testproject - cd testproject - vim .zuul.layout - -To post a testproject review you simply need to add a .zuul.layout_ file:: - - - project: - check: - jobs: - - periodic-tripleo-centos-7-train-containers-build-push: - vars: - force_periodic: true - -So the above would run the periodic-tripleo-centos-7-train-containers-build-push. -Note the required *force_periodic* variable which causes the job to run as -though it is in the periodic pipeline, rather than in the check pipeline which -you will use in testproject. - -An `example is there`_ and if you need to include a known fix you can simply -have a Depends-On in the commit message. - -Specifying a particular hash -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Jobs in the periodic promotion pipelines are using the tripleo-ci-testing -repo as described in the promotion-stages-overview_, since that is the candidate -we are trying to promote to current-tripleo. The tripleo-ci-testing and all -other named tags in tripleo, are associated with a particular *hash* that -identifies the delorean repo. For example looking at `centos7 master tripleo-ci-testing`_ -at time of writing we see:: - - [delorean] - name=delorean-tripleo-ansible-544864ccc03b053317f5408b0c0349a42723ce73 - baseurl=https://trunk.rdoproject.org/centos7/54/48/544864ccc03b053317f5408b0c0349a42723ce73_ebb98bd9 - enabled=1 - gpgcheck=0 - priority=1 - -So the centos7 master tripleo-ci-testing *hash* is -*544864ccc03b053317f5408b0c0349a42723ce73_ebb98bd9a*. The corresponding repo -is given by the baseurl above and if you navigate to that URL with your -browser you can see the list of packages used in the jobs. Thus, the job -specified in the example above for testproject -*periodic-tripleo-centos-7-train-containers-build-push* would use whatever -the current tripleo-ci-testing points to. - -However it is possible to override the particular hash (and thus repo) used by -a job you run with testproject, using the dlrn_hash_tag featureset_override:: - - - project: - check: - jobs: - - periodic-tripleo-ci-centos-7-ovb-1ctlr_1comp-featureset002-train-upload: - vars: - force_periodic: true - featureset_override: - dlrn_hash_tag: 4b32d316befe0919fd98a147d84086bc0907677a_046903a2 - -Thus, in the example above the periodic-tripleo-ci-centos-7-ovb-1ctlr_1comp-featureset002-train-upload -job would run with the hash: *4b32d316befe0919fd98a147d84086bc0907677a_046903a2* -regardless of the current value of tripleo-ci-testing. - -The most common reason for overriding the hash in this way is when we notice -that a particular job failed during one of the recent periodic pipeline runs. -Looking at one of the `indexed promoter service logs`_ you may notice something -like the following text:: - - 2020-02-21 03:57:07,458 31360 INFO promoter Skipping promotion of centos7-master - {'timestamp': 1582243926, 'distro_hash': 'ebb98bd9545e026f033683143ae39e9e236b3671', - 'promote_name': 'tripleo-ci-testing', 'user': 'review_rdoproject_org', - 'repo_url': 'https://trunk.rdoproject.org/centos7/54/48/544864ccc03b053317f5408b0c0349a42723ce73_ebb98bd9', - 'full_hash': '544864ccc03b053317f5408b0c0349a42723ce73_ebb98bd9', - 'repo_hash': '544864ccc03b053317f5408b0c0349a42723ce73_ebb98bd9', - 'commit_hash': '544864ccc03b053317f5408b0c0349a42723ce73'} - from tripleo-ci-testing to current-tripleo, - missing successful jobs: [u'periodic-tripleo-ci-centos-7-ovb-3ctlr_1comp-featureset035-master', - u'periodic-tripleo-ci-centos-7-ovb-3ctlr_1comp-featureset001-master'] - -In particular note the last line 'missing successful jobs'. This means that -for the hash *544864ccc03b053317f5408b0c0349a42723ce73_ebb98bd9* a promotion -could not happen, because in this particular run, those two identified jobs -were failed. If the jobs were fixed in the meantime or you now know -how to fix them and get a good result, you could re-run those with testproject -specifying the particular hash. If they execute successfully then on the next -run the promoter will promote that hash to become the new current-tripleo. - - -.. _promotion-stages-overview: stages-overview.html -.. _dlrn-api-promoter: dlrn-promoter-overview.html -.. _`ruck|rover`: ruck_rover_primer.html -.. _`ci jobs`: https://docs.openstack.org/tripleo-docs/latest/ci/ci_primer.html#where-do-tripleo-promotion-jobs-live -.. _`config repo zuul pipelines`: https://github.com/rdo-infra/review.rdoproject.org-config/blob/0fd16d0badb13e02460d3b2e3213db4af7f027e0/zuul.d/upstream.yaml#L84-L157 -.. _openstack-periodic-master: https://review.rdoproject.org/zuul/builds?pipeline=openstack-periodic-master -.. _openstack-periodic-latest-released: https://review.rdoproject.org/zuul/builds?pipeline=openstack-periodic-latest-released -.. _openstack-periodic-24hr: https://review.rdoproject.org/zuul/builds?pipeline=openstack-periodic-24hr -.. _openstack-periodic-wednesday-weekend: https://review.rdoproject.org/zuul/builds?pipeline=openstack-periodic-wednesday-weekend -.. _`rdo-infra periodic zuul layout`: https://github.com/rdo-infra/review.rdoproject.org-config/blob/0fd16d0badb13e02460d3b2e3213db4af7f027e0/zuul.d/tripleo.yaml#L74-L424 -.. _`DLRN API Promoter`: https://github.com/rdo-infra/ci-config/blob/master/ci-scripts/dlrnapi_promoter/README.md -.. _`RDO delorean service`: https://trunk.rdoproject.org/centos7-master-head/report.html -.. _`promotion criteria`: https://github.com/rdo-infra/ci-config/blob/4bc3261c4ce644829a317c1bd85c1d645cb96cbd/ci-scripts/dlrnapi_promoter/config/CentOS-7/master.ini#L16 -.. _current-tripleo: https://trunk.rdoproject.org/centos7-master/current-tripleo/delorean.repo -.. _testproject: https://review.rdoproject.org/r/#/q/project:testproject -.. _`example is there`: https://review.rdoproject.org/r/#/c/23502/ -.. _`indexed promoter service logs`: http://promoter.rdoproject.org/ -.. _`centos7 master tripleo-ci-testing`: https://trunk.rdoproject.org/centos7-master/tripleo-ci-testing/delorean.repo diff --git a/doc/source/ci/check_gates.rst b/doc/source/ci/check_gates.rst deleted file mode 100644 index 24098e6c..00000000 --- a/doc/source/ci/check_gates.rst +++ /dev/null @@ -1,245 +0,0 @@ -How to add a TripleO job to your projects check pipeline -======================================================== - -To ensure a non-TripleO project's changes work with TripleO an additional -check job can be added to the project's job definitions in OpenStack's -`project config `_ - -Project Config Example ----------------------- - -In this case we'll use openstack/neutron as an example to understand how -this works. Note that this is only an example and this job may not be appropriate -for your project, we will cover how to pick a job later on in this documentation. -Browse through the `layout.yaml -`_ -file in the project-config repository until you find:: - - - name: openstack/neutron - template: - - name: merge-check - - ... - - ... - check: - - ... - - ... - - gate-tripleo-ci-centos-7-nonha-multinode-oooq-nv - -The above configuration will run the TripleO job -``gate-tripleo-ci-centos-7-nonha-multinode-oooq-nv`` without voting (nv). -This type of job is used to inform the reviewers of the patch whether or not -the change under review works with TripleO. - - -How to pick which job to execute for any given OpenStack project ----------------------------------------------------------------- - -TripleO can deploy a number of different OpenStack services. To best utilize -the available upstream CI resources TripleO uses the same concept as the -`puppet-openstack-integration project -`_ to define how -services are deployed. The TripleO documentation regarding services can be found -`here. `_ -Review the TripleO documentation and find a scenario that includes the services -that your project requires to be tested. Once you have determined which -scenario to use you are ready to pick a TripleO check job. - -The following is a list of available check jobs:: - - gate-tripleo-ci-centos-7-scenario001-multinode-oooq - gate-tripleo-ci-centos-7-scenario001-multinode-oooq-puppet - gate-tripleo-ci-centos-7-scenario001-multinode-oooq-container - gate-tripleo-ci-centos-7-scenario002-multinode-oooq - gate-tripleo-ci-centos-7-scenario002-multinode-oooq-puppet - gate-tripleo-ci-centos-7-scenario002-multinode-oooq-container - gate-tripleo-ci-centos-7-scenario003-multinode-oooq - gate-tripleo-ci-centos-7-scenario003-multinode-oooq-puppet - gate-tripleo-ci-centos-7-scenario003-multinode-oooq-container - gate-tripleo-ci-centos-7-scenario004-multinode-oooq - gate-tripleo-ci-centos-7-scenario004-multinode-oooq-puppet - gate-tripleo-ci-centos-7-scenario004-multinode-oooq-container - gate-tripleo-ci-centos-7-nonha-multinode-oooq - gate-tripleo-ci-centos-7-containers-multinode - -**Note** over time additional scenarios will be added and will follow the same -pattern as the job names listed above. - -Adding a new non-voting check job ---------------------------------- - -Find your project in `layout.yaml -`_. -An example of a project will look like the following example:: - - - name: openstack/$project - template: - - ... - - ... - -**Note** ``$project`` is the name of your project. - -Under the section named ``check``, add the job that best suits your project. -Be sure to add ``-nv`` to the job name to ensure the job does not vote:: - - check: - - ... - - ... - - $job-nv - -Enabling voting jobs --------------------- - -If your project is interested in gating your project with a voting version -of a TripleO job, you can follow the openstack/mistral project's example in -`layout.yaml -`_ - -For example:: - - - name: openstack/mistral - template: - -name: merge-check - - ... - - ... - check: - - ... - - ... - - gate-tripleo-ci-centos-7-scenario003-multinode-oooq-puppet - gate: - - gate-tripleo-ci-centos-7-scenario003-multinode-oooq-puppet - -**Note** the example does **not** append ``-nv`` as a suffix to the job name - -Troubleshooting a failed job ----------------------------- - -When your newly added job fails, you may want to download its logs for a local -inspection and root cause analysis. Use the -`tripleo-ci getthelogs script -`_ -for that. - -Enabling tempest tests notification ------------------------------------ - -There is a way to get notifications by email when a job finishes to running -tempest. -People interested to receive these notifications can submit a patch to add -their email address in `this config file -`_. -Instructions can be found `here -`_. - -featureset override -------------------- - -In TripleO CI, we test each patchset using different jobs. These jobs -are defined using `featureset config files -`_. -Each featureset config file is mapped to a job template that is defined in -`tripleo-ci `_. -Tempest tests are basically triggered in scenario jobs in order to post validate the -a particular scenario deployment. -The set of tempest tests that run for a given TripleO CI job is defined in the -`featureset config files -`_. -You may want to run a popular TripleO CI job with a custom set of Tempest -tests and override the default Tempest run. This can be accomplished through -adding the `featureset_overrides` var to zuul job config `vars:` section. -The allowed featureset_override are defined in the `tripleo-ci run-test role -`_. -This setting allows projects to override featureset post deployment configuration. -Some of the overridable settings are: - - - `run_tempest`: To run tempest or not (true|false). - - `tempest_whitelist`: List of tests you want to be executed. - - `test_black_regex`: Set of tempest tests to skip. - - `tempest_format`: To run tempest using different format (packages, containers, venv). - - `tempest_extra_config`: A dict of additional tempest config to be overridden. - - `tempest_plugins`: A list of tempest plugins needs to be installed. - - `standalone_environment_files`: List of environment files to be overridden - by the featureset configuration on standalone deployment. The environment - file should exist in tripleo-heat-templates repo. - - `test_white_regex`: Regex to be used by tempest - - `tempest_workers`: Numbers of parallel workers to run - - `standalone_container_cli`: Container cli to use - - `tempest_private_net_provider_type`: The Neutron type driver that should be - used by tempest tests. - -For a given job `tripleo-ci-centos-7-scenario001-multinode-oooq-container`, you -can create a new abstract layer job and overrides the tempest tests:: - - - job: - name: scn001-multinode-oooq-container-custom-tempest - parent: tripleo-ci-centos-7-scenario001-multinode-oooq-container - ... - vars: - featureset_override: - run_tempest: true - tempest_whitelist: - - 'tempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_volume_boot_pattern' - test_black_regex: - - 'keystone_tempest_plugin' - tempest_format: 'containers' - tempest_extra_config: {'compute-feature-enabled.attach_encrypted_volume': 'True', - 'auth.tempest_roles': '"Member"'} - tempest_plugins: - - 'python2-keystone-tests-tempest' - - 'python2-cinder-tests-tempest' - tempest_workers: 1 - test_white_regex: - - 'tempest.api.identity' - - 'keystone_tempest_plugin' - standalone_environment_files: - - 'environments/low-memory-usage.yaml' - - 'ci/environments/scenario003-standalone.yaml' - standalone_container_cli: docker - -In a similar way, for skipping Tempest run for the scenario001 job, you can do -something like:: - - - job: - name: scn001-multinode-oooq-container-skip-tempest - parent: tripleo-ci-centos-7-scenario001-multinode-oooq-container - ... - vars: - featureset_override: - run_tempest: false - -Below is the list of jobs based on `tripleo-puppet-ci-centos-7-standalone` which uses -featureset_override and run specific tempest tests against puppet projects: - -* puppet-nova - - - job name: puppet-nova-tripleo-standalone - - tempest_test: compute - -* puppet-horizon - - - job name: puppet-horizon-tripleo-standalone - - tempest_test: horizon - -* puppet-keystone - - - job name: puppet-keystone-tripleo-standalone - - tempest_test: keystone_tempest_plugin & identity - -* puppet-glance - - - job name: puppet-glance-tripleo-standalone - - tempest_test: image - -* puppet-cinder - - - job name: puppet-cinder-tripleo-standalone - - tempest_test: volume & cinder_tempest_tests - -* puppet-neutron - - - job name: puppet-neutron-tripleo-standalone - - tempest_test: neutron_tempest_tests & network - -* puppet-swift - - - job name: puppet-swift-tripleo-standalone - - tempest_test: object_storage diff --git a/doc/source/ci/ci_primer.rst b/doc/source/ci/ci_primer.rst deleted file mode 100644 index 34444961..00000000 --- a/doc/source/ci/ci_primer.rst +++ /dev/null @@ -1,159 +0,0 @@ -TripleO CI jobs primer -====================== - -This primer aims to demonstrate where the Triple ci jobs are defined and -illustrate the difference between the check and gate queues and how jobs -are executed in them. Which queue a job is executed in also affects whether the -job is defined as voting or not. Generally: - -* new jobs are run in check and are non voting -* once a job is voting in check, it needs to be added to gate too. -* once a job is voting in check and gate you should add it to the promotion - jobs so that tripleo promotions (i.e. from tripleo-testing - to current-tripleo) will depend on successful execution of that job. - -Once a job becomes voting it must be added to the gate queue too. If it isn't -then we may end up with a situation where something passes the voting -check job and merges without being run in the gate queue. It could be that for -some reason it would have failed in the gate and thus not have merged. A common -occurrence is the check jobs run on a particular submission and pass on one day but -then not actually merge (and so run in the gate) until much later perhaps even after -some days.In the meantime some unrelated change merges in another project which would -cause the job to fail in the gate, but since we're not running it there the code -submission merges. This then means that the job is broken in subsequent check runs. - -Non tripleo-projects are not gated in tripleo. The promotion jobs -represent the point at which we take the latest built tripleo packages and the -latest built non-tripleo projects packages (like nova, neutron etc) and test these together. -For more information about promotions refer to :doc:`Promotion Stages` - -Where do tripleo-ci jobs live ------------------------------ - -.. note:: - - If you ever need to search for a particular job to see which file it is defined - in or which tripleo project repos it is running for you can search by name in - the openstack-codesearch_ (e.g. that is a search for the - tripleo-ci-centos-7-scenario003-standalone job). - -.. note:: - - If you ever want to see the status for a particular job with respect to how - often it is failing or passing, you can check the zuul_builds_ status and - search by job name (again the linked example is for scenario003-standalone). - -The tripleo ci jobs live in the tripleo-ci repo and specifically in various -files defined under the zuul.d_ directory. As an example we can examine one of -the scenario-standalone-jobs_:: - - - job: - name: tripleo-ci-centos-7-scenario001-standalone - voting: true - parent: tripleo-ci-base-standalone - nodeset: single-centos-7-node - branches: ^(?!stable/(newton|ocata|pike|queens|rocky)).*$ - vars: - featureset: '052' - standalone_ceph: true - featureset_override: - standalone_container_cli: docker - standalone_environment_files: - - 'ci/environments/scenario001-standalone.yaml' - - 'environments/low-memory-usage.yaml' - tempest_plugins: - - python-telemetry-tests-tempest - - python-heat-tests-tempest - test_white_regex: '' - tempest_workers: 1 - tempest_extra_config: {'telemetry.alarm_granularity': '60'} - tempest_whitelist: - - 'tempest.api.identity.v3' - - 'tempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_volume_boot_pattern' - - 'telemetry_tempest_plugin.scenario.test_telemetry_integration.TestTelemetryIntegration' - -As you can see the job definition consists of the unique job name followed by -the rest of the zuul variables, including whether the job is voting and which -node layout (nodeset) should be used for that job. The unique job name is then -used in the zuul layout (discussed in the next section) to determine if the job -is run in check or gate or both. Since the job shown above is set as voting -we can expect it to be defined in both gate and check. - -.. _zuul.d: https://github.com/openstack-infra/tripleo-ci/tree/master/zuul.d -.. _scenario-standalone-jobs: https://github.com/openstack-infra/tripleo-ci/blob/101074b2e804f97880440a3e62351844f390b2f2/zuul.d/standalone-jobs.yaml#L86-L88 -.. _openstack-codesearch: http://codesearch.openstack.org/?q=tripleo-ci-centos-7-scenario003-standalone&i=nope&files=&repos= -.. _zuul_builds: http://zuul.opendev.org/builds?job_name=tripleo-ci-centos-7-scenario003-standalone - -Zuul queues - gate vs check ---------------------------- - -As with all OpenStack projects there are two zuul queues to which jobs are -scheduled - the check jobs which are run each time a change is submitted and -then the gate jobs which are run before a change is merged. There is also -an experimental queue but that is invoked manually. - -Which queue a given job is run in is determined by the zuul layout file for the -given project - e.g. here is tripleo-heat-templates-zuul-layout_. The layout -file has the following general format:: - - - project: - templates: - .. list of templates - check: - jobs: - .. list of job names and any options for each - gate: - queue: tripleo - jobs: - .. list of job names and any options for each - -The templates: section in the outline above is significant because the layout -can also be defined in one of the included templates. For example the -scenario-standalone-layout_ defines the check/gate layout for the -tripleo-standalone-scenarios-full template which is then included by the -projects that want the jobs defined in that template to execute in the manner -it specifies. - -.. _tripleo-heat-templates-zuul-layout: https://github.com/openstack/tripleo-heat-templates/blob/efe9b8fa1fff7ef1828777a95eee9fe4d901f9b9/zuul.d/layout.yaml#L9 -.. _scenario-standalone-layout: https://github.com/openstack-infra/tripleo-ci/blob/7333a6fc8ff3990a971a661a817e30ae25e06374/zuul.d/standalone-jobs.yaml#L77-L79 - -Where do tripleo promotion jobs live ------------------------------------- - -.. note:: - If you even need to find the definition for a particular promotion job you can - search for it by name using the rdo-codesearch_. - -The tripleo promotions jobs are not defined in the tripleo-ci but instead live -in the rdo-jobs_ repository. For more information about the promotion pipeline -in TripleO refer to the :doc:`Promotion Stages` - -Similar to the tripleo-ci jobs, they are defined in various files under the -rdo-jobs-zuul.d_ directory and the job definitions look very similar to the -tripleo-ci ones - for example the -periodic-tripleo-ci-centos-7-multinode-1ctlr-featureset010-master_:: - - - job: - name: periodic-tripleo-ci-centos-7-multinode-1ctlr-featureset010-master - parent: tripleo-ci-base-multinode-periodic - vars: - nodes: 1ctlr - featureset: '010' - release: master - -If you even need to find the definition for a particular promotion job you can -search for it by name using the rdo-codesearch_. - -.. _rdo-jobs: https://github.com/rdo-infra/rdo-jobs -.. _rdo-jobs-zuul.d: https://github.com/rdo-infra/rdo-jobs/tree/master/zuul.d -.. _periodic-tripleo-ci-centos-7-multinode-1ctlr-featureset010-master: https://github.com/rdo-infra/rdo-jobs/blob/76daaff19a464614a002655bc85db4080607f1bf/zuul.d/multinode-jobs.yaml#L148 -.. _rdo-codesearch: https://codesearch.rdoproject.org/?q=periodic-tripleo-ci-centos-7-multinode-1ctlr-featureset010-master&i=nope&files=&repos= - -Contacting CI team ------------------- - -When in need you can contact the TripleO CI team members on one of the two -irc channels on OFTC #tripleo by mentioning ``@oooq`` keyword in your -message as team members get notified about such messages. It is good to -remember that those nicknames with ``|ruck`` and ``|rover`` suffix are on duty -to look for CI status. diff --git a/doc/source/ci/component_integration_pipelines.mmd b/doc/source/ci/component_integration_pipelines.mmd deleted file mode 100644 index da0605da..00000000 --- a/doc/source/ci/component_integration_pipelines.mmd +++ /dev/null @@ -1,5 +0,0 @@ -graph TD - compute/consistent-->compute/component-ci-testing-->compute/promoted-components-->promoted-components - cinder/consistent-->cinder/component-ci-testing-->cinder/promoted-components-->promoted-components - security/consistent-->security/component-ci-testing-->security/promoted-components-->promoted-components - promoted-components-->tripleo-ci-testing-->current-tripleo diff --git a/doc/source/ci/component_pipeline_tags_flow.mmd b/doc/source/ci/component_pipeline_tags_flow.mmd deleted file mode 100644 index 01345573..00000000 --- a/doc/source/ci/component_pipeline_tags_flow.mmd +++ /dev/null @@ -1,6 +0,0 @@ -graph TD - A[consistent] -->|periodically promote to| B[component-ci-testing] - B -->|Run periodic promotion jobs| C{criteria jobs passing?} - C -->|no| E[reject content] - C -->|yes| D[promoted-components] - D --> F[start of integration pipeline] diff --git a/doc/source/ci/content_provider_jobs.rst b/doc/source/ci/content_provider_jobs.rst deleted file mode 100644 index a57b634b..00000000 --- a/doc/source/ci/content_provider_jobs.rst +++ /dev/null @@ -1,178 +0,0 @@ -Content Provider Jobs -===================== - -This section gives an overview and some details about the 'content provider' -zuul jobs. They are so called because they consist of a parent job that builds -containers which are then consumed by any number of child jobs. Thus the parent -jobs are the 'content provider' for the child jobs. - -Why Do We Need Content Providers? ---------------------------------- - -The content provider jobs were added by the Tripleo CI squad during the -Victoria development cycle. Prior to this `check and gate tripleo-ci jobs`_ -running on review.opendev.org code submissions were pulling the promoted -'current-tripleo' containers from docker.io. - -Having all jobs pull directly from a remote registry obviously puts a strain on -resources; consider multiple jobs per code submission with tens of -container pulls for each. We have over time been affected by a number of issues -related to the container pulls (such as timeouts) that would cause jobs to fail -and block the gates. Furthermore, `docker has recently announced`_ that requests -will be rate limited to one or two hundred pull requests per six hours (without and -with authentication respectively) on the free plan effective 01 November 2020. - -In anticipation of this the TripleO CI squad has moved all jobs to the new -content provider architecture. - -The Content Provider --------------------- - -The main task executed by the content provider job is to build the containers -needed to deploy TripleO. This is achieved with a collection of ansible plays -defined in the `multinode-standalone-pre.yml`_ tripleo-quickstart-extras -playbook. - -Once built, the content provider then needs to make those containers available -for use by the child jobs. The `build-container role itself`_ as invoked in -`multinode-standalone-pre.yml`_ ensures containers are pushed to the -a local registry on the content provider node. However the child job will need -to know the IP address on which they can reach that registry. - -To achieve this we use the `zuul_return module`_ that allows for a parent -job to return data for consumption within child jobs. We set the required -zuul_return data in the `run-provider.yml playbook`_:: - - - name: Set registry IP address - zuul_return: - data: - zuul: - pause: true - registry_ip_address: "{{ hostvars[groups.all[0]].ansible_host }}" - provider_dlrn_hash: "{{ dlrn_hash|default('') }}" - provider_dlrn_hash_tag: "{{ dlrn_hash_tag|default('') }}" - provider_job_branch: "{{ provider_job_branch }}" - registry_ip_address_branch: "{{ registry_ip_address_branch }}" - provider_dlrn_hash_branch: "{{ provider_dlrn_hash_branch }}" - tags: - - skip_ansible_lint - -Child jobs retrieve the IP address for the content provider container -registry via the `registry_ip_address_branch dictionary`_. This contains a -mapping between the release (master, victoria, ussuri etc) and the IP address -of the content provider container registry with images for that release. -For example:: - - registry_ip_address_branch: - master: 38.145.33.72 - -Most jobs will only ever have one release in this dictionary but upgrade jobs -will require two (more on that later). Note that besides setting the -zuul_return data the task above sets the `zuul pause: true`_. As the name -suggests, this allows the parent content provider job to be paused until all -children have executed. - -Given all the above, it should be of little surprise ;) that the -`content provider zuul job definition`_ is as follows (at time of writing):: - - - job: - name: tripleo-ci-centos-8-content-provider - parent: tripleo-ci-base-standalone-centos-8 - branches: ^(?!stable/(newton|ocata|pike|queens|rocky|stein)).*$ - run: - - playbooks/tripleo-ci/run-v3.yaml - - playbooks/tripleo-ci/run-provider.yml - vars: - featureset: '052' - provider_job: true - build_container_images: true - ib_create_web_repo: true - playbooks: - - quickstart.yml - - multinode-standalone-pre.yml - -It uses the `same featureset as the standalone job`_. Notice the -`multinode-standalone-pre.yml`_ passed to tripleo-quickstart for execution. -The `run-provider.yml playbook`_ is executed as the last of the zuul `run` plays. - -Finally, one other important task performed by the content provider job is to -build any dependent changes (i.e. depends-on in the code submission). This is -done with `build-test-packages`_ invoked in the `multinode-standalone-pre.yml`_. -We ensure that the built repo is available to child jobs by setting the -`ib_create_web_repo variable`_ when built-test-packages is invoked by a -provider job. This `makes the repo available via a HTTP server`_ on the -content provider node that consumers then retrieve as described below. - -The Content Consumers ---------------------- - -The child jobs or content consumers must use the container registry available -from the content provider. To do this `we set the docker_registry_host`_ -variable using the `job.registry_ip_address_branch` zuul_data returned from -the parent content provider. - -Any dependent changes built by `build-test-packages`_ are installed into -consumer jobs using the `install-built-repo`_ playbook. This has been added -into the `appropriate base job definitions`_ as a *pre-run:* play. - -Finally, in order to make a given zuul job a *consumer* job we must set the -content provider as dependency and pass the relevant variables. For example -in order to `run tripleo-ci-centos-8-scenario001-standalone as a consumer job`_:: - - - tripleo-ci-centos-8-content-provider - - tripleo-ci-centos-8-scenario001-standalone: - files: *scen1_files - vars: &consumer_vars - consumer_job: true - build_container_images: false - tags: - - standalone - dependencies: - - tripleo-ci-centos-8-content-provider - - -Upgrade Jobs ------------- - -Upgrade jobs are a special case because they require content from more than -one release. For instance tripleo-ci-centos-8-standalone-upgrade-ussuri will -deploy train containers and then upgrade to ussuri containers. - -To achieve this we use two content provider jobs as dependencies for the upgrade -jobs that require them (not all do):: - - - tripleo-ci-centos-8-standalone-upgrade: - vars: *consumer_vars - dependencies: - - tripleo-ci-centos-8-content-provider - - tripleo-ci-centos-8-content-provider-ussuri - -As shown earlier in this document the `registry_ip_address_branch dictionary`_ -maps release to the appropriate registry. This is set by each of the two parent -jobs and once both have executed the dictionary will contain more than one -entry. For example:: - - registry_ip_address_branch: - master: 213.32.75.192 - ussuri: 158.69.75.154 - -The consumer upgrade jobs then use the appropriate registry for the deployment -or upgrade part of the test. - -.. _`check and gate tripleo-ci jobs`: ci_primer.html -.. _`docker has recently announced`: https://www.docker.com/blog/scaling-docker-to-serve-millions-more-developers-network-egress/ -.. _`content provider zuul job definition`: https://opendev.org/openstack/tripleo-ci/src/commit/fbaaa3324712b9a718ce17c82bb190d09cca95be/zuul.d/standalone-jobs.yaml#L1032 -.. _`multinode-standalone-pre.yml`: https://opendev.org/openstack/tripleo-quickstart-extras/src/commit/e61200fec8acccb3d5fe20f68b64156a3daadb8a/playbooks/multinode-standalone-pre.yml -.. _`build-container role itself`: https://opendev.org/openstack/tripleo-ci/src/commit/fbaaa3324712b9a718ce17c82bb190d09cca95be/roles/build-containers/tasks/main.yaml#L265-L270 -.. _`zuul_return module`: https://zuul-ci.org/docs/zuul/reference/jobs.html?highlight=zuul_return#return-values -.. _`run-provider.yml playbook`: https://opendev.org/openstack/tripleo-ci/src/commit/fbaaa3324712b9a718ce17c82bb190d09cca95be/playbooks/tripleo-ci/run-provider.yml#L56 -.. _`zuul pause: true`: https://zuul-ci.org/docs/zuul/reference/jobs.html?highlight=pause#pausing-the-job -.. _`we set the docker_registry_host`: https://opendev.org/openstack/tripleo-quickstart-extras/src/commit/e61200fec8acccb3d5fe20f68b64156a3daadb8a/roles/extras-common/defaults/main.yml#L44 -.. _`build-test-packages`: https://opendev.org/openstack/tripleo-quickstart-extras/src/branch/master/roles/build-test-packages/ -.. _`ib_create_web_repo variable`: https://opendev.org/openstack/tripleo-quickstart-extras/src/commit/e61200fec8acccb3d5fe20f68b64156a3daadb8a/roles/install-built-repo/defaults/main.yml#L11 -.. _`makes the repo available via a HTTP server`: https://opendev.org/openstack/tripleo-quickstart-extras/src/commit/e61200fec8acccb3d5fe20f68b64156a3daadb8a/roles/install-built-repo/templates/install-built-repo.sh.j2#L17-L23 -.. _`install-built-repo`: https://opendev.org/openstack/tripleo-ci/src/commit/fbaaa3324712b9a718ce17c82bb190d09cca95be/playbooks/tripleo-ci/install-built-repo.yml#L16-L27 -.. _`appropriate base job definitions`: https://opendev.org/openstack/tripleo-ci/src/commit/fbaaa3324712b9a718ce17c82bb190d09cca95be/zuul.d/base.yaml#L184 -.. _`run tripleo-ci-centos-8-scenario001-standalone as a consumer job`: https://opendev.org/openstack/tripleo-ci/src/commit/fbaaa3324712b9a718ce17c82bb190d09cca95be/zuul.d/standalone-jobs.yaml#L483-L492 -.. _`registry_ip_address_branch dictionary`: https://opendev.org/openstack/tripleo-ci/src/commit/fbaaa3324712b9a718ce17c82bb190d09cca95be/playbooks/tripleo-ci/run-provider.yml#L26 -.. _`same featureset as the standalone job`: https://github.com/openstack/tripleo-quickstart/blob/671893a60467ad76359eaaf2199c55b64cc20702/config/general_config/featureset052.yml#L2 diff --git a/doc/source/ci/dlrn-promoter-overview.rst b/doc/source/ci/dlrn-promoter-overview.rst deleted file mode 100644 index b345acf1..00000000 --- a/doc/source/ci/dlrn-promoter-overview.rst +++ /dev/null @@ -1,141 +0,0 @@ -How the TripleO-RDO Pipelines' Promotions Work -============================================== - -Building consumable RDO repos and images involves various stages. -Each stage takes inputs and outputs artifacts. This document explains the -stages comprising the promotion pipelines, and the tools used to create -and manage the resulting artifacts. - -What is DLRN? -------------- - -DLRN is a tool to build RPM packages from each commit to a set of -OpenStack-related git repositories that are included in RDO. -DLRN builds are run through CI and to detect packaging issues with the -upstream branches of these Openstack projects. - -DLRN Artifacts - Hashes and Repos ---------------------------------- - -When a DLRN build completes, it produces a new hash and related repo version. -For example, the Pike builds on CentOS are available at: -https://trunk.rdoproject.org/centos7-pike/. -The builds are placed in directories by DLRN hash. Each directory contains -the RPMs as well as a repo file -https://trunk.rdoproject.org/centos7-pike/current-tripleo/delorean.repo -and a ``commit.yaml`` file -https://trunk.rdoproject.org/centos7-pike/current-tripleo/commit.yaml. - -There are some standard links that are updated as the builds complete and pass -stages of CI. Examples are these links are: - -- https://trunk.rdoproject.org/centos7-pike/current/ -- https://trunk.rdoproject.org/centos7-pike/consistent/ -- https://trunk.rdoproject.org/centos7-pike/current-tripleo/ -- https://trunk.rdoproject.org/centos7-pike/current-tripleo-rdo/ -- https://trunk.rdoproject.org/centos7-pike/current-tripleo-rdo-internal/ -- https://trunk.rdoproject.org/centos7-pike/tripleo-ci-testing/ - -The above links will be referenced in the sections below. - -Promoting through the Stages - DLRN API ---------------------------------------- - -DLRN API Client -``````````````` - -`The DLRN API -`_ -`client `_ -enables users to query repo status, upload new hashes and create promotions. -Calls to the dlrnapi_client retrieve the inputs to stages and upload artifacts -after stages. - -For example: - -:: - - $ dlrnapi --url https://trunk.rdoproject.org/api-centos-master-uc \ - promotion-get --promote-name tripleo-ci-testing - - [{'commit_hash': 'ec650aa2c8ce952e4a33651190301494178ac562', - 'distro_hash': '9a7acc684265872ff288a11610614c3b5739939b', - 'promote_name': 'tripleo-ci-testing', - 'timestamp': 1506427440}, - {'commit_hash': 'ec650aa2c8ce952e4a33651190301494178ac562', - [..] - - - $ dlrnapi --url https://trunk.rdoproject.org/api-centos-master-uc \ - repo-status --commit-hash ec650aa2c8ce952e4a33651190301494178ac562 \ - --distro-hash 9a7acc684265872ff288a11610614c3b5739939b - - [{'commit_hash': 'ec650aa2c8ce952e4a33651190301494178ac562', - 'distro_hash': '9a7acc684265872ff288a11610614c3b5739939b', - 'in_progress': False, - 'job_id': 'consistent', - 'notes': '', - 'success': True, - 'timestamp': 1506409403, - 'url': ''}, - {'commit_hash': 'ec650aa2c8ce952e4a33651190301494178ac562', - 'distro_hash': '9a7acc684265872ff288a11610614c3b5739939b', - 'in_progress': False, - 'job_id': 'periodic-singlenode-featureset023', - 'notes': '', - 'success': True, - 'timestamp': 1506414726, - 'url': 'https://logs.rdoproject.org/openstack-periodic-4hr/periodic-tripleo-centos-7-master-containers-build/8a76883'}, - {'commit_hash': 'ec650aa2c8ce952e4a33651190301494178ac562', - [..] - - -DLRN API Promoter -````````````````` - -`The DLRN API Promoter script -`_ -is a Python script that, based on the information in an input config file, -will promote an existing DLRN link to another link, provided the required tests -return successful results. - -For example, -`the master ini config file -`_ -is passed to the `promoter script -`_ -to promote the ``current-tripleo`` link to ``current-tripleo-rdo``. See the -sections above where both these links (for Pike) were shown. - -In the RDO Phase 1 pipeline, the tests listed under the ``[current-tripleo-rdo]`` -are run with the ``current-tripleo`` hash. Each test reports its ``success`` status to the -DLRN API endpoint for the Master release, ``api-centos-master-uc``. - -If each test reports ``SUCCESS: true``, the content of the ``current-tripleo`` -will become the new content of the ``current-tripleo-rdo`` hash. - -For complete documentation on how to run the Promoter script see: -https://github.com/rdo-infra/ci-config/blob/master/ci-scripts/dlrnapi_promoter/README.md - - -Pushing RDO containers to ``docker.io`` -``````````````````````````````````````` - -The DLRN Promoter script calls the `container push playbook -`_ -to push the RDO containers at each stage to `docker.io -`_. -Note that the above ``docker.io`` link shows containers tagged with ``tripleo-ci-testing``, -``current-tripleo`` and ``current-tripleo-rdo``. - - -DLRN API Promoter Server -```````````````````````` - -It is recommended that the Promoter script is run from a dedicated server. -`The promoter-setup repo -`_ -contains the Ansible playbook used to setup the promoter-server in the RDO -Cloud environment. This playbook allows the promoter script server to be -rebuilt as required. - diff --git a/doc/source/ci/emit_releases_file.rst b/doc/source/ci/emit_releases_file.rst deleted file mode 100644 index 84d32c34..00000000 --- a/doc/source/ci/emit_releases_file.rst +++ /dev/null @@ -1,93 +0,0 @@ -emit-releases-file and releases.sh -================================== - -The emit-releases-file tool is a python script that lives in the tripleo-ci -repo under the `scripts/emit_releases_file`_ directory. This script produces -an output file called `releases.sh` containing shell variable export commands. -These shell variables set the release **name** and **hash** for the -installation and target (versions) of a given job. For example, installing -latest stable branch (currently stein) and upgrading to master. The **hash** -is the delorean repo hash from which the packages used in the job are to be -installed. - -The contents of `releases.sh` will differ depending on the type of upgrade or -update operation being performed by a given job and this is ultimately -determined by the featureset. Each upgrade or update related featureset sets -boolean variables that signal the type of upgrade performed. For example -featureset050_ is used for undercloud upgrade and it sets:: - - undercloud_upgrade: true - -The `releases.sh` for an undercloud upgrade job looks like:: - - #!/bin/env bash - export UNDERCLOUD_INSTALL_RELEASE="stein" - export UNDERCLOUD_INSTALL_HASH="c5b283cab4999921135b3815cd4e051b43999bce_5b53d5ba" - export UNDERCLOUD_TARGET_RELEASE="master" - export UNDERCLOUD_TARGET_HASH="be90d93c3c5f77f428d12a9a8a2ef97b9dada8f3_5b53d5ba" - export OVERCLOUD_DEPLOY_RELEASE="master" - export OVERCLOUD_DEPLOY_HASH="be90d93c3c5f77f428d12a9a8a2ef97b9dada8f3_5b53d5ba" - export OVERCLOUD_TARGET_RELEASE="master" - export OVERCLOUD_TARGET_HASH="be90d93c3c5f77f428d12a9a8a2ef97b9dada8f3_5b53d5ba" - export STANDALONE_DEPLOY_RELEASE="master" - export STANDALONE_DEPLOY_HASH="be90d93c3c5f77f428d12a9a8a2ef97b9dada8f3_5b53d5ba" - export STANDALONE_DEPLOY_NEWEST_HASH="b4c2270cc6bec2aaa3018e55173017c6428237a5_3eee5076" - export STANDALONE_TARGET_RELEASE="master" - export STANDALONE_TARGET_NEWEST_HASH="b4c2270cc6bec2aaa3018e55173017c6428237a5_3eee5076" - export STANDALONE_TARGET_HASH="be90d93c3c5f77f428d12a9a8a2ef97b9dada8f3_5b53d5ba" - -As can be seen there are three different groups of keys set: -`UNDERCLOUD_INSTALL` and `UNDERCLOUD_TARGET` is one group, then -`OVERCLOUD_DEPLOY` and `OVERCLOUD_TARGET`, and finally `STANDALONE_DEPLOY` and -`STANDALONE_TARGET`. For each of those groups we have the `_RELEASE` name and -delorean `_HASH`. Since the example above is generated from an undercloud -upgrade job/featureset only the undercloud related values are set correctly. -The values for `OVERCLOUD_` and `STANDALONE_` are set to the default values -with both `_DEPLOY` and `_TARGET` referring to `master`. - -Where is releases.sh used -------------------------- - -The releases script is not used for all CI jobs or even for all upgrades -related jobs. There is a conditional in the -`tripleo-ci run-test role which determines`_ -the list of jobs for which we `use emit-releases-file`. In future we may remove -this conditional altogether. - -Once it is determined that the releases.sh file will be used, a list of extra -`RELEASE_ARGS is compiled`_ to be passed into the subsequent -`quickstart playbook invocations`_. An example of what these `RELEASE_ARGS` -looks like is:: - - --extra-vars @/home/zuul/workspace/.quickstart/config/release/tripleo-ci/CentOS-7/master.yml -e dlrn_hash=be90d93c3c5f77f428d12a9a8a2ef97b9dada8f3_5b53d5ba -e get_build_command=be90d93c3c5f77f428d12a9a8a2ef97b9dada8f3_5b53d5ba - -The `RELEASE_ARGS` are resolved by a helper function -get_extra_vars_from_release_. As you can see this function uses the release -name passed in via the `_RELEASE` value from the `releases.sh` to set the right -release configuration file from the tripleo-quickstart `config/release/`_ -directory which sets variables for the ansible execution. It also sets the -`dlrn_hash` which is used to setup the right repo and thus versions of packages -and finally the get_build_command is used to make sure we have the right -containers for the job. - -As you can see in the list of compiled `RELEASE_ARGS` the `INSTALL` or `TARGET` -are passed in to the get_extra_vars_from_release function, depending on the -playbook:: - - declare -A RELEASE_ARGS=( - ["multinode-undercloud.yml"]=$(get_extra_vars_from_release \ - $UNDERCLOUD_INSTALL_RELEASE $UNDERCLOUD_INSTALL_HASH) - ["multinode-undercloud-upgrade.yml"]=$(get_extra_vars_from_release \ - $UNDERCLOUD_TARGET_RELEASE $UNDERCLOUD_TARGET_HASH) - -So for the multinode-undercloud.yml use INSTALL_RELEASE but for -multinode-undercloud-upgrade.yml use TARGET_RELEASE and HASH. - -.. _`scripts/emit_releases_file`: https://opendev.org/openstack/tripleo-ci/src/commit/91c836da76f6f28a5c7545b6a96bf6a9c0d2289e/scripts/emit_releases_file -.. _featureset050: https://opendev.org/openstack/tripleo-quickstart/src/commit/b90b5a51df5104da35adf42a7d7fb5f7bc603eca/config/general_config/featureset050.yml#L18 -.. _releases_jobs: https://opendev.org/openstack/tripleo-ci/src/commit/91c836da76f6f28a5c7545b6a96bf6a9c0d2289e/roles/run-test/templates/toci_gate_test.sh.j2#L120 -.. _`tripleo-ci run-test role which determines`: https://opendev.org/openstack/tripleo-ci/src/commit/93768b46eec9cf3767fef23c186806e660f69395/roles/run-test/templates/toci_gate_test.sh.j2#L124 -.. _get_extra_vars_from_release: https://opendev.org/openstack/tripleo-ci/src/commit/91c836da76f6f28a5c7545b6a96bf6a9c0d2289e/roles/run-test/templates/oooq_common_functions.sh.j2#L155 -.. _`RELEASE_ARGS is compiled`: https://opendev.org/openstack/tripleo-ci/src/commit/91c836da76f6f28a5c7545b6a96bf6a9c0d2289e/roles/run-test/templates/toci_quickstart.sh.j2#L66 -.. _`quickstart playbook invocations`: https://opendev.org/openstack/tripleo-ci/src/commit/91c836da76f6f28a5c7545b6a96bf6a9c0d2289e/roles/run-test/templates/toci_quickstart.sh.j2#L130 -.. _`config/release/`: https://opendev.org/openstack/tripleo-quickstart/src/commit/b90b5a51df5104da35adf42a7d7fb5f7bc603eca/config/release diff --git a/doc/source/ci/index.rst b/doc/source/ci/index.rst deleted file mode 100644 index 9b331a0d..00000000 --- a/doc/source/ci/index.rst +++ /dev/null @@ -1,21 +0,0 @@ -TripleO CI Guide -================ - -.. toctree:: - :maxdepth: 2 - :includehidden: - - ci_primer - reproduce-ci - check_gates - standalone_scenario_jobs - baremetal_jobs - dlrn-promoter-overview - stages-overview - emit_releases_file - ruck_rover_primer - chasing_promotions - third_party_dependencies_ci - content_provider_jobs - tripleo_dependencies_pipelines - tripleo_ci_job_parenting diff --git a/doc/source/ci/promotions.mmd b/doc/source/ci/promotions.mmd deleted file mode 100644 index e6441776..00000000 --- a/doc/source/ci/promotions.mmd +++ /dev/null @@ -1,6 +0,0 @@ -graph TD - A[promoted-components] --> |periodically promote to| B[tripleo-ci-testing] - B --> |Build images & containers| C[images in RDO cloud] - C --> |Run periodic promotion jobs| D{criteria jobs passing?} - D-->|no| F[reject content] - D-->|yes| E[current-tripleo] diff --git a/doc/source/ci/reproduce-ci.rst b/doc/source/ci/reproduce-ci.rst deleted file mode 100644 index 89c0a3f2..00000000 --- a/doc/source/ci/reproduce-ci.rst +++ /dev/null @@ -1,127 +0,0 @@ -Reproduce CI jobs for debugging and development -=============================================== - -Knowing that at times ( perhaps always ) manipulating zuul jobs to do -your bidding can be frustrating. Perhaps you are trying to reproduce a -bug, test a patch, or just bored on a Sunday afternoon. I wanted to -briefly remind folks of their options. - -`RDO's zuul: `__ ---------------------------------------------------------------- - -RDO's zuul is setup to directly inherit from upstream zuul. Any TripleO -job that executes upstream should be re-runnable in RDO's zuul. A distinct -advantage here is that you can ask RDO admins to hold the job for you, -get your ssh keys on the box and debug the live environment. It's good -stuff. To hold a node, ask your friends in #rhos-ops - -Use testproject: Some documentation can be found -`here `__: - -upstream job example: -^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: yaml - - - project: - name: testproject - check: - jobs: - - tripleo-ci-centos-8-content-provider - - tripleo-ci-centos-8-containers-multinode: - dependencies: - - tripleo-ci-centos-8-content-provider - - gate: - jobs: [] - -periodic job, perhaps recreating a CIX issue example: -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: yaml - - - project: - name: testproject - check: - jobs: - - tripleo-ci-centos-8-scenario002-standalone: - vars: - timeout: 22000 - - periodic-tripleo-ci-centos-8-standalone-full-tempest-scenario-master: - vars: - timeout: 22000 - force_periodic: true - - periodic-tripleo-ci-centos-8-standalone-full-tempest-scenario-victoria: - vars: - timeout: 22000 - force_periodic: true - - periodic-tripleo-ci-centos-8-standalone-full-tempest-scenario-ussuri: - vars: - timeout: 22000 - force_periodic: true - - gate: - jobs: [] - - - - -Remember that depends-on can bring in any upstream changes. -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -- Here is an example commit message: - -Test jobs with new ovn package - -.. code-block:: yaml - - Test jobs with new ovn package - - Depends-On: https://review.opendev.org/c/openstack/openstack-tempest-skiplist/+/775493 - - Change-Id: I7b392acc4690199caa78cac90956e717105f4c6e - -`Local zuul: `__ ---------------------------------------------------------------------------------- - -Setting up zuul and friends locally is a much heavier lift than your -first option. Instructions and scripts to help you are available in any upstream -TripleO job, and -`here `__ - -A basic readme for the logs can be found directly in the logs directory -of any tripleo job. - -- `Basic - Readme `__ -- `Job - reproduce `__ - -If you are familiar w/ zuul and friends, containers, etc.. this could be -a good option for you and your team. There are a lot of moving parts and -it's complicated, well because it's complicated. A good way to become -more familiar with zuul would be to try out zuul's tutorial - -`zuul-runner: `__ -------------------------------------------------------------------------------------------- - -A long hard fought battle of persuasion and influence has been fought -with the maintainers of the zuul project. The blueprints and specs have -merged. The project's status is not complete as there are many -unmerged patches to date. - -Other Options: --------------- - -Finally, if you are not attempting to recreate, test, play with an -upstream tripleo job and just want to develop code there is another -option. A lot of developers find `tripleo-lab `__ to be quite useful. Many -devels have their own patterns as well, what works for you is fine. - -Summary: --------- - -For what it's worth imho using testproject jobs is an efficient, low -barrier to getting things done with upstream TripleO jobs. I'll be -updating the documentation and references to try and help over the next -few days, patches are welcome :) diff --git a/doc/source/ci/ruck_rover_primer.rst b/doc/source/ci/ruck_rover_primer.rst deleted file mode 100644 index 41d0c0fc..00000000 --- a/doc/source/ci/ruck_rover_primer.rst +++ /dev/null @@ -1,201 +0,0 @@ -TripleO CI ruck|rover primer -============================ - -The tripleo-squad divides their work across 3 week sprints. During sprint -planning 2 members of the team are nominated as the 'ruck' and 'rover'. -You can easily identify these unfortunate souls in OFTC #oooq with "ruck" or -"rover" in their irc nick. - -In short the "ruck" and "rover" are tasked with keeping the lights on for a -given TripleO CI sprint. This means: - -* ensuring `gate queues`_ are green to keep TripleO patches merging. -* ensuring promotion_ jobs are green to keep TripleO up to date with - the rest of OpenStack and everything else that isn't TripleO! Target - is bugs filed + escalated + fixed for promotion at *least* once a week. - -The "ruck|rover" concept adopted by Tripleo CI are taken from -`Australian Rules Football`_. The ruck monitors 'the queue' and files bugs, -and the rover picks up those bugs and runs with them until they're fixed. - -This document is a primer for anyone new to the TripleO CI squad or otherwise -interested in how the ruck|rover of the TripleO CI squad operate. See the -`CI Team Structure`_ document for general information about how the (rest of -the) TripleO CI team is organised and operates in a given sprint. - -Ruck ----- - -The ruck monitors the various jobs across the various tripleo related repos -both upstream tripleo-ci and rdo-infra jobs and periodics for promotions. The -grafana dashboard at -`http://cockpit-ci.tripleo.org/`_ is one of the -tools used by the ruck to monitor jobs (and many other things, more info on -grafana below). - -Any new issues are triaged by collecting logs from multiple instances of the -error (i.e. same error in different jobs or different runs of the same job). -The ruck monitors the failing jobs and files bugs for all known or confirmed -things currently affecting TripleO CI. - -Launchpad is used as the bug tracker - here is a list of recently created -`Tripleo launchpad bugs`_. When filing a new bug, the ruck will add the correct -milestone, change the status to "Triaged" add the appropriate tag(s): - -* ci: a general tag for all ci related bugs - any bug about a failing CI job - should have this. -* alert: critical bugs e.g. something that affects a great number of jobs. This - tag causes the bug to be advertised in irc OFTC #tripleo. -* tempest: bug is tempest related - failing tests or other tempest related error. -* ci-reproducer: related to the `zuul based job reproducer`_ -* promotion-blocker: this is used when the failing job(s) is in the promotion - criteria (more on that below). Bugs with this tag are picked up by a script - running periodically and converted to a CIX card which are tracked twice a week - in a CI Escalation Status meeting. -* ovb: bug is related to ovb (openstack-virtual-baremetal) jobs. - -For the periodic promotion jobs the ruck must ensure that the jobs defined as -being in 'promotion criteria' are passing. The criteria is simply a list of -jobs which must pass for a promotion to occur (see the promotion_ -docs for more info on the promotion stages in TripleO). This list is maintained -in a file per branch in the ci-config-dlrnapi-promoter-config_ directory. -For tripleo-ci promotions we are interested in promotions from current to -current-tripleo (see promotion_). Thus, looking at master.yaml_ at time of -writing for example:: - - promotions: - current-tripleo: - candidate_label: tripleo-ci-testing - criteria: - # Jobs to be added as they are defined and qualified - - periodic-tripleo-ci-build-containers-ubi-8-push - - periodic-tripleo-centos-8-buildimage-overcloud-full-master - - periodic-tripleo-centos-8-buildimage-overcloud-hardened-uefi-full-master - - periodic-tripleo-centos-8-buildimage-ironic-python-agent-master - - periodic-tripleo-ci-centos-8-standalone-master - ... - -The above means that for a promotion to happen all the jobs defined under -"current-tripleo" must pass. Obviously this list changes over time as jobs -are created and retired. It is sometimes necessary to temporarily skip a job -from that list (which is why you may see some jobs commented out with #). - -Rover ------ -The rover then takes the bugs filed by the ruck and tries to fix them. That is -*not* to say that the rover is expected or indeed able to fix all encountered -things! Really the expectation is that the rover has a root cause, or at least -understands where the bug is coming from (e.g. which service). - -In some cases bugs are fixed once a new version of some service is released -(and in tripleo-ci jobs after a promotion_ if it is a non tripleo -service/project). In this case the rover is expected to know what that fix is -and do everything they can to make it available in the jobs. This will range -from posting gerrit reviews to bump some service version in requirements.txt -through to simply harassing the 'right folks' ;) in the relevant `TripleO Squad`_. - -In other cases bugs may be deprioritized - for example if the job is non voting -or is not in the promotion criteria then any related bugs are less likely to -be getting the rover's attention. If you are interested in such jobs or bugs -then you should go to #OFTC oooq channel and find the folks with "ruck" or -"rover" in their nick and harass them about it! - -Of course for other cases there are bona fide bugs with the `TripleO CI code`_ -that the rover is expected to fix. To avoid being overwhelmed time management -is hugely important for the rover especially under high load. As a general rule -the rover should not spend any more than half a day (or four hours) on any -particular bug. Once this threshold is passed the rover should reach out and -escalate to any component experts. - -Under lighter load the rover is encouraged to help with any open bugs perhaps -those ongoing issues with lower priority (e.g. non-voting jobs) and even non -CI bugs in TripleO or any other relevant OpenStack component. - -Tools ------ - -The TripleO squad has developed two main tools to help the ruck and rover -do their job efficiently. They are known within the squad as 'grafana' and -'sova' (the names of the underlying code in each case): - -* grafana: `http://cockpit-ci.tripleo.org/`_ -* sova: `http://cistatus.tripleo.org/`_ -* etherpad: $varies -* ci health: `http://ci-health.tripleo.org/`_ - -The ruck|rover are encouraged to use an etherpad that is kept up to date for -any ongoing issues actively being worked on. Besides allowing coordination -between ruck and rover themselves (the TripleO CI team is distributed across -a number of time zones) one other use case is to allow tripleo-devs to check -if the reason a particular job is failing on their code review is 'known' or if -they need to go harrass the ruck|rover about it in OFTC #oooq. The location -of the current ruck|rover etherpad is given in grafana (see below). - -Sova -^^^^ - -In sova you can see for each of "check", "gate", and "promotions" a list of all -jobs, grouped by functionality ('ovb' or 'containers') as well as by branch in -the case of promotion jobs. By clicking on a particular job you can see the -most recent failures and successes with link to logs for more investigation. -Sova tries to determine where and how the a job fails and reports that -accordingly as shown below. - -.. image:: ./_images/sova.png - :align: left - :scale: 40 % - -Grafana -^^^^^^^ - -Grafana is used to track many things and is also constantly evolving so we -highlight only a few main data points here. The top of the dashboard has some -meters showing the overall 'health' of CI. - -.. figure:: ./_images/grafana1.png - :align: center - :scale: 40 % - :alt: grafana overall ci health - - As can be seen left to right - the "Upstream Zuul queue" gives the time a - review waits before being picked up by zuul for jobs to run against it, the - "Upstream gate jobs" shows the number of failing gate jobs in the last 24 hours, - "Upstream CI stats" shows the ratio of passing to failing jobs as a Pie chart - (anything above 80% pass is good) and finally a list of the latest failing gate - jobs with links. At the bottom left there is a link to the current ruck rover - etherpad. - - -Grafana is also useful for tracking promotions across branches. - -.. figure:: ./_images/grafana2.png - :align: center - :scale: 40 % - - As seen above on the left hand side and from top to bottom - the latest - promotions for master, stein, rocky, queens and pike as bar charts. The bars - represent promotions and height shows the number of promotions on that day. - - -Finally grafana tracks a list of all running jobs highlighting the failures in -red. - -.. image:: ./_images/grafana3.png - :align: left - :scale: 40 % - - -.. _`gate queues`: https://docs.openstack.org/tripleo-docs/latest/ci/ci_primer.html -.. _`Australian Rules Football`: https://en.wikipedia.org/wiki/Follower_(Australian_rules_football) -.. _promotion: https://docs.openstack.org/tripleo-docs/latest/ci/stages-overview.html -.. _`TripleO Squad`: https://docs.openstack.org/tripleo-docs/latest/contributor/index.html#squads -.. _`TripleO launchpad bugs`: https://bugs.launchpad.net/tripleo/+bugs?orderby=-datecreated&start=0 -.. _ci-config-dlrnapi-promoter-config: https://github.com/rdo-infra/ci-config/tree/master/ci-scripts/dlrnapi_promoter/config_environments/rdo/CentOS-8 -.. _master.yaml: https://github.com/rdo-infra/ci-config/blob/cc3999a3fb29736769a8c497f0069e90c035b82c/ci-scripts/dlrnapi_promoter/config_environments/rdo/CentOS-8/master.yaml#L24-L51 -.. _`http://cockpit-ci.tripleo.org/`: http://cockpit-ci.tripleo.org/ -.. _`http://cistatus.tripleo.org/`: http://cistatus.tripleo.org/ -.. _`http://ci-health.tripleo.org/`: http://ci-health.tripleo.org/ -.. _`CI Team Structure`: https://specs.openstack.org/openstack/tripleo-specs/specs/policy/ci-team-structure.html -.. _`zuul based job reproducer`: https://opendev.org/openstack/tripleo-quickstart-extras/src/branch/master/roles/create-zuul-based-reproducer/README.md -.. _`TripleO CI code`: https://opendev.org/openstack/tripleo-ci/src/branch/master/README.rst - diff --git a/doc/source/ci/stages-overview.rst b/doc/source/ci/stages-overview.rst deleted file mode 100644 index 06ac4bbc..00000000 --- a/doc/source/ci/stages-overview.rst +++ /dev/null @@ -1,266 +0,0 @@ -TripleO CI Promotions -===================== - -This section introduces the concept of promotions in TripleO. -In short, a promotion happens when we can certify the latest version of all -packages required for a TripleO deployment of OpenStack as being in a good -state and without regressions. - -The certification consists of running Zuul CI jobs with the latest packages -built from source for TripleO code (list of TripleO repos at [1]_) and -the latest packages built from source for non-tripleo code. If the tests are -successful, then the result is certified as **current-tripleo**, ready to be -consumed by the TripleO CI check and gate jobs (see [2]_ for more information -about check and gate). - -This process is continuous as new code is merged into the various repos. Every -time we get a successful completion of the promotion CI jobs, the tested content -is 'promoted' to be the new **current-tripleo**, hence the name this workflow -is known by. At a given time, the latest **current-tripleo** is the baseline by -which we test all new code submissions to the TripleO project. - -TripleO vs non-tripleo repos ----------------------------- - -All proposed code submissions across the various tripleo repos are gated by the -TripleO community which owns and manages the zuul check and gate jobs for those -repos. - -However, we cannot gate changes to anything outside TripleO, including all -the OpenStack projects used by TripleO as well as any dependencies such -as Open vSwitch or Pacemaker. - -Even though we cannot gate on those external repos, the promotion process -allows us to test our TripleO code with their latest versions. If there are -regressions or any other bugs (and assuming ideal test coverage) the promotion -jobs will fail accordingly allowing the TripleO CI team to investigate and file -launchpad bugs so the issue(s) can be addressed. - -RDO DLRN & Promotion Criteria ------------------------------ - -TripleO CI jobs consume packages built by the RDO DLRN service ('delorean') so -we first introduce it here. An overview is given on the RDO project site at -[3]_. - -In short, RDO DLRN builds RPMs from source and publishes the resulting packages -and repos. Each build or repo is identifiable using a unique build ID. - -RDO DLRN assigns named tags to particular build IDs. You can see all of these -named tags by browsing at the RDO DLRN package root, for example for Centos8 -master branch at [4]_. Of particular importance to the TripleO promotion -workflow are:: - -* current -* consistent -* component-ci-testing -* promoted-components -* tripleo-ci-testing -* current-tripleo - -The list of tags in the order given above gives the logical progression -through the TripleO promotion workflow. - -The build ID referenced by each of those named tags is constantly updated as -new content is 'promoted' to become the new named tag. - -A general pattern in DLRN is that **current** is applied to the very latest -build, that is, the latest commits to a particular repo. A new **current** -build is generated periodically (e.g. every half hour). The **consistent** tag -represents the latest version of packages where there were no errors -encountered during the build for any of those (i.e. all packages were built -successfully). The **consistent** build is what TripleO consumes as the entry -point to the TripleO promotion workflow. - -One last point to be made about RDO DLRN is that after the TripleO promotion -CI jobs are executed against a particular DLRN build ID, the results are -reported back to DLRN. For example, you can query using the build ID at [5]_ -to get the list of jobs that were executed -against that specific content, together with the results for each. - -The list of jobs that are required to pass before we can promote a particular -build is known as the 'promotion criteria'. In order to promote, TripleO -queries the DLRN API to get the results for a particular build and compares the -passing jobs to the promotion criteria, before promoting or rejecting that -content accordingly. You can find the master centos8 promotion criteria at [6]_ -for example. - -The TripleO Promotion Pipelines -------------------------------- - -A pipeline refers to a series of Zuul CI jobs and what we refer to as the -TripleO promotion workflow is actually a number of interconnected pipelines. -At the highest level conceptually these are grouped into either *Component* -or *Integration* pipelines. The output of the Component pipeline serves as -input to the Integration pipeline. - -A Component is a conceptual grouping of packages related by functional area -(with respect to an OpenStack deployment). This grouping is enforced in -practice by the RDO DLRN server and the current list of all components can be -found at [7]_. For example, you can expect to find the 'openstack-nova-' -packages within the Compute component. - -The Component pipeline actually consists of a number of individual -pipelines, one for each of the components. The starting point for each of these -is the latest **consistent** build of the component packages and we will go -into more detail about the flow inside the component pipelines in the following -section. - -A successful run of the jobs for the given component allows us to certify that -content as being the new **promoted-components**, ready to be used as input to -the Integration pipeline. The Integration pipeline qualifies the result of the -components tested together and when that is successful we can promote to a new -current-tripleo. This is shown conceptually for a subset of components here: - -.. only:: html - - .. mermaid:: component_integration_pipelines.mmd - -In the diagram above, you can see the component pipeline at the top with the -compute, cinder and security components. This feeds into the integration -pipeline in the bottom half of the diagram where promoted-components will be -tested together and if successful produce the new **current-tripleo**. - -The Component Promotion Pipeline --------------------------------- - -As noted above, the "Component pipeline" is actually a series of individual -pipelines, one for each component. While these all operate and promote -in the same way, they do so independently of each other. -So the latest **compute/promoted-components** may be much newer than the latest -**security/promoted-components**, if the latter is failing to promote for -example. The following flowchart shows the progression of the RDO DLRN tags -through a single component pipeline while in practice this flow is repeated in -parallel per component. - -.. only:: html - - .. mermaid:: component_pipeline_tags_flow.mmd - - -As illustrated above, the entry point to the component pipelines -is the latest **consistent** build from RDO DLRN. Once a day a periodic job -tags the latest **consistent** build as **component-ci-testing**. For example -you can see the history for the baremetal component job at [8]_ descriptively -named -**periodic-tripleo-centos-8-master-component-baremetal-promote-consistent-to-component-ci-testing**. - -After this job has completed the content marked as **component-ci-testing** -becomes the new candidate for promotion to be passed through the component CI -jobs. The **component-ci-testing** repo content is tested with the latest -**current-tripleo** repos of everything else. Remember that at a given time -**current-tripleo** is the known good baseline by which we test all new -content and the same applies to new content tested in the component pipelines. - -As an example of the component CI jobs, you can see the history for the -baremetal component standalone job at [9]_. If you navigate to the -*logs/undercloud/etc/yum.repos.d/* -directory for one of those job runs you will see (at least) the following -repos: - -* delorean.repo - which provides the latest current-tripleo content -* baremetal-component.repo - which provides the 'component-ci-testing' content - that we are trying to promote. - -You may notice that the trick allowing the baremetal-component.repo to have -precedence for the packages it provides is to set the repo priority accordingly -(*1* for the component and *20* for delorean.repo). - -Another periodic job checks the result of the **component-ci-testing** job runs -and if the component promotion criteria is satisfied the candidate content is -promoted and tagged as the new **promoted-components**. You can find the -promotion criteria for Centos8 master components at [10]_. - -As an example the history for the zuul job that handles promotion to -promoted-components for the cinder component can be found at [11]_ - -You can explore the latest content tagged as **promoted-components** for the -compute component at [12]_. All the component **promoted-components** are -aggregated into one repo that can be found at [13]_ and looks -like the following:: - - [delorean-component-baremetal] - name=delorean-openstack-ironic-9999119f737cd39206df3d73e23e5f47933a6f32 - baseurl=https://trunk.rdoproject.org/centos8/component/baremetal/99/99/9999119f737cd39206df3d73e23e5f47933a6f32_1b0aff0d - enabled=1 - gpgcheck=0 - priority=1 - - [delorean-component-cinder] - name=delorean-openstack-cinder-482e6a3cc5cca697b54ee1d853a4eca6e6f3cfc7 - baseurl=https://trunk.rdoproject.org/centos8/component/cinder/48/2e/482e6a3cc5cca697b54ee1d853a4eca6e6f3cfc7_ae00ff8c - enabled=1 - gpgcheck=0 - priority=1 - -Every time a component promotes a new **component/promoted-components** the -aggregated **promoted-components** delorean.repo on the RDO DLRN server is -updated with the new content. - -This **promoted-components** repo is used as the starting point for the TripleO -Integration promotion pipeline. - -The Integration Promotion Pipeline ----------------------------------- - -The Integration pipeline as the name suggests is the integration point where -we test new content from all components together. The consolidated -**promoted-components** delorean.repo produced by the component pipeline -is tested with a series of CI jobs. If the jobs listed in the promotion -criteria pass, we promote that content and tag it as **current-tripleo**. - -.. only:: html - - .. mermaid:: promotions.mmd - -As can be seen in the flowchart above, the **promoted-components** content -is periodically promoted (pinned) to **tripleo-ci-testing**, which becomes the -new promotion candidate to be tested. You can find the build history -for the job that promotes to **tripleo-ci-testing** for Centos 8 master, -descriptively named -**periodic-tripleo-centos-8-master-promote-promoted-components-to-tripleo-ci-testing**, -at [14]_. - -First the **tripleo-ci-testing** content is used to build containers and -overcloud deployment images and these are pushed to RDO cloud to be used by -the rest of the jobs in the integration pipeline. - -The periodic promotion jobs are then executed with the results being reported -back to DLRN. If the right jobs pass according to the promotion criteria -then the **tripleo-ci-testing** content is promoted and tagged to become the -new **current-tripleo**. - -An important distinction in the integration pipeline compared to the promotion -pipeline is in the final promotion of content. In the component pipeline -the **promoted-components** content is tagged by a periodic Zuul job as -described above. For the Integration pipeline however, the promotion to -**current-tripleo** happens with the use of a dedicated service. This service -is known to the tripleo-ci squad by a few names including -'the promotion server', 'the promoter server' and 'the promoter'. - -In short the promoter periodically queries delorean for the results of the last -few tripleo-ci-testing runs. It compares the results to the promotion criteria -and if successful it re-tags the container and overcloud deployment images as -**current-tripleo** and pushes back to RDO cloud (as well as to the quay.io and -docker registries). It also talks to the DLRN server and retags the -successful **tripleo-ci-testing** repo as the new **current-tripleo**. -You can read more about the promoter with links to the code at [15]_. - -References -~~~~~~~~~~ - -.. [1] `List of TripleO repos `_ -.. [2] `TripleO Check and Gate jobs `_ -.. [3] `RDO DLRN Overview @ rdoproject.org `_ -.. [4] `Index of RDO DLRN builds for Centos 8 master @ rdoproject.org `_ -.. [5] `Query RDO DLRN by build ID @ rdoproject.org `_ -.. [6] `Centos8 current-tripleo promotion criteria at time of writing `_ -.. [7] `Centos8 RDO DLRN components @ rdoproject.org `_ -.. [8] `Zuul job history "periodic-tripleo-centos-8-master-component-baremetal-promote-consistent-to-component-ci-testing" `_ -.. [9] `Zuul job history "periodic-tripleo-ci-centos-8-standalone-baremetal-master" `_ -.. [10] `Centos8 master promoted-components promotion critiera at time of writing `_ -.. [11] `Zuul job history "periodic-tripleo-centos-8-master-component-cinder-promote-to-promoted-components" `_ -.. [12] `Compute promoted-components @ rdoproject.org `_ -.. [13] `Centos8 master promoted-components delorean.repo @ rdoproject.org `_ -.. [14] `Zuul job history "periodic-tripleo-centos-8-master-promote-promoted-components-to-tripleo-ci-testing" `_ -.. [15] `TripleO CI docs "Promotion Server and Criteria" `_ diff --git a/doc/source/ci/standalone_scenario_jobs.rst b/doc/source/ci/standalone_scenario_jobs.rst deleted file mode 100644 index 72639d39..00000000 --- a/doc/source/ci/standalone_scenario_jobs.rst +++ /dev/null @@ -1,100 +0,0 @@ -Standalone Scenario jobs -======================== - -This section gives an overview and some details on the standalone scenario ci -jobs. The standalone deployment is intended as a one node development -environment for TripleO. - see the `Standalone Deploy Guide `_ -for more information on setting up a standalone environment. - -A 'scenario' is a concept used in TripleO -to describe a collection of services - see the service-testing-matrix_ for more -information about each scenario and the services deployed there. We combine the -two to define the standalone scenario jobs. - -These are intended to give developers faster feedback (the jobs are relatively -fast to complete) and allow us to have better coverage across services by defining a -number of scenarios. Crucially the standalone scenario jobs allow us to increase -coverage without further increasing our resource usage footprint with eachjob only taking -a single node. See this openstack-dev-thread_ for background around the move from -the multinode jobs to the more resource friendly standalone versions. - -.. _service-testing-matrix: https://github.com/openstack/tripleo-heat-templates/blob/master/README.rst#service-testing-matrix -.. _openstack-dev-thread: http://lists.openstack.org/pipermail/openstack-dev/2018-October/136192.html -.. _standalone_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/deployment/standalone.html - - -Where ------ - -The standalone scenario jobs (hereafter referred to as just 'standalone' in this -document), are defined in the `tripleo-ci/zuul.d/standalone.yaml`_ file. Besides -the definitions for each of the scenario00X-standalone jobs, this file also -carries the tripleo-standalone-scenarios-full_project-template_ which defines -the zuul layout and files: sections for the standalone jobs in a central location. - -Thus, the jobs are consumed by other projects across tripleo by inclusion of -the template in their respective zuul layout file, for example -tripleo-heat-templates_ and tripleo-common_. - -Besides the job definitions in the tripleo-ci repo, the other main part of the -standalone jobs is a service environment file, which lives in the -`tripleo-heat-templates-ci/environments`_. As you can see in scenario001-env_, -scenario002-env_, scenario003-env_ and scenario004-env_ that is where we define the -services and parameters that are part of a given scenario. - -.. _`tripleo-ci/zuul.d/standalone.yaml`: https://github.com/openstack-infra/tripleo-ci/blob/master/zuul.d/standalone-jobs.yaml -.. _tripleo-standalone-scenarios-full_project-template: https://github.com/openstack-infra/tripleo-ci/blob/75ff68608baab31f6ac9e5395a9841c08c62e092/zuul.d/standalone-jobs.yaml#L78-L80 -.. _tripleo-heat-templates: https://github.com/openstack/tripleo-heat-templates/blob/d5298e2f7936bcb5ca7d41466d024fe6958ce177/zuul.d/layout.yaml#L8 -.. _tripleo-common: https://github.com/openstack/tripleo-common/blob/026ed7d9e041c92956aa9db59e881f6632eed2f2/zuul.d/layout.yaml#L14 -.. _`tripleo-heat-templates-ci/environments`: https://github.com/openstack/tripleo-heat-templates/tree/master/ci/environments -.. _scenario001-env: https://github.com/openstack/tripleo-heat-templates/blob/1c46d1850a8de89daeecd96f2f5288336e3778f8/ci/environments/scenario001-standalone.yaml#L1 -.. _scenario002-env: https://github.com/openstack/tripleo-heat-templates/blob/1c46d1850a8de89daeecd96f2f5288336e3778f8/ci/environments/scenario002-standalone.yaml#L1 -.. _scenario003-env: https://github.com/openstack/tripleo-heat-templates/blob/1c46d1850a8de89daeecd96f2f5288336e3778f8/ci/environments/scenario003-standalone.yaml#L1 -.. _scenario004-env: https://github.com/openstack/tripleo-heat-templates/blob/1c46d1850a8de89daeecd96f2f5288336e3778f8/ci/environments/scenario004-standalone.yaml#L1 - -How ---- - -The standalone jobs are special in that they differ from 'traditional' multinode -jobs by having a shared featureset rather than requiring a dedicated featureset -for each job. Some of the standalone scenarios, notably scenario012_ will end up -having a dedicated-featureset_ however in most cases the base standalone-featureset052_ -can be re-used for the different scenarios. Notably you can see that scenario001-job_, -scenario002-job_, scenario003-job_ and scenario004-job_ job definitions are all -using the same standalone-featureset052_. - -Given that we use the same featureset the main differentiator between these -standalone jobs is the scenario environment file, which we pass using -featureset_override (see :doc:`../ci/check_gates`). -For example in the scenario001 job we point to the scenario001-standalone.yaml -(scenario001-env_):: - - - job: - name: tripleo-ci-centos-7-scenario001-standalone - voting: true - parent: tripleo-ci-base-standalone - nodeset: single-centos-7-node - branches: ^(?!stable/(newton|ocata|pike|queens|rocky)).*$ - vars: - featureset: '052' - standalone_ceph: true - featureset_override: - standalone_container_cli: docker - standalone_environment_files: - - 'environments/low-memory-usage.yaml' - - 'ci/environments/scenario001-standalone.yaml' - ... - -Finally we use a task in the tripleo-ci-run-test-role_ to pass the scenario -environment file into the standalone deployment command using the standalone -role standalone_custom_env_files_ parameter. - -.. _scenario012: https://review.opendev.org/634723 -.. _dedicated-featureset: https://review.opendev.org/636355 -.. _standalone-featureset052: https://github.com/openstack/tripleo-quickstart/blob/6585d6320ca4f0c37ae62dfc60fe2eb0cd42647c/config/general_config/featureset052.yml#L2 -.. _scenario001-job: https://github.com/openstack-infra/tripleo-ci/blob/1d890565feeeea6ce637cf0384da822926480f07/zuul.d/standalone-jobs.yaml#L376 -.. _scenario002-job: https://github.com/openstack-infra/tripleo-ci/blob/1d890565feeeea6ce637cf0384da822926480f07/zuul.d/standalone-jobs.yaml#L401 -.. _scenario003-job: https://github.com/openstack-infra/tripleo-ci/blob/1d890565feeeea6ce637cf0384da822926480f07/zuul.d/standalone-jobs.yaml#L426 -.. _scenario004-job: https://github.com/openstack-infra/tripleo-ci/blob/1d890565feeeea6ce637cf0384da822926480f07/zuul.d/standalone-jobs.yaml#L448 -.. _tripleo-ci-run-test-role: https://github.com/openstack-infra/tripleo-ci/blob/1d890565feeeea6ce637cf0384da822926480f07/roles/run-test/tasks/main.yaml#L26-L36 -.. _standalone_custom_env_files: https://github.com/openstack/tripleo-quickstart-extras/blob/def233448d2ae8ed5bcc6d286f5cf8378f7cf7ec/roles/standalone/templates/standalone.sh.j2#L9 diff --git a/doc/source/ci/third_party_dependencies_ci.rst b/doc/source/ci/third_party_dependencies_ci.rst deleted file mode 100644 index eb4d3940..00000000 --- a/doc/source/ci/third_party_dependencies_ci.rst +++ /dev/null @@ -1,144 +0,0 @@ -Gating github projects using TripleO CI jobs -============================================ - -In TripleO deployment, we consume OpenStack and non-openstack projects. -In order to catch issues early, every patchset of the OpenStack projects -is gated with TripleO CI jobs using Zuul. - -With the help of an RDO software factory instance, we can also now gate -non-openstack projects hosted on Github. - -ceph-ansible and podman are the two non-openstack projects which are heavily -used in TripleO deployments and are hosted on github and for which we have -enabled TripleO CI jobs via github pull requests as described below. - -Jobs running against ceph-ansible ---------------------------------- - -ceph-ansible_ is used to deploy Ceph in standalone scenario 1 and 4 jobs. -These jobs are defined in rdo-jobs_ repo. - -On any ceph-ansible pull request, A user can trigger these jobs by leaving a -comment with 'check-rdo' on a pull request. It is currently done manually by -the OpenStack developers. - -Then, those jobs will appear in the RDO software factory Zuul_ status page -under `github-check` pipeline. - -On merged patches, periodic jobs are also triggered in -`openstack-periodic-weekend` pipeline_. - -.. _ceph-ansible: https://github.com/ceph/ceph-ansible -.. _rdo-jobs: https://github.com/rdo-infra/rdo-jobs/blob/master/zuul.d/ceph-ansible.yaml -.. _Zuul: https://review.rdoproject.org/zuul/status -.. _pipeline: https://review.rdoproject.org/zuul/builds?pipeline=openstack-periodic-weekend&project=ceph%2Fceph-ansible - -Jobs running against podman ---------------------------- - -In TripleO, OpenStack services are running in containers. -The container lifecycle, healthcheck and execution is managed via systemd using -paunch. Paunch under the hood uses podman. - -The `podman` utility comes from libpod_ project. - -Currently on each libpod pull request, tripleo ci based jobs get triggered -automatically and get queued in `github-check` pipeline in RDO software factory -Zuul instance. - -TripleO jobs related to podman are defined in rdo-jobs-repo_. - -For gating libpod project, we run keystone based scenario000 minimal tripleo -deployment job which tests the functionality of podman with keystone services. -It takes 30 mins to finish the tripleo deployment. - -Below is the example job definition for scenario000-job_:: - - - job: - name: tripleo-podman-integration-rhel-8-scenario000-standalone - parent: tripleo-ci-base-standalone-periodic - nodeset: single-rhel-8-node - branches: ^master$ - run: playbooks/podman/install-podman-rpm.yaml - required-projects: - - name: github.com/containers/libpod - vars: - featureset: '052' - release: master - registry_login_enabled: false - featureset_override: - standalone_environment_files: - - 'environments/low-memory-usage.yaml' - - 'ci/environments/scenario000-standalone.yaml' - - 'environments/podman.yaml' - run_tempest: false - use_os_tempest: false - -For re-running the tripleo jobs on libpod pull request, we can add -`check-github` comment on the libpod pull requests itself. - -On merged patches, periodic jobs also get triggerd in -`openstack-regular` rdo-job-pipeline_. - -.. _libpod: https://github.com/containers/libpod -.. _rdo-jobs-repo: https://github.com/rdo-infra/rdo-jobs/blob/master/zuul.d/podman.yaml -.. _scenario000-job: https://github.com/rdo-infra/rdo-jobs/blob/0186d637063c7e410ab9e0afc91b266c19e92473/zuul.d/podman.yaml#L50-L67 -.. _rdo-job-pipeline: https://review.rdoproject.org/zuul/builds?pipeline=openstack-regular&project=containers%2Flibpod - - -Report bugs when Jobs start failing ------------------------------------ - -TripleO Jobs running against libpod and ceph-ansible projects might fail due to -issue in libpod/ceph-ansible or in TripleO itself. - -Once the status of any job is *FAILED* or *POST_FAILURE* or *RETRY_LIMIT*. -Click on the job link and it will open the build result page. Then click on -`log_url`, click on the `job-output.txt`. It contains the results of -ansible playbook runs. -Look for *ERROR* or failed messages. -If looks something obvious. -Please go ahead and create the bug on launchpad_ against tripleo project with -all the information. - -Once the bug is created, please add `depcheck` tag on the filed launchpad bug. -This tag is explicitly used for listing bugs related to TripleO CI job failure -against ceph-ansible and podman projects. - -.. _launchpad: https://bugs.launchpad.net/tripleo/+filebug - -`check-rdo` vs `check-github` ------------------------------ - -`check-rdo` and `check-github` comments are used to trigger TripleO based zuul -jobs against github projects (ceph-ansible/podman) 's pull requests. - -.. note:: - - On commenting `check-rdo` or `check-github`, not all jobs will appears in the - github-manual pipeline. It depends whether the jobs are configured in the - particular pipeline to get triggered. If the jobs are not defined there - then, nothing will happen. - -check-rdo -********* - -It is used against ceph-ansible pull requests especially. The jobs will be gets -triggered and land in `github-check` pipeline. - -check-github -************ - -If a TripleO job fails against ceph-ansible or podman PRs, then it can be -relaunched using `check-github` comment. The job will appear in `github-manual` -pipeline. - -Using `Depends-On` on ceph-ansible/podman pull requests -------------------------------------------------------- - -One can also create/put OpenStack or RDO gerrit reviews against -ceph-ansible/podman pull requests by putting -`Depends-On: ` in the first message -of the github pull request_. - -.. _request: https://github.com/ceph/ceph-ansible/pull/3576 diff --git a/doc/source/ci/tripleo_ci_job_parenting.rst b/doc/source/ci/tripleo_ci_job_parenting.rst deleted file mode 100644 index b3f094a8..00000000 --- a/doc/source/ci/tripleo_ci_job_parenting.rst +++ /dev/null @@ -1,422 +0,0 @@ -TripleO CI Zuul Jobs Parenting -============================== - -When a developer submits a patch to TripleO repositories, their code is -tested against a series of different TripleO CI jobs. -Each job creates a different scenario for testing purposes. - -The TripleO CI jobs are Zuul jobs, defined within TripleO projects under -one of several locations: `zuul.d`_ directory, .zuul.yaml or zuul.yaml. - -A Zuul job can be inherited in various child jobs as `parent`_. - - -Zuul Job Parenting -++++++++++++++++++ - -In order to re-use a particular Zuul job, we create -a set of standard base jobs, which contain -ansible variables, required projects, pre-run, run, -post-run steps and Zuul related variables. - -These base job definitions are used as `parent`_ in various tripleo-ci -jobs. The child job inherits attributes from the parent unless -these are overridden by the child. - -A child job can override the variable which is also defined -in parent job. - -TripleO CI Base jobs -++++++++++++++++++++ - -TripleO CI base jobs are defined in `zuul.d/base.yaml`_ file -in tripleo-ci repo. - -Below is the list of base jobs and each is explained in a little more detail -in subsequent sections: - -* tripleo-ci-base-common-required-projects -* tripleo-ci-base-standard -* tripleo-ci-base-multinode-standard -* tripleo-ci-base-singlenode-standard -* tripleo-ci-base-standalone-standard -* tripleo-ci-base-standalone-upgrade-standard -* tripleo-ci-base-ovb-standard -* tripleo-ci-base-containers-standard -* tripleo-ci-base-images-standard -* tripleo-ci-content-provider-standard - -tripleo-ci-base-common-required-projects ----------------------------------------- - -It contains a list of common required projects and ansible roles -which are needed to start the deployment. It is used in -upstream, RDO and Downstream. -If a new project is needed in all types of deployment -(upstream, RDO and Downstream) it can be added here. - -tripleo-ci-base-standard ------------------------- - -It contains a set of ansible variables and playbooks used in -most deployments. - -tripleo-ci-base-multinode-standard ----------------------------------- -It contains a set of ansible variables and playbooks used in -most containers multinode and scenarios job. - -It is used in those jobs where the user needs to deploy -OpenStack using one undercloud and one controller. - -tripleo-ci-base-singlenode-standard ------------------------------------ -It contains a set of ansible variables and playbooks used in -most single node jobs. - -It is used in those jobs where user needs to build containers -and overcloud images which later can be used in another deployment. - -It can also be used for undercloud deployment. - -tripleo-ci-base-standalone-standard ------------------------------------ -It contains a set of ansible variables and playbooks used in -vanilla standalone and standalone based scenario jobs. - -The standalone job consists of single node overcloud deployment. - -tripleo-ci-base-standalone-upgrade-standard -------------------------------------------- -It contains a set of ansible variables and playbooks used in -the standalone upgrade job. - -The singlenode job consists of single node overcloud deployment -where we upgrade a deployment from an older release to a newer one. - -tripleo-ci-base-ovb-standard ----------------------------- -It contains a set of ansible variables and playbooks used in -the virtual baremetal deployment. - -The ovb job consists of one undercloud and four overcloud -nodes (one compute and multiple controllers) deployed as -virtual baremetal nodes. It is a replica of -real world customer deployments. - -It is used in RDO and downstream jobs. - -tripleo-ci-base-containers-standard ------------------------------------ -It contains a set of ansible variables and playbooks used -during build containers and pushing it to specific registry. - -tripleo-ci-base-images-standard -------------------------------- -It contains a set of ansible variables and playbooks used -during build overcloud images and pushing it to image server. - -tripleo-ci-content-provider-standard ------------------------------------- -It contains a set of ansible variables and playbooks used for -building containers and pushing them to a local registry. -Depends-on patches are built into respective rpm packages via DLRN and -served by a local yum repos. - -The job is `paused`_ to serve container registry and yum repos which -can be used later in dependent jobs. - -Currently these jobs are running in Upstream and Downstream. - -Required Project Jobs -+++++++++++++++++++++ - -It contains the list of required projects needed for specific type -of deployment. - -Upstream job `tripleo-ci-build-containers-required-projects-upstream`_ -requires projects like ansible-role-container-registry, -kolla, python-tripleoclient, tripleo-ansible to build containers. - -In case of RDO `tripleo-ci-build-containers-required-projects-rdo`_ serves the -same purpose. - -Many Upstream OpenStack projects are forked downstream and have different -branches. - -To accommodate the downstream namespace and branches we use the downstream -specific required project job (*required-projects-downstream*) -as a base job with proper branches and override-checkout. - -tripleo-ci-base-required-projects-multinode-internal job defined in the -examples are perfect example for the same. - -Below is one of the examples of container multinode required projects job. - -`Upstream`_ :: - - - job: - name: tripleo-ci-base-required-projects-multinode-upstream - description: | - Base abstract job to add required-projects for Upstream Multinode Jobs - abstract: true - parent: tripleo-ci-base-multinode-standard - required-projects: - - opendev.org/openstack/tripleo-ansible - - opendev.org/openstack/tripleo-common - - opendev.org/openstack/tripleo-operator-ansible - - name: opendev.org/openstack/ansible-config_template - override-checkout: master - -`RDO`_ :: - - - job: - name: tripleo-ci-base-required-projects-multinode-rdo - abstract: true - description: | - Base abstract job for multinode in RDO CI zuulv3 jobs - parent: tripleo-ci-base-multinode-standard - pre-run: - - playbooks/tripleo-rdo-base/pre.yaml - - playbooks/tripleo-rdo-base/container-login.yaml - roles: - - zuul: opendev.org/openstack/ansible-role-container-registry - - zuul: opendev.org/openstack/tripleo-ansible - required-projects: - - opendev.org/openstack/ansible-role-container-registry - - opendev.org/openstack/tripleo-ansible - secrets: - - rdo_registry - vars: - registry_login_enabled: true - - -Downstream :: - - - job: - name: tripleo-ci-base-required-projects-multinode-internal - description: | - Base abstract job to add required-projects for multinode downstream job - abstract: true - override-checkout: - parent: tripleo-ci-base-multinode-standard - required-projects: - - name: tripleo-ansible - branch: - - ansible-config_template - - tripleo-operator-ansible - - rdo-jobs - - tripleo-environments - roles: - - zuul: rdo-jobs - pre-run: - - playbooks/configure-mirrors.yaml - - playbooks/tripleo-rdo-base/cert-install.yaml - - playbooks/tripleo-rdo-base/pre-keys.yaml - vars: - mirror_locn: - featureset_override: - artg_repos_dir: /home/zuul/src//openstack - -Distribution Jobs -+++++++++++++++++ - -The TripleO deployment is supported on multiple distro versions. -Here is the current supported matrix in RDO, Downstream and Upstream. - -+----------+------------------------------+-------------+ -| Release | CentOS/CentOS Stream Version |RHEL Version | -+==========+==============================+=============+ -| Master | 9-Stream |- | -+----------+------------------------------+-------------+ -| Wallaby | 8-Stream, 9-Stream |8.x, 9 | -+----------+------------------------------+-------------+ -| Victoria | 8-Stream |- | -+----------+------------------------------+-------------+ -| Ussuri | 8-Stream |- | -+----------+------------------------------+-------------+ -| Train | 7, 8-Stream |8.x | -+----------+------------------------------+-------------+ - -Each of these distros have different settings which are used in deployment. -It's easier to maintain separate variables based on distributions. - -Below is an example of distro jobs for containers multinode at different levels. - -`Upstream Distro Jobs`_ :: - - - - job: - name: tripleo-ci-base-multinode - abstract: true - description: | - Base abstract job for multinode TripleO CI C7 zuulv3 jobs - parent: tripleo-ci-base-required-projects-multinode-upstream - nodeset: two-centos-7-nodes - - - - job: - name: tripleo-ci-base-multinode-centos-8 - abstract: true - description: | - Base abstract job for multinode TripleO CI centos-8 zuulv3 jobs - parent: tripleo-ci-base-required-projects-multinode-upstream - nodeset: two-centos-8-nodes - - - job: - name: tripleo-ci-base-multinode-centos-9 - abstract: true - description: | - Base abstract job for multinode TripleO CI centos-9 zuulv3 jobs - parent: tripleo-ci-base-required-projects-multinode-upstream - nodeset: two-centos-9-nodes - -`RDO Distro Jobs`_ :: - - - job: - name: tripleo-ci-base-multinode-periodic - parent: tripleo-ci-base-multinode-rdo - pre-run: playbooks/tripleo-ci-periodic-base/pre.yaml - post-run: playbooks/tripleo-ci-periodic-base/post.yaml - required-projects: - - config - - rdo-infra/ci-config - roles: - - zuul: rdo-infra/ci-config - secrets: - - dlrnapi - - - job: - name: tripleo-ci-base-multinode-periodic-centos-8 - parent: tripleo-ci-base-multinode-rdo-centos-8 - pre-run: playbooks/tripleo-ci-periodic-base/pre.yaml - post-run: playbooks/tripleo-ci-periodic-base/post.yaml - required-projects: - - config - - rdo-infra/ci-config - roles: - - zuul: rdo-infra/ci-config - vars: - promote_source: tripleo-ci-testing - secrets: - - dlrnapi - - - job: - name: tripleo-ci-base-multinode-periodic-centos-9 - parent: tripleo-ci-base-multinode-rdo-centos-9 - pre-run: playbooks/tripleo-ci-periodic-base/pre.yaml - post-run: playbooks/tripleo-ci-periodic-base/post.yaml - required-projects: - - config - - rdo-infra/ci-config - roles: - - zuul: rdo-infra/ci-config - vars: - promote_source: tripleo-ci-testing - secrets: - - dlrnapi - -Zuul Job Inheritance Order -++++++++++++++++++++++++++ - -Here is an example of Upstream inheritance of tripleo-ci-centos-9-containers-multinode_ job.:: - - tripleo-ci-base-common-required-projects - | - v - tripleo-ci-base-standard - | - v - tripleo-ci-base-multinode-standard - | - v - tripleo-ci-base-required-projects-multinode-upstream - | - v - tripleo-ci-base-multinode-centos-9 - | - v - tripleo-ci-centos-9-containers-multinode - - -Here is the another example of RDO job periodic-tripleo-ci-centos-8-containers-multinode-master_ :: - - tripleo-ci-base-multinode-standard - | - v - tripleo-ci-base-required-projects-multinode-rdo - | - v - tripleo-ci-base-multinode-rdo-centos-8 - | - v - tripleo-ci-base-multinode-periodic-centos-8 - | - v - periodic-tripleo-ci-centos-8-containers-multinode-master - - -TripleO CI Zuul Job Repos -+++++++++++++++++++++++++ - -Below is the list of repos where tripleo-ci related Zuul jobs are defined. - -Upstream --------- -* `tripleo-ci `_ - -RDO ---- -* `config `_: Jobs which needs secrets are defined here. -* `rdo-jobs `_ - -FAQs regarding TripleO CI jobs -++++++++++++++++++++++++++++++ - -* If we have a new project, which needs to be tested at all places - and installed from source but - - - cloned from upstream source, then it must be added under required-projects - at tripleo-ci-base-common-required-projects job. - - - the project namespace is different in Upstream and downstream, then it must be - added under required-projects at - Downstream (tripleo-ci-base-required-projects-multinode-internal) or - Upstream (tripleo-ci-base-required-projects-multinode-upstream) specific - required-projects parent job. - - - if the project is only developed at downstream or RDO or Upstream, then it must - be added under required project at downstream or RDO or Upstream required-projects - parent job. - -* In order to add support for new distros, please use required-projects job as a - parent and then create distro version specific child job with required nodeset. - -* If a project with different branch is re-added in child job required-projects, - then the child job project will be used in the deployment. - -* If a playbook (which calls another role, exists in different repo) is called at - pre-run step in Zuul job, then role specific required projects and roles needs - to be added at that job level. For example: In `tripleo-ci-containers-rdo-upstream-pre`_ - job, ansible-role-container-registry and triple-ansible is needed for pre.yaml playbook. - So both projects are added in roles and required-projects. - -* If a job having pre/post run playbook needs zuul secrets and playbook depends on - distros, then the job needs to be defined in config repo. - -* We should not use branches `attributes`_ in Zuul Distro jobs or options jobs. - -.. _`zuul.d`: https://opendev.org/openstack/tripleo-ci/src/branch/master/zuul.d -.. _`parent`: https://zuul-ci.org/docs/zuul/latest/config/job.html#attr-job.parent -.. _`zuul.d/base.yaml`: https://opendev.org/openstack/tripleo-ci/src/branch/master/zuul.d/base.yaml -.. _`tripleo-ci-build-containers-required-projects-rdo`: https://github.com/rdo-infra/rdo-jobs/commit/86e7e63ce6da27c2815afa845a6878cf96acdb47#diff-4897e02c92e2979a54f09d6eb383dba74c9a9211b065a52f9ecc4efbcce19637R17 -.. _`paused`: https://zuul-ci.org/docs/zuul/latest/job-content.html#pausing-the-job -.. _`tripleo-ci-build-containers-required-projects-upstream`: https://opendev.org/openstack/tripleo-ci/commit/1d640d09fd808caa33b82f0bdd5622120cebef09 -.. _`Upstream`: https://opendev.org/openstack/tripleo-ci/src/commit/9e270ea7f8c19fc3902a38d87a7ea4ace8219cd9/zuul.d/multinode-jobs.yaml#L17 -.. _`RDO`: https://github.com/rdo-infra/review.rdoproject.org-config/commit/b96b916fb2446171f5040ba8168c470a79f1befa#diff-80b60a19d10a7b56e22da7bfc1926e4e8d2143670b3ec3f26d009bda8e8910bfR527 -.. _`Upstream Distro Jobs`: https://github.com/openstack/tripleo-ci/commit/9e270ea7f8c19fc3902a38d87a7ea4ace8219cd9#diff-7653508e44c2cd8de8b5140648d7583c5efb27f0012155ff21f83c22edad69a3R29-R57 -.. _`RDO Distro Jobs`: https://github.com/rdo-infra/review.rdoproject.org-config/commit/b96b916fb2446171f5040ba8168c470a79f1befa#diff-80b60a19d10a7b56e22da7bfc1926e4e8d2143670b3ec3f26d009bda8e8910bfR574-R616 -.. _`periodic-tripleo-ci-centos-8-containers-multinode-master`: https://review.rdoproject.org/zuul/job/periodic-tripleo-ci-centos-8-containers-multinode-master -.. _`tripleo-ci-centos-9-containers-multinode`: https://zuul.openstack.org/job/tripleo-ci-centos-9-containers-multinode -.. _`tripleo-ci-containers-rdo-upstream-pre`: https://opendev.org/openstack/tripleo-ci/commit/05366af2930d76b4791a0fcb1f8ed9fddb132721 -.. _`attributes`: https://opendev.org/openstack/tripleo-ci/commit/bda6e1a61a846890c9cc39d0bc91952e9c6deb8f diff --git a/doc/source/ci/tripleo_dependencies_pipelines.rst b/doc/source/ci/tripleo_dependencies_pipelines.rst deleted file mode 100644 index 2bee8e45..00000000 --- a/doc/source/ci/tripleo_dependencies_pipelines.rst +++ /dev/null @@ -1,188 +0,0 @@ -TripleO Dependency Pipeline -+++++++++++++++++++++++++++++ - -This section introduces the TripleO Dependency Pipeline. The dependency -pipeline is what the TripleO CI team calls the series of zuul CI jobs -that aim to catch problems in deployment *dependencies*. - -A dependency is any package that is not directly related to the deployment -of OpenStack itself, such as OpenvSwitch, podman, buildah, pacemaker and ansible. -Each time, these projects release a newer version, it breaks the OpenStack -deployment and CI. - -Currently we have `promotion and component pipeline`_ set up to detect -OpenStack projects related issues early. - -In order to detect the breakages from non-openstack projects, TripleO -dependency pipeline has come into existence. Currently we have a single -type of pipeline enabled: - -* packages coming from specific repo - -The configurations for each pipeline can be found under -tripleo-quickstart/src/branch/master/config/release/dependency_ci//repo_config.yaml. - -Current OpenStack Dependency Pipeline jobs ------------------------------------------- -* openstack-dependencies-openvswitch - for testing OVS and OVN dependencies coming from NFV sig repo. -* openstack-dependencies-centos-compose - for testing jobs pinned to a specific CentOS compose build. - -.. note:: - The following pipelines were deprecated in favor of CentOS Stream 9 adoption: - - openstack-dependencies-containertools - for testing container tools dependencies - - openstack-dependencies-centos8stream - for testing base operating system dependencies coming from CentOS-8 stream repo. - -Understanding Package Dependency Pipeline ------------------------------------------ - -openstack-dependencies-openvswitch is a package dependency pipeline where we -tests OVS and OVN packages coming from NFV sig. - -Here is the config for the `openvswitch dependency pipeline`_: - -.. code-block:: yaml - - add_repos: - - type: generic - reponame: openvswitch-next - filename: "openvswitch-next.repo" - baseurl: "https://buildlogs.centos.org/centos/8/nfv/x86_64/openvswitch-2/" - update_container: false - dependency_override_repos: - - centos-nfv-openvswitch,http://mirror.centos.org/centos/8/nfv/x86_64/openvswitch-2/ - dep_repo_cmd_after: | - {% if dependency_override_repos is defined %} - {% for item in dependency_override_repos %} - sudo dnf config-manager --set-disabled {{ item.split(',')[0] }} - {% endfor %} - sudo dnf clean metadata; - sudo dnf clean all; - sudo dnf update -y; - {% endif %} - - -What do the above terms mean? -* `add_repos`: This is the 'test' repo i.e. the one that is bringing us a newer -than 'normal' version of the package we are testing, OpenvSwitch in this case. -* `dependency_override_repos`: It is used to disable or override a particular repo. - -In the above case, openvswitch-next.repo repo will get generated due to repo setup -and will disables the centos-nfv-openvswitch repo. - -Before the deployment, `rdo-jobs/dependency/get-dependency-repo-content.yaml` playbook -is used to set particular release file (in this case it is -config/release/dependency_ci/openvswitch/repo_config.yaml) and then generate a diff -of packages from dependency_override_repos and new repos added by add_repos option. - -Below are the jobs running in `openstack-dependencies-openvswitch`_ pipeline on review.rdoproject.org. - -.. code-block:: yaml - - openstack-dependencies-openvswitch: - jobs: - - periodic-tripleo-ci-centos-8-standalone-openvswitch-container-build-master: - dependencies: - - periodic-tripleo-ci-centos-8-standalone-master - - periodic-tripleo-ci-centos-8-scenario007-standalone-openvswitch-container-build-master: - dependencies: - - periodic-tripleo-ci-centos-8-scenario007-standalone-master - - periodic-tripleo-ci-centos-8-standalone-master: - vars: - force_periodic: false - - periodic-tripleo-ci-centos-8-scenario007-standalone-master: - vars: - force_periodic: false - -Understanding CentOS Compose Pinning Dependency ------------------------------------------------ -The dependency `compose-repos`_ works in the same line as package dependency jobs, with the difference that instead of -setting up a single repository at a time, it consumes metadata from the provided compose URL and generates a set of -repos as specified in the configuration snippet below: - -.. code-block:: yaml - - ... - add_repos: - - type: compose_repos - compose_url: "https://odcs.stream.centos.org/production/latest-CentOS-Stream/compose/" - release: centos-stream-9 - disable_conflicting: true - variants: - - AppStream - - BaseOS - - HighAvailability - - CRB - disable_repos: - - quickstart-centos-appstreams.repo - - quickstart-centos-base.repo - - quickstart-centos-highavailability.repo - - quickstart-centos-crb.repo - -The `compose_repos` repo's type was created to generate a set of repos based on a compose repos URL and information about -variants and conflicting repos. The `variants` will define which repos should be created from compose metadata, while -`disable_conflicting` and `disable_repos` should guarantee that conflicting repos will be disabled in favor of the new -ones. -For more details on how repos are generated, please check `yum-config-compose`_ in setup-role and `yum-config`_ tool. - -.. note:: - The process of setting up compose-repos starts earlier in the job, before any call to `repo-setup`, in one of the pre - playbooks defined in base jobs. You shall see the `centos-compose-repos.yml`_ playbook running in jobs that have - `dependency` set to *centos-compose*, which sets up those repos using the same tools mentioned above. The purpose of - the dependency config here is to keep those repos enabled when any other playbook or role calls `repo-setup`. - -Testing Jobs Using Compose Pinning Dependency ---------------------------------------------- - -In order to test any job against a CentOS compose build, which can be a compose newer or older than the available on -CentOS mirrors, you will need to setup a new job definition and provide the following job variables: - -.. code-block:: yaml - - - job: - name: tripleo-ci-centos-9-standalone-compose-pinning - parent: tripleo-ci-centos-9-standalone - vars: - dependency: centos-compose - centos_compose_url: https://odcs.stream.centos.org/production/latest-CentOS-Stream/compose/ - build_container_images: true - containers_base_image: quay.io/centos/centos:stream9 - -* `dependency`: need to be set to *centos-compose*. -* `centos_compose_url`: CentOS compose URL to be tested. Note that the full URL ends with `compose`, because it is where - compose `metadata` lives, required by `yum-config` tool to generate the repos. The default value is set to latest - compose, which might be ahead of mirror's compose. - -.. note:: - In the example above, there is an enabled flag for `build_container_images`. It means that process of building - containers will also use compose repositories. - -Ensuring Correct Module or Repo is Used ---------------------------------------- - -Once a jobs runs and finishes in the dependency pipeline, we need to navigate -to job log url. Under `logs/undercloud/home/zuul` directory, we can see -two log files: - -* control_repoquery_list.log.txt.gz - Contains a list of new packages coming from newly added repos. -* control_test_diff_table.log.txt.gz - contains a diff of the packages coming from new repo and overridden repo - -All the above operation is done `rdo-jobs/playbooks/dependency/diff-control-test.yaml`_ playbook which uses -`compare_rpms`_ project from ci-config/ci-scripts/infra-setup/roles/rrcockpit/files. - -.. note:: - The dependency `compose-repos` doesn't support rpm diff control test yet. - -.. _`promotion and component pipeline`: https://docs.openstack.org/tripleo-docs/latest/ci/stages-overview.html -.. _`openvswitch dependency pipeline`: https://opendev.org/openstack/tripleo-quickstart/src/branch/master/config/release/dependency_ci/openvswitch/repo_config.yaml -.. _`openstack-dependencies-containertools`: https://review.rdoproject.org/zuul/builds?pipeline=openstack-dependencies-containertools -.. _`openstack-dependencies-openvswitch`: https://review.rdoproject.org/zuul/builds?pipeline=openstack-dependencies-openvswitch -.. _`rdo-jobs/zuul.d/dependencies-jobs.yaml`: https://github.com/rdo-infra/rdo-jobs/blob/master/zuul.d/dependencies-jobs.yaml -.. _`rdo-jobs/zuul.d/project-templates-dependencies.yaml`: https://github.com/rdo-infra/rdo-jobs/blob/master/zuul.d/project-templates-dependencies.yaml -.. _`rdo-jobs/playbooks/dependency/diff-control-test.yaml`: https://github.com/rdo-infra/rdo-jobs/blob/master/playbooks/dependency/diff-control-test.yaml -.. _`get-dependency-module-content.yaml`: https://github.com/rdo-infra/rdo-jobs/blob/master/playbooks/dependency/get-dependency-module-content.yaml -.. _`rdo-jobs/dependency/get-dependency-repo-content.yaml`: https://github.com/rdo-infra/rdo-jobs/blob/master/playbooks/dependency/get-dependency-repo-content.yaml -.. _`compare_rpms`: https://github.com/rdo-infra/ci-config/tree/master/ci-scripts/infra-setup/roles/rrcockpit/files/compare_rpms -.. _`compose-repos`: https://github.com/openstack/tripleo-quickstart/blob/3f3f93da95c8531a4542c9a9aaa6424f2f6364c6/config/release/dependency_ci/centos-compose/repo_config.yaml -.. _`yum-config-compose`: https://github.com/openstack/tripleo-quickstart/blob/3f3f93da95c8531a4542c9a9aaa6424f2f6364c6/roles/repo-setup/tasks/yum-config-compose.yml -.. _`yum-config`: https://github.com/openstack/tripleo-repos/blob/cbbdde6cb6c73692b3ce9d0f6931f1b6e6fe6c91/plugins/modules/yum_config.py -.. _`centos-compose-repos.yml`: https://github.com/openstack/tripleo-ci/blob/5246cc282819f0248d997db79bc16c0f00a9e2f8/playbooks/tripleo-ci/centos-compose-repos.yml \ No newline at end of file diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100644 index fb8028f1..00000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,195 +0,0 @@ -# instack-undercloud documentation build configuration file, created by -# sphinx-quickstart on Wed Feb 25 10:56:57 2015. -# -# This file is execfile()d with the current directory set to its containing -# dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# import os -# import sys - -from pyquery import PyQuery -import requests - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinxcontrib.mermaid', - 'openstackdocstheme', - 'sphinxcontrib.rsvgconverter', -] - -# Disable usage of xindy https://bugzilla.redhat.com/show_bug.cgi?id=1643664 -latex_use_xindy = False - - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -# source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'TripleO' -copyright = u'2015, OpenStack Foundation' -bug_tracker = u'Launchpad' -bug_tracker_url = u'https://launchpad.net/tripleo' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -# version = '3.0.0' -# The full version, including alpha/beta/rc tags. -# release = '3.0.0' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -# today = '' -# Else, today_fmt is used as the format for a strftime call. -# today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -# default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -# add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -# add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -# show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'native' - -# A list of ignored prefixes for module index sorting. -# modindex_common_prefix = [] - - -# -- Options for HTML output ------------------------------------------------- - -html_static_path = ['../../_custom'] -# html_style = 'custom.css' -templates_path = ['../../_templates'] - -# Output file base name for HTML help builder. -htmlhelp_basename = '%sdoc' % project - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'openstackdocs' - -# -- Options for LaTeX output ------------------------------------------------ - - -def _get_name_version(index=1): - response = requests.get('https://releases.openstack.org/') - release_list = PyQuery(response.content) - all_tr = release_list('tr') - release = all_tr('td:first')[index] - - return release.text_content() - - -def get_oldest_version_name(): - return _get_name_version(index=4) - - -def get_before_oldest_version_name(): - return _get_name_version(index=3) - - -def get_before_latest_version_name(): - return _get_name_version(index=2) - - -def get_latest_version_name(): - """Get the name of the last stable version""" - return _get_name_version() - - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto/manual]). -latex_documents = [ - ('index', - 'doc-tripleo-docs.tex', - u'TripleO Documentation', - u'OpenStack Foundation', 'manual'), -] - -# Allow deeper levels of nesting for \begin...\end stanzas -latex_elements = {'maxlistdepth': 10, 'extraclassoptions': 'openany,oneside'} - -oldest_version_name = get_oldest_version_name() -oldest_version_name_lower = oldest_version_name.lower() -before_oldest_version_name = get_before_oldest_version_name() -before_oldest_version_name_lower = before_oldest_version_name.lower() -before_latest_version_name = get_before_latest_version_name() -before_latest_version_name_lower = before_latest_version_name.lower() -latest_version_name = get_latest_version_name() -latest_version_name_lower = latest_version_name.lower() -rst_prolog = """ -.. |project| replace:: {project} -.. |bug_tracker| replace:: {bug_tracker} -.. |bug_tracker_url| replace:: {bug_tracker_url} -.. |oldest_version_name| replace:: {oldest_version_name} -.. |oldest_version_name_lower| replace:: {oldest_version_name_lower} -.. |before_oldest_version_name| replace:: {before_oldest_version_name} -.. |before_oldest_version_name_lower| replace:: {b_oldest_version_name_lower} -.. |before_latest_version_name| replace:: {before_latest_version_name} -.. |before_latest_version_name_lower| replace:: {b_latest_version_name_lower} -.. |latest_version_name| replace:: {latest_version_name} -.. |latest_version_name_lower| replace:: {latest_version_name_lower} -""".format( - project=project, bug_tracker=bug_tracker, bug_tracker_url=bug_tracker_url, - oldest_version_name=oldest_version_name, - oldest_version_name_lower=oldest_version_name_lower, - before_oldest_version_name=before_oldest_version_name, - b_oldest_version_name_lower=before_oldest_version_name_lower, - before_latest_version_name=before_latest_version_name, - b_latest_version_name_lower=before_latest_version_name_lower, - latest_version_name=latest_version_name, - latest_version_name_lower=latest_version_name_lower -) - -# openstackdocstheme options -openstackdocs_repo_name = 'openstack/tripleo-docs' -openstackdocs_pdf_link = True -openstackdocs_auto_name = False -openstackdocs_bug_project = 'tripleo' -openstackdocs_bug_tag = 'documentation' diff --git a/doc/source/contributor/contributions.rst b/doc/source/contributor/contributions.rst deleted file mode 100644 index 5e2b3dd3..00000000 --- a/doc/source/contributor/contributions.rst +++ /dev/null @@ -1,77 +0,0 @@ -How to Contribute -================= - -|project| source code is publicly available. You can contribute code to -individual projects, documentation, report bugs and vulnerabilities, request -features. - -Contributing Code ------------------ -As long as |project| is a set of integrated OpenStack projects, all -development is happening in OpenStack upstream. - -Learn `how to contribute into OpenStack's upstream `_. - -See :doc:`../install/introduction/components` to find out how to contribute into -individual projects. - -Contacting the Core Team ------------------------- -Please refer to the `TripleO Core Team -`_ contacts. - -For upgrade specific contacts, refer to `TripleO Upgrade Core -`_ contacts - -For TripleO Ansible specific contacts, refer to `TripleO Ansible Core -`_ contacts - -For Shared TripleO CI role contacts, refer to `TripleO Shared CI Core -`_ contacts - - -Contributing to this Documentation ------------------------------------ - -|project| User Documentation lives on -`git.opendev.org `_ -and is mirrored on -`GitHub under the OpenStack organization `_. - -Learn `how to contribute into TripleO Docs -`_. - -Reporting Bugs --------------- - -**OpenStack Upstream**: If you find bugs or vulnerabilities which affect -upstream projects, please follow OpenStack's process of filing bugs. - -* Learn `how to report bugs in OpenStack - `_. - -* If you want to file a bug against upstream project, you can find useful links - in our list of :doc:`../install/introduction/components`. - - -**TripleO** If the bug impacts the |project| project as a whole, you can file a -bug in |bug_tracker|: - -#. Go to |bug_tracker_url| - -#. Fill in needed information (If you filed also upstream bug, please provide - its URL in advanced fields) - -#. Submit bug - -Requesting Features -------------------- -**OpenStack Upstream**: Since we are developing projects in OpenStack community, -all the features are being requested upstream via Blueprints. - -* Learn `how to create Blueprints in OpenStack - `_. - -* If you want to file a bug against upstream project, you can find useful links - in our list of :doc:`../install/introduction/components`. diff --git a/doc/source/contributor/core.rst b/doc/source/contributor/core.rst deleted file mode 100644 index 5b02edc0..00000000 --- a/doc/source/contributor/core.rst +++ /dev/null @@ -1,118 +0,0 @@ -Core maintainers -================ - -The intention of this document is to give developers some information -regarding what is expected from core maintainers and hopefully provide some -guidance to those aiming for this role. - -Teams ------ - -The TripleO Core team is responsible for reviewing all changes proposed to -repositories that are under the `governance of TripleO `_. - -.. _tripleo_governance: https://governance.openstack.org/tc/reference/projects/tripleo.html - -The TripleO Upgrade core reviewers maintain the `tripleo_upgrade`_ project. - -.. _tripleo_upgrade: https://opendev.org/openstack/tripleo-upgrade - -The TripleO Validation team maintains the Validation Framework in TripleO. - -The TripleO CI team maintains the TripleO CI related projects (tripleo-ci, -tripleo-quickstart, tripleo-quickstart-extras, etc). - -We also have contributors with a specific area of expertise who have been -granted core reviews on their area. Example: a Ceph integration expert would -have core review on the Ceph related patches in TripleO. - -Because Gerrit doesn't allow such granularity, we trust people to understand -which patches they can use their core reviewer status or not. -If one is granted core review access on an area, there is an expectation that -it'll only be used in this specific area. -The grant is usually done for all the TripleO repositories but we expect -SME cores to use +/- 2 for their area of expertise otherwise the regular +/- 1. - -.. note:: - Everyone is warmly encouraged to review incoming patches in TripleO, even - if you're not (yet) a member of these teams. - Participating in the review process will be a major task on the road to join - the core maintainer teams. - -Adding new members ------------------- - -Each team mentioned above should be aware of who is active in their respective -project(s). - -In order to add someone in one of these groups, it has to be discussed -between other cores and the TripleO PTL. - -It is a good practice to reach out to the nominee before proposing the -candidate, to make sure about their willingness to accept this position and its -responsibilities. - -In real life, it usually happens by informal discussions, but the official -proposals have to be sent with an email to the openstack-discuss mailing list. -It is strongly recommended to have this initial informal agreement before -going public, in case there are some disagreements which could cause -unpleasant discussions which could harm the nominee. - -This discussion can be initiated by any core, and only the existing cores votes -will weight into whether or not the proposal is granted. -Of course anyone is welcome to share their feedback and opinions. - -Removing members ----------------- - -It is normal for developers to reduce their activity and work on something -else. If they don't reach out by themselves, it is the responsibility of the -teams to remove them from the core list and inform about the change on the -mailing-list and privately when possible. - -Also if someone doesn't respect the TripleO rules or doesn't use the core -permission correctly, this person will be removed from the core list with -a private notice at least. - -Core membership expectations ----------------------------- - -Becoming a core member is a serious commitment and it is not granted easily. -Here are a non-exhaustive list of things that are expected: - -* The time invested on the project is consistent. - -* (Nearly) Daily participation in core reviews. - -.. note:: - Core reviewers are expected to provide thoroughly reviews on the code, - which doesn't only mean +1/-1, but also comments the code that confirm - that the patch is ready (or not) to be merged into the repository. - This capacity to provide these kind of reviews is strongly evaluated when - recruiting new core reviewers. It is preferred to provide quality reviews - over quantity. A negative review needs productive feedback and harmful - comments won't help to build credibility within the team. - -* Quality of technical contributions: bug reports, code, commit messages, - specs, e-mails, etc. - -* Awareness of discussions happening within the project (mailing-list, specs). - -* Best effort participation on IRC #tripleo (when timezone permits), - to provide support to our dear users and developers. - -* Gain trust with other core members, engage collaboration and be nice with - people. While mainly maintained by Red Hat, TripleO remains a friendly - project where we hope people can have fun while maintaining a project which - meets business needs for the OpenStack community. - -* Understand the `Expedited Approvals `_ policy. - -.. _expedited_approvals: https://specs.openstack.org/openstack/tripleo-specs/specs/policy/expedited-approvals.html - -Final note ----------- - -The goal of becoming core must not be intimidating. It should be reachable to -anyone well involved in our project with has good intents and enough technical -level. One should never hesitate to ask for help and mentorship when needed. diff --git a/doc/source/contributor/index.rst b/doc/source/contributor/index.rst deleted file mode 100644 index a10b9010..00000000 --- a/doc/source/contributor/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -TripleO Contributor Guide -========================= - -.. toctree:: - :maxdepth: 2 - :includehidden: - - new_developers - contributions - core -.. include:: ./squads.rst diff --git a/doc/source/contributor/new_developers.rst b/doc/source/contributor/new_developers.rst deleted file mode 100644 index 93b04c81..00000000 --- a/doc/source/contributor/new_developers.rst +++ /dev/null @@ -1,117 +0,0 @@ -Information for New Developers -============================== - -The intention of this document is to give new developers some information -regarding how to get started with TripleO as well as some best practices that -the TripleO community has settled on. - -In general TripleO is a very complex chunk of software. It uses numerous -technologies to implement an OpenStack installer. The premise of TripleO was -to use the OpenStack platform itself as the installer and API for user -interfaces. As such the first step to installing TripleO is to create what is -called an `undercloud`. We use almost similar architecture for both -`undercloud` and `overcloud` that leverages same set of Heat templates found -in `tripleo-heat-templates` repository, with a few minor differences. The -`undercloud` services are deployed in containers and can be managed by the -same tool chain used for `overcloud`. - -Once the `undercloud` is deployed, we use a combination of Ansible playbooks -and a set of Heat templates, to drive the deployment of an overcloud. Ironic -is used to provision hardware and boot an operating system either on baremetal -(for real deployments) or on VMs (for development). All services are deployed -in containers on the overcloud like undercloud. - -Repositories that are part of TripleO -------------------------------------- - -* `tripleo-common `_: - This is intended to be for TripleO libraries of common code. - Unfortunately it has become a bit overrun with unrelated bits. Work - is ongoing to clean this up and split this into separate repositories. - -* `tripleo-ansible `_: - Contains Ansible playbooks, roles, plugins, modules, filters for use with - TripleO deployments. - -* `tripleo-heat-templates `_: - This contains all the Heat templates necessary to deploy the overcloud (and - hopefully soon the undercloud as well). - -* `python-tripleoclient `_: - The CLI for deploying TripleO. This contains some logic but remember that we - want to call Mistral actions from here where needed so that the logic can be - shared with the UI. - -* `tripleo-docs `_: - Where these docs are kept. - -* `tripleo-image-elements `_: - Image elements (snippets of puppet that prepare specific parts of the - image) for building the undercloud and overcloud disk images. - -* `tripleo-puppet-elements `_: - Puppet elements used to configure and deploy the overcloud. These - used during installation to set up the services. - -* `puppet-tripleo `_: - Puppet is used to configure the services in TripleO. This repository - contains various puppet modules for doing this. - -* `tripleo-quickstart `_: - Quickstart is an Ansible driven deployment for TripleO used in CI. Most - developers also use this to stand up instances for development as well. - -* `tripleo-quickstart-extras `_: - Extended functionality for tripleo-quickstart allowing for end-to-end - deployment and testing. - -* `tripleo-ui `_: - The web based graphical user interface for deploying TripleO. - -* `kolla `_: - We use the containers built by the Kolla project for services in TripleO. - Any new containers or additions to existing containers should be submitted - here. - -* `diskimage-builder `_: - Disk image builder is used to build our base images for the TripleO - deployment. - -Definition of Done ------------------- - -This is basically a check list of things that you want to think about when -implementing a new feature. - -- Ensure that the continuous integration (CI) is in place and passing, adding - coverage to tests if required. See - http://specs.openstack.org/openstack/tripleo-specs/specs/policy/adding-ci-jobs.html - for more information. -- Ensure there are unit tests where possible. -- Maintain backwards compatibility with our existing template interfaces from - tripleo-heat-templates. -- New features should be reviewed by cores who have knowledge in that area of - the codebase. -- One should consider logging and support implications. If you have new logs, - would they be available via sosreport. -- Error messages are easy to understand and work their way back to the user - (stack traces are not sufficient). -- Documentation should be updated if necessary. New features need a - tripleo-docs patch. -- If any new dependencies are used for your feature, be sure they are properly - packaged and available in RDO. You can ask on #rdo (on OFTC server) for - help with this. - - -Using TripleO Standalone for Development ----------------------------------------- - -The Standalone container based deployment can be used for development purposes. -This reuses the existing TripleO Heat Templates, allowing you to do the -development using this framework instead of a complete overcloud. -This is very useful if you are developing Heat templates or containerized -services. - -Please see `Standalone Deployment Guide `_ -on how to set up a Standalone OpenStack node. - diff --git a/doc/source/contributor/squads.rst b/doc/source/contributor/squads.rst deleted file mode 100644 index 4fa73dd0..00000000 --- a/doc/source/contributor/squads.rst +++ /dev/null @@ -1,45 +0,0 @@ -Squads ------- - -Work in TripleO is divided in Squads. For more information the `project policy -`_. - -The list tends to be dynamic over the cycles, depending on which topics -the team is working on. The list below is subject to change as squads change. - -+-------------------------------+----------------------------------------------------------------------------+ -| Squad | Description | -+===============================+============================================================================+ -| CI | Group of people focusing on Continuous Integration tooling and system | -| | https://etherpad.openstack.org/p/tripleo-ci-squad-meeting | -+-------------------------------+----------------------------------------------------------------------------+ -| UI/CLI | Group of people focusing on TripleO UI and CLI | -| | https://etherpad.openstack.org/p/tripleo-ui-cli-squad-status | -+-------------------------------+----------------------------------------------------------------------------+ -| Upgrade | Group of people focusing on TripleO upgrades | -| | https://etherpad.openstack.org/p/tripleo-upgrade-squad-status | -+-------------------------------+----------------------------------------------------------------------------+ -| Validations | Group of people focusing on TripleO validations tooling | -| | https://etherpad.openstack.org/p/tripleo-validations-squad-status | -+-------------------------------+----------------------------------------------------------------------------+ -| Workflows | Group of people focusing on TripleO Workflows | -| | https://etherpad.openstack.org/p/tripleo-workflows-squad-status | -+-------------------------------+----------------------------------------------------------------------------+ -| Containers | Group of people focusing on TripleO deployed in containers | -| | https://etherpad.openstack.org/p/tripleo-containers-squad-status | -+-------------------------------+----------------------------------------------------------------------------+ -| Networking | Group of people focusing on networking bits in TripleO | -| | https://etherpad.openstack.org/p/tripleo-networking-squad-status | -+-------------------------------+----------------------------------------------------------------------------+ -| Integration | Group of people focusing on configuration management (eg: services) | -| | https://etherpad.openstack.org/p/tripleo-integration-squad-status | -+-------------------------------+----------------------------------------------------------------------------+ -| Edge | Group of people focusing on Edge/multi-site/multi-cloud | -| | https://etherpad.openstack.org/p/tripleo-edge-squad-status | -+-------------------------------+----------------------------------------------------------------------------+ - -.. note:: - - Note about CI: the squad is about working together on the tooling used - by OpenStack Infra to test TripleO, though every squad has in charge of - maintaining the good shape of their tests. diff --git a/doc/source/developer/index.rst b/doc/source/developer/index.rst deleted file mode 100644 index 2ea5953a..00000000 --- a/doc/source/developer/index.rst +++ /dev/null @@ -1,12 +0,0 @@ -Developer Documentation -======================= - -Documentation of developer-specific options in |project|. - - -.. toctree:: - - tht_walkthrough/tht_walkthrough - release - tripleoclient_primer - ../upgrade/developer/upgrades/upgrades diff --git a/doc/source/developer/release.rst b/doc/source/developer/release.rst deleted file mode 100644 index 29c64d96..00000000 --- a/doc/source/developer/release.rst +++ /dev/null @@ -1,160 +0,0 @@ -Release Management -================== - -Releases Overview ------------------ - -Before reading this document and being involved in TripleO release management, -it's suggested to read the OpenStack Release Management guide_. - -.. _guide: https://docs.openstack.org/project-team-guide/release-management.html - -Most of TripleO projects follows the independent_ release model. -We will be creating stable branches based on our long term supported releases -going forward. The details can be found on the releases repository_. - -.. _repository: https://opendev.org/openstack/releases/src/branch/master/deliverables/_independent - -.. _independent: https://releases.openstack.org/reference/release_models.html#independent - -All information about previous releases can be found on https://releases.openstack.org. -This page will document the process of releasing TripleO projects. - -The tagging convention can be discussed with the PTL or the Release Liaison of TripleO. - -For puppet-tripleo, we also need to update metadata.json file:: - - "version": "X.Y.Z", - -For other projects, there is no need to update anything since the release will be ready by pbr. - -.. Note:: - Puppet OpenStack modules release management is documented here: - https://docs.openstack.org/puppet-openstack-guide/releases.html#how-to-release-puppet-modules - -Once this is done, you can submit a patch in openstack/releases and per project to modify the YAML. -The openstack/releases project provides tooling to update these files. See the new-release_ command. -You can also update the yaml files manually as necessary. -Example with tripleo-heat-templates, edit deliverables/pike/tripleo-heat-templates.yaml:: - - --- - launchpad: tripleo - release-type: python-pypi - team: tripleo - type: other - repository-settings: - openstack/tripleo-heat-templates: {} - releases: - - version: 15.0.0 - projects: - - repo: openstack/tripleo-heat-templates - hash: 1ffbc6cf70c8f79cb3a1e251c9b1e366843ab97c - - version: 15.1.0 - projects: - - repo: openstack/tripleo-heat-templates - hash: ec8955c26a15f3c9e659b7ae08223c544820af03 - - version: 16.0.0 - projects: - - repo: openstack/tripleo-heat-template - hash: - -.. _new-release: https://releases.openstack.org/reference/using.html#using-new-release-command - -Once the file is edited, you can submit it and OpenStack release team will review it. Note that the patch -requires +1 from TripleO PTL or TripleO Release Liaison_. - -.. _Liaison: https://wiki.openstack.org/wiki/CrossProjectLiaisons#Release_management - - -The process of branching is also done by Release tools, and you need to change the YAML to -specify where we want to branch. -Example with tripleo-heat-templates, edit deliverables/ocata/tripleo-heat-templates.yaml:: - - --- - launchpad: tripleo - release-type: python-pypi - team: tripleo - type: other - repository-settings: - openstack/tripleo-heat-templates: {} - branches: - - name: stable/xena - location: 16.0.0 - releases: - - version: 15.0.0 - projects: - - repo: openstack/tripleo-heat-templates - hash: 1ffbc6cf70c8f79cb3a1e251c9b1e366843ab97c - - version: 15.1.0 - projects: - - repo: openstack/tripleo-heat-templates - hash: ec8955c26a15f3c9e659b7ae08223c544820af03 - - version: 16.0.0 - projects: - - repo: openstack/tripleo-heat-template - hash: - -Keep in mind that tags, branches, release notes, announcements are generated by the tooling -and nothing has to be done manually, except what is documented here. - - -Releases for RDO ----------------- - -Due to TripleO's switch_ to the independent model, the TripleO project needs to -cut tags at the end of cycles that will not be supported in the long term. These -tags are used by the RDO release process to include a build of the TripleO -rpms in the RDO release. The process to create the intermediate release would -be as follows. - -.. _switch: https://specs.openstack.org/openstack/tripleo-specs/specs/xena/tripleo-independent-release.html - -Update required metadata -^^^^^^^^^^^^^^^^^^^^^^^^ - -Some projects like puppet-tripleo and puppet-pacemaker require the metadata -be updated in the repository prior to cutting a tag. If the metadata is -not updated, the tagging patch to openstack/releases will fail CI. - -For puppet-tripleo_ and puppet-pacemaker_, update the version information to -represent the next tag version (e.g. 16.1.0). - -.. _puppet-tripleo: https://review.opendev.org/c/openstack/puppet-tripleo/+/813847 -.. _puppet-pacemaker: https://review.opendev.org/c/openstack/puppet-pacemaker/+/813854 - - -Get latest promoted content -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -After the previous metadata updates are available in the latest promoted content, -fetch the version information from RDO which contains the git repository hashes. - -An example where this could be found is:: - - https://trunk.rdoproject.org/centos8-master/current-tripleo/versions.csv - -.. Note:: - You will needed to adjust the centos8 to centos9 as necessary. - - -Prepare version tags -^^^^^^^^^^^^^^^^^^^^ - -Based on the versions.csv data, an openstack/releases patch needs to be created -to tag the release with the provided hashes. You can determine which TripleO -projects are needed by finding the projects tagged with "team: tripleo_". -`An example review`_. Please be aware of changes between versions and create -the appropriate version number as necessary (e.g. major, feature, or bugfix). - -.. _tripleo: https://opendev.org/openstack/releases/src/commit/fcdb1f5b556e99f25f248d38f16ad812489c9be0/deliverables/_independent/tripleo-heat-templates.yaml -.. _An example review: https://review.opendev.org/c/openstack/releases/+/813852 - -.. Note:: - If this is a long term release, this patch should include a stable branch. - -Notify RDO team of tags -^^^^^^^^^^^^^^^^^^^^^^^ - -Once the release has been created, make sure the RDO team not has been notified -of the new tags. They will update the RDO release items to ensure that the -given openstack release will contained the pinned content. diff --git a/doc/source/developer/tht_walkthrough/changes-puppet-tripleo.rst b/doc/source/developer/tht_walkthrough/changes-puppet-tripleo.rst deleted file mode 100644 index 7feb09b5..00000000 --- a/doc/source/developer/tht_walkthrough/changes-puppet-tripleo.rst +++ /dev/null @@ -1,56 +0,0 @@ -Updating puppet-tripleo ------------------------ - -.. include:: ../../links.rst - -The puppet manifests that currently define overcloud node configuration are -moved from the tripleo-heat-templates to new puppet-tripleo class definitions -as part of the composable services approach. In next iterations, all service -configuration should be moved also to puppet-tripleo. -This section considers the addition of the ntp definition to puppet-tripleo. - -Folder structure convention -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Services should be defined in the services folder, depending on the service -purpose. -:: - - manifests - profile/base ---> To host all services not using pacemaker. - time ---> Specific folder for time services (NTP, timezone, Chrony among others). - ntp.pp ---> Puppet manifest to configure the service. - -.. note:: - - For further information related to the current folders manifests structure - refer to the `puppet-tripleo repository`_. - -Adding the puppet manifest -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This step will reference how the puppet logic should be organized in -puppet-tripleo. - -Inside the manifests folder, add the service manifest following the folder -structure (``manifests/profile/base/time/ntp.pp``) as: -:: - - class tripleo::profile::base::time::ntp ( - #We get the configuration step in which we can choose which steps to execute - $step = hiera('step'), - ) { - #step assigned for core modules. - #(Check for further references about the configuration steps) - #https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/puppet/services/README.rst - if ($step >= 2){ - #We will call the NTP puppet class and assign our configuration values. - #If needed additional Puppet packages can be added/installed by using the repo tripleo-puppet-elements - if count($ntpservers) > 0 { - include ::ntp - } - } - } - -If users have followed all the previous steps, they should be able to configure -their services using the composable services within roles guidelines. diff --git a/doc/source/developer/tht_walkthrough/changes-tht.rst b/doc/source/developer/tht_walkthrough/changes-tht.rst deleted file mode 100644 index 60c6d77e..00000000 --- a/doc/source/developer/tht_walkthrough/changes-tht.rst +++ /dev/null @@ -1,241 +0,0 @@ -Updating tripleo-heat-templates -------------------------------- - -.. include:: ../../links.rst - -This section will describe the changes needed for tripleo-heat-templates. - -Folder structure convention for tripleo-heat-templates -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Services should be defined in the services folder, depending on the service -purpose. -:: - - puppet - services ---> To host all services. - ---> Folder to store a specific type services (If time, will store time based services like: NTP, timezone, Chrony among others). - .yaml ---> Heat template defining per-service configuration. - -base.yaml ---> Heat template defining common service configuration. - -.. note:: - - No puppet manifests may be defined in the `THT repository`_, they - should go to the `puppet-tripleo repository`_ instead. - -.. note:: - - The use of a base heat template (-base.yaml) is necessary in cases where - a given 'service' (e.g. "heat") is comprised of a number of individual - component services (e.g. heat-api, heat-engine) which need to share some - of the base configuration (such as rabbit credentials). - Using a base template in those cases means we don't need to - duplicate that configuration. - Refer to: https://review.opendev.org/#/c/313577/ for further details. - Also, refer to :ref:`duplicated-parameters` for an use-case description. - -Changes list -~~~~~~~~~~~~ - -The list of changes in THT are: - -- If there is any configuration of the given feature/service - in any of the ``tripleo-heat-templates/puppet/manifests/*.pp`` - files, then this will need to be removed and migrated to the - puppet-tripleo repository. - -- Create a service type specific folder in the root services folder - (``deployment/time``). - -- Create a heat template for the service inside the deployment/time folder - (``deployment/time/ntp-baremetal-puppet.yaml``). - -- Optionally, create a common heat template to reuse common configuration - data, which is referenced from each per-service heat template. - -Step 1 - Updating puppet references -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Remove all puppet references for the composable service from the current -manifests (\*.pp). All the puppet logic will live in the puppet-tripleo -repository based on a configuration step, so it is mandatory to remove all the -puppet references from tripleo-heat-templates. - -The updated .pp files for the NTP example were: - -- ``puppet/manifests/overcloud_cephstorage.pp`` - -- ``puppet/manifests/overcloud_compute.pp`` - -- ``puppet/manifests/overcloud_controller.pp`` - -- ``puppet/manifests/overcloud_controller_pacemaker.pp`` - -- ``puppet/manifests/overcloud_object.pp`` - -- ``puppet/manifests/overcloud_volume.pp`` - - - -Step 2 - overcloud-resource-registry-puppet.j2.yaml resource registry changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The resource ``OS::TripleO::Services::Timesync`` must be defined in the resource -registry (``overcloud-resource-registry-puppet.j2.yaml``) - -Create a new resource type alias which references the per-service -heat template file, as described above. - -By updating the resource registry we are forcing to use a nested template to -configure our resources. In the example case the created resource -(OS::TripleO::Services::Timesync), will point to the corresponding service yaml file -(deployment/time/ntp-baremetal-puppet.yaml). - - -Step 3 - roles_data.yaml initial changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The default roles are defined here. They are then iterated and the respective -values of each section are rendered into the overcloud.j2.yaml. - -Mandatory services should be added to the roles' ServicesDefault value, -which defines all the services enabled by default in the role(s). - -From ``roles_data.yaml`` find:: - - - name: Controller - CountDefault: 1 - ServicesDefault: - - OS::TripleO::Services::CACerts - - OS::TripleO::Services::CertmongerUser - - OS::TripleO::Services::CephMds - - OS::TripleO::Services::Keystone - - OS::TripleO::Services::GlanceApi - - OS::TripleO::Services::GlanceRegistry - ... - - OS::TripleO::Services::Timesync ---> New service deployed in the controller overcloud - - -Update this section with your new service to be deployed to the controllers in -the overcloud. - -These values will be used by the controller roles' ServiceChain resource as -follows:: - - {% for role in roles %} - # Resources generated for {{role.name}} Role - {{role.name}}ServiceChain: - type: OS::TripleO::Services - properties: - Services: - get_param: {{role.name}}Services - ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]} - EndpointMap: {get_attr: [EndpointMap, endpoint_map]} - - ... - {% endfor %} - -THT changes for all the different roles are covered in: - -- https://review.opendev.org/#/c/310421/ (tripleo-heat-templates controller) - -- https://review.opendev.org/#/c/330916/ (tripleo-heat-templates compute) - -- https://review.opendev.org/#/c/330921/ (tripleo-heat-templates cephstorage) - -- https://review.opendev.org/#/c/330923/ (tripleo-heat-templates objectstorage) - -.. note:: - - In the case of the controller services, they are defined as part of the - roles' ServiceChain resource. If it is needed to add optional services, they - need to be appended to the current services list defined by the default - value of the role's ServicesDefault parameter. - - -Step 4 - Create the services yaml files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Create: ``deployment/time/ntp-baremetal-puppet.yaml`` - -This file will have all the configuration details for the service to be -configured. -:: - - heat_template_version: rocky - description: > - NTP service deployment using puppet, this YAML file - creates the interface between the HOT template - and the puppet manifest that actually installs - and configure NTP. - parameters: - EndpointMap: - default: {} - description: Mapping of service endpoint -> protocol. Typically set - via parameter_defaults in the resource registry. - type: json - NtpServers: - default: ['0.pool.ntp.org', '1.pool.ntp.org'] - description: NTP servers - type: comma_delimited_list - NtpInterfaces: - default: ['0.0.0.0'] - description: Listening interfaces - type: comma_delimited_list - outputs: - role_data: - description: Role ntp using composable services. - value: - config_settings: - ntp::ntpservers: {get_param: NtpServers} - ntp::ntpinterfaces: {get_param: NtpInterfaces} - step_config: | - include ::tripleo::profile::base::time::ntp - -.. note:: - - All role-specific parameters have to be tagged:: - - ExampleParameter: - description: This is an example. - type: json - default: {} - tags: - - role_specific - -.. note:: - - It is required for all service templates to accept the EndpointMap parameter, - all other parameters are optional and may be defined per-service. Care should - be taken to avoid naming collisions between service parameters, e.g via using - the service name as a prefix, "Ntp" in this example. - - Service templates should output a role_data value, which is a mapping containing - "config_settings" which is a mapping of hiera key/value pairs required to configure - the service, and "step_config", which is a puppet manifest fragment that references - the puppet-tripleo profile that configures the service. - - If it is needed, the templates can be decomposed to remove - duplicated parameters among different deployment environments - (i.e. using pacemaker). To do this see - section :ref:`duplicated-parameters`. - - If your service has configuration that affects another service and should - only be run on nodes (roles) that contain that service, you can use - "service_config_settings". You then have to specify the hieradata inside this - section by using the name of the service as the key. So, if you want to - output hieradata related to your service, on nodes that deploy keystone, you - would do this:: - - role_data: - ... - step_config: - ... - ... - service_config_settings: - keystone: - # Here goes the hieradata - - This is useful for things such as creating the keystone endpoints for your - service, since one usually wants these commands to only be run on the - keystone node. diff --git a/doc/source/developer/tht_walkthrough/design-patterns.rst b/doc/source/developer/tht_walkthrough/design-patterns.rst deleted file mode 100644 index f4fe738e..00000000 --- a/doc/source/developer/tht_walkthrough/design-patterns.rst +++ /dev/null @@ -1,105 +0,0 @@ -THT design patterns -------------------- - -.. _duplicated-parameters: - -Duplicated parameters -~~~~~~~~~~~~~~~~~~~~~ - -Problem: When defining multiple related services, it can be necessary -to define the same parameters (such as rabbit or DB credentials) in -multiple service templates. To avoid this, it is possible to define a -"base" heat template that contains the common parameters and config_settings -mapping for those services that require it. - -This pattern will describe how to avoid duplicated parameters in the THT yaml -files. - -``mongodb-base.yaml``: This file should have all the common parameters between -the different environments (With pacemaker and without pacemaker). -:: - - heat_template_version: rocky - description: > - Configuration details for MongoDB service using composable roles - parameters: - MongoDbNoJournal: - default: false - description: Should MongoDb journaling be disabled - type: boolean - MongoDbIPv6: - default: false - description: Enable IPv6 if MongoDB VIP is IPv6 - type: boolean - MongoDbReplset: - type: string - default: "tripleo" - outputs: - role_data: - description: Role data for the MongoDB base service. - value: - config_settings: - mongodb::server::nojournal: {get_param: MongoDbNoJournal} - mongodb::server::ipv6: {get_param: MongoDbIPv6} - mongodb::server::replset: {get_param: MongoDbReplset} - -In this way we will be able to reuse the common parameter among all the -template files requiring it. - -Referencing the common parameter: - -``mongodb.yaml``: Will have specific parameters to deploy mongodb without -pacemaker. -:: - - heat_template_version: rocky - description: > - MongoDb service deployment using puppet - parameters: - #Parameters not used EndpointMap - EndpointMap: - default: {} - description: Mapping of service endpoint -> protocol. Typically set - via parameter_defaults in the resource registry. - type: json - resources: - MongoDbBase: - type: ./mongodb-base.yaml - outputs: - role_data: - description: Service mongodb using composable services. - value: - config_settings: - map_merge: - - get_attr: [MongoDbBase, role_data, config_settings] - - mongodb::server::service_manage: True - step_config: | - include ::tripleo::profile::base::database::mongodb - -In this case mongodb.yaml is using all the common parameter added in the -MongoDbBase resource. - -If using the parameter 'EndpointMap' in the base template, you must the pass it from the service file, -and even if it is not used in the service template, it must still be defined. - -In the service file: -:: - - parameters: - EndpointMap: - default: {} - description: Mapping of service endpoint -> protocol. Typically set - via parameter_defaults in the resource registry. - type: json - resources: - ServiceBase: - type: ./-base.yaml - properties: - EndpointMap: {get_param: EndpointMap} - -This will pass the endpoint information to the base config file. - -.. note:: - - Even if the EndpointMap parameter is optional in the base template, - for consistency is advised always using it in all service templates. diff --git a/doc/source/developer/tht_walkthrough/introduction.rst b/doc/source/developer/tht_walkthrough/introduction.rst deleted file mode 100644 index 666c1973..00000000 --- a/doc/source/developer/tht_walkthrough/introduction.rst +++ /dev/null @@ -1,67 +0,0 @@ -Introduction ------------- - -.. include:: ../../links.rst - -The initial scope of this tutorial is to create a brief walkthrough with some -guidelines and naming conventions for future modules and features aligned with -the composable services architecture. Regarding the example described in this -tutorial, which leads to align an _existing_ 'non-composable' service implementation -with the composable roles approach, it is important to notice that a similar approach would be -followed if a user needed to add an entirely new service to a tripleo deployment. - -.. _puppet/manifests: https://github.com/openstack/tripleo-heat-templates/tree/3d01f650f18b9e4f1892a6d9aa17f1bfc99b5091/puppet/manifests - -The puppet manifests used to configure services on overcloud nodes currently -reside in the tripleo-heat-templates repository, in the folder `puppet/manifests`_. -In order to properly organize and structure the code, all -manifests will be re-defined in the puppet-tripleo repository, and adapted to -the `composable services architecture`_. - -The use case for this example uses NTP as a service installed by default among -the OpenStack deployment. So the profile needs to be added to all the roles in -roles_data.yaml. - -Which means that NTP will be installed everywhere in the overcloud, so the -tutorial will describe the process of refactoring the code from those files -in order move it to the puppet-tripleo repository. - -This tutorial is divided into several steps, according to different changes -that need to be added to the structure of tripleo-heat-templates and -puppet-tripleo. - -Relevant repositories in this guide -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- tripleo-heat-templates: All the tripleo-heat-templates (aka THT) logic. - -- puppet-tripleo: TripleO puppet manifests used to deploy the overcloud services. - -- tripleo-puppet-elements: References puppet modules used by TripleO to deploy the overcloud services. - (Not used in this tutorial) - -Gerrit patches used in this example -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The gerrit patches used to describe this walkthrough are: - -- https://review.opendev.org/#/c/310725/ (puppet-tripleo) - -- https://review.opendev.org/#/c/310421/ (tripleo-heat-templates controller) - -- https://review.opendev.org/#/c/330916/ (tripleo-heat-templates compute) - -- https://review.opendev.org/#/c/330921/ (tripleo-heat-templates cephstorage) - -- https://review.opendev.org/#/c/330923/ (tripleo-heat-templates objectstorage) - - -Change prerequisites -~~~~~~~~~~~~~~~~~~~~~ - -The controller services are defined and configured via Heat resource chains. In -the proposed patch (https://review.opendev.org/#/c/259568) controller -services will be wired to a new Heat feature that allows it to dynamically include -a set of nested stacks representing individual services via a Heat resource -chain. The current example will use this interface to decompose the controller -role into isolated services. diff --git a/doc/source/developer/tht_walkthrough/service_template_sections.rst b/doc/source/developer/tht_walkthrough/service_template_sections.rst deleted file mode 100644 index e16fe900..00000000 --- a/doc/source/developer/tht_walkthrough/service_template_sections.rst +++ /dev/null @@ -1,513 +0,0 @@ -Service template sections description -===================================== - -As mentioned in the previous sections of the developer guide, there are several -sections of the template's output that need to be filled out for creating a -service in TripleO. - -In this document we will attempt to enumerate all of them and explain the -reasoning behind them. - -Note that you can also find useful information in the `tht deployment readme`_. - -What's the bare-minimum? ------------------------- - -Before, digging into details, it's always good to know what the bare-minimum -is. So lets look at a very minimal service template:: - - heat_template_version: rocky - - description: Configure Red Hat Subscription Management. - - parameters: - RoleNetIpMap: - default: {} - type: json - ServiceData: - default: {} - description: Dictionary packing service data - type: json - ServiceNetMap: - default: {} - description: Mapping of service_name -> network name. Typically set - via parameter_defaults in the resource registry. This - mapping overrides those in ServiceNetMapDefaults. - type: json - RoleName: - default: '' - description: Role name on which the service is applied - type: string - RoleParameters: - default: {} - description: Parameters specific to the role - type: json - EndpointMap: - default: {} - description: Mapping of service endpoint -> protocol. Typically set - via parameter_defaults in the resource registry. - type: json - RhsmVars: - default: {} - description: Hash of ansible-role-redhat-subscription variables - used to configure RHSM. - # The parameters contains sensible data like activation key or password. - hidden: true - tags: - - role_specific - type: json - - resources: - # Merging role-specific parameters (RoleParameters) with the default parameters. - # RoleParameters will have the precedence over the default parameters. - RoleParametersValue: - type: OS::Heat::Value - properties: - type: json - value: - map_replace: - - map_replace: - - vars: RhsmVars - - values: {get_param: [RoleParameters]} - - values: - RhsmVars: {get_param: RhsmVars} - - outputs: - role_data: - description: Role data for the RHSM service. - value: - service_name: rhsm - config_settings: - tripleo::rhsm::firewall_rules: {} - upgrade_tasks: [] - step_config: '' - host_prep_tasks: - - name: Red Hat Subscription Management configuration - vars: {get_attr: [RoleParametersValue, value, vars]} - block: - - include_role: - name: redhat-subscription - -Lets go piece by piece and explain what's going on. - -Version and description -^^^^^^^^^^^^^^^^^^^^^^^ - -As with any other heat template, you do need to specify the -``heat_template_version``, and preferably give a description of what the -stack/template does. - -Parameters -^^^^^^^^^^ - -You'll notice that there are a bunch of heat parameters defined in this -template that are not necessarily used. This is because service templates are -created in the form of a `heat resource chain object`_. This -type of objects can create a "chain" or a set of objects with the same -parameters, and gather the outputs of them. So, eventually we pass the same -mandatory parameters to the chain. This happens in the -`common/services.yaml`_ file. Lets take a look and see how -this is called:: - - ServiceChain: - type: OS::Heat::ResourceChain - properties: - resources: {get_param: Services} - concurrent: true - resource_properties: - ServiceData: {get_param: ServiceData} - ServiceNetMap: {get_param: ServiceNetMap} - EndpointMap: {get_param: EndpointMap} - RoleName: {get_param: RoleName} - RoleParameters: {get_param: RoleParameters} - -Here we can see that the mandatory parameters for the services are the -following: - -* **ServiceData**: Contains an entry called ``net_cidr_map``, which is a map - that has the CIDRs for each network in your deployment. - -* **ServiceNetMap**: Contains a mapping that tells you what network is each - service configured at. Typical entries will look like: - ``BarbicanApiNetwork: internal_api``. - -* **EndpointMap**: Contains the keystone endpoints for each service. With this - you'll be able to get what port, what protocol, and even different entries - for the public, internal and admin endpoints. - -* **RoleName**: This is the name of the role on which the service is applied. - It could be one of the default roles (e.g. "Controller" or "Compute"), or a - custom role, depending on how you're deploying. - -* **RoleParameters**: A Map containing parameters to be applied to the specific - role. - -So, if you're writing a service template yourself, these are the parameters -you have to copy into your template. - -Aside from these parameters, you can define any other parameter yourself for -the service, and in order for your service to consume the parameter, you need -to pass them via ``parameter_defaults``. - -The ``role_data`` output -^^^^^^^^^^^^^^^^^^^^^^^^ - -This is the sole output that will be read and parsed in order to get the -relevant information needed from your service. It's value must be a map, and -from the aforementioned example, it minimally contains the following: - -* ``service_name``: This is the name of the service you're configuring. The - format is lower case letters and underscores. Setting this is quite - important, since this is how TripleO reports what services are enabled, and - generates appropriate hieradata, such as a list of all services enabled, and - flags that say that your service is enabled on a certain node. - -* ``config_settings``: This will contain a map of key value pairs; the map will - be written to the hosts in the form of hieradata, which puppet can then run - and use to configure your service. Note that the hieradata will only be - written on hosts that are tagged with a role that enables your service. - -* ``upgrade_tasks``: These are ansible tasks that run when TripleO is running - an upgrade with your service enabled. If you don't have any upgrade tasks to - do, you still have to specify this output, but it's enough to set it as an - empty list. - -* ``step_config``: This defines what puppet manifest should be run to configure - your service. It typically is a string with the specific ``include`` - statement that puppet will run. If you're not configuring your service with - puppet, then you need to set this value as an empty string. There is an - exception, however: When you're configuring a containerized service. We'll - dig into that later. - -These are the bare-minimum sections of ``role_data`` you need to set up. -However, you might have noticed that the example we linked above has another -section called ``host_prep_data``. This section is not mandatory, but it is one -of the several ways you can execute Ansible tasks on the host in order to -configure your service. - -Ansible-related parameters --------------------------- - -The following are sections of the service template that allow you to use -Ansible to execute actions or configure your service. - -Host prep deployment (or ``host_prep_tasks``) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This is seen as ``host_prep_tasks`` in the deployment service templates. -These are Ansible tasks that run before the configuration steps start, and -before any major services are configured (such as pacemaker). Here you would -put actions such as wiping out your disk, or migrating log files. - -Lets look at the output section of the example from the previous blog post:: - - outputs: - role_data: - description: Role data for the RHSM service. - value: - service_name: rhsm - config_settings: - tripleo::rhsm::firewall_rules: {} - upgrade_tasks: [] - step_config: '' - host_prep_tasks: - - name: Red Hat Subscription Management configuration - vars: {get_attr: [RoleParametersValue, value, vars]} - block: - - include_role: - name: redhat-subscription - -Here we see that an Ansible role is called directly from the -``host_prep_tasks`` section. In this case, we're setting up the Red Hat -subscription for the node where this is running. We would definitely want this -to happen in the very beginning of the deployment, so ``host_prep_tasks`` is an -appropriate place to put it. - -Pre Deploy Step tasks (or ``pre_deploy_step_tasks``) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are Ansible tasks that take place in the overcloud nodes. They are run -after the network is completely setup, after the bits to prepare for containers -running are completed (TCIB/Kolla files, container engine installation and configuration). -They are also run before any External deploy tasks. - -External deploy tasks -^^^^^^^^^^^^^^^^^^^^^ - -These are Ansible tasks that take place in the node where you executed the -"overcloud deploy". You'll find these in the service templates in the -``external_deploy_tasks`` section. These actions are also ran as part of the -deployment steps, so you'll have the ``step`` fact available in order to limit -the ansible tasks to only run on a specific step. Note that this runs on each -step before the "deploy steps tasks", the puppet run, and the container -deployment. - -Typically you'll see this used when, to configure a service, you need to -execute an Ansible role that has special requirements for the Ansible -inventory. - -Such is the case for deploying OpenShift on baremetal via TripleO. The Ansible -role for deploying OpenShift requires several hosts and groups to exist in the -inventory, so we set those up in ``external_deploy_tasks``:: - - - name: generate openshift inventory for openshift_master service - copy: - dest: "{{playbook_dir}}/openshift/inventory/{{tripleo_role_name}}_openshift_master.yml" - content: | - {% if master_nodes | count > 0%} - masters: - hosts: - {% for host in master_nodes %} - {{host.hostname}}: - {{host | combine(openshift_master_node_vars) | to_nice_yaml() | indent(6)}} - {% endfor %} - {% endif %} - - {% if new_masters | count > 0 %} - new_masters: - hosts: - {% for host in new_masters %} - {{host.hostname}}: - {{host | combine(openshift_master_node_vars) | to_nice_yaml() | indent(6)}} - {% endfor %} - - new_etcd: - children: - new_masters: {} - {% endif %} - - etcd: - children: - masters: {} - - OSEv3: - children: - masters: {} - nodes: {} - new_masters: {} - new_nodes: {} - {% if groups['openshift_glusterfs'] | default([]) %}glusterfs: {}{% endif %} - -In the case of OpenShift, Ansible itself is also called as a command from here, -using variables and the inventory that's generated in this section. This way we -don't need to mix the inventory that the overcloud deployment itself is using -with the inventory that the OpenShift deployment uses. - -Deploy steps tasks -^^^^^^^^^^^^^^^^^^ - -These are Ansible tasks that take place in the overcloud nodes. Note that like -any other service, these tasks will only execute on the nodes whose role has -this service enabled. You'll find this as the ``deploy_steps_tasks`` section in -the service templates. These actions are also ran as part of the deployment -steps, so you'll have the ``step`` fact available in order to limit the -ansible tasks to only run on a specific step. Note that on each step, this runs -after the "external deploy tasks", but before the puppet run and the container -deployment. - -Typically you'll run quite simple tasks in this section, such as setting the -boot parameters for the nodes. Although, you can also run more complex roles, -such as the IPSec service deployment for TripleO:: - - - name: IPSEC configuration on step 1 - when: step == '1' - block: - - include_role: - name: tripleo-ipsec - vars: - map_merge: - - ipsec_configure_vips: false - ipsec_skip_firewall_rules: false - - {get_param: IpsecVars} - -This type of deployment applies for services that are better tied to TripleO's -Ansible inventory or that don't require a specific inventory to run. - -Container-related parameters ----------------------------- - -This covers the sections that allow you to write a containerized service for -TripleO. - -Containerized services brought a big change to TripleO. From packaging puppet -manifests and relying on them for configuration, we now have to package -containers, make sure the configuration ends up in the container somehow, then -run the containers. Here I won't describe the whole workflow of how we -containerized OpenStack services, but instead I'll describe what you need to -know to deploy a containerized service with TripleO. - -``puppet_config`` section -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Before getting into the deployment steps where TripleO starts running services -and containers, there is a step where puppet is ran in containers and all the -needed configurations are created. The ``puppet_config`` section controls this -step. - -There are several options we can pass here: - -* ``puppet_tags``: This describes the puppet resources that will be allowed to - run in puppet when generating the configuration files. Note that deeper - knowledge of your manifests and what runs in puppet is required for this. - Else, it might be better to generate the configuration files with Ansible - with the mechanisms described in previous sections of this document. - Any service that specifies tags will have the default tags of - ``'file,concat,file_line,augeas,cron'`` appended to the setting. - To know what settings to set here, as mentioned, you need to know your puppet - manifests. But, for instance, for keystone, an appropriate setting would be: - ``keystone_config``. For our etcd example, no tags are needed, since the - default tags we set here are enough. - -* ``config_volume``: The name of the directory where configuration files - will be generated for this service. You'll eventually use this to know what - location to bind-mount into the container to get the configuration. So, the - configuration will be persisted in: - ``/var/lib/config-data/puppet-generated/`` - -* ``config_image``: The name of the container image that will be used for - generating configuration files. This is often the same container - that the runtime service uses. Some services share a common set of - config files which are generated in a common base container. Typically - you'll get this from a parameter you pass to the template, e.g. - ``Image`` or ``ConfigImage``. Dealing with these - images requires dealing with the `container image prepare workflow`_. - The parameter should point to the specific image to be used, and it'll be - pulled from the registry as part of the - deployment. - -* ``step_config``: Similarly to the ``step_config`` that's described earlier in - this document, this setting controls the puppet manifest that is ran for this - service. The aforementioned puppet tags are used along with this manifest to - generate a config directory for this container. - -One important thing to note is that, if you're creating a containerized -service, you don't need to output a ``step_config`` section from the -``roles_data`` output. TripleO figured out if you're creating a containerized -service by checking for the existence of the ``docker_config`` section in the -``roles_data`` output. - -``kolla_config`` section -^^^^^^^^^^^^^^^^^^^^^^^^ - -As you might know, TripleO uses kolla to build the container images. Kolla, -however, not only provides the container definitions, but provides a rich -framework to extend and configure your containers. Part of this is the fact -that it provides an entry point that receives a configuration file, with which -you can modify several things from the container on start-up. We take advantage -of this in TripleO, and it's exactly what the ``kolla_config`` represents. - -For each container we create, we have a relevant ``kolla_config`` entry, with a -mapping key that has the following format:: - - /var/lib/kolla/config_files/.json - -This, contains YAML that represents how to map config files into the container. -In the container, this typically ends up mapped as -``/var/lib/kolla/config_files/config.json`` which kolla will end up reading. - -The typical configuration settings we use with this setting are the following: - -* ``command``: This defines the command we'll be running on the container. - Typically it'll be the command that runs the "server". So, in the example you - see ``/usr/bin/etcd ...``, which will be the main process running. - -* ``config_files``: This tells kolla where to read the configuration files - from, and where to persist them to. Typically what this is used for is that - the configuration generated by puppet is read from the host as "read-only", - and mounted on ``/var/lib/kolla/config_files/src``. Subsequently, it is - copied on to the right location by the kolla mechanisms. This way we make - sure that the container has the right permissions for the right user, given - we'll typically be in another user namespace in the container. - -* ``permissions``: As you would expect, this sets up the appropriate - permissions for a file or set of files in the container. - -``docker_config`` section -^^^^^^^^^^^^^^^^^^^^^^^^^ - -This is the section where we tell TripleO what containers to start. Here, we -explicitly write on which step to start which container. Steps are set as keys -with the ``step_`` format. Inside these, we should set up keys -with the specific container names. In our example, we're running only the etcd -container, so we use a key called ``etcd`` to give it such a name. -`Paunch`_ or tripleo_container_manage_ Ansible role will read these parameters, -and start the containers with those settings. - -Here's an example of the container definition:: - - step_2: - etcd: - image: {get_param: ContainerEtcdImage} - net: host - privileged: false - restart: always - healthcheck: - test: /openstack/healthcheck - volumes: - - /var/lib/etcd:/var/lib/etcd - - /etc/localtime:/etc/localtime:ro - - /var/lib/kolla/config_files/etcd.json:/var/lib/kolla/config_files/config.json:ro - - /var/lib/config-data/puppet-generated/etcd/:/var/lib/kolla/config_files/src:ro - environment: - - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS - -This is what we're telling TripleO to do: - -* Start the container on step 2 - -* Use the container image coming from the ``ContainerEtcdImage`` heat parameter. - -* For the container, use the host's network. - -* The container is not `privileged`_. - -* The container will use the ``/openstack/healthcheck`` endpoint for healthchecking - -* We tell it what volumes to mount - - - Aside from the necessary mounts, note that we're bind-mounting the - file ``/var/lib/kolla/config_files/etcd.json`` on to - ``/var/lib/kolla/config_files/config.json``. This will be read by kolla - in order for the container to execute the actions we configured in the - ``kolla_config`` section. - - - We also bind-mount ``/var/lib/config-data/puppet-generated/etcd/``, which - is where the puppet ran (which was ran inside a container) persisted the - needed configuration files. We bind-mounted this to - ``/var/lib/kolla/config_files/src`` since we told kolla to copy this to - the correct location inside the container on the ``config_files`` section - that's part of ``kolla_config``. - -* Environment tells the container engine which environment variables to set - - - We set ``KOLLA_CONFIG_STRATEGY=COPY_ALWAYS`` in the example, since this - tells kolla to always execute the ``config_files`` and ``permissions`` - directives as part of the kolla entry point. If we don't set this, it - will only be executed the first time we run the container. - -``container_puppet_tasks`` section -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are containerized puppet executions that are meant as bootstrapping -tasks. They typically run on a "bootstrap node", meaning, they only run on one -relevant node in the cluster. And are meant for actions that you should only -execute once. Examples of this are: creating keystone endpoints, creating -keystone domains, creating the database users, etc. - -The format for this is quite similar to the one described in ``puppet_config`` -section, except for the fact that you can set several of these, and they also -run as part of the steps (you can specify several of these, divided by the -``step_`` keys). - -.. note:: This was docker_puppet_tasks prior to the Train cycle. - - -.. References - -.. _tht deployment readme: https://opendev.org/openstack/tripleo-heat-templates/src/branch/master/deployment/README.rst -.. _heat resource chain object: https://docs.openstack.org/heat/pike/template_guide/openstack.html#OS::Heat::ResourceChain -.. _common/services.yaml: https://github.com/openstack/tripleo-heat-templates/blob/stable/queens/common/services.yaml#L44 -.. _container image prepare workflow: https://docs.openstack.org/tripleo-docs/latest/install/containers_deployment/overcloud.html#preparing-overcloud-images -.. _Paunch: https://docs.openstack.org/paunch/readme.html -.. _tripleo_container_manage: https://docs.openstack.org/tripleo-ansible/latest/roles/role-tripleo_container_manage.html -.. _privileged: https://www.linux.com/blog/learn/sysadmin/2017/5/lazy-privileged-docker-containers diff --git a/doc/source/developer/tht_walkthrough/summary.rst b/doc/source/developer/tht_walkthrough/summary.rst deleted file mode 100644 index af42f8af..00000000 --- a/doc/source/developer/tht_walkthrough/summary.rst +++ /dev/null @@ -1,18 +0,0 @@ -Summary -------- - -References: - -#. https://etherpad.openstack.org/p/tripleo-composable-roles-work - -#. https://review.opendev.org/#/c/245804/2/specs/mitaka/composable-services-within-roles.rst - -#. https://review.opendev.org/#/q/topic:composable_service - -#. https://docs.openstack.org/tripleo-docs/latest/install/advanced_deployment/template_deploy.html - -#. http://hardysteven.blogspot.com.es/2015/05/tripleo-heat-templates-part-1-roles-and.html - -#. http://hardysteven.blogspot.com.es/2015/05/tripleo-heat-templates-part-2-node.html - -#. http://hardysteven.blogspot.com.es/2015/05/tripleo-heat-templates-part-3-cluster.html diff --git a/doc/source/developer/tht_walkthrough/tht_walkthrough.rst b/doc/source/developer/tht_walkthrough/tht_walkthrough.rst deleted file mode 100644 index b65f5a06..00000000 --- a/doc/source/developer/tht_walkthrough/tht_walkthrough.rst +++ /dev/null @@ -1,24 +0,0 @@ -Composable services tutorial -============================ - -.. include:: ../../links.rst - -This guide will be a walkthrough related to how to add new services to a TripleO -deployment through additions to the tripleo-heat-templates and puppet-tripleo -repositories, using part of the architecture defined in the `composable services architecture`_. - -.. note:: - - No puppet manifests may be defined in the `THT repository`_, they - should go to the `puppet-tripleo repository`_ instead. - -.. toctree:: - :maxdepth: 2 - - introduction - changes-tht - changes-puppet-tripleo - design-patterns - tls_for_services - summary - service_template_sections diff --git a/doc/source/developer/tht_walkthrough/tls_for_services.rst b/doc/source/developer/tht_walkthrough/tls_for_services.rst deleted file mode 100644 index 3cbefd7b..00000000 --- a/doc/source/developer/tht_walkthrough/tls_for_services.rst +++ /dev/null @@ -1,849 +0,0 @@ -TLS support for services -======================== - -.. _public-tls-dev: - -Public TLS ----------- - -If you're adding a REST service to TripleO, chances are that you'll need your -service to be terminated by HAProxy. Unfortunately, adding your service to -HAProxy needs extra changes to existing modules. Fortunately, it's not that -hard to do. - -You can add your service to be terminated by HAproxy by modifying the -`manifests/haproxy.pp`_ file. - -First off, we need a flag to tell the HAProxy module to write the frontend for -your service in the HAProxy configuration file if your service is deployed. For -this, we will add a parameter for the manifest. If you have followed the -walk-through, you may have noticed that the `tripleo-heat-templates`_ yaml -template requires you to set a name for your service in the ``role_data`` -output:: - - ... - outputs: - role_data: - description: Description of your service - value: - service_name: my_service - ... - -The overcloud stack generated from the tripleo-heat-templates will use this -name and automatically generate several hieradata entries that are quite -useful. One of this entries is a global flag that can tell if your service is -enabled at all or not. So we'll use this flag and fetch it from hiera to set -the parameter we need in haproxy.pp:: - - ... - $keystone_admin = hiera('keystone_enabled', false), - $keystone_public = hiera('keystone_enabled', false), - $neutron = hiera('neutron_api_enabled', false), - $cinder = hiera('cinder_api_enabled', false), - $glance_api = hiera('glance_api_enabled', false), - ... - $my_service = hiera('my_service_enabled', false), - ... - -Note that the name of the hiera key matches the following format -"_enabled" and defaults to ``false``. - -Next, you need to add a parameter that tells HAProxy which network your service -is listening on:: - - ... - $barbican_network = hiera('barbican_api_network', false), - $ceilometer_network = hiera('ceilometer_api_network', undef), - $cinder_network = hiera('cinder_api_network', undef), - $glance_api_network = hiera('glance_api_network', undef), - $heat_api_network = hiera('heat_api_network', undef), - ... - $my_service_network = hiera('my_service_network', undef), - ... - -Tripleo-heat-templates will also autogenerate this key for you. However for it -to do this, you need to specify the network for your service in the templates. -The file where this needs to be set is `network/service_net_map.j2.yaml`_, and -you'll be looking for a parameter called ``ServiceNetMapDefaults``. It will -look like this:: - - # Note that the key in this map must match the service_name - # see the description above about conversion from CamelCase to - # snake_case - the names must still match when converted - ServiceNetMapDefaults: - default: - # Note the values in this map are replaced by *NetName - # to allow for sane defaults when the network names are - # overridden. - ... - NeutronTenantNetwork: tenant - CeilometerApiNetwork: internal_api - BarbicanApiNetwork: internal_api - CinderApiNetwork: internal_api - GlanceApiNetwork: storage - ... - MyServiceNetwork: - -Now, having added this, you'll have access to the aforementioned hiera key and -several others. - -Note that the network is used by HAProxy to terminate TLS for your service. -This is used when Internal TLS is enabled and you'll learn more about it in the -:ref:`internal-tls-dev` section. - -Then, you need to add the ports that HAProxy will listen on. There is a list -with the defaults which is called ``default_service_ports``, and you need to -add your service here:: - - $default_service_ports = { - ... - neutron_api_port => 9696, - neutron_api_ssl_port => 13696, - nova_api_port => 8774, - nova_api_ssl_port => 13774, - nova_placement_port => 8778, - nova_placement_ssl_port => 13778, - nova_metadata_port => 8775, - nova_novnc_port => 6080, - nova_novnc_ssl_port => 13080, - ... - my_service_port => 5123, - my_service_ssl_port => 13123, - ... - } - -You are specifying two ports here, one that is the standard port, and another -one that is used for SSL in the public VIP/host. This was done initially to -address deployments without network isolation. In these cases, deploying TLS -would effectively take over the other interfaces, so HAProxy would be listening -with TLS everywhere accidentally if only using one port, and further -configuration for the services would need to happen to address this. However, -this is not really an issue in network isolated deployments, since they would -be using different IP addresses. So this extra port might not be needed in the -future if network isolation becomes the standard mode of deploying. - -.. note:: The SSL port is not needed if your service is only internal and - doesn't listen on the public VIP. - -.. note:: These ports can be overwritten by using the ``$service_ports`` - parameter from this manifest. Once could pass it via hieradata through the - ``ExtraConfig`` tripleo-heat-templates parameter, and setting something - like this as the value:: - - tripleo::haproxy::service_ports: - my_service_ssl_port: 5123 - my_service_2_ssl_port: 5124 - - Please consider that this will overwrite any entry from the list of - defaults, so you have to be careful to update all the relevant entries in - tripleo-heat-templates if you want to change port (be it SSL port or - non-SSL port). - -Finally, you need to add the actual endpoint to HAproxy which will configure -the listen directive (or frontend and backend) in the haproxy configuration. -For this, we have a helper class called ``::tripleo::haproxy::endpoint`` that -sets the relevant bits for you. All we need to do is pass in all the -information that class needs. And we need to make sure that this only happens -if the service is enabled, so we'll enclose it with the flag we mentioned -above. So here's a code snippet that demonstrates what you need to add:: - - if $my_service { - ::tripleo::haproxy::endpoint { 'my_service': - public_virtual_ip => $public_virtual_ip, - internal_ip => hiera('my_service_vip', $controller_virtual_ip), - service_port => $ports[my_service_port], - ip_addresses => hiera('my_service_node_ips', $controller_hosts_real), - server_names => hiera('my_service_node_names', $controller_hosts_names_real), - mode => 'http', - listen_options => { - 'http-request' => [ - 'set-header X-Forwarded-Proto https if { ssl_fc }', - 'set-header X-Forwarded-Proto http if !{ ssl_fc }'], - }, - public_ssl_port => $ports[my_service_ssl_port], - service_network => $my_service_network, - } - } - -* The ``public_virtual_ip`` variable contains the public IP address that's used - for your cloud, and it's the one that people will usually have access to - externally. - -* The hiera keys ``my_service_node_ips``, ``my_service_vip``, - ``my_service_node_names`` are automatically generated by - tripleo-heat-templates. These are other keys that you'll get access to once - you add the network for your service in ``ServiceNetMapDefaults``. - -* ``my_service_vip`` is, as mentioned, automatically generated, and will point - HAProxy to the non-public VIP where other services will be able to access - your service. This will usually be the Internal API network, but it depends - on your use-case. - -* ``my_service_node_ips`` is, as mentioned, automatically generated, and will - tell HAProxy which nodes are hosting your service, so it will point to them. - The address depends on the network your service is listening on. - -* ``my_service_node_names`` is, as mentioned, automatically generated, and will - be the names that HAProxy will use for the nodes. These are the FQDNs of the - nodes that are hosting your service. - -* This example is an HTTP service, so note that we set the mode to ``http``, - and that we set the option for HAProxy to detect if TLS was used for the - request, and set an appropriate value for the ``X-Forwarded-Proto`` HTTP - header if that's the case. Not all services can read this HTTP header, so - this depends on your service. For more information on the available options - and the mode, consult the `haproxy documentation`_. - -.. note:: If your service is only internal and doesn't listen on the public - VIP, you don't need all of the parameters listed above, and you would - instead do something like this:: - - if $my_service { - ::tripleo::haproxy::endpoint { 'my_service': - internal_ip => hiera('my_service_vip', $controller_virtual_ip), - service_port => $ports[my_service_port], - ip_addresses => hiera('my_service_node_ips', $controller_hosts_real), - server_names => hiera('my_service_node_names', $controller_hosts_names_real), - service_network => $my_service_network, - } - } - - The most relevant bits are that we omitted the SSL port and the - ``public_virtual_ip``, since these won't be used. - - -Having added this to the manifest, you should be covered for both getting your -service to be proxied by HAProxy, and letting it to TLS in the public interface -for you. - -.. _internal-tls-dev: - -Internal TLS ------------- - -How it works -~~~~~~~~~~~~ - -If you haven't read the section `TLS Everywhere `_ -it is highly recommended you read that first before continuing. - -As mentioned, the default CA is FreeIPA, which issues the certificates that the -nodes request, and they do the requests via certmonger. - -FreeIPA needs to have the nodes registered in its database and those nodes need -to be enrolled in order to authenticate to the CA. This is already being -handled for us, so there's nothing you need to do for your service on this -side. - -In order to issue certificates, FreeIPA also needs to have registered a -Kerberos principal for the service (or service principal). This way it knows -what service is using what certificate. The service principal will look -something like this:: - - /. - -We assume that the domain matches the kerberos realm, so specifying it is -redundant. - -Fortunately, one doesn't need to do much but fill in some boilerplate code in -tripleo-heat-templates to get this service principal. And this will be covered -in subsequent sections. - -So, with this one can finally request certificates for the service and use -them. - -.. _internal-tls-for-your-service: - -Enabling internal TLS for your service -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Aside from the actual certificate request, if your service is a RESTful -service, getting TLS to work with the current solution requires usually two -fronts: - -* To get your service to actually serve with TLS. - -* To tell HAProxy to try to access your service using TLS. - -This can be different for other types of services. For instance, at the time of -writing this, RabbitMQ isn't proxied by HAProxy, so there wasn't a need to -configure anything in HAProxy. Another example is MariaDB: Even though it is -proxied by HAProxy, TLS is handled on the MariaDB side and HAProxy doesn't do -TLS termination, so there was no need to configure HAProxy. - -Also, for services in general, there are two options for the Subject -Alternative Name (SAN) for the certificate: - -1) It should be a hostname that points to a specific interface in the node. - -2) It should be a hostname that points to a VIP (or a Virtual IP Address). - -The usual case for a RESTful service will be the first option. HAProxy will do -TLS termination, listening on the cloud's VIPs, and will then forward the -request to your service trying to access it via the node's internal network -interface (not the VIP). So for this case (#1), your service should be serving -a TLS certificate with the nodes' interface as the SAN. RabbitMQ has a similar -situation even if it's not proxied by HAProxy. Services try to access the -RabbitMQ cluster through the individual nodes, so each broker server has a -certificate with the node's hostname for a specific network interface as the -SAN. On the other hand, MariaDB follows the SAN pattern #2. It's terminated by -HAProxy, so the services access it through a VIP. However, MariaDB handles TLS -by itself, so it ultimately serves certificates with the hostname pointing to a -VIP interface as the SAN. This way, the hostname validation works as expected. - -If you're not sure how to go forward with your service, consult the TripleO -team. - -.. _services-over-httpd-internal-tls: - -Services that run over httpd -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Good news! Certificates are already requested for you and there is a hash where -you can fetch the path to the certificates and use them for your service. - -In `puppet-tripleo`_ you need to go to the manifest that deploys the API for -your service. Here, you will add the following parameters to the class:: - - class tripleo::profile::base::my_service::api ( - ... - $my_service_network = hiera('my_service_network', undef), - $certificates_specs = hiera('apache_certificates_specs', {}), - $enable_internal_tls = hiera('enable_internal_tls', false), - ... - ) { - -* ``my_service_network`` is a hiera key that's already generated by - tripleo-heat-templates and it references the name of the network your service - is listening on. This was referenced in the :ref:`public-tls-dev` section. - Where it mentioned the addition of your service's network to the - ``ServiceNetMapDefaults`` parameter. So, if this was done, you'll get this - key autogenerated. - -* ``apache_certificates_specs`` is a hash containing the specifications for all - the certificates requested for services running over httpd. These are - network-dependant, which is why we needed the network name. Note that this - also contains the paths where the keys are located in the filesystem. - -* ``enable_internal_tls`` is a flag that tells TripleO if TLS for the internal - network is enabled. We should base the usage of the certificates for your - service on this. - -In order to get the certificate and key for your application you can use the -following boilerplate code:: - - if $enable_internal_tls { - if !$my_service_network { - fail('my_service_network is not set in the hieradata.') - } - $tls_certfile = $certificates_specs["httpd-${my_service_network}"]['service_certificate'] - $tls_keyfile = $certificates_specs["httpd-${my_service_network}"]['service_key'] - } else { - $tls_certfile = undef - $tls_keyfile = undef - } - -If internal TLS is not enabled, we set the variables for the certificate and -key to ``undef``, this way TLS won't be enabled. If it's enabled, we get the -certificate and key from the hash. - -Now, having done this, we can pass in the variables to the class that deploys -your service over httpd:: - - class { '::my_service::wsgi::apache': - ssl_cert => $tls_certfile, - ssl_key => $tls_keyfile, - } - -Now, in `tripleo-heat-templates`_, hopefully the template for your service's -API already uses the base profile for apache services. To verify this, you need -to look in the ``resources`` section of your template for something like this:: - - ApacheServiceBase: - type: ./apache.yaml - properties: - ServiceNetMap: {get_param: ServiceNetMap} - EndpointMap: {get_param: EndpointMap} - -Note that this is of type ./apache.yaml which is the template that contains the -common configurations for httpd based services. - -You will also need to make sure that the ssl hieradata is set correctly. You -will find it usually like this:: - - my_service::wsgi::apache::ssl: {get_param: EnableInternalTLS} - -Where, EnableInternalTLS should be defined in the ``parameters`` section of the -template. - -Finally, you also need to add the ``metadata_settings`` to the output of the -template. This section will be in the same level as ``config_settings`` and -``step_config``, and will contain the following:: - - metadata_settings: - get_attr: [ApacheServiceBase, role_data, metadata_settings] - -Note that it merely outputs the metadata_settings section that the apache base -stack already outputs. This will give the appropriate parameters to a hook that -sets the nova metadata, which in turn will be taken by the *novajoin* service -generate the service principals for httpd for the host. - -See the `TLS Everywhere Deploy Guide `_ - -.. _tls_everywhere_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/features/ssl.html#tls-everywhere-for-the-overcloud -.. _configuring-haproxy-internal-tls: - -Configuring HAProxy to use TLS for your service -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Now that your service will be serving with TLS enabled, we go back to the -`manifests/haproxy.pp`_ file. You already have added the HAProxy endpoint -resource for your service, so for this, you need to add now the option to tell -it to use TLS to communicate with the server backend nodes. This is done by -adding this:: - - if $my_service { - ::tripleo::haproxy::endpoint { 'my_service': - ... - member_options => union($haproxy_member_options, $internal_tls_member_options), - } - } - -This adds the TLS options to the default member options we use in TripleO for -HAProxy. It will tell HAProxy to require TLS for your service if internal TLS -is enabled; if it's not enabled, then it won't use TLS. - -This was all the extra configuration you needed to do for HAProxy. - -Internal TLS for services that don't run over httpd -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If your service supports being run with TLS enabled, and it's not -python/eventlet-based (see :ref:`internal-tls-via-proxy`). This section is for -you. - -In `tripleo-heat-templates`_ we'll need to specify the specs for doing the -certificate request, and we'll need to get the appropriate information to -generate a service principal. To make this optional, you should add the -following to your service's base template:: - - parameters: - ... - EnableInternalTLS: - type: boolean - default: false - - conditions: - - internal_tls_enabled: {equals: [{get_param: EnableInternalTLS}, true]} - ... - ... - -* ``EnableInternalTLS`` is a parameter that's passed via ``parameter_defaults`` - which tells the templates that we want to use TLS in the internal network. - -* ``internal_tls_enabled`` is a condition that we'll furtherly use to add the - relevant bits to the output. - -The next thing to do is to add the certificate specs, the relevant hieradata -and the required metadata to the output. In the ``roles_data`` output, lets -modify the ``config_settings`` to add what we need:: - - config_settings: - map_merge: - - - # The regular hieradata for your service goes here. - ... - - - if: - - internal_tls_enabled - - generate_service_certificates: true - my_service_certificate_specs: - service_certificate: '/etc/pki/tls/certs/my_service.crt' - service_key: '/etc/pki/tls/private/my_service.key' - hostname: - str_replace: - template: "%{hiera('fqdn_NETWORK')}" - params: - NETWORK: {get_param: [ServiceNetMap, MyServiceNetwork]} - principal: - str_replace: - template: "my_service/%{hiera('fqdn_NETWORK')}" - params: - NETWORK: {get_param: [ServiceNetMap, MyServiceNetwork]} - - {} - ... - metadata_settings: - if: - - internal_tls_enabled - - - - service: my_service - network: {get_param: [ServiceNetMap, MyServiceNetwork]} - type: node - - null - -* The conditional mentioned above is used in the ``config_settings``. So, if - ``internal_tls_enabled`` evaluates to ``true``, the hieradata necessary to - enable TLS in the internal network for your service will be added. Else, we - output ``{}``, which won't affect the ``map_merge`` and won't add anything - to the regular hieradata for your service. - -* For this case, we are only requesting one certificate for the service. - -* The service will be terminated by HAProxy in a conventional way, which means - that the SAN will be case #1 as described in - :ref:`internal-tls-for-your-service`. So the SAN will point to the specific - node's network interface, and not the VIP. - -* The ``ServiceNetMap`` contains the references to the networks every service - is listening on, and the key to get the network is the name of your service - but using camelCase instead of underscores. This value is the name of the - network and if used under the ``config_settings`` section, it will be - replaced by the actual IP. Else, it will just be the network name. - -* tripleo-heat-templates automatically generates hieradata that contains the - different network-dependant hostnames. They keys are in the following - format:: - - fqdn_ - -* The ``my_service_certificate_specs`` key will contain the specifications for - the certificate we'll request. They need to follow some conventions: - - * ``service_certificate`` will specify the path to the certificate file. It - should be an absolute path. - - * ``service_key`` will specify the path to the private key file that will be - used for the certificate. It should be an absolute path. - - * ``hostname`` is the name that will be used both in the Common Name (CN) and - the Subject Alternative Name (SAN) of the certificate. We can get this - value by using the hiera key described above. So we first get the name of - the network the service is listening on from the ``ServiceNetMap`` and we - then use ``str_replace`` to place that in a hiera call in the appropriate - format. - - * ``principal`` is the service principal that will be the one used for the - certificate request. We can get this in a similar manner as we got the - hostname, and prepending an identifying name for your service. The format - will be as follows:: - - < service identifier >/< network-based hostname > - - * These are the names used by convention, and will eventually be passed to - the ``certmonger_certificate`` resource from `puppet-certmonger`_. - -* The ``metadata_settings`` section will pass some information to a metadata - hook that will create the service principal before the certificate request is - done. The format as follows: - - * ``service``: This contains the service identifier to be used in the - kerberos service principal. It should match the identifier you put in the - ``principal`` section of the certificate specs. - - * ``network``: Tells the hook what network to use for the service. This will - be used for the hook and novajoin to use an appropriate hostname for the - kerberos principal. - - * ``type``: Will tell the hook what type of case is this service. The - available options are ``node`` and ``vip``. These are the cases mentioned - in the :ref:`internal-tls-for-your-service` for the SANs. - - Note that this is a list, which can be useful if we'll be creating several - service principals (which is not the case for our example). Also, if - ``internal_tls_enabled`` evaluates to ``false``, we then output ``null``. - -* Remember to set any relevant flags or parameters that your service might - need as hieradata in ``config_settings``. These might be things that - explicitly enable TLS such as flags or paths. But these details depend on the - puppet module that deploys your service. - -.. note:: **VIP-based hostname case** - - If your service requires the certificate to contain a VIP-based hostname, as - is the case for MariaDB. It would instead look like the following:: - - metadata_settings: - if: - - internal_tls_enabled - - - - service: my_service - network: {get_param: [ServiceNetMap, MyServiceNetwork]} - type: vip - - null - - * One can get the hostname for the VIP in a similar fashion as we got the - hostname for the node. The VIP hostnames are also network based, and one - can get them from a hiera key as well. It has the following format:: - - cloud_name_< network name > - - * The ``type`` in the ``metadata_settings`` entry is ``vip``. - -In `puppet-tripleo`_ We'll create a class that does the actual certificate -request and add it to the resource that gets the certificates for all the -services. - -Lets create a class to do the request:: - - class tripleo::certmonger::my_service ( - $hostname, - $service_certificate, - $service_key, - $certmonger_ca = hiera('certmonger_ca', 'local'), - $principal = undef, - ) { - include ::my_service::params - - $postsave_cmd = "systemctl restart ${::my_service::params::service_name}" - certmonger_certificate { 'my_service' : - ensure => 'present', - certfile => $service_certificate, - keyfile => $service_key, - hostname => $hostname, - dnsname => $hostname, - principal => $principal, - postsave_cmd => $postsave_cmd, - ca => $certmonger_ca, - wait => true, - require => Class['::certmonger'], - } - - file { $service_certificate : - owner => $::my_service::params::user, - group => $::my_service::params::group, - require => Certmonger_certificate['my_service'], - } - file { $service_key : - owner => $::my_service::params::user, - group => $::my_service::params::group, - require => Certmonger_certificate['my_service'], - } - - File[$service_certificate] ~> Service<| title == $::my_service::params::service_name |> - File[$service_key] ~> Service<| title == $::my_service::params::service_name |> - } - -* You'll note that the parameters mostly match the certificate specs that we - created before in tripleo-heat-templates. - -* By convention, we'll add this class in the **manifests/certmonger** folder. - -* ``certmonger_ca`` is a value that comes from tripleo-heat-templates and tells - certmonger which CA to use. - -* If it's available, by convention, many puppet modules contain a manifest - called *params*. This usually contains the name and group that the service - runs with, as well as the name of the service in a specific distribution. - So we include this. - -* We do then the actual certificate request by using the - ``certmonger_certificate`` provider and passing all the relevant data for the - request. - - * The post-save command which is specified via the ``postsave_cmd`` is a - command that will be ran after the certificate is saved. This is useful for - when certmonger has to resubmit the request to get an updated certificate, - since this way we can reload or restart the service so it can serve the new - certificate. - -* Using the ``file`` resource from puppet, we set the appropriate user and - group for the certificate and keys. Fortunately, certmonger has sane defaults - for the file modes, so we didn't set those here. - -Having this class, we now need to add to the `certmonger_user`_ resource. This -resource is in charge of making all the certificate requests and should be -available on all roles (or at least it should be added). You would add the -certificate specs as a parameter to this class:: - - class tripleo::profile::base::certmonger_user ( - ... - $my_service_certificate_specs = hiera('my_service_certificate_specs', {}), - ... - ) { - -And finally, we call the class that does the request:: - - ... - unless empty($my_service_certificate_specs) { - ensure_resource('class', 'tripleo::certmonger::my_service', $my_service_certificate_specs) - } - ... - -.. note:: - It is also possible to do several requests for your service. See the - `certmonger_user`_ source code for examples. - -Finally, you can do the same steps described in -`configuring-haproxy-internal-tls`_ to make HAProxy connect to your service -using TLS. - -.. _internal-tls-via-proxy: - -Internal TLS via a TLS-proxy -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you have a RESTful service that runs over python (most likely using -eventlet) or if your service requires a TLS proxy in order to have TLS in the -internal network, there are extra steps to be done. - -For python-based services, due to performance issues with eventlet, the best -thing you can do is try to move your service to run over httpd, and let it -handle crypto instead. Then you'll be able to follow the instructions from the -:ref:`services-over-httpd-internal-tls` section above. If for any reason this -can't be done at the moment, we could still use httpd to service as a TLS proxy -in the node. It would then listen on the service's port and forward all the -requests to the service, which would then be listening on localhost. - -In `puppet-tripleo`_ you need to go to the manifest that deploys the API for -your service, and add the following parameters:: - - class tripleo::profile::base::my_service::api ( - ... - $certificates_specs = hiera('apache_certificates_specs', {}), - $enable_internal_tls = hiera('enable_internal_tls', false), - $my_service_network = hiera('my_service_api_network', undef), - $tls_proxy_bind_ip = undef, - $tls_proxy_fqdn = undef, - $tls_proxy_port = 5123, - ... - ) { - ... - -* ``certificates_specs``, ``enable_internal_tls`` and ``my_service_network`` - have already been mentioned in the :ref:`services-over-httpd-internal-tls` - section. - -* ``tls_proxy_bind_ip``, ``tls_proxy_fqdn`` and ``tls_proxy_port`` are - parameters that will be used by the httpd-based TLS proxy. They will tell it - where what IP to listen on, the FQDN (which will be used as the servername) - and the port it will use. Usually the port will match your service's port. - These values are expected to be set from tripleo-heat-templates. - -Next comes the code for the actual proxy:: - - ... - if $enable_internal_tls { - if !$my_service_network { - fail('my_service_network is not set in the hieradata.') - } - $tls_certfile = $certificates_specs["httpd-${my_service_network}"]['service_certificate'] - $tls_keyfile = $certificates_specs["httpd-${my_service_network}"]['service_key'] - - ::tripleo::tls_proxy { 'my_service_proxy': - servername => $tls_proxy_fqdn, - ip => $tls_proxy_bind_ip, - port => $tls_proxy_port, - tls_cert => $tls_certfile, - tls_key => $tls_keyfile, - notify => Class['::my_service::api'], - } - } - ... - -* The ``::tripleo::tls_proxy`` is the resource that will configure the TLS - proxy for your service. As you can see, it receives the certificates that - come from the ``certificates_specs`` which contain the specification - for the certificates, including the paths for the keys. - -* The notify is added here since we want the proxy to be set before the - service. - -In `tripleo-heat-templates`_, you should modify your service's template and add -the following:: - - parameters: - ... - EnableInternalTLS: - type: boolean - default: false - ... - conditions: - ... - use_tls_proxy: {equals : [{get_param: EnableInternalTLS}, true]} - ... - resources: - ... - TLSProxyBase: - type: OS::TripleO::Services::TLSProxyBase - properties: - ServiceNetMap: {get_param: ServiceNetMap} - EndpointMap: {get_param: EndpointMap} - EnableInternalTLS: {get_param: EnableInternalTLS} - - -* ``EnableInternalTLS`` is a parameter that's passed via ``parameter_defaults`` - which tells the templates that we want to use TLS in the internal network. - -* ``use_tls_proxy`` is a condition that we'll use to modify the behaviour of - the template depending on whether TLS in the internal network is enabled or - not. - -* ``TLSProxyBase`` will make the default values from the proxy's template - available to where our service is deployed. We should make sure that we - combine our service's hieradata with the hieradata coming from that resource - by doing a ``map_merge`` with the ``config_settings``:: - - ... - config_settings: - map_merge: - - get_attr: [TLSProxyBase, role_data, config_settings] - - # Here goes our service's metadata - ... - -So, with this, we can tell the service to bind on localhost instead of the -default interface depending if TLS in the internal network is enabled or not. -Lets now set the hieradata that the puppet module needs in our service's -hieradata, which is in the ``config_settings`` section:: - - tripleo::profile::base::my_service::api::tls_proxy_bind_ip: - get_param: [ServiceNetMap, MyServiceNetwork] - tripleo::profile::base::my_service::api::tls_proxy_fqdn: - str_replace: - template: - "%{hiera('fqdn_$NETWORK')}" - params: - $NETWORK: {get_param: [ServiceNetMap, MyServiceNetwork]} - tripleo::profile::base::my_service::api::tls_proxy_port: - get_param: [EndpointMap, NeutronInternal, port] - my_service::bind_host: - if: - - use_tls_proxy - - 'localhost' - - {get_param: [ServiceNetMap, MyServiceNetwork]} - -* The ``ServiceNetMap`` contains the references to the networks every service - is listening on, and the key to get the network is the name of your service - but using camelCase instead of underscores. This value will be automatically - replaced by the actual IP. - -* tripleo-heat-templates generates automatically hieradata that contains the - different network-dependant hostnames. They keys are in the following - format:: - - fqdn_ - - So, to get it, we get the network name from the ``ServiceNetMap``, and do a - ``str_replace`` in heat that will use that network name and add it to a hiera - call that will then gets us the FQDN we need. - -* The port we can easily get from the ``EndpointMap``. - -* The conditional uses the actual IP if there's no TLS in the internal network - enabled and localhost if it is. - -Finally, we add the ``metadata_settings`` section to make sure we get a -kerberos service principal:: - - metadata_settings: - get_attr: [TLSProxyBase, role_data, metadata_settings] - -.. References - -.. _certmonger_user: https://github.com/openstack/puppet-tripleo/blob/master/manifests/profile/base/certmonger_user.pp -.. _haproxy documentation: http://www.haproxy.org/ -.. _manifests/haproxy.pp: https://github.com/openstack/puppet-tripleo/blob/master/manifests/haproxy.pp -.. _network/service_net_map.j2.yaml: https://github.com/openstack/tripleo-heat-templates/blob/master/network/service_net_map.j2.yaml -.. _puppet-certmonger: https://github.com/earsdown/puppet-certmonger -.. _puppet-tripleo: https://github.com/openstack/puppet-tripleo -.. _tripleo-heat-templates: https://github.com/openstack/tripleo-heat-templates diff --git a/doc/source/developer/tripleoclient_primer.rst b/doc/source/developer/tripleoclient_primer.rst deleted file mode 100644 index e930df88..00000000 --- a/doc/source/developer/tripleoclient_primer.rst +++ /dev/null @@ -1,139 +0,0 @@ -Primer python-tripleoclient and tripleo-common -============================================== - -This document gives an overview of how python-tripleoclient_ provides the -cli interface for TripleO. In particular it focuses on two key aspects of -TripleO commands: where they are defined and how they (very basically) work. - -Whilst python-tripleoclient provides the CLI for TripleO, it is in -tripleo-common_ that the logic behind a given command resides. So interfacing -with OpenStack services such as Heat, Nova or Mistral typically happens in -tripleo-common. - -For this primer we will use a specific example command but the same applies to -any TripleO cli command to be found in the TripleO documentation or in any -local deployment (or even in TripleO CI) logfiles. - -The example used here is:: - - openstack overcloud container image build - -This command is used to build the container images listed in the -tripleo-common file overcloud_containers.yaml_ using Kolla_. - -See the `Building Containers Deploy Guide `_ for more information on -how to use this command as an operator. - -.. _building_containers_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/deployment/3rd_party.html - -One of the TripleO CI jobs that executes this command is the -tripleo-build-containers-centos-7_ job. This job invokes the overcloud container -image build command in the build.sh.j2_ template:: - - openstack overcloud container image build \ - --config-file $TRIPLEO_COMMON_PATH/container-images/overcloud_containers.yaml \ - --kolla-config-file {{ workspace }}/kolla-build.conf \ - -The relevance of showing this is simply to serve as an example in the following -sections. First we see how to identify *where* in the tripleoclient code a given -command is defined, and then *how* the command works, highlighting a recurring -pattern common to all TripleO commands. - -.. _python-tripleoclient: https://opendev.org/openstack/python-tripleoclient/ -.. _tripleo-common: https://opendev.org/openstack/tripleo-common/ -.. _overcloud_containers.yaml: https://opendev.org/openstack/tripleo-common/src/branch/master/container-images/overcloud_containers.yaml?id=827af753884e15326863ff2207b2ac95d4ad595b#n1 -.. _Kolla: https://opendev.org/openstack/kolla -.. _tripleo-build-containers-centos-7: http://zuul.opendev.org/builds?job_name=tripleo-build-containers-centos-7 -.. _build.sh.j2: https://opendev.org/openstack-infra/tripleo-ci/src/branch/master/playbooks/tripleo-buildcontainers/templates/build.sh.j2?id=69212e1cd8726396c232b493f1aec79480459666#n5 -.. _setup.cfg: https://opendev.org/openstack/python-tripleoclient/src/branch/master/setup.cfg?id=73cc43898cfcc8b99ce736f734fc5b514f5bc6e9#n46 - - -TripleO commands: *where* -------------------------- - -Luckily the location of all TripleO commands is given in the list of -``entry_points`` in the python-tripleoclient_ setup.cfg_ file. Each *key=value* -pair has a key derived from the TripleO command. Taking the command, omit -the initial *openstack* and link subcommands with underscore instead of -whitespace. That is, for the -**openstack overcloud container image build** command the equivalent entry is -**overcloud_container_image_build**:: - - [entry_points] - openstack.cli.extension = - tripleoclient = tripleoclient.plugin - - openstack.tripleoclient.v1 = - ... - overcloud_container_image_build = tripleoclient.v1.container_image:BuildImage - -The value in each *key=value* pair provides us with the file and class name -used in the tripleoclient namespace for this command. For **overcloud_container_image_build** we have -**tripleoclient.v1.container_image:BuildImage**, which means this command is -defined in a class called **BuildImage** inside the `tripleoclient/v1/container_image.py`_ -file. - -.. _`tripleoclient/v1/container_image.py`: https://opendev.org/openstack/python-tripleoclient/src/branch/master/tripleoclient/v1/container_image.py?id=0132e7d08240d8a9d5839cc4345574d44ec2b278#n100 - -TripleO commands: *how* ------------------------ - -Obviously each TripleO command 'works' differently in that they are doing -different things - deploy vs upgrade the undercloud vs overcloud etc. -However there **is** at least one commonality which we highlight in this section. -Each TripleO command class defines a get_parser_ function and a take_action_ -function. - -The get_parser_ is where all command line arguments are defined and -take_action_ is where tripleo-common is invoked to perform the task at hand, -building container images in this case. - -Looking inside the **BuildImage** class we find:: - - def get_parser(self, prog_name): - ... - parser.add_argument( - "--config-file", - dest="config_files", - metavar='', - default=[], - action="append", - help=_("YAML config file specifying the images to build. May be " - "specified multiple times. Order is preserved, and later " - "files will override some options in previous files. " - "Other options will append. If not specified, the default " - "set of containers will be built."), - ) - parser.add_argument( - "--kolla-config-file", - -Here we can see where the two arguments shown in the introduction above are -defined: **--config-file** and **--kolla-config-file**. You can see the default -values and all other attributes for each of the command parameters there. - -Finally we can look for the take_action_ function to learn more about how the -command actually 'works'. Typically the take_action function will have some -validation of the provided arguments before calling out to tripleo-common to -actually 'do' the work (build container images in this case):: - - from tripleo_common.image import kolla_builder - ... - def take_action(self, parsed_args): - ... - try: - builder = kolla_builder.KollaImageBuilder(parsed_args.config_files) - result = builder.build_images(kolla_config_files, - -Here we can see the actual image build is done by the **kolla_builder.KollaImageBuilder** -class **build_images** function. Looking in tripleo-common we can follow that -python namespace to find the definition of **build_images** in the -`tripleo_common/image/kolla_builder.py`_ file:: - - def build_images(self, kolla_config_files=None, excludes=[], - template_only=False, kolla_tmp_dir=None): - cmd = ['kolla-build'] - ... - -.. _get_parser: https://opendev.org/openstack/python-tripleoclient/src/branch/master/tripleoclient/v1/container_image.py?id=0132e7d08240d8a9d5839cc4345574d44ec2b278#n119 -.. _take_action: https://opendev.org/openstack/python-tripleoclient/src/branch/master/tripleoclient/v1/container_image.py?id=0132e7d08240d8a9d5839cc4345574d44ec2b278#n184 -.. _`tripleo_common/image/kolla_builder.py`: https://opendev.org/openstack/tripleo-common/src/branch/master/tripleo_common/image/kolla_builder.py?id=3db41939a370ef3bbd2c6b60ca24e6e8e4b6e30a#n441 diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index 347b74fe..00000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,147 +0,0 @@ -Welcome to |project| documentation -==================================== - -TripleO is a project aimed at installing, upgrading and operating OpenStack -clouds using OpenStack's own cloud facilities as the foundation - building on -Nova, Ironic, Neutron and Heat to automate cloud management at datacenter -scale - -Contributor Guide ------------------ - -.. toctree:: - :maxdepth: 3 - :includehidden: - - contributor/index - developer/index - -|project| Architecture ----------------------- - -.. toctree:: - :maxdepth: 3 - :includehidden: - - install/introduction/architecture.rst - -|project| Components ----------------------- - -.. toctree:: - :maxdepth: 2 - :includehidden: - - install/introduction/components.rst - -Tripleo CI Guide ----------------- - -.. toctree:: - :maxdepth: 3 - :includehidden: - - ci/index - -Install Guide -------------- - -.. toctree:: - :maxdepth: 3 - :includehidden: - - install/index - -Upgrades/Updates/FFWD-Upgrade ------------------------------ - -.. toctree:: - :maxdepth: 3 - :includehidden: - - upgrade/index - -Documentation Conventions -========================= - -Some steps in the following instructions only apply to certain environments, -such as deployments to real baremetal and deployments using Red Hat Enterprise -Linux (RHEL). These steps are marked as follows: - -.. admonition:: RHEL - :class: rhel - - Step that should only be run when using RHEL - -.. admonition:: RHEL Portal Registration - :class: portal - - Step that should only be run when using RHEL Portal Registration - -.. admonition:: RHEL Satellite Registration - :class: satellite - - Step that should only be run when using RHEL Satellite Registration - -.. admonition:: CentOS - :class: centos - - Step that should only be run when using CentOS - -.. admonition:: Baremetal - :class: baremetal - - Step that should only be run when deploying to baremetal - -.. admonition:: Virtual - :class: virtual - - Step that should only be run when deploying to virtual machines - -.. admonition:: Ceph - :class: ceph - - Step that should only be run when deploying Ceph for use by the Overcloud - -.. admonition:: Stable Branch - :class: stable - - Step that should only be run when choosing to use components from their - stable branches rather than using packages/source based on current master. - -.. admonition:: |oldest_version_name| - :class: |oldest_version_name_lower| - - Step that should only be run when installing from the |oldest_version_name| - stable branch. - -.. admonition:: |before_oldest_version_name| - - Step that should only be run when installing from the - |before_oldest_version_name| stable branch. - -.. admonition:: |before_latest_version_name| - :class: |before_latest_version_name_lower| - - Step that should only be run when installing from the - |before_latest_version_name| stable branch. - -.. admonition:: |latest_version_name| - :class: |latest_version_name_lower| - - Step that should only be run when installing from the |latest_version_name| - stable branch. - -.. admonition:: Validations - :class: validations - - Steps that will run the pre and post-deployment validations - -.. admonition:: Optional Feature - :class: optional - - Step that is optional. A deployment can be done without these steps, but they - may provide useful additional functionality. - -Any such steps should *not* be run if the target environment does not match -the section marking. diff --git a/doc/source/install/_images/TripleO_Network_Diagram_.jpg b/doc/source/install/_images/TripleO_Network_Diagram_.jpg deleted file mode 100644 index 72d9f3a9ef4acf1a3375b0b1a3b63d17d6c0ac0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94564 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%0AP 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 RBpdq=a>3TJ*4+Ef{{!aIXVw4! diff --git a/doc/source/install/_images/introspection_diagram.svg b/doc/source/install/_images/introspection_diagram.svg deleted file mode 100644 index 9112b0d8..00000000 --- a/doc/source/install/_images/introspection_diagram.svg +++ /dev/null @@ -1,717 +0,0 @@ - - - -image/svg+xmlClient -Ironic -Introspection Ramdisk -Ironic-inspector -Register nodes’power management details -Send nodes for introspection - Reboot nodes -> PXE boot generic -introspection ramdisk image -Facts checking and registration of hardware details -Post hardware metrics -Nodes registered -Nodes are fully registeredwth full stack of hardware attributes - \ No newline at end of file diff --git a/doc/source/install/_images/logical_view.png b/doc/source/install/_images/logical_view.png deleted file mode 100644 index e8941c234c197157fb3c7c0bf25870b74d26db79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122773 zcmZtu1zc2L^gfK9Vdz#-q(KCfmS$)WK{}+nW9aS_Q5q@f27#fwQ@Xo5hDN%%A zd++;odXV%$y_S$Q$=h^c^K~4e(lNb{K0G!W~AC&+AX%qlJjOeI{D|^RZjSycT zMwcfW;SeCv{mFh>@)|vw^X#p$W5_wH-nl z0QlV?h(l`=Cj&}1YbzT^h?~Hh|B-+oj{jX|c|-X>B2G|&H|nwqlw!6HCX}4a9L%h5 z1TiToDfu0YO(9AjKmD)U5oZE#%$=OXyRz(U}5KEVQWMAFJA*gTW2SMH*fwG^nYIetDe?&|EC}u z$N$wTMEh9W4D47wFtf7!zun|yVfufo_y2R(zhC~l?SESJUt#=+u7QX-m>4+OI()IU zwGtHh*LRektqsgfluQha-T7Jm|0Vu!P5J+236XcOFhR8SUyB4k@U#3suKh20ewKgD z{r_tIe|`HuR}q~nh>0lae-D%(=6mKL0RRvNK7SPX;s!cMMe|enGu1QV*(hy`G(Lbt z|Bl|JJ*2sIHXOxhX7S43%(O_bt<4DTQNd3-m4$MWYFeQb8y;@pOsmP2}l5Rd`insOk8?-lQuj~Mw zhVOz)2Ek}fgWI*76VBekI$>=} zJ0W&8zdIw|DI!J&nyFT4k^G}z#v4_AQ@HT@ftD~wsk0$xf;uuy=qWUGNXlVPI|I7; z25FbHyK6w@Cm247N!^tp5~$gHyH~Uj{`!NV-+JwMX{(P&@KOCvnyR+8l}>}x2OQFn z2r36kMADyHYa7iJvmX5Q;qnim-t66R>oHFH?-0EIXwtb{wN^DTg|ju~xtdi<9jFDdoS4p+ zT#Qnz-II8@CtsCsx%J%KYMAr(c{;5kj12>fjdCLNoF#L0;i{UqgylwCxVB z);~C8v^eTh{SmZVZR2ctyxpfZwqF**Ii6{BJ?`*%xSjI@fnl~QEs3KonR%C}Rlk6oAIxE~RTvCH3LB5$tA{j9=+!7Mj7m&=mlNHFk1A6n4#lFYMOyrn5*VY8^MLRC{MnwP78s4@!DZJVBj48 zC#MlLNZD9}S8CAQbu(HbY29josg}`VuEL}tBZG1(!(Zn4cx9rDY352{f79$yuYa$< zN(^{BIR4f0M+%3Jbi=89+zhO#M7$1fRdPv} z5t!ztupsUi_*5uM3y=4Vjw_jv*Y(K?gTYmd9Hg&i$wdn`lna>QU>Cq>)9+uuh=?%{kw9*f+4^BLMWOL5~-LxS(kRzhje zM-$G#MX6Ui;aJ46RiF36v)&-5Fpy>yiSheJf2a|3 zY@<`5+;DJ8iGxb)n&qBhr4vTQpG0ac9gKLhCnoDLoc$0l$19cC$_P z8&AJPZJ$ric}k^bLXI!4#(JS9BPXZp8Wc~hubXR3&BcY#85ys5SN$|gY(?_>tFt%# z(a7I5ZN+Q7+oB<29gYHRFr;QD_`kzdc4{#HP2Y{vCcgiclR{bDt*=UEd$8KrVmT{A zB(E-GG~~-`yCo`5l^@KSsjn*w9f0@Zh65&a?3%B3ucWqfg?_3@fTbT?FUH3we7Q(+ z-}b)As!?yBen9BtJqQ|oTP2Lb_cfbwFAZY$Ic0SUZ&GtoXI*l$&qcfYK*IcEs#bI#~ zh{}B@{T)bZ2X*3&>gH~6O835ePf(Xe*$VI6Bz(v!JbcZ|^8GS7j*~?_jql}4Yo3Ox zb5NqlE$O==$CZvOedlhjinmB{&m#UtgF`of@sN}E#=h^E-Z!@z+ZcT2;%iWbc%Q?6 z{v;&81E@4~+f}`=qruK`VE6Vjgi=pO=tfyhy$G~W$12FoR1e|)OJ00l1wEcs;iN60 zEm5_K{gTFtup<_vvEYP2IHq^%!uFrF6(Eg|@a4r_ebu>;c)=ubFd-M?p@zaQ)jWdq z3Pxr}8dhl~bNfQY*O{*y_Sx>Mg`fGvBXJDGApXLoG8pr+4&o*$g;TdzN41T<;- z>%7l;<9WTc_SY?*wdjSDXI>yO2jgah1$2b zBfNUU(s)o2O6EMNm|JK4@kCokwfj68{4Z7afLs%k5et=tcuoghnj6yWn9k}=DHsjc zD$lX(o7hhUR!jk+IwD;b%cog}h4UlGMTR|7@Ko#{5?Z*JtgW&AvT`fr+V}IyG5_Fp z4E@nftIJce>W@pN;y9K4&s68t(LG8XVBt6=Sfl_|Y2K7xm6pNoPU1K@juOf)@7&

4q}J@yObJehj^y~zTJWtRo(M5dbA06f&(%8lFMdhF1d|2l^u0F0Zp zH6H!^`*4MSTn(@yL-7)K8kMp0OTJ%B0g3rMcqdn2Xqq&A=&`&szHmXigv9Dk^Y^8B z$1bDIHiu1N6img$W~>k;t9AA{HZx1Un^Xdn8oB;62bcyUy@P%^Df){>gw}AQW?J-} z{?J2egf#NakT!wg;E&RGZfb;a_%Fp{p^f&zUM^KxOq?T(MAa;u;w1P+$JrG^ebW~D zH6;#|ebdTdDC-Lg2oN$;Dj>ULvQnt;6|Vbk zl$FI;omI`9&D=qt*x>fQD#6U3O4ena7Si9N#T9}pFg5>&l9t=Oak*4TP<2}Ne)p;O z>+-7qo?3)1#a}8^DXKbm-kvi{KU7gy=W)8f{+sUMQ#*??I+j^x*LX8`kU?fLw_o^@ z8=(L2mM25w$DsI+?>7n%~~@aX9_ z*mQh|@S?#CvEa-z+}Eu7!E=>n$3B1m5GLQJDKn}OGL0~t*LQU!u%oGOwfPQI!e1(G zpIYfLLg(z-ibs)#XdkQ*hFG)r!^Mo*LG#t}kjfj|CS^Yy0 z7m|8iauIfB=)C%&l?G~#g)12jO}y*{{ky^QpRY$)`7#qU_*AObFQmwdU0~Dnz5cGt z?mO4Z&7RzgmPN%^Xu1SGkm7}9~` z`0#<Z zG>r7OH!iEC8P|eUrK}U_Z?Y1Z1($sF3g!lzNx@1r&X6$s`>5QktT#q4&?5kqR<#5- zB~49BcC%q@KVx?}@?BeY(?N9)Mumi5MEe!mycv(N<9YPC>Y3GAYo+z7C~PnD7So$OFQF@AlHqY@S)INN~g;C-*Jw4tn6vACJ zf3<#Wqr$2CLFJ%t!Q+PwN+IF0dJXJ;e?~nkGURi+n-64=aF{EAauV`V=6j`e%7Oih z+J~DFU#?<*n@L-ZORzb3yu7~^v0%7#;&9KxG%7^};!WzS+e;<0ZR`PF!{^-<2xV4F z7PntJ_KDE>^$bMOV6kL@##K) zC>7GDWUW?N<#)K4s9gN8+_g=0jYj4-t_UU;Sl4LQTMTY*w*qoP(pF}ZkJ9*w`P>f5>t&ODE zOm&Pi*=K6tD=E=hRR6dIRFx~d1TVOp}TUD`Y|;j?YNn4T`ys(lwTkam30 zf(%glB*G|4IR6|L7L``$_W9|i4`4by1&C=J<#7cZSk*z9lOXS9s)Uao4(IXohQ6*C5rq8Rz#gsQK|ybAMOz zf9Nnp>dE4DJpZi_+>Mj0S(ph!9!l2e`}%{+wf}2HL&5d8)P}EYJJKTG?!D}C+!jA6 zWyvO+hLgN#%ht5Q;d7~(^m0cYQFuT}VxP#{)h!^m$;?gex6~O9d@jr8Rufe4<`0%z zLVpNV`jLC#gtkW7dolc_cdjLS#i^Cfx%j8S#IZUv<*i9sIhxSZe6c{P#6iKrWj<$E zNI9g498ENMte<3Q>fHKj!B$9E{={4NLj9SRwiYSCi1g|2!2MP0leO>t1_gMReVC^+ ziNnJ11+7fkerc=V{ZZqw;DW;d6IlIEHJG)Jg=kSJJZPw$*n^E}e2C%lBCjeNp%!xn1bTQYofsQC{~K?m+68)EeuQ@4zb%(+DRlo}I#CijopG_p zW>FYZ*aC z>C}?ImfI_0^3`MHQei6guE{4C++141&JP>%Wlq`MT<2@P3r(M6R343?Mdv#50!x_0 z+%*`-EoL#CMz|xw0DmsU)^lL7@(VfcOK)7k$)wV;0b1|#AK`9CzEs|UQwv(A;{<<7 z4TctKYb}hrX9v@LnD2fmxoeg#j1ZUBB*~ILR1T3tx-cOw6-0%~J;MU9yRqPfuyUir z{RNxquthxu83r*wcBQTN#l4CRaW%I-18fW5UG2i$32F^Y5U#~QGPpM#L)bP?tP>HT zF(Ki$Ng0isiC@PYV6p9tvL$;|kBKBaok%@Ab)A9u76q>Qs;N zbf#EvR6M_WbEb;6HtCV?<(wInO{()W#sv~QVyuo`)d<5cp`x!ex9v1QO_uT z`xm?lVz{hCF<$xHD_)L()6X|nSReM>)IU7Q~*$5xqXd!xuIe2QM~ z+V1>7>}%N2gS?PRTYUn~6WnOOae#Tc$|N+(wSUfRPTIGAyruc#6@%4Se~9TwSu^=V z=|yzor%Zy5lo+`x1EdBn`)vix&2EsP` z6h6PLy*HyT=T~gXT7t<9o4J=Jzu}Nub=q7*)vMfU`Hri63Z(4Be30+o4EMdC z&~3V}P)Oqrdo}zFuCueLY!$35U;WCVbd=tv;<=esRqW~nU5Zsq?x0j9P0f*g&umQ( z8I)zksS>9JE()D=#z}tKz+ZsJ##kL%*H+W9G*5oReQ1~JzPDP?c~V=rZv(@A5G;Ag za^2z)8{;5vvR4RVMSA>ozWvVFTN7=G0%v)DxZM2PoH~(4P>Cbb(&X7LWN1UZ-qJop z^az=&2KcJ~QVf(W_RllHKm)!5U%cEwC0`$|R#t#gKYgUD@~Bjod5iXAH3n2!z5m&)$~&-YpkD6Iiu0{~eSyUEXg>9tPh}%qR|jq0Ps3c` z@p^;HxEKF!>DY&G+~@vp59qw*Vp=PYX)ioG7~ugAj1xA8M;tpEyhCbTq5?9;1)A}82_9Cs^2<-?z%vJ2ZO{ z99iaiRJTN2tvSRs>&XIr7p1{wqkZC;`0(IbGj>Bbd#S|rA}2@pX{QzTCDr4OeFVQv z;1BIyV8jTyJI|)YM1Jidqi|}p_fw2nTKU*ML(Vsz#&yZ}N5RF40sxms+;1|qgJ#TFC zw@9e4+DD);E{_v17KX)(V>=&>WlIEwB0m%StmXS~(fNQUc9vJR>eeyuZg$eafLXxz zJM@1B_ z=U_V-wjrNw<*bo+Q)L_Cvkz6(V{?obaGl$_96NNdP*|LdrnY{9mX;$qdyz_1MWq%u zE(tSC4L)UdMpm>3u3(eo$Ui-z@!hWl!&d(G%r78~=I)(;Rcem#fS*uX_wJXX5@I)1 z+}cz-*IjLj`&L~&{=HIoTnJes7qY;5q=!2vKVHr|FhFw?FYhWMgnp|z!TSC_%5u;5 zQFxjE*)M^54?`A~8;&$5BxPyq>ter}{fL_{mEQS`@gY#{=?8v#lwoUZ=E(R#6QT4b_{?fO(kUXqy*XYjv-&T3@?#`+H&UKgNmKRarcj+*g zpS9CL-@fzvB>>1mfsqRyZq2^k?9pMdn`%4V%ZTz!*?@)(J}YCR_H2YR?dZ5Jy@XYx zk=hBD(Kfy$3FUOJmv588VWk6{w)Tm%-&DQy{=R`1uj^N;9V42k-lpfa7G(F-jz)pq zG6O86x-RoB_KA`P}D!lPD zgch=s>YDZeLq7|EBV3TJ?`52PVJGiGcg4ry|rl>D47xGtKiSzdYv`7G$! zCsxV%b56nd+tionu!-&?a0uOODisr-TT($Cu0RjgRl0w|pS#&C)ueJBjZF~OTH6Nc zG^+9cV13Ts`6|3blZ={y;i`8;sK=x|$+k`rm=|g}4av>*g4kA84=H&SYOif7zpiTp zVAYr3tF2UPhcR_OIJory`I9uU-^z(b~-FHi92h|x1Cx4?&b_$DJaXteCv*E zg6CI+Fz4c_(TtzP1gE_GYe|~BFKouEO7%)bo);)XscP8&RFMd%MWR`O`T1OrNPp@_ zqYfGhbQgv>6JdRr){al4=0EMFZnyNDkma5$Ds3TNU!>sGhL2EcRDpI!B}zce>XjH! z=+rx;$Jxc51nfyP55`7`S&RJCfV=NnzdU0DU14LBp*7Fx_l3@x?tg_*^+(eRs1jK9TLuwoHn#P`?@UI@uN#t6VE^!fTH47SM;kf?ud+uG=lF zLUM_mTyABitk>pg|LRfS$5unSy@sk3-)m^}eb!-XJWzR6^17)#_5KMMlmwS;WeY7bBLZ6tTw&e2Op>G#P*l-Zy~LGv zhSE`C`N6oP)TcQn?fuHJC6xR5tQeZNGat`36Bf%nBlUx<7fS~5+%C=16F`$G9zkm| zhjOSTdEU7i<*-tm5X{b>Hte90v;O#!>@N^nVYd=(&b&tsDVq)pPsx@ZBZ6RQaSgSE zxz9Uw?sa!xhn;d;mC!fS&pH*7v+j!_&NZJ%Yz!xaZWI_?oXT%BUs4z6p1hirx%naw zmm`HthH$S8YQi@#DIFb)O~_ztI{h##$Mf3|Ry`AZC3Q3><1FFFsdH!cXYXDvDk#W( zHQmZBzeTSJ5N-3St8}>6Xk%cq(3y_^w2l`^iFg!Wc7vKBM}-|EYgqJuifj_1CSR%+ zsh{)@f`qAyEUfC*zFm%r;i2FU76LNkb-@f^3L>Nu48Rzm@pILwzj+4q*kmq$v{md2 zwnF-t8GeV{(xYzoV+YL+$Z5c4$E5|kYY2cDxZ=%9K1*>f#ET0uQu{mBD6mnoDSN6yW!b z;(Q%N1Z%zh&O!}!7T;k}L-N!1*`0#Se-Y_T7kuo}BqY>oZGD`|lf4$#`fZ;0)AI-i zDqZ=>K}=`l{#Kf#5RX99W#4i^@LJ)!ST5_wn#1LRd8=}jL@bH=w7xLF|h;tgKSP4jX?mp#HuC_*tf1c7B-9Fos(%%+`( zoM9_Ick@>MI}}ItEZ5F=U0IFVg6gL>6*ZK4ce5L?WIB2yKM1mB;=VJH?cDi-IDSK1&Y@h^> zR3C6X`GJzuhUWS-VQNqZ0b)Uskrsq=2xyeynqq@mRDM4y+DymA9*EIm35L(9$_V zLLGCQO+9`s;X27wScZKJ%ByJyzgdOUbUhFsvK+aQ?S9eH@cyC|U%F4j#gfk*YvsEr zPxQ>_dp-Up-+k+8>rNaiNAIY*c-4_#*Bh+Rx!g+Z*`Uioci*yS4j7Ky82z}^1;Y0J zd#LZ8)TKerOBw0b#knrGR@|dfIlZbANr|Pp-o@VB*F$9-x|)11PS@VBWVSTl(%*Tl z3Tye!=p1m|l*vw)2HuY8E8x&9I`pH$u z>!1$YJYu@vWDe})Q7o_m~%4FK4VOm5XeA)0wcm$Nq`v)o|8}Jr7xK{IkQhj{QL<) z&OkwPYjrS;bZQWD^%rak0=;o2w;#nY4q|>jd$&9HG$*g;WinJ1^2vX`t?+fslm_aG zLvpjnWOVyfroygNzI-Lu?L1HMaIlI;N8_=&qB5_BId$BW>(W$SpYP4S)^Sys@WxlX zs>C1DA5pQnx^=WaQ*H0+ZnbK3`SY8BNo_V3R|9yddUgsxHqFDICTV)8XJRa;*_ZIfJ{aj$3@ zX=EmwlN>rVw9!V88R-c66?W0X_cd)@}26w)$pALGtK<9_#?SAmFWN-g9D$S za?&lEG9=pq;ynVB`R3~NYpiq82B0(+FM}>BeMrfUiAv~k$WMK`0QCzv&mIFrV1$v+ z=x2o&uDF=*bFE#8+4C>Z%6CvEcA}HV@0IhpQzG=*1^ioMC&{B+m80bSHSff$MIQ57 z+Z@pwSg(jqxf}SL+D{h)xhX>R*_;6q_m`t87-itb1l__*0-G`wMX`GE*qiwh0(xB> z#idSW&$B!k4r@cQMZ&Vl)A!(-3EJ@Ff%mGogkDxNO^HKE*V4e`HErcSCFNogXZbGD zPxUn|j`#APsUo`ZR42&+vX=_Q-FFm)|gO*g~6*9x0i}542 zs|jO6l+uMfd9r7V-#suDV)TTyW?-WS)-Kz_L_Tcpd8qmMbPsAu3xa-ux4o; zn2b^6Gx)_*?2bU*Ll?%GDaSsUcB9EGx!|o_QW79e4CSs--;*RgWHB$-oSm~vtD)~n zZ;118OY`T*B=mwk!^^F7?{Dty377iP6R^p3r_y&nDMsT+S5k7g+cT0LIf6Cxo;`W8 z{I+{o% z?J4boH2ESc03ge6u=RQ8_n>+CnG1gqyw5=i1OFoX`h4fYk9=p87UyD3P*opkXE9JP zo57(u3E!L=QRG;q%*q9FY^syUVQxo0?DC3xhwW6flA-6w~9 zg;Hi|w4pgo+I(3)XfBSXdc9$q;Idymup9;(oFif{_V+v9)0_*$yQxq{E(MJskEX#E zt!|bSoTRJCcr%^B^&T>cx?8r3CE4(TmWepEi&)c9De9ovH=cROep zXxWVyW3Lh||G`J#>IQ~qDb$ZL?WvZ1j zq^$9w|o4!c{rG2MYX@&V_Y0>e3kJLu6su73Zf7wy=lZpy81Z-T4e(eQo^AUNl7HFn zFTPArJUZXi@qbtY-@wm=S#Yilm;V!?cgQH5uB87N+V>x;;0>B8B^r|7@ZSs_|EVA1 z6919lgm4k;kf$^YE5-lenhyD!`|DPx`&xPbJ9StUc3M%#m5C7lM}S1EvJ$w+KB(@qa%<*V^6;%rem) z8rq7lHmhHDC97--bIhnjD}I>k@9@`D2_JiDY~p_4+?d7?D(~YRz5{4%-+OEuTFx;F|N+b6E&qd57Rtkt9F=#OtU%Y&pG;u{GcF_EMxkx z^KVpQ!8crxg7?KH(IZPp0W=yuHGZmiz7PRTs>hJdhhahkNHL{sZJ@9OFBs}n2d zk@%Amd1$r^NO-0<9@H>aGrpl&TXoeFQSJ)O=8Ep7AMq#a^7kp$)Jm>D1Ao`uB6?0# zCglj2ME)UKy`R>yos*#OHWqricLWF*L#YsBP73%n@E6xEd(;eZEvVolP8-zpO7z&t{ugt>zTwX>UeF_PZ-8f zT$pQlLv=3*EnlX4nD3Z>f2Flm$7xJ_y4H3D0#a!9QU8vs5?U5LM+B3S57>mNlRWO;$Z%%w2YQl)BO=p|XyvxD54>gap$+KiLx=`;K4Z3$1 zUg6*EqruYaz&o%3MMmPfU@)m+x`p?zVwp!!5dg#C#f)C<(NZJYRc@|{Of|@< zOpq|gy6Qg0=gV#_sdH>`X~y=7$uhx-K$7^MJ4l=J0qFrUggaVx>NJd}QB_t%ADMS_1>YfN@|f!BvKrRfj5 z^1hg=^L2j6{-da@dC43V`%Fl}yFGMrIKC6M=&3fLre!9-?iGKJ zsD)@rRQcfT@AEX9%zF&Yxh~#0uz*}F_pEpSu~^T*DRrO21l_JXB>x4(OCv9Y%YkUG zJDN=;jo}-npk3%)LjwJdNCm0Q7AhPcDg2ZRU%5Tfj$8g=VB=x+LIa)@dg{UW#dUpP zU>$xzH@}g(Eb9FCcB}7&W@g1JOWQXOUfy3rTAx!UMcFL&S``9L8fRkK2)wSW&<+?C zPJhjAD&w}aTxQUTS=1-`@Sz?5IOe0u)nebR;0UCTyVXG|7<7Ql2=d} z@(P$KDblG z&(yPcUVp_eZv$zi^|m3-7ir2r<5;9-c0aTy6?#et=yFA81AohnNHXcA#|alZ_B<#9fKdJtVP&erJ>V?L_>a*oTYj z#fqPQ9i>aTuWdC*O`)sw4f5J!&WCMOGBwIoRU2wic=O$-c63~bQz(VnTgq_Nnt zS-0Hv)p=RO*oX2-l ziBKR4uV^&663}BC9(j-?78UfkIogs=AW0ZZIBu#qb=Zh;irL8-z_~fv38mIE`CHGy zAg!h0vwkzSJ@1vQ$N)en6wXkU*F>8`WI!SK=$rvF9My-m;=E2xZykSbx#hntVWag- zjgeTy%+Qf)*~Ce`>-4)6<%nxRE^3Ov`m?h+(tOT^FE6k!n(;81+u&7Xv7|_JLWKy? z_4>2n)-kK6Fx%^h`CbTy&^BBJJa^Dxz*0H7-(f{0@o;vU~e`oGSAW|zSd!i6VYK-Pyip!F@ z%NDw5pUUEvSk-rzlrN?l^Dw-T;FP1CaAlmnk>c@1HGyVKhv&Rb*g?+U=MYVK z+>DQrIUZr)mThU8xIkgxHwxcI7zzlUM>pu$mvf-`S{n{Hq1^_|#2`?6V@EX>$-PkH z)Iwr;av#{p{+51U4r%`mxyP>x43*3Qzld~(n`?b+;>``XKeYdCL#G(OxK#G{l^wjRBdKPc#Q%5&Vy|sIFAs>OZ?}lv zgw|8tFglvNbx$4KIsJNoL&C+lm_?c((#9lo3!FRdx+V6xt@n!Q1<5^+ar3}5yg)yt znjwwh$dgHY-v80YaiO8kW7KRHx+!+lJW@W6cN66vFw;43zHjG9^H9k+UpB~pX272T zJz!~_)zD-!+bFKBSvYE0xSR}T%}?`o0VenvpQ5>%l;{ZwPN|#1FEU7IzrMhiAt&IV zOyRgU9Za!E(DSagrhL-q*HC-Z@vT2J`my-L@d!n;ezJlV{Xc!OfQyo)jLvC5^kZ3wA}tus~W23ZHv>$@FKk-#~kN z7c?x^ezZczUMa1&+sT*5PmkP-bYvz}2QnY)@^Ev`Aa|Vh^NCctz_~`yGe(MVy*$If4}yjMs7f?%<>o zueP-H5dvpCeuBTaZP;hs>k^nDtN*K=t;L__1jFo5@`!CehE)z%V7#D37PwdsWtrzY zZhA3HrVvAsy3W6fE@1v_)Yn$(_^|P~1*9G|9hjf%UAyFxyySV@{LA+ zXtIXy8YhlYdsi^$n4}uS*Ja^)9@Xay+@ExU>J)G(=_qhYwfLERaqIX`NZnl!d%tRn zIkwXfG9s7h?%Rn9@6$*|67-Z_^&UI4vF`}Z*7TKPsKq$)F)EUV|zySC6XG0jBF76IJ=d*=Nqiv z2BR4w2C{Ca;|UG}GBv55qq!{z06z6WoB}R}_W1BO(ii*G=WK|3VYb{ztm*3FtzHV@ z-#S*bfILms5td4A=9HXUwP82L5x;)h^U-CmNB73<(}BZh?`g@G-4nD8W2&;Jkuk=N zhw@qoCGS+@wZEe8vmkK<|CwCz91*-*52fVr+tJJU-N$WpZRe?%jH!U?j@o)xB5=}6 zeYqYZKR=|Ydi;kjt&E|xby?Sa1LsZ^^D-X6OnFvu)Zq8{`~KLH@->SGI<^oz>@_c2 ztOTTgqqmvz9BEaI6U$`#lf+o~>U_D&@$zN<*+?z)=^o)2l=mE9Vr)e?s8Zw(k9}d6 zA^3|{$RK3uF`9)FD`2|FbGKep8ZaPHrViaEH4i;R7c8MZE{b`4tLX$Vb{NG;yu{iq zgBi_H6yt@LW$3p*3X`QJ(j5Aib}7>yCeoRCvZWsMlc=f$(1pIuIw|fRTF&^fQ}6O7(}RRjv$Uyc+)grl$;+OvaywQEz1ynP}h5H zCyd^pef~*W=mQ+#*uD?+a9b7JYAm^Euutbfx($i+N3RNkWF|-sjGG~w$JpeY^H?+w z<%sw`z6p%bS{*e3zW?3m32yS8B0dM~uX|2yHfbn0Fm$H^yCTM^ zoZd~dYD?DAIW=rySz>qMBnZ+~_73fpOlALZd*0g&U5`1R3{cpfv-f!ZRAy#)GHjcaBjyB1ee> zf}!tYsqqAy{DnW4Ne0s71?dW1#$rkI;F2BSB~bz%1v4s0rxZS?KTM_yxaaJ|_z(g6 z0|6YnTIjbQMHn`8Cp()P5m==e@O!`A9bJ#UG@m2hJJnRwwN_D%@`xwZSNA<8e~%W+ zv&Zt#IPLv})ceaReKRU><8sq4L3z7YYJEQ!zvyx5^?jo8VCJtJs`_^IxrZDoHfe7& zg&e4sp!d1JNu{Sj9lX|~r1bTP|FO8@R*wZeisc z=oOUl9Mlh$qNw;rZ(>+~J7nu)wBI{~-Q49Ze7Q0H!Y{t{>EYObh;1F1fvclB$FDEA z@1%m&^~J!bSBSl7^B8m~_)b=}HcJ6MncB1fon;E;Fq$nIb(KE`I0nUuT`SqPz#h;? zde`u!0T%#Sb8Td#0bZ)?AWDUF#C#QKB1YpEI%xw>XG=tmqRxvZwFjb+?Bjzw*2tzU z<~{Py-$GJpP(WpnloY=1!@cvRz7J5o&qnW=al;au&$kKZS|m0+(ZbuC z%7tCv6tFfw?K8$F1kIHwCifNbPISSU$^H6cL4KO04kvjGIj?Ef_XA-HB5DCP=j}wZ zZx^${=)Nc2K`S3RFab+0zJO^)qRZKbqcHYibcd@E-$(Xd0q-+~wcus8hT_)8+sx%A zP^Qh*l52YP#Onb!*^FZ<-xFXp44XQ+>I{bnbq+aL(5W6frgH$qbI&8kgOq_SV22Td zvsatVie&PvETfb9mT15K1>E%N<;>TXrBS9cWvIO=$YA&ULnkC|sD1;A~cg!b@FVgUUJ z3W;mp*L^Rta$}?7$8_PX5A&IDJz|cMF+8jTQ=|;vXKnX!5S60g)WezQ0AnGrCYE!6 zF7esls2nv)mk#=&?FI#hwN&agXd~GCgjWp7E!EUq59)Fq=L3wp(pae#bm9=eg%ld+ zSYOvE1(%GV?i6~X z+Ud_JBqdU@SLc!Sw5l{xZvbO@6NrvwGrELF0s#Lrgm=nbz^XHqM zP!`f=_KE)tQpApM%!^->L@NCnK_C4vZnpx**|DRrN8vi>j9?+kK&EK>=(>-$&)V8- zz5&w0Z(bS0T$<8Qzv@vhwNqjNCPQCfUHPdlnq}vpF3@5C4 zJ_NCX_CN~*>lz+>8}=YH`VIE@WkEI%s*PUUSH?)EpUDB57!F|;hsedH+}Z+C_klK& zSOi(J^Th0v>T7DybT0|zYa#=-e)YRxq5JknhFYmjOoba5wsmUI2X)k_mO#d}2>-BW zXaei*B%NQeLwP7k8a&Nq9xBVwHiTkS@jtTv@Bac2+k6ONC_%5NM{J`&(YTyO6HB^f zI0X4kjPwm4M+mmzsZlfb`0ej+R)oNiLfXOdd)EAZ{~wypIA=rq`P5=gbETO0urN38tIZ69U}xJ-hF@X`~JUuwkOVg&biNZUw7V( zmof+Nkt;h;prq$6?#HXBZ_xym!tmmomwe}96pe~C$|ncfuRA>+5u8VuYWVe4hSLJ! zI1u=D_{o_eO=}jyCV0d?8w(yU-9=4$z;W@}uGS*ag&FIr$s!qeT(`Gwf#5j~<{C`2 zSLp1Ggw*E4%s?1LLR_bEwkk$;Wh_;SJ0TJWY|7&)*pMSHJXsZ{xZqo(0b8rJRpNXKFR3 zOXOx;(l3w7!=1Hy|LkkcX}8Y@tKrqKzky=9*s6zGxNcFqly!o~+n2=_=T>Om-8lEP zw!EIhIrygSzPeMPfJG1h=1N_&_#oCd?_lNn9~tdR%oE=pDd*F&BMxC0+oWkz3Ui=T zg7IhV=8L4h*5TmK5<)xy9-lmyiIilbaHd#8*=P;We@uxnZ>zlo(V(lp7p5l=_H09Hzg-jtf%{&R^z@ zbI@RF`ziOQ1!R7M5rVPLUoWkO$Wvcu6*59+fd1gVyI0&0n6X^B9OnlPTr@`WsW!3a z6^}r7fbWqt$N?4K$^kxvx~2L!3W1`qL*jkcB&> zKqN7$nz;0kPB4b*k`(TMbV$}cVFV&_EGj_5eI904E%~zWk-XzhO@*Ptm2gc7H9tUYC1(uA z5BHq{Q6svTDv1aCV=<)^!}pXN);Hv(5G^RzV3TiFX567=^CH3bY8Rc9`R6N-ocJ&7 zU@Qz};cNjRMD9(EkDZwg%Za<6vuNt9g$#TV`-4NI?Qe1Q;tNjnO^^J4M;1P@;2oYD z&NXs(dj1C#E>k8)gwQgbNoP3cf#?_NFIR83A7+<=gLNuWrSb{ zK=CvbR!h*!3A_CIx=lCq=Fhse+-1iaFGx*_VU3u`B5Y$uL2`!%BT_mL?@oD5R0^Ou zQIMrlbz}v#6e!VlXdVT~s9K1Eb>OO!JGxcNMjdrVA1d%NwCQ{lFT|d`>yEkx06WJI(^l zFaFD#wA5WlAkJ9}A%h(2S=6LR-s9162I+qPMab|JLS(r>u$5I;Y{p@c?%A(;t!Jz- z_6RPkRrB~Jli&y|&?p#s^(jM`@!nc}*`iDORgLuxK2Lqrk~&IS@v2rtDPIT|c!fc~ zc(Hm%V#(eMWi8%3Q~W8W$v-L4lWKtNT~ zr&d-rsI+#5HiO(CAx*H=ocdq9EAfXXDge`i2^oZEDCD;SRRUky@zhIHh2l;~v*eYo z*iuG_4>6Gx1yiuI@#{)?4ZN@XUnccv%&y%*Y)~X&WCTk1WRlNu;`9nSA>B9?WYk!DW3%kD zYIn}llJ2==1+zeCMHu#fRC=q!5Sn{0MSm9)k8SXJNfGFsPW7zaRsjDXO`yDbY{~Xl zbnj>J3gNmXJ{8l-upe=0@pv0748tm}(WPv z9bx_^u*Y96T09~1hR-h_FwGtzi1fGV16AtdC&~D9EgCbn!O~LTF7;*iQYv_Bm3?7q zZQZ3X#j>l2THSh|3)ec?`FmtCij9RRJ={x_m7WR2QBZouYgheeL!M_B<{O;uq0u>Z zE!r0GG5t~(CrqKx&cWD!^f$Dj4AuIXcwVJ2tM8+B1SgOVCyv&xwB_eB>^rDbb~5~ z8GY7|R$`>mLB~+tfzih(G;_{~t-2S5wI{ku4FyNCgHkjRfe9U~HBNOOn^*Y}k%rwn zOgs(@|$f0V4lP1de@EosOS)FoGXJ8Bix= zqoSIOVMRrdLkK7~;he0iAs!z8fJ{p4oOrI+`AQ(Z8Joe52f$;r9ad0oGIk7Ac1^H| z7{+}HjvS^6cEGo;01pq39Kz-Vfv+0`BVJnAL)JbJyF_u(CNHLbh7@6TmxPKYPXWQ6 zUX0u)C#g?`lFT;32rK>m;;yWX8@dkz(`SPGZ^h6VNMA`T#?;~#0leO~`S;!ZiLIg^ z!Zy;iO&z(zlUe@_YLO8%bZmt)q~l)2^cEuQ#yLKm2V{YIc%$2s7jZ(TG^yZQWN|5i z_r~wQRqPLgh=?wtM!q+WCY!zff|(GKAif@2%2;bGuAe?ApXG{%$EgAtZQjddf+{$_2Z`jwT@m8lH|1h=UVeX$m_C>%1EYxss@n%N14$< zRjCXvK9Wt9@wo0-8j#-??8BI(NaHGo+0Pq#tG1$ZYeRJ{Qs9elxl_Pm$NGCe8z%hd ziiM~Ba@`4JAfPNEZ5fTQ!!*vBhg%@gCt*s_Q*3}`d3wRxW zAQT?O^y#mSG53iYAjckF zU2HD9&;MMpf4QqB>}mCq_~bP|>zzl&&7v!f6~WeeN~WC7?5Fon_>I0%>G+|o1F;H; z3KZr$u*rB8#-^fP#b~S?1Y!WDVY%HcU)2JGu2@WrHK~RGLpw@0j8g9m*LKWztn4Gj z{?;{mB%|ueON2QWon8_L0IP&Y02fYjpT76mc*(;Y!BSl;+wDNeQBW%Oq$A?*vQU zC|Flj_*H-DD<|}5t0lsK) zK-W`V&4iqTN6CclkedNwRPUo}r9S_18L!c}(pBbkKKTpN_1~ zXOy30z3p6PIb~{!9oJ<km;R-H$Ir{Cbg{ApFCl-6=sei zL#|EZ6x!@M&tfh4nGXYry|g!&*zOp!Fz{q512_NmMBKP$R_y(H==i^_z?6pR#f|Y| zBLHul)j!C6`2=ts>a*E(#qL4>+KzTr%DB56Da1YIt1n&?Og>%cxp%c_6pH7wxWyq$gEHU8{=cX1O$sE2La(VreGaWr-8 z$ar4KiaPT7c!)VkrlxJl0XeEUCtrDG?Nd?x@e4%g_>d^^YneP6ej%-HwX>2*j*AsZ z#wm9Oo+c_dj!k~SgK+_=IGQK1TU~1&J!HsPx)Kd&Ej+F^kST7?| z1;#932$WlLNGBnQJaDN4&d*9AHXkGJ6)z0v81;2$jq5$feJ4)|pv|{=o}kmuR22$b zK#VajW;VpkJPleXG7f)n>;3YX@C3G;9glj$#6D66_N;#7eyKHdDfz#&yw$Y_to_Hw zHK(+jWSO2)0{`fd{s5TjBneXLvyiODDhH8>*;t_DSB^G|o-;3V7XG;zSOcJfHS8|cG~n}Qlfnws zn_{pG7-P)SBix(s?Z-2R{=Y%!r0Q!R&!RST|TU}|MxbBKTIE$ zvKlKPFE!%MUvY@bM&akkdb{Ez<0{0@WPzvj_}ZO*UcFr(S9)z>AK4!);(5$g z$<1T%uMJp|et#p_esldbPAhVVwx{{=7$;`1aeFwO_Qyx(8pC$)Q2u~l*+~+R!J7ax zl$?h;&0x^rRd9gUF_Jr8LI4XsZ#bf0_+;2)f%`1g*FYuN;Cmtn${$*k9h*T_NSeZm zu#2MKMg|E4cp56d{A#LstMKRtwCZWv%ulkbXYl3U0dP*7tX_fuHo_sg(d=z)^EF8s zXlM?7*jG_rJY)Zcr?}mdGOam3zIs`GlICn759$2kaHH;X9xaR`yC3pvW8Gtr4t9Jp zqM)Yb-?6Ei^%nmvIJ6FvF(~^j?^FIn4}j64Pihp@`MZ~5(}&yDr+;q9+2G+AAzaKk zL)l&;-&tuzurw#YK5bB$iq+Ea$~iD=cFifosPjF^RRVLv{{`cMcLpes!A31k3MFOb z&XR3;r195iP|%YYesv8^N)9+t-P8!Z4W*~5+8l}hZ3&_SWWek>RJFfo!e=iB7TyyQ zuS?c9u$Zdb;%zBGZ-9$45$^h;x`WJk@PKqWzxOs;!@yv`YBPvfNc#)GhZBSKg_P68 zO69dGG{4zO`8F7w~Hg_AACpFKvx zh{pV@&>otjHSNF*nJ?sZ-PDX2bs`iR-KW;Ce0V*%S;uS&owLEjMaJas>1oGOOV))B zG0f0K{J_QgEUq63VEDXZo=@kzYg)2msmE7edu#m<*m8Hu!zc9^IA7vxM}4X>c06Aj zP**wX95;zyF3ens|n_Cb#L#2eEa6 zNfN4N%UcZ>qgk_?jdO94_*-Lk!o;ps^$ir=Pp?xq4L&fK)x0?zb>*KOS#Y$a4B^yo zYEXOy*<=XAtg|{7dm)06CVuEpeboyI%nn*gRs*U?vq_LUAed*gv|9=q)%x^WmD5V1n!&Q@l znS%={zcGu@$fqqfQT?6oYMTwM+V83aY=Cn$z@F{NlwlUTc)L_Uno~NmStQ%re7W_v zR>wzF_TRg_=?oBzkG4L1CbSu<t@}qO+GmgWxS=n;*1qw0 z2HD^_Y+^BMlp9M-PlGrs%eHuf*3H=%<>#DQtIWCvoHAwU1<}Fzne|-MN1s2tnwCH9 zA^W4`a??2(^9JlV?He9CW%8pI=h*`t;%v)=qUT3jf?|6^vK{#dzrw28uupZ_q1I|< zF>+riW-h#X!Kgc6A<3L4u5m~I6`#Sx>(VRGSo(J%BK$D4Ac+VbaTtylKlN=e=(nt& zF9#abYxm^V$o{o~{O_WJ7B)ScrVO$=>aT`|*yVCLa`{#Rgk0^B8bjH~p+bC&%fTL- zr~aF7(8kmTG{iBRB(aVwy;oV<)i}XDiJ#c2Cl3=EPOLLHMjz$v*Y=7WX)Jx&>tPuz zM*H$$nsuI!((BM#Nl{IP(}$Ww9aliB#OZodiwiW9bI92{dO69H2%bc*GT`iVP|5nl zfH4NygAc-^wYFjZOeIysMe{|<*f(v82EsG*z{H&BVsjJ!aRr>{<=>94FiE*DO3nXd zs)ka1`OiG2lf6*e^ZRvaC|X^5a?13@9oWNLVf3_@$E!+5YJArAncObT{8cP7mMup8 zqiT|Uc)-u1&@(%uL#iQ5e<9dMvyW|9<#o#G<>BHYx)Po4wxrpTw&WRLGSyjczCPp( z-P%cs|MJTJPh|`VMfTSMyF|z!aU;*Lxt1L4hoW1XS#1p>U-B8vO)0^QBcy4!r(W`bZFd14=H^A)lb(6kNrRrZ z?Z_IZX7nSg(Hy$;Y-7-ul&W58&Fn>%=Kjk6-vz5Ke9qFNZy6Lq6(T3s^DJFy0x3b` z`rS_>5*)4UmY12vCMdmT(DMABtE z6)HcI@U=JkJn*^l6WEh|ZL!=i>K+L1^+NnRS=Za@_z9Qa?9k?EVJ?1gaW&*+@bE$| zZ?Gw^;rr77R9T6cVtY`$v$6dycf2KCb>5Px#TL(3x8Mvz%1HUC&(lPHkCANGj(WNj zUleUUoC+x5E8*GM8`tkRzP5z7O#R><*2rBEtI!GzZ9Wa{s4vxi?&+g$f0{Y*$>}z2 z!9=g+_aII&_lA$p&XXxV4EUo+HgK0R{%cD0_W`5ELa~OaxZ=b7qHm@-&8Bkp@D&+Q z1KTr7;BAesW(b( ze={i6_dl=YXAh=gw@Q;ywu>DJJ%$7#EsXX&p!wshJfiFP)( zwI?sV&PA>(z3hG5mq$Y$Qsu;78CVFdn1cr_GyVA^8={t^`1s_+c@IAZ54}JQ4jWnY zF9q_}cxE@!g;`989W6Cm=SmBx^e54Gqk?;a7|}D4ON~7L5m|BTrA*JiGliA@WJbo5 zsB9(b%`?G;U1{D9-@rkC)cWG#FdqAHK;V(m;;#Go`6hDVEVX~iqlgy5i*bF&u=|Ix zA=v!-3DG3Sl;`v`Y*MvdG*6nO6`pnC@2tslFXq)>0M( zr4NQ*coOJDpUUJ!pmJ$<)8skQ5;h7_X!}JW@vD%Vz`vvaj=p{SZoZ+EEcd261_Idv z7kmOMDudJQe3A%U&k{w9vhR5k6_<%u)8Tq_KdJbeOxsV zZw=1P1v>fn<3GZT`K{2MZL;j^zfOc6YwH(YHyTUB@R_#2I{c-&;UuWh%TDgNO(YLP};)FAsp|Xa{yAv4jcgZVx84ZMhIMcJB zayN+8`^z8hMODIoOE%8$78aFEP(iI{$^JF8PO?NTjwfrK_A^Zj_i9MQS>B*=ftGS@c?bX%h3rzWz7}=d{I2Pes@%aoPlT|9CarAHtvwIyfFNavVsPa9@%ycC z9RqaxNC1N2ee@Zut3qs12?PduhsjUYg6ZfVU_tDJt5>EeDMk!EAYbD3N zsCQ+6xMIw{i1!94e?-J$o@!@G0LN7S=5*d=IsxA_7u?#fUrVE{-rX0@HEk3{SYz1^ z15eVBYa4vFY-DmX-On0xF>T_un!W74ob7fI_M{)76|3Lx@BS^KaUR#?ft=rML4J$q z??(J;=h~niBZU%{!wFGJ@qwscVD@p@8{&{~=e-NG|1DN5J?8uSl0TpT1q#qS+KgUi zj`jjwBEXP2u8IOuK>GRvYLkUA5bv8w69Ag z?O)s@E&;O`wY`JG@UZbxGmOL65z^LOnE4`3x>(0>`4`yod(Q)hn002};|_mV!qO`; zad||Jm2=Mnl0bG5971%P`fFdk`03kN{MwyXWB0JShPfl~;m+#iRyY6ywJZ|cHrh^j z3*HG6;WOe!iIGt)KNB8#v9NO129YO(SS4ZJ1@Zbcj!>A+Ez~!**7#R-BJYm;8VAes z7q;_VY>)#&s3i@4EZB=Pptzqd;G@>GQm9r0Z7O?`&|y>Cx4t}pir z%&=bkdm2o6G!~kIoTs#GxPLRuR$mGE9m2B=3v|@u zyKq}v#bRs_n2@YgL>w_Pq=W)MOe3Ka^z zC(jSjv81*OJg1+Pf4frv63TVLH5(lv~zgP0vB?2ODG2or$nr`E$_byZdmuN67^) z9|c48tN{!P_w|8fv(V4tOXs2s6KJ(CiRy#DdQPku#*EXLI!EE-AzR(UyZF#iyT`YP zZI*Lz7G%i-twMTE4nxK=hDx+**{G`BU~fglrr7S3@;icEKWc-|cgL!HJkX_|c$^AQzd8m^Z{XL@9XX$#y`byghOxJnpKPm`%VG(zFScxzVgI09 zS{NQ~-`4`aV&d%!rNiR+I+iTb++{y^Za&3hv lQ$y6hW<-ku#OW_y57SzeB*na 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

2i{WpY@{0gxk`;?UuPhI z>T?*0`~?k(ZM>^gbC6K1D62=3YSG#7|9-l}3nigpjAP`XUS1`07I;dz`N`BzQ&x(5 zhG%Xykl6VO4AalDuidP9BdK_tzJ8qPG@n+0n|13>@w$HRD1wftJO#aei#zS(xWuQ^ z1PG(}3R(GR0fX#?0%@bawTjx5CSJvIt>Xao<4E7<2AKexQEo1%+$X)(=lV~uRO+*>+_1*8XsM>-y869CQg>ZUvM-MWC{@t~}U8*Vf~M5{aQWio)_fwLtA8+uo;T^Qnrf|7s>eTz)*qqnkS=IQRV4=~^Uo?Fe4K zRvy{iA>mz~7Lb>zG-sMfySU8+Yw-DFDNwx0G7T{)-&}pzPEE0iiM_Q~S*JTc^(+=S zS*CSg*Ux?Z`emx zck-Y~cwH2ACjNe$p7Y02qZAu%4n{#GPXDOqwVQc2cCe>dd_zoS`MAHx&outIV4M1@ zwG`rT|Iu2ueqy-%gWPtpiyC!_79-+Jh%(J9dbNZ!HHBvf{RmG3e>BidIz2FOKtJ2q ze;8AE|6uiDo7-KvgYa0Q-UbJuR{A?5?gNXoi+@(B_{+Yg`tF z$M$6t!mRT$$%&@0)^^w9`;7}jms}El)5tFYUWx1@n)6-u7UFX}08ASN-FA1q2aNnZ zYfxyhe2yq+7cnUeFZSH2zxk>{n-r{me=6Y4vu)%Wc+by*SBljijJ83e*|j@6z_ju3 z7wPWb&qNGj9MconRH~QVgPz}-@h4S27QP%J>hJd!%A8 zI6}mipaNSpL}457;UM#J8c|GPzu_?|_T|4{yNlF*p^aPleNv&mIAKa6?e z%gOCq6u-by216ycnfhW=5Fb(f0VH| z7`d0O@4++;f`hv4(f6YP7+rqvu9Y8%$li63It|2fcDVO>nRbSUgD`_i5+Z)Cc2f7E z%XG2mY4YMm8=SVENe+LL5IW`Is}c$r{H+$C&Lx87OUz`KoHJ-amK@?s$0Bv~nv$+- z8AP9q{Pu<~B}-2=X?09w)HjZ5w#JsupdA#rES@?ZBzY^Lm3#^D8SX@lV`AKF3fw0Y zjGxxhvP{DgnKi^9muC-q=v75~FuCUSKNwg7F@ZXi;Lu1_MXh=yoBHG}Ye6=r#~lv0 z>%!}u9!5pxp!#U;*kA7cj<&A*!F{RqTU)aKxRiK^z+?A1h1APLpU0-LS4G+upLQR9 zll}N)!f;bqSm^b8Gwau*FiFt3%^fv>M|tE^eTtLSyNYK_MMs%kNp$_MYQH#*;K~Vf zYHW8SH`6o-Sb_s!YS zx!m3L6UamI{e5(EO6&Wt04K?w;n6^9;N~VAnle{Bvf}j20I-H7qaY6J=4qqDsR{Y&wpK+L{|OQ?z;)6HQ7fbS&-#} zj2->c`T4uKHl%W?0dmJLRt4|}C34DI_jNL3NDLVo#O8ZWo@+;K!=~y!=q~ps_I`mo zh%2DrDTgBv!XfiKKy`9|i!7{JR9yXd2A)2;?ITC|YEOQCGWOBxeq)F1qx#qfZ}xXu z%HCeE>!#vby&5e&@VwudR}eOrJIP8XLGpqtetKQ%O1Rd|#akbl7pxC0LIi=~#--qo z>AzM7OwdT$kb8o=_4evfJZKnbit{c5kxxc(i6iBEEk=BVhd*`-l3KlT1Jh-FV>YZ? z8{e7IFmdr;jptVNUS^V%60~r1^jD{?p1t;9HrzHD@LuUudtpJbkiKepxFs=hKV9-3 zb}&yA7Cd&m37;Wk>uP}~f4uBFV;~BR^ED0Aa+rbFI~n)cHyWr4Xo$5(U2h*pmuzn} z`0#m;d1~_&t!=JVjyi3(N3AkWPM&JvGo@91{flS*!BMDoV0vbaw=U*)>M2$_+s#`X z&vPap-GCF4{UMZOh0=L2dLQ!{0ER_~ROrbS9K{)kM1;6sUe`DY`<)HHx)GpvO>f;f zq!cfO9pr7M9!ViCzqWfRM{j9MVB{+8T))O=R(eimeOmRj;q|1%S;GgIz%)FMA_LG5 zIA$lwOIXp;ss|=gFGkZvFY=!pvica%dJ(}S7IT$2?>G8=>Q8+96dm{-GW1WN+QH_) zBcqD`9)|9g$FeYI;mLe{1pssk@;;chQDh@y@*ea;dZpCNv; z5+|~@?YI_vV9YQ68STalhS)zXNWHhw5Y0T-<$riZD-w`S*kt&NnW+4y!3jTaw0d5q zY~$Zkg%L(hn{$D_bCu3xFU_1|higG1TaEjuGzo)VmB%d~pU0H+xL?0WfO)A7L+lRu z%~V!-qR)sbR3uA*SKYvD``)@+;{oNw#$HK#;B4}I<8CoNsL0SKC8s7zW?L&rtC#aX zLWYcho^N_S*W=u}olHlxJ(|Bca=_OPDCIdh$S;j^?&4Eax>`Lm^Du!l2qe;{p+|*b zWWSB=U%anf5l^{g@gjayzn1IZuS3PW5imHDj20JH70^FRwM(@hy}7CAIkyaq-!Nph zA7fO3nwvg@iK;q?GD62b>Eht0GR18No7Z3dVP*+UQ+J>rG)-*meo|TeSN5Z7Su8yL zN;A>KaGrEbBA3K^eNlI^|L5iRVna*cIXRdBs>yj?ce&>43r~4tJRyB2w(idSzM2{V zSz;&aKef^8mp|KMw*xx1g9U;yCVUek!qo!Wl2%_^YbM&u@%#mz~BTN`Lucao~9e>`_q3$anC3@u3}|4 zP7{uJ!YY1(zT=((bJlO3p1t)ZDsR$vTfSbl3{BVzEX<60-~wz7%0dMrUni0YRLsES z&WEGK)X~G`wK&jsM)@u?!!+0Y$VF=5-%h2W#p3G7bF31Ibm3W|4g2QFwQe@b_W>6a z)@Qf%4})uQ`+#}kdxJ?Ifvd(Gc9^SNPUMV=MR=UNdk#%J%{y5OmaWt@D0cv?XHriD znd^>z<2w?n)x>kvZ0HuG%s0#})A*@tqbX>;U7q!Mb5ZsLZz2%RkIKcP0*J%OxiR_G zt0u$f@tl+Jo9iaStZm0rB@$AVq#en`?!)`USIxIMKcoA@uYTYC7kQbC2%xMFY<}U@ zuLz!UCtI*p6X%t6>7U(^Yx-H2s3W5A#;->yKxB~p?E4TP>beq2AhjPRkbq%6CL*<2 zaUi@nH&4oWH`m?hl_j`P@#cwR{juPGo3YV+_s5HW(8XzsyvvdMMGvCe9lKX}jwS|c z{2Hl1sl2DXoh1>i!+V@>r^!ygP~Ennr$k4#qITKMlVugv5B*$m)%-F=T`fb7#BU)4 zpKX7N^6yA>ghkf!4cMQ1vfbfkh`xdD@f+FCoA|2gE*`GX&WK0HdJ@)4deoIy6hnhm z!TNbyo5rbejShFUi-mdy;ICj}YGNUmJrU@BOfFD7jy((YbQkNO*3wFIMcwY#&_UI? z%kQuHHX=j1bckR9M;4v+{!b+uxS@Di?i<tq55mTN`#ew8#Fh!vnkm{)rI zSYaFsle&n>4;6Ns{t@=8-80bD`f0@NQ9D_O>VGRF4a7=|4XOVZCYBpeWi#KOC}^3= za;+Ta*bG3=o|v{;tabVi(gr-=e2LSy`}TL7BB#xQDp!i8LQX8P?z`ECK={p;x5LaF zdXKi@Ks{Eg{vK;cGvr^w0`dFp_oN}dLLlTu(PUhuE}vp6%Gu9($#cL#U0fyvrhK!l znyyIGO0{@Pqha1)b5WS%(+hcvu{sF}ZbZdM9@eNxr3Brn@-u@+g8P*T71=ZNiO z(!f(?slh?yMaZdhndgRF(L$5wrdKaxNpO$F;-l$i%6$9R!&+wmY9L2hk^68s_=?hz zUJx8{`HbnQP6zhvbVkwcHfAElzee|+TKDrIG9*_a#y!)}X%Yr1r$DP_^q#I7`+WDi zb!?+cY$K^iSc`=Nz|G!jw%P?=py^U5Nq+ph`{BOQTVHkttmSEwC}_A@^_jG*?Q=5f zPv657?<3`BMuEY>Vx)0c^=U08%Xk|kv=U@Hsk(Y-U#BJqdYoGC|MuD#eVIqVPhp7L zXTvowl7u&*6;5XD>vUO1`s11ZlOV4~cXZ%SUz=r1@~wnm*IyHVr$5U(>r7@2;;9mg zvbCE->JE4QhG&mEXPFEM^X7S4M9=mkb^cVv4Q#Jfd07Uhz0zYM8~=F~?9Q;us@B9| zX<$J&?1(K(=Q3ry9OAI|N3?{xCy45N=PxeZ9fJ*`y3aWa)h1-?Pz?>S>ye&)=qBOT?0gl&ox{y- z&b*s&#EJqW7H+#azK!LPbUlvH%)C9ApNjpx$_QCVcupTi>8B0Y|B33f&oQ^{5zI>Q0dup*KJ9-uUWKPquanF_>rY0Uua66=!e}w z#y3AztQ@L8mSif(EGH(_kGT65{R1tPh?XsRkGm{)H}RHNZWWH-P<23Lm3?QAMtuD6 zwW;36!%Tl-F#*NGk(KfBT%|ZepA&_th7%GU11=Tiz3YTIHmFP8cU%$zGgU3-l9$In zkA_1#g(6*FEv1CL1zs2MX0oHfih6^-D?r4ga-^BEXsv@O4d0J#EUh?4DQAQkMASUa z%zFLwE=I$yH{f=?O0}-bHIZu;orvYAIoob$6|Qt}RP{M;oP-5lIIL;@!U5i%hXrke#&7uNL21&qL2n$XZN?-ciY4P9=D)VO>3PcOeGex=@vf@9URmviKHg@ zW&-Nsv6Y)?wK<@w0(d1-GSQ|iV|~tT>cegP>kMI=>spsA2Vd6Xk^g@A3C)N}4J6n3 zY+?Eto`0B%tsW24@Pp07$zBBU9T|$5giaQ`?Oc0px!fbttb51!nCTG|8BN{%utDZ+ zU0nNj!6FHOEYomalJ$VU7itL~hP?M_y=uG;KF8V0(e!TkIei^0l^xQ_BH_;csd`Q_ z?W(ETELdk=OxF}wxgnST?c`|(BrbjHTH+<>-|(^Lv7oQh4jSCQ3F$ zPhv5a5lWl^8{eIZ%lOx=;^$@V}^Cf<#8W({`~2Vl!8 z$~}FMK1%zdXb>>~V`%)XxQ1u+^?c;_mX$mAuCDspT2{O&Y%R~c{SHy&|AHuaV`j`l zyfe6Qk`xvtS9^Zuu2O?dbE0~oH&Ah!o8Dg{xk`cwl7`Kkw_0*eV!O>wLZLhLkE)28t()kTgAymQo#sqL#rmSmB=>pN zci{yho$rq&DOZ%tI(xG6p%0y0EuW15RSkQ3D);$;`V$#df}-g*7)Ir)&w3K@;&!jz zOYy(tt#5wT6^z|5)#B!^wG@EZGI`Ita{B%y5W8C1(A&Fw-tmzYxL_va)Arf&Z+WV7 z0~1-55Kh|S+zcn)C` z)V99;#X&pucHV1@z)W*G9p*Fzer3yhyOec!?y!#dw|&x4lu3%`^H3)~!eOAdt}%z1 zuExP3`|1b;YhS`o9~h8zw_Edz{pmJAhwMDIK$^AUBJSRVr5U^ z$()0#m5jc@2!n(-Z+d)pdb9d>K#;%b?4?ufU*DW3GufrsW+-f50`B)_xilPtd<;69Z}aJBr% zALGa4O1qdQJYkvLi>2AwnICEHfLA|FaIn5YNKW~qf<`Is6_Ye~Y`kC=XN1y?vR^OQ zm?iDQm>#K?q_}6^k!lp1M0j2wj5n}e{%67FkhyAKl7I*bDi9qvJ|mTa;a>Q`la7T>ApF3QR#*x*2h+Vpcj((_iRpo z@)?F2WJ_1?A(>a={Uy9zm_4t)q~eBe*!%4GBlMutbMHh6QpS>2J5|5n)M#zk6qSO0 zYC_I4Xz7oSRhgt$6?`=9Vt!)L_ctc-%dVB14v6F4K#31Qt6vZm&(BzjBjn@Z7(v`j zrvE*UNtkn!b^Lyrr^@c+CiSl4qK?ZU$fWQwt7N)x8h5`L+=DrEwwO4l^z_N&anIP1 zxZ_4UPgpx7s#MXpw&e`}N%G9F)%qit7OEko{N?DR+{HT3%mg-rQ z$AZgG35l!EyQ7x==k9PT1w)U4D2x{a`vWBif-~SWU=8-5O}c|cw=wkTIVpJyx84h> zQXV7)oH&4wD1cqO)hA;`8blmzwt{nab$`ipagrazz~z-G=_u!VLI#`G`;}B#_DPs} zF7r0*(Q}FldH#SPYxM%^d zwj(c>;#SkNsfk$b%I|fij(yjO{T9lVxO~Jpo`>61q_V$5vz1R3r+1Rp23iLi~wy%nNJg8&^=&iIN*bYY@7l@cv}h*5kG*Uo+_w7H1eg zo9-J@EU)>EEF5C1$Y%0t#}u)#cB_J4iIw8{T;=)#)~tRf43L$(LbdeR^(&$K#^h1) zM&+|Nwv2g1D`vN+E`o_n?U}>wn-8itFA57bA6ijgZ*M##WltL7Ol^d(CGvL(^e%O4^fA(R4`kF=FcF6>hj(Qi-nPKs!y6%z1{cZC_T;iRf`P3RE?yuHlhUps` zX+D=twlXs`uK8aZCKeZRy&Y>>5BNN{*VSTroRVJBd#6{9otniSk93sm>;^4P4?7o3 zf2Sd+jvd+s6GsPt8*NaKG$VQHg^ut&_$ox9;Ks^k2F zL=w*qM+Q^7^<4>41n`dfc#P#@*mH5p|I+sF_S0G1sb8i4z=D-7EQ`cz7jqQ^6JFv& z4`Uc$odu6whp&@2d_)`;ut#w<-Q7N8d#&Febf9-5^MXE)ITv@YdS@Elef-_`OJ!W5 zi@c3@7aX%mtypvdPOEUV3S*9xG(3$vdxWklwlA6mI$jz+42J#EtVJ~K=xTev8sy4tl?usZ%q8JJRV$jJ~r$nS{AMo$xrz~U{+-M_TSG(NqAH!$9~+faiLNn z=PLxe%(W%%)ZhR@*nMQwi_8Tn51&)99 z_r>Rqn^@pXxf3Id7pXvvi^Sm9dI8uIddfe>SUc zB1s)1(i8qw<@ z9Py)HBqYwfEf<`~q(>OP|9=<2`LVwX+0Yg#21#DZOy>gCV-fSsVWH*aav~%9OrWur zc3uJ4@{`-o_S`9)yg9PgolZ!@48H!48B1Gb0?NOsuFcQkYWMXu-gkW;Jzb`5tD~*L z(%dR#ct|W9t+=6wjm=|?!-P@`nwuXFZJc*CN$g<#f2{Nk61PYHW$H*!Jzj7oUe#3F z%m;kuJd{>zrV&^u3A;(_o_%pKQL!qh$u)k}IDrju?@^UFWq@w`d!Kieo?sB;c>eRr z#_#_7Tc1;}%^nZ51x@@S`%)v2aqK`}_WZ zG0LeDB6+82PIp;4u4a)Lj@&Z^rIM3vIW<_jjReA=YkV(DQe7M2KJfP=r^AuPp7TzU z5>o5A#oX8pyMCVpD;-f^DOykK$j%@e?BmUK9hCn{j6L^VD+Df-UVnny;jM>0l2C&M zsxf&2HC%d7o0dyksj*BPq=;CE*IDL`)vr5_ORabNm>elc`XBp-Z!D- zbjXeKN2nOmxb^CC+#G9~Tyo{*x@#P#ez~5MQ>MPxwMqHD;d3Nn9At~LzU96-;Ie-% zUPJ}ySXtYK4#?Zg=bpt@MFk$qVD>u^^YxG7jdSk4`=@@C&4*u zMG~oTUST7?XTs3?!e*Bmfz@~~YUja}WiUh)S`nV&Y_n*zb8;6al_d?=ZwS?RM%=sc@6G40htGVN(ssV8%{+%Ux}H;La2jIg9qh%JPP+!P-T zV?Ygs7w!u0^HY9@$`R|^Mdjm^(g%rhs>A>R4t(JB1Y(j@_Z1wd(W1BYO*l-qX4bZb zt7hSAlQWh$#)Qbjk6Y_Mn)oQED0JGb;|nTCPRF;Jc7g}Y}1AJ=FI{4jj@4bQE z%g;R*^80$q6g%jsqe6YoZQouUb#ZvnlKN3rR-S0K;ZF@60|>Z&@uipSg0s&K3yxW; zBl!b-Raje~k15Pm-hfv4z=8w+pMLqpmP+%D*1DSNHC4d5bJwmmsDFRkT4!@o59-Pe zz&1+vyUIRK3z|X#!qkC$-+uR98!~jL9owdjZK*e^Yt^h7(qL`_@5#49g$lNnegJe9 z1)!uwx@QqWJ^*VpJ>(U;|BeIF1W#9A(pswUVQP;DRT5qVY^LkS*`?CAX$o<|MstDM zmvrAq{@5hHr!e^J#5}m@==<1*uAYDQ~+-&uG0Qe;3 z-Bmx*1F9G3S3zaFLh?39{_l&{A@bwvgt5Sg3IE0c&kAX)6&J7?eK67w%atu1Ub>BNx2e*`{`T8~@Z#Z%(yldWvag-fiN1T<1#LCGY`rh8BTld?amm;Br%3fcZ=SEhq(GJ!| zV0+(vYFooSb`t28Nry}>B;NrDU)AYI+i~aWS_teR(EVaC1!&f!PBuFe+WuxucaXjH z7J7Mp3#(G4yfm660w4Di7^j}t!?M2Q1Xld;V<6*O0VB~X5sVy!S1TF1%W`luuKu-aPGv9p3U7=O&0(B^i( zeYj1S@VyOt;RDI^g?93Z2L!X9_r`w{7N+EP<~a{p(cA}M(3CI0+pJ5kir)9bp05$7euCuofw0ha^ zP9%VQLJ!mAfI0!oJaG5Pw$~oD?D8ugw~m({6vhTjmi9j2MmzJ2=2o*-l~Df3@Iw_h z7?&6&3${4x3_t@o(WrKl=J)lHBLk>K6TJ5xd)O`4UvGOhZEDBq+}}x)Cu{Y$AOPz( z1m+%4{5I0$@&&Hm(kMSaVnjHo{hZTJx1*0d(nh}WinjOO4j}uPVZ-bOX?_8oO9Uiw zm`yMs9^SgOef;K|0VEH4>ZuU+=)i$iOJ*G}zWlO1^w?vzWa(0UpkR0FtfTm9=<}qn zjT>h@bO8KxnVMX9?zwi>X{QD7&B+k61!}KWx$DRT<&yKy51keOIZ+zifkTGacatUs zFpMb&r$~%^_E|fkT|3)fi-xz}dB@%pz#k*}gZlLgAo{A#o$Uu{;cvY9YHO?d9;3Rw zG#FNE`dy$OAopJVZc)1Tb)BKKbJeD$1XxBX?#1$d zS^iVykJdVjtO_5a`x6vaTl7!Y^R)`^t>;5^<#@ZXO5aV-J#@dF?g8HK>-xN|xXnR5 zw@y0-cDlR(*x}rk_O2%8J$A1Z%pm}-Xra+2H*Hc^i|^uL3pv>5s;^d;rgnn1xcRE# z{<5vyZ{MB5i-PxQQY~Muw8rHhtyZnAwWVCeR!Z}QJ!yHJq59dRAHoZCS9Uzyc9r%I z0K@ig3u%83KCq#b5nBW#zgRC90>qzv?j!4c$0@QOtsl%Q(Bkq!;uZo1ApUS9s^ZR{ zzeFG6+D;m`1MKmEZ&{1xyGU73-d12E4b0crgu_<5fwsn}2iw!U%r`~b%K)YZ^|sA^ z0Z~U{%9fLDd$!8UlqnfB??UQfu~Ds>6ejwlFW?&hC0Ug+V?_X8a%7ns{BZU#uLzvrW*d^8r0t|Y`+7Xnl;-w@R##u<8d*tr@;Rq&r6o-=v+|-OvCHK zYHMuNnTpDlmwAND8TQz%W>`?}AaGZvOlbkwS)nYCJ^p5p{bEXc;tBhQ#Ularb^%l; zPMp|XeQAMY6Tr)k1Bo!EcAU)$NxbezUQ!eG$r1s$~5jgUBHcdR6seVb!YTq!nIhg^Cxk z!m`CKQKERzc2AiyIe=~ABIh{3_mPM1rh5FYuUer1tYC#pl@9ss+OUQdm$^rgrGT|s3P)g+(|G`w7`u!l)znHbs zOO<7{a8cqAe{=em;Ltj#G1>vNmAJaH2?kiM&?Ju56)o&Z0J^u{3Yysa1s1RA*wLOH zFu>aD)1Z?Dyazw?j187Hd6>)#y34%b0)>Aju#GnNIhh%pf7V&{!5eQ_S81_-kT$u6 zKr3MSm{U%%Qv|55zTpP@TdltLo_pHK#~&Zcaj9s}oj>267Vv)Lfd_1a=wp{XN`UkG z>C;2n&R1S(;{>pK3$#v{I5C)105AcuoOyY+fIOODfq>94sZ$Y|SX5MyOV&9a9c zebiP+bNzwLNG`qTB0E~2P@VSu_cltCo06{SUa4I{x*nl$z$|7QedKqv?jM!km3lrzi&3=1lO(%GD%}9Z?g8EX&sJ=>0Mvsci9j~e~CY$$gO6EvV?h2mkd zfsHaJSL`6bj>h}F&o+u7G&&$1~~ezk>j=7*C)!11&rW#Xkw&f3Opxn(KaXTQ4QTluh1D6JQ>;9Wtt zd4UShMoNr@3+75adX5MtNc01M%+E3-K<4+^dne1%NgUYfvlC#FmEUCAP(na-C)v&8 zu9toN-~kufS?!w#puN4~<5s9$SwsOOt5zv1yz!^CKH~Q9A|J9+M77EUdX-a`aw2LK>nZu>)C6g zJFCC_VMCsNH^?V153(rZr9;d$F!}gu@(i*GGRZp)ha7o(IQ<4c-hWVnu=6qErHQs% zqZ(GS^cJB%F}$+aqkQyT+}2x{30K}NnEL%pTOp+;r^!$*>dZ@%f9b~p6Y~>yEC12y zHR2;Dk0AGlAKJ(sf4GBn?|Oo5zui_jyI>xFbGfb)4K&Q7xfqym*yn~(SoaJlm>{49 zMN19HzFBtBjr93XOa#u6*~J^uFk@P2~^J$=*8hTUz+KwF1yV3lIEB%BH=VC z2Xh1fGFn?~d3kAZ@8-?zC23Z7tXVU}<3&JB4({yU-KGhwPWt@wV1n_pOd-%}UvSPj z)>s;HOgbh>YmBMIXNq&%Ll1@Ylchx_J(_enEsp=x!yV7moog8ZZt9LH%9WR1YJBQ+ zxWGS}_r?PD<#dMjK!I5t0JW#gFLqV_m`~uQ3Md0;SvV9^9@vxPFxvpUo-IHP|5~+Z zVY}9^ANa=$fS9asHaD)_(MN}T&OG&0`%0!IFA1!}8yqGZWz`OqRNt+XhBm=0UohoqMQ<`~9Sa9qF)KPx>h=;dGBaJDJ^CLuv|NR#naIxb$S$$%1q!9FT z1Oips76R0t>53_ZE~}gX^E-Otx0+M@Pv!9`;3MJ?@dcvsbkt9A0p0wf?i;23CgQ<- zw;HiX*d}|suKEa*{_c&kZ1hXl+Jk+@2pkXBcu`nd(29ngaRY%%j)}uv+VSylTExjG z?klZxouE0o;kvfAbHgh&Xlo`1<; zf#5%F+iK-(@Dms5T0y4;>~1HY{($VHFVIVkC)hQepSG&^zG5|MRJ77tNV6-gFfaGD zI;6YoN*}kHS(WUmK^JQrTPB6U9|5@E*Sozn-v36uh}gjPlNkhH87(6kz-%WBOXz@yG3}m&PmEJ$IgF&02K}VF$NrV0ZOAHE6q+FGpLP5I5R@QwMNpC{b(x z92)JqeRz@Urmin*Y_4X#dYmkpTUoc8kF`T(OS?sxvesait%F9B7t1ggX|L_~Ap)soi`50qUC`7>jo2q16tfH`~5ZoyXEYXj!)Qm z=d`f1&unSGX>o^ZbKJc$H)v&Dx(*AbK{ab`t(OVw*@c%rW@ntZkU$^J6?8(jUMw^Sgf%y z94{MWV8VIlw6w$8^s+8D93z^a*{+f`G{$J4`#x}vVLG%=lbeDTxJC1N!oxZ;Qe!hO z`F^aEFLv4WD#>9x*&_d>(=f){qy5ga-IU*1XEd`t_UUSO^=fCGuKGWFX8~YU(Z%sY zcXtX%2q+=aNF!o*D`IySCbnW=cl+552BN4a2B2V~ASFsjcgOeto%?3@?qe5rmsL>T zz}q`_;>^ssb7%f@=FGYOv&$~tSG&!nY}E>>jQT==Pp_{}d-oZ?M~$BBAi28E7o2tO z)4uq9`L(Z|7CSy120Z@6hi$QTUmlcMNgOmPitceIKBNUiO>Yl*kve1XW{lKSF28ht zmz*bHk>}gq{xC7-wPRx4YM1=#F-S2vSCJI9Vg33J0J}-;fCq?~w$1?`aHGy zi3c9Ao?2ME^2QrpCgpmYec;dlqIR(`sU<5Sz5r5ts5^@Zub=A0v(j7W13-s(z(Ev!}xH4mew1Eb3xR8%@_`^MMYK$lj0b=RThR6n+(>q{ql*6fA$_`@eT z{U(iT`t~>$3n-7aApK*znnP7c7};898^1}D8m^B_x|2@m?r{M9dICB~6-kGFDPVcM zR9X%?pslOCte09!JL$!?(DpW_@37+W;JqjM_>GheO9k+j_5hStNJ>{jsvit}@NaKf z^7wT4)h=-+?T_Pbbz8X{(!`Pi>8P`hmCl*epX_iTc>qezicJO`0wbAn~rJaID9ym$T=?O0Ry?0PwYu$QB zSI2q#&5PXP1at7tQso%-?qzsE3z zb0a<*?~+?A$XqD<fGvwctZzV{GYTQTY}t|y++8I_eW!f+l6K>D zNBE-j`|qb~&aWqnFulCZNVW%Db+C4k8u<>(dqXbK;;x?8>0Q-tN2y-fTAi`dJ1~6c z<^xb?KnnZWmtWe2Qn%6u1F&&R1k5>Xh&xVc z0rS^L8r@Op0p)v1^w3P;J9KcBkUo3t;q?P#HLhORuxE(N_+AZKTPxABp>KI)Dj?Z`HiHtDWqw`kbb6Cr#D?97(B>o+FXwupr3Gl^X^Er}uZItA-hz=m?!z}{cY#Rd>*p8zv z&;yJ^1Jh&qqzvUUv%e1@Ayng(db?ym+f2j*-mhjyS| zf{F-n>s8(w0b}%^QR9FvbwsC|VT(MNFe@xDJYIU;KmRh*+f-Rn=XI!Ns7M7)PJs{pqQCu;YU&5&ehV ziC!#PRUZDH^2_7zD}5}qksX@@_iy9v09a$|e2vtLD4WIF(MRs?sujg$!DFq$SV;EK zE)eQbyvOMB*U;|FYUL@UzTQ=f>}9g(!N*xnJGqDKX15T(qJ=RuF>85X%{Jn}TGdrM z>uM8qL`CyR>57L1ZBOkEwQt){xFwR@bKZhFZ_h3}eJiK+&l3Qh8QTK5I$WR>rgI<= zo!cTvPX!`5podfw&{k8D>eHo`F-tnXw+lcw5rD%=#H9k(bp*Pb%aTTWfmrm4k+4FW zG68@{qM^@0yz7-7o#>LHJ4L$9hX}Z%!hrdk9Lq&uGi6;w8BJJL>Ze0iAO{7PB z_rQVHLv(sb+Dm%C_e24HEN|@Gq=`#;FO)uUlg5o57$d1gr}-R#eCh$nM_(DBd3FE( zelQRKPWjY#qh6-^0_U{x7y;ihO4myZhy5ir2h;`^76eFqSwNg6sdrNWd@ObxCTVn2 zl|M()@v8;?Ysy*&eC;pOdG!U}0lysdt6Qgz>o8M3pIblwj5F*$siN#J;Ld?b95hh< z7^y`JCjS85w5Oi(4ib$c`}LEwXeTfClJm}stbZsUFB2}ULvH6Uj#u{I|0f!;F#(Y7 zctl8qdC&POg%su@({;KA7ak*BG}#eHcrE?V-{DY0NKYpSz&M^a#4FnKa>a%4tkOoQ zQhzt$z^1QPoQ3Jh!=xL5Stj9VB4&baE4|IC*Ob-xtB<7Uz#WU=FwPLqWQ!vY5?>~H ze$eEXPBSVSAi+c*@YfCw0HqH34`+ z{&*VyFpDBWUO@b+bpU{<9n?F@7fH3(3M>QOQA@#^$y%wB1iew}A1^OzQ&cBF(YnNe zHOdD-I6vT@@`bcs*!KD-Jiv$}+d(a(z7?-XR(yo#>T0%9I?ANsex-IEZ~)CR0+hGj zc)0qxc4O7f2;k|-C>{PtctoC+3XA5mK#RTt(5A28_dcL<@UysEsXjxQAsuDviA!n` zy%1g(rSb4Ylh&&;SY;LK77LC3VA4-`jH0dGHoZTm!04V zX?TZu@9@)()k+6HkUqQFJPG!AXNcz)%7cf|yTn0Q9n#bRT(7qZq3Tzhe`~z1D|Qn@8T(@{{X!_8?1IV*!)fn=iQ%(I? zEMN|haN@l#N=rL1&4(%qb;leZ3miUt1CIgNQ`JW504PUa8ot6S^1{DRH*Z`H|B#RMWT>vCOx*AG`(;Wz18OyMW%%Ih5mzPfeRLL=D)+Koly8AV<#8t>^^ zLqEX!H2rWPU38cJs4}A&()`=6&SQ;deRb&hu~%MsrC_^u?KWzB((3`cw(NL!d8Zai zwd~sKZnfQ7VrNP=Q#a z9f^w7PPW%yf5Y0gZ7o&5l|C13i_Srv=%4&JC4L z@xUDb!azH@UGY50ahctdp0{aB?_O4PvkK3wtmH7-fJ-hryLC#Yhs|c@+ptJZj?a>3 z)FF{Lt2D{9w)H*rWZ^Ss&N933lEU&AHS(V3c7}J?_`9Uj{qSJfXmw zJZUozn*#X(@@fiH;s(m^laP;rkOPD0T{9A*#y~n61;FO(fY9Oa9Jl-T!z)U$f^snJbGfCO03-y2>Eu^MF z-MOdUfL7`YAg4Y!)I(77fG%lq-p=aPy$#%xpL{q}Q+Coqgtl-{5;`161OU6!ec&y1 zL<0tP*{i4nkNvi26tOkqd7n#s8!?yE-qWPV!yd#&3=0f$^E4kH= zJkY{y9i2WbRsfOE=BK?t{|JjNCOc>D5XHo$<%!_bCC&lfD(i&vMlQz(j=7^g0sw*Rr-)|bMf)G;1AbCe)<$+^&IKJ;^f_~ z9P^<5=g7s|fS*s-uU{Vlq^#zpc%JMO7Ny@Zv$CR_Re1Kw&b-|0)+xCRz#}ee-egf; zj8Im2V@b9PFJoqeY@)Ffyp>lj5}iiWGUwQqN}_g~ae>JIKY&}f=Oso;j71G3ybNF~ z6F@JdA#8>6aUXurz=bpbL>%B5n#6BRgoQlB18S*5Xk?)4aVp32>t>~ZB93(A5A^Z# zVy}}vah$HFRUD4AVQ?Z%aB&)hk;co>HPBk6yrE1UFaSKn1t1;n1MTE+XnQ*oeCEl} zu8=9vj8O^db=^~~ zasaLCo(h_&u;1hd?6P>fO!s@pn@@3{>zN{3)pT z^_L$IPY3!}KX$cOP0X3&ePdUyMf1k?^wZbsBOyBA)1b0!5$aLuz0`}DGlI_IoaUhj z9!+lY<*<5b$^Y*1C^&RK+WB{v|M!)rchK@n8n=AeYQy@144X;HtAnQ6-p@@Rg>!lB zcBrin{XF`bthFq)3YAORdZ{Et^~-rlv^V88};849+Y;DxmZ>jvP6!xk7b@W>% zpbL0CUq9455I@}|(7aMW?M9_*uk?KscD8;W>7Eawd?%2M{pLNC<~8{zDXfsD$=X8BcSL%d4=-ZX|n?(GkFTE1|8=cylqh^Vp zzQ{$TsYj1)Ht62x?Y#4!unW)M&p)t0e9EObkW&uO3pwEV$)^)+z;(~t&9dH9t5)qa zK~YZW)Q>$gTURwMx1kMaY&C+Rtj(zTg>Efja4 zq{$=YpCy`KOIqDr>5x1x7QKrJ*RP7=rYY?~3ZJgaUndUOTLEqc)k!8&mY1K<<+X~TW|8mAHHhWL<&YbZN8 zeRk7sDPNp^@W-$5{Bb|J-d}z>NkPl()?06}z4qGM&%&^qn43Ntr=1sm@W2jIOMLq2 zr>t+^TblGR2dofPS+T7r^nK0?h{qMDw}t+jTuc_s1!IiGFchq1%6- zQ=4GbjQLsz)t8z+)|YZA4&;ghI*YBv;vPCE+s5kDsq5gGF_r$d zwax)_Vrb{GMT#U~Ml7*tsU26TvOV~*;);g8{U&R4B9@1y5 zeB7>2tgo5cm=Iuh4x51xN4s#*N>}f4Y8+ z^_#2TUiyvI59j$KufO8taiFX#Dk82!ExMSJz#w=&Nug&+N{Xt;{<{BC{yh~}SrhUU zmAjk5pcx)t75T9Sa*pD@m;X`yYUl@mrW_u1$|Z3i4D{leTjan}f;8P72u0?%qT?}v z$?-uv?uRV*xR5rw%lJ2>3F)%B4>aOs#M1_`s^Azknjx21ff3F$-H_@A=pd0dpE8&r&-$V!W z=FeXs`^Lrm{85PA9w&Y2*HI&o$5r@$oD1!DUuO_c!A@Sea^+RTHyy_JJ}|M8@2)&AlFwclvK zm?J-u;VJrcN%)HiP(LUj)>iTFDhwd}y8!LA^5c*;^9v4tkRGS4W0VJ-=%Ynv7v()z z_vdTEyH_;#QFu}LFV}UZepuU}PW}ibt*))|2kD;4u(ZdOzjzNtSc4&;^tJ$mkE2OZekx_0gArgDAk^c7cb zDMtAmK_nYQO4+*s6S7JjwL&`YKkT%3|4e{}?z?*njvOhUZxDQv- z+}=|OhYrTz7VT-V&l>)EB{4V-K7(mv6uCC-~s{KR1 z;3g(K#K{6=hWv#6D!?41$s~p5!o-hz(&!_dYf&NL7hEVS-2c~laE)XjPwa?q|ef5Az1?gf{- zRf5Kio4DyzEpD?<>@P@(P;mVCpBy|t`{cQH=)tWdkw&fKFDNWU^54$^^&7r0+Oxa9 z9$mY#U2yTGw#zQN=peSfA0hy~wQdstO+WR)c{7wrqZ2|lSK#@%MGO2(3x^$Yh_!Fs zIg}81UMeci0q;waIxJeGExS)Xv8P9lwAKX+S+63+thgf6bO+*@QvS?1z|03b z`Gr|9NO*ar@yG9V>n@BU@jOH%(+jkr6^01%#>*og_wjNq-@Tg) zK+7J-vK0=hwyZJ1nkqlAF(a#nESGM_y0>T?Do~( zjq5f_<*ktIwP!PX^zkb8%{Sj#lO|1b|2ShgHv!PGxGcT-#GegCi`eLe^Bg?C|Hd1( zYl{}X4a7^3aw!hvlmn~=PdMfn8}jbEcKQVuST%iOy_LX1ehsL+j$7&e3!O5siMGc5 zu#WpU4?;X~Av}a-cE7neXoPtDxHygACp@ck#Qjs8w?SLY{ZwI8V&2ykX?r*X36Q4E z0bI+QI|r!9FKb6diWJtCqX_C5Ib^t*AbJ5q)ZU^Su7so`u+^^Sfz-TXwki=)U``nRM%mE?u4`&fJOyL^H-#5J+WBaUh8Uy>x%1q{OJVyrAnx3BB&s zN$IxgmW~T>&Nz7ynsEjop7luv0fxd@er5$ZDBW z!quo=-PJbu>~mgsTrVK?=Rd=N75Yqi*)nCUS2ulmO#nK-4!GD7eGeoT{au4FdcnBV zsxIO~>Tlk1zz0B$c@0JO8chb5N-8}<*H5&Y!XZlzRQ@d*NItde9pM00@)*p{PF_wL zOnQ{V=W*kXGAOH{&M%N={d$0VJVn-ifCBXRWdwB@^Mo?91FkaW%)2|(Y6{TySmUS< zZO^Tv{e0krXNSb~Z*#FW{B31sqagb8mR!_l^ehU5P8MB5KTLiPwnQ(hc=|H5=-25J zQ3S+z$EUEFluw@vRCb_Q&CQEc~MTF zmmOMvR~tk7{%zNMdUi}uMT!)OnwE=EBk_u?T()k*Q3YjMO=DaI5yJvSczga1wuP>q zo3gT-H@oR_Q-_@9`8(?Jca)Lcc2k#%iNqi$e(Z<$);Q5yefWx^MT>r@9XZSif`|%a zXZ%pQY`TnHnLEJcq)D^w<=4KlsZ;;7;w6e&tCn@8OWMjRlrO1m%e6|CF<$_rK5o&X zgd;pTEW{NlQqX43TxgFz@sZ7(wZJ9gT{}0i{rBBX=Anw%go!hK!f(>JhHsUId|Y{* z;R8c-7+1L#D^}RXd_CE|`07_X`GoHJKu`VzXaJl<`2gha4gFSe1+7Q-=);<^q2ALm z!O)EKaw5rns6%>qdim*b6r}K&BkdcM${H2F_EO5HTvkuRVOrbpd0Ow`PR@%=KW?GY-YDhmf`l@JJ zU6h8tHg(z@>3^@WCXH*#icvKiX7v+@a}rMS)2mw5O_Jr*xnVc&i` z&3^u6hBa+c(^@pIBh!b)qdF-a)=_Yw{?s8j_o_&C6>!9{Fql7onfR7xWpsPP1Y>)0#AQ%o{2KsXZqWJ>k zUnEWpqgwQ?a3GAyXz%@Rvs$&v%id{gD^j?S-F@$S_RYAdHsGp5tWxDN%yiLUC{Un5 zN}mar@I&Jw`ST-TW0ulHwpyS7pjx1i!osYk>v~P%%a*OSLHE34BR>1ZPCuoW?Da0U zWBWa5&pdIO9eZ?VyK=xQ0+bzX7lHQz>sMQ00gK=^DF5m;>olh3w?fkE)~xFFFqJi9 z<^ntaqG#>IEFBbrR$UOo}dlYF*T3k>Il76CqCD2n#36)ol!3W46>A>UfRQy;Sd zS03OChL1n_(fXbIkiGK!c~-M#c~6^9^x@@3mA6`EUW-VV*TX0eQYv$;>H%m#@?1db zkmbsiRQ|PIowRy;TCM&?gSxTM&{7O4qP@Y};x~EnCoyv739Z}{*-|a&j(|D<^2@J& zX?;(8NT9BUb?wsF`{BKV`l=u9?x2)(q%R;Iuh+9!yOwos)Xn{wKnFhR8PmrKs~@s} z%CF}Kzv(MHuTMVt$$IZ|t1N=Fu@dSZ^!L|aKHm;Jw1W*FJX&TZr`yFB?&p1_klvXB zyh|#VzQZ%d`7>1<^`NY!%T`&(E;rgQKiq7MwD=;Pvezh{y!6o_?|kC`y4fx}MEy#2 z32pLztorkw01T4pqU(X=APlOW|oX07gw*+Pr_uKU8HtWwnt#-|tUJhSIBpzVx z(sKDj2MM&}4<(ctR!no|&vy`APO1e?i^7xYNE`XlzKN42Sq**GoOZ4eh=yKf9ttN4F%s^YHM!(m$om}tZmEz zz3-2x3McCqz%w?uhv@gQ-o4?=mMxoAqC^QkseYz@J`QlrOUHZ9M73hY8hvo$E2~qt zqCNJ|DOR^$6$hZ*yEV0jO)r!QyvCAZ)sVDqjuq6TIDh_9+fiv+wW_D_qJaH0{tx@% z$LT%^SFcu1pHXgNlPAx%@scERcj?8{du<@DONt}i-;?R`mt zSrjmyx7xLy)!(s71f-OoIp*^(C)m+Pw6hB@+D`!m?ZEw7Tc3SzwI%xS6XWeCBgVUA z9zfHyNiA#9qKCIH*QrxUCLk*~ zzX0FgegB)l;UcSBx3V>;U(KKSEz)56Su>TjeEAytMN;e?)kn*z zPf-rLLr98wS9adHmX*{(lYaZB%Kt^->yZlab)aXh6{xxh^ z&EwJ+wAt=3X$cdXc~&EO7bU8K)&KKsH8cInku+fEG{SYv&jbJyn0?MNAK z2T0>cOQ+z60m$i^2_$zOD~D>%k{Frt#0I1hPx_5WlfLYQ(4-n6NXh$>&Mv{4Gl8!La zk%qd2G|n5vF}Md>u!3~l^U2d8@4aVjTD8)aVgq%&HBJv2p(z@|ss|_|X2E z3(kzTLVw)Q>;-0pll|C~OOh`;A1 zs_NCP>h1ir@dUf>>O<_NTi&!^1jdg)wzEC^+(@fjxwH+s?Kpex#gTT=rO(@Gr}VIg z9{E^wHrP+&2HKYb?I)f3sNHt+kq(sKd3T)Mdec!>rAis+2cWojujY1izX!zM{JtP) zBjEk+;7c47kNEUw>)!iDyZVX)ZQi^k0(cKQ@c3rj6mM@&sh-r<4#5)wBwv1dtyR|I z04eI|F_RrYYor(OKhhp~Y`6`$;T^l|l0EE}fkW)Ehffyhs%4#fT<_0wslfUrm%U`~ zy?u#qsjrh1b?aT2b+?|u0q-D!G_Nf+JJnLPxvvRV^JWabVfJ7EdUrP0eMJNly-Me3BM;_iz_cN?l&t2^L zYYuY|diHrwxuhGQdgAfjL~BQD-KwrjW}kaur1l9lTmS$-07*naRKItlKfhk{wa%9z z`IbX^>$A1`{3}`@Kk?*eve~_ZF9=vPkoJu?zqbAMZD|*rw~vicKcZhZZd^_8;!G_f zTDfF=;>210E=<$nt7H3y_QK1fwa`9M^;s{w$j_?RZE#hX1NLiWmtDNSOYf0tgS*(B z!hI(xdwHpXHI~ZB^hx(vQSo!ZoF!7_8gBo4exxr3D^)CQH(hsxgY{0`uGONpmOqbR4=KkR#7==?bTcRTCcr`+nwy!lJ)rt6RJ#qK@# zy(`tGAFXtmVpdflBG+vsw|@yvY2;n76=2?wtF9X$liVJHLG8* zo_+Z7$990e9QMKB!M1yc4&DI)*(-HOj&>B4j_(4M1K$AbOP4Lv09wIHh~}Jm^E`|) z7OFhJKVY9l0eSH+RUKBYT4m++eRr?3XctlV^gsTvt8cu~9=P*Pt6Qgz^DVTKw8e{~ zx3q0kOPmRR@1M{u0XzIsF2#Yo%s&0>r&djpo%ZeO+nocCv0VhlkfZ?+*|z2@peIOmqO7FBlck6I%>O>M zj*@ydZd~2&y{oTFq>*$_{B@RMRVRenUlkI>*@6)#QDjV_PRo1R;14*fO zbZJ~=O?W$LvfZO+Gl9ZtE^)i>!D059fXK+tC)oRMUut{o(Zc%d*+N2=6)sIfD%`Sl ze=qZt69Goip*pUC#gQ-}68aB+|8he*TS=1Kt8W-$vwu6&C0_L#pD!S=pKND0b^5zW zl3YsQ{I)ya5wQ5f-WvS14SC}tujgJWAD}h;_xbk1i=W%IS08MLAKKp9wyE!c6~5G{ zRY7w?B>3p9g~A&zop0|B9p|9t98Zge)RF-cGThRt?#j21iIErLOt0f{yYcxgH-juAsdN0J0PlB)p9<^v4CVAET{zz z04YJ%zG^h|X{7icfA*{0aLs{s_8GnHx*J~?4?nbX&gx^w^nJiydhTrPd^ELt?|XS9=bgQmFKiAz{4QI*=t;Xo>KQlP@`ml+^Jb~_tQNgqcHTLAS##~+ z94&Pv`aS*pjkm_wQ;(nOyAnv0_dDngPip>~wqam1qI_;n2&aPSMptd*@C~ zTsnQ;IeU8leQU_qcJy(NYGK>b2EYBaj|)TJ?r%f1+i}nR!(1Z%y`=Cg0^WG#0+(EO z>^i`j?OfXqKdgiL)CN~G0x-Y$zq6cwM;?2h#*y;&$o(hyd-dM?vVH?{N6+1vHZUwZW` zU$ESC>k#|uv+I1}+kW?J^#PQx?VL0B6n^9IWzPG1e314E=D{Ba(0NUmK@N~O?)&c@ zJiqhmtJb?m53Q`$*v^d`JMi0G(&4VV?`}W*^pk_bnX_iu%-OT;+|y6DE}c3#s6=vo z(;atMOXLRQbEZmxrfWJ!Rm@lMq}&CWUigj5>c=I)Z#z5eDXjTr?cEnQ|e-8xtx zcD2U0Vgk-Jd>gxc+xpgA`j@nziU4u3VukGYDbW`7$tU-;@|Bm0+boX<{DAb4MCB_|)ZTw*w6~~a@nWtr zvPvKk-AX0N2n^G)w8rIPu47$F*UK*4!^)H{?ovPq(SEk_4?p%{YrbAWKX?z2*wSBcyc6wO?_dWV(8h{sVTknqc`cBT6yrFwI$l!Z z?|=BsrNF2S;W!LirV?rdRjgvA^0rLRoPKtvb}mjowU_JazxeW(w&PCc+stYAd!J)* zRaVm3E>eB^Tq;WgZyzjN^M`gTc6Mp(2g84`dj}nFW%T@bmiOJ=PXe^1_STSbUglMo zA0R1rUH`;7&okrP96cA_Dc;$#l_dz1&U`;D)Y@s0hsx6~O>21HLoI0J7ZdEZJBHYB z>1`i&NJ|IE9Dcl7i{6UbN#VfnVbbMhF^qaf^=f78;YU7{%8Azf`3tDtzuV#PQcPuM zW0@rMd-vJZrSGU%u)yB;pxdTs=xP#K+pM2tKAER{zTqDu_a`{nWvoM679o}Ki)N`UaBA9eu+MR{)F1_k^u8ysh!a7Q%^X-E)t+`uf;~kcI{lU{y)VHy#9Lo z{DTjyW3OH=O-CX>^|#-=TqM#eP$mCFiN-t6#Y-6qv%PZc2HF+1xR55)#&M>PmB&U zKn^K&ap?#nA?@1h24lOqMe`l3u|PSyhqw*0lmVy#Jfnw+#A@(s7rHd}z4yPhXP^H} z=R?Zb=Th&OJ!g^alCQRXtcjk9dASZJ9(6rd-@BA}qx3Pq8a2^% zvC$z#ck`rvUF?LuU9}jQ=e+X+VWJ3a_h|huqwLRFi(IeR z55-CC09}6cozd@|`0JcRf5`81G5yjHVydzS?6;dsP1$*vqeWG-i$|$)`WD4oZ(2)XG)rzlouOF~f%q^*!E6J_Mo; zFPyQ~)rv|8*e{a=7u5>%{{gZ?-u})WdGG`+OdHuV&wZvH=XKuy(1FIGt2|vg;X5^| z;aChk|6`;s#e0SHnZw5DWV5Tm!M~@T9pQZv$$j01wXN6cRa$gRcZoF%QXD%rES5WV zXyko-xpoA!n(?y-8>DW9brg1e&b{zi0q{9mO!U)^&pcbXOgfe-Ymye#4v19;B<(B$ zSj6tPPfJO|+xvUhT?-(darp`*9oVNa$!oCf{`hE=cwTw>20@G$9f!(AaOnR60LzzU zH6GbPy!hO6UA>}%K;yvzeE@58c@Gz${YBE|X*w8)dw19{2h*pWc%pUd+*uENXAeg$ z0SW9imtSu0NsXd{)D=dJ8DmYP%JHS7$~6R7aR7I~B&rqU`AQOK4jcaV`|moG^06Hy zK;FA&PY2{bfBm&|lv=qI`A*p+zEU9eI!Szya08l?CqxF=xYHpbb=)Pc&T;E?*ID;2 zU7X%kmtN}9<4O8hNZ+H5aw&Z0#D{1O65wyE&!GdfQ8NLIcWm3%CCAj|n#(S;uO&^M zEg+9%oHF^5miD6tQcZ0{V$T6a91`$fwE$o-@VY=eivZFm*Ee4Glt0CR6bH7*0bY2} zTE-VYi)`Ut%_2Hi!3?j^WwJvz7ckbK$pv=p^{?7h175b~yItn`v%5?8FzCr%bm_Bp z+F6g=1(!T$y?X3o2Orc%QlljCu(tDM!>tctP>2fu{v19HtjG;-`>>ZIq05uZTLsy z^$FdY(hY59d+c?KT`6g5kKQ-=A#Fha^Dlnkp!~UK&aeXy8>E9?(|tmQIkXc{xkO;p zC6Bhw!2#niDj;mxGpR-gy;rzSai8AJB(?fM2P{X~`4|3AY8T%*_jiu$qyU45@Cj3r0vAe9Byl-8kk9_iJ zk616YW9IB7zDPJ)`O$BF=#gRe)H5UOj=SFV!<%|M4mgmI0%$O`c8H{axb|%ux)c>j z-$Y44kw%|&dM~Tj=wcgi-OJXi&&{%|Qqj&myN^Bm*vEF?149L#KeGGo|HP%1NXFq! zVybnT|MovD*bY3Pwbk08f<8t5l#Q3P_c!&;d$qV>C#CN(U3{_krw#+6?>_nG>3SZY z_<{$O1RTJ*n7*crbaspmY_d4Qflu7&t)4J(j)#}kyU@7VWj5;b@j5s--Bo8eh|9A= zAOCX!z9}*tIcoG|S*Gb>b?a32cjaU0QS&|kjCmh_6HpvF>|5)(=N+zRjBYl1(q~I8 zq0fE;g>&X`zXzSBa^&V!wTMmFn3@?T#(=#Re9I(2qv-jAyjH^!IdRo5zrz zMwSzhEhJTrU!;oAK|l~dDEp``MSl3nC+(R>9&vz)S^{ zZk5V@Qqtv8QsY2+4(JB7va&AMWpTuX( zK(DfmbQrN<@!)+YsJhWsE?e8gbGrYulY9ALDnK8TJrXRpVj-y-y2~6?LPB`=oqYvt z=J?EVkG8Ox3@b>2bjU$%CDbTqs{{hx(*eBpNMMZopf9%hqd6@k1jJ%6^OiObwt zLA^Rvq)U3LTRd2~a;;31-Qwl2J&b-P(!xfv)`9*wl1Zdv@QG_T>2Z!4d7WFsfcKP* zwF4|@U`656kFHL$xbf9z*SfV6fC@wIdTohwr41}z-jpR1R691Poh)+L-Uo19aNgc3 zr-=ioVeee#&yd4hpXneLy8;|w{OE&=ZAa}OIH=My`meaq-z$_aWjE`<8kS#9)q-&3 z=hN)U{(IWzBL?{M_)(JRof=iMS&~q<>wLX-7CPxLX&2vR`QY9DcC{9nM;-T&7AxJf z>(R%biCHnX`wTAufo)sY@&0nhz+?T~zQ^L3LItV(+ zo_O?Bso1<|XPooAbgK82%0~}BICxUOZf^0TPJ?r$!@j$H{pD4@!&6T{oA+sdNyGQq ztEHb0IP8#i-q+|SEJ(2kL#M&aA(mS3vx`z*?I#UL5|xhKr3$sXq|P_o{D$3r*9Ug) znca1mvAyGlLq!u^Y8J6by4$tcQGKU62Xz!I>|Ar@f&T7CeF}WOQ9Nki@7lA^ zeP(@6dRS^$75&}m)UmO4_6yjvPoA!`0@q1Bs-oK4)pfx!sd0>OZB)^i=Q?&Q0h@T=zu2+PIkK*)UPgG?@rc1 zmVKh}Aa}j}uXs!N{L{E@1q!z4RH%r_E`^I!HdheOjDv4eH7Gs0PzNsrgb&OaF>u$Nlj+4apl{emy-NXiV!m-Cnax&BQleG4J=}G_e^UrpY)Du1ykZ#qorRz{% zK45?!>f3KGDg2A>kCH}@ls@ull6X&)#f-87riUJPoOI-N_OIXVD>aHSsweuxCrHnE z-#&djeP`tb?4m+3?5(%_U?6n@z;cN2@@ucvi#p357&ORrnukf%1eFQYC(u8}I>%Ew zWC$>>BRy#r4u8y;;XJrZ2Oa0?;2`Q2_e;;YjevCDQ%`j(C4l+8qzdwp+SF9K<9!Y| zKrhCbZb@Vxf%@^1va`VGBz^M!QWNRXwW}R9LG51Fa^U_y0Ry(+uej_$2Q{?W+oj|g?Ld2T z{10F@pJ;hy6cX%9^K7Y$P?$nRK!6#G3c->A^&^e9Upzt=eU13ZxEI>Mhci$$z=W8$ z+xZjmERD99fa;2Gd#6_`+rCi#f`u!ra*b2$_1E99wr$(EU<+Z(ws6#mvguK`-gb`_ zDe#kBb@^ekz)-{&9?9=b)CPw3e42Z8@ZTl-I^3_t6?DFpngr(7CjC4}AhnRI7y#Cy z-3z3qOa0lPx`Vzu5?#!@q22^|#yZCeEu_kqFX159* zbCm|EH0IdQnMZPrDaM7`C0V#|nM-3)x!~aAf(6T6{elk%VZnpGg6=yDB;1lEtK9k+ zVZrnqdi|J8T)j$Zwb-NYurMVYFg|~Q3=C*d$Swz}6pR&sd(@K-l_dH{={Wc3eVcv% z^>wz3RInCF@=V!9#3L+SfKkHu0*`qwahS4%9@r17G|}_GTG$3HDi-@az`mHkJf{C> zAB$zu@nfM&8{ju;GQ_i+1TT0#i*;@Q{-8QWTPPbl)hw(5((r(E@I1LMcm+4}2U?5; zbLK3Q)saVSr=|zmi6S~)kU5HQNHVZ*FnzkU{%KyRiBn~%~^k-_m2L>;`4t3{yB zaFIZC6gkmKmX&unNzk^MrzvvjBBHiEL1uCzTwG0m9RglyeyF3Z$OWO zhM3m_&>wTsNuCcqXDn!-UyPLuEPLD_Q+$B*;X{V_C(P05#xe#fCMojrs{v^T9d{iJmeJ{?WmZ4y!_5U)mJhZL;!#)sCIi zu69!Kpgl*)3}Aan&#B|IY116cQ)d<_$4Liz;0-s}&00V-5+LW(*ht0ut9>b#;y{W6 ze?JEp5C2LR#>I6jGOiUhoH)+I{_#0y^>R?QW|<_^nphpMDBdN#(b+YxB9f!E8~7NB zu%sq0X!FH2Xc0%=b(#RX0)RedGYtJ?Vs7H zp}!+EH14vfR>Z@|Vg)7;x#wdWJR1NSi;aV&=7D|a3Ic{}q+1J^_1>c*knZwq2;(`h zXkizDdw!e?;P4=RXac}$$r=mg(8qXQ;knePAH)){P2s(vPm-Vhz#(4BV0XE6DcP1TLm!Ha0RYwk_VBN=zKlt`hy!pI)Iy8} z!7I`i$I1(~sQ>rWN#5^QYtcX)3rH3gEJAS9BV4I3_tdX)e$_!`Ks(?QK5LJCZ5&{l zovxB4#XEsu+J=jCs`G2d2z4lp9SR5RV{;lmykc=fd;R@Qj|M!2;4qrUBbn;ot)( zbh>+$4qa-(u#=3$8tWE-^WSCuje1>p_SvqhjC#dxl46&Yo;Ky7S^|yZrS{QU;Y>Vq zB-#jwu2-jy-7WxqtfaeZR4;U`ky!IdYWxpMGX32TKR6xAM@JhAB%~!jha5?R^$mdZ zS&~4b&pcWZX3FGHBvNXm(A1Z*uh9bJP_-3_ExOTI1i@Meyq+?3s_mk*ZPiXxVkm<{ zh5&ffJW?*jffNV+IUMk_B>BQ&x~%KXc$Ap?G9+U1;eZboFPQi=eE1j^5@nVTkQ%4O zq#Rsk=`)Lq=MVAW3XO~|y}YdGBZ&&md6Kw^r_bPz(00h;SK5v(Uk*<>BUBG~!o(hL zV}?vgH=9eBSzNqMfmCu>{66jv>A7Y`J071?e>yjFn)9zsAG*et01te^0l;{!+#)dr z;9<`0wp)%CRw!tzwb%>ub*MQD80bR*I)K=8P#l5e03P8xePs3ONT@|Qp={_;K8`S_ z>vf61IpO4wfMKM&8_|pMkq3Iz85gI^dmF-_8~k7d{ZC690pCC;ofotT8dxCV6WmxJ zIqj6PZXv_#AYEz>2d~n>#pE`5Vfy3sQG2K#A65@1q`^P^4FRbIa*efl%uEJ1GWx=7SpX~@$f|rKy0pj3QyBnWUOrSd&|mJV!;64We$d6? z$JX>-iNlJtk+MTO0KI!j%>p`vW32;w(d4IG%+GOnFwmt;>^grebrS4N(cxJ;y^T)MI72zf1^48uJRWYu*zmNcux{jvFBjk z<1k+B+7&ck2GE<4n&*kpCx3iyjQdHJTt+PGCi&9ql3r$V{wPhx_&Ci_W(bSdC+^QI zU3&RZZU8d6C%(N@K$s(Q8NFtD2zd$Fx0FJU`Y=07&sD8fYERdkOb&L8}8GtG+N5%v=l}uYeYM=JAh$;F92QyJRf$f_WT0Z=ZAz3y8ObyWgBEnjALt@Y4{;&P1GeKo z|Gg<~JAN3cs%Qn{)BB8T`tWR&=7?fez_#q0D%`C?@eYkuS6Ocv#$@oEu*E{3a?78lk=TGj%y_uhMG+!yOkEV$20&zW&X_ zib~xf%r8-@ZSxmC;ffY5Xj3NX!(&o)C|9nS13t7HbK>;sqzSMB-JIml%e3%3(X_lI zn{8T*0f1(Jbi|7YG-oz8WSi(_5^n4ECRdFG8RtWmEn8y~Cd{>_yP!dkoGN$sTcN^{ zUW0UB=9LJ*EnG>(3yUfQDjWEjERr4R<9UeR+a!;8mGLgX@gO50=2Q*}yl zAa6Oqd&`2obm=nIqk9)S?6CV~*Y!(%<*cP2ddl0c21Z8=v^HgjHq0tKaR)W+_<>kd2UpbmD#p{=dB^oP;^O}P{Ya>@aKa(*4k zT)uR*zLNNj3_AQ~*WcJY&lZfiQ{kXi1$Ek3j!qu{-zG00V3V}CEc_XOb39FyE6RsI z(7_*17xxo~3t?PwA#VsLEcnAUgmFzyALxX*&E+9Ya3Ni|hH$R&u(&^#W{bRurFAcK zaH0OuUHaeTa+2>!8EAxD&`M4h?vvAQDG%|o`g<~n+f665L?@~5Ix90(ks&mf#wEb9)B zKQ+Sk-e-U7+xHlKu%&c{UCWSuTU<9vC%0L%<~Cr!0PB0g0NKwzOy`MeT1gJhWi{Vy zi;AYo-0nHR2uYV&vShhzbWgCG2fm|)*JBE@ABc+dgXMdxFfx8o{*e^XU5EhgUI50?4X(xpq; z;2|Sz@X%kaa6!x)N{@quV@jx!DgRP|n{t4zvT99XonI?u4?p~%?Y?{0tOdTCX5V5+ zj#W6Q5Xu&1mn^e`D^{|*@4w$F=x|-1J@#-b8e1$el_14|OgMo4I%fUuk-hBiWjp)i zij}SKid9>*OP&d-R8Wco{~8VeDp2L%z;x55JL@yhO*Y%MIJO7?o3P*~Gg6r#z|P>0 zr3-XIzHm?e5QaaQHetAsKBUc1P9jr?i*juGmpr(5T`4>{U#LU4M!BND$>j!G#KzMn zib|s$?nxIfFP?|E;6nP4Ho4r*)jN$wf=IlMAufImbqLoCaS9CiGt@zeLfuGDT)uo* ztk}K|mWTdcT2k>t4mnhPzNvlp-FLEYywJ_OrgmQ9Pdnw$ngfxZH)Ch@8r5xA8J0j* zi5)${=x2H1atxqDp#Yx7`mXx^Wy{&sH{ImF9c8+Wfj)!kLCBE0rZ|uZ2N)0w>!8&5 z?|(>(J+?w6t0`NxS}LZ6r93GP{8u>;By)_bTO9Z`F=PZ#e1j|;8VV39I@lfYGu@vS zD;nu4r%`A+4RS?cUN85Coas-9^pOj3>E!@jqdG<^Em?!2h(>yRdcO3Ms14~K>!gC{Lt4%!Qg;ymYI)y9qKmZUNiunli`)?kRm zGI2XXR;a!h@sa&B_A@J9x`OH(`qDP6V5;bU9tSjTj%~J^b?U0Gq$bQI=M{){0G*p| zNuDBlfp=ZA-Wpe}ZZmbV_YZxtI~oH1c|16hEC6{(U_9Qf-v5P_&|c+Mg|o+sU(u`TK0=@g-v&c7%;^K>CkZrYo5o+wUJe_ZD;?;xGSuNWYPINMadrCAMT(^q{nMC}@?@I> zNW8R_xNgy6TPu@>g>|2DDGsDKuqg+&H_)?b4O1a04&8!bxr3gz-TE9N zD+-apg4|P0<@~R5fTbq(*LK-`58I(ZW4rj`3$1zc7S^y~gFMlc$h8VbK7r?TS}l%Q zzSQ1b8hza3zxt3;?am_(ES1gerHk!wsRcFCSBnY(to;SZBl;;aDGsDKkm5j!1KS-3 zkUj&RQB(S2y-X;o;;WT91*te=FXjK zk3991J^suyc0&1zR(F-G4gBXgk!o;?11S!qIPl-)z?zlIt!jg&R=8MkTOU47w!N@J zU<_UR&ALqhs932oR<~t)Tc-ut7N21@ zOUp5UhBbWVVsYsb_U6nPcELI4*l8!8XywY5^-oG?v)oj&6bCYJ00{&ij_H5lh4#fa z-`KF9ezJb$Dq4}%Yy8WRTNtu3&`RB;IFRB%iUTPQ{4+U_FYzHUul?o*e$5%+k+}2Z zTLQT84B7D~m!tbMRjNc>+CB7=>zqY>T$Vpp7h zz8!PYNoFNW@U8aDsHVbF9Qa3ZAWSy@s7j|Qo8rK>;6Ru&wp6wbh_Q3Yr^z*W`5{BB zE6B6?xok^xljAin@`c2x96lZ=AeJZxu{)WJ_w9x~JknhK{Z4&?zvH|lGa8>qV+ zc#!lNzl60IDO(JRdL>%+?5um8K$HM`DX_HNq(*ai^ ze%_2}HsyzJM0ca@(73r(s=0#$Ra67`dSU?`baWsMO@4AtH!-)Rm8bChn%7pZSZ;s* zHrcAysc(gg7K;FRsEg-Tezk9dK=AJqf3hjxe{JQf)wFs$?`kE>miKxunLpPS&7E!4 z>Na%1Oq;34vc(I;m*1>L{hh2(;UeiDxJ#m+R;NTb_iLoy05Eq@ta=az#v`11{4sI7 zm8(+C>NII?rL;qgM0fq_)vAv)6B36#lj+hN4~skzpAvp93W#_mZ#=KZd33@QWrDBq z^dU{QuUqO@*(MYv%)OyqH5x~QH&-X(v-(9<$h*Ipl@q8Fmm3#oZZ2@B`Gq)IWSa+|KP>U*)}FV?TPwF6`OZe*E%dD_*LI{XA-f4S)Vo2ddC6C=dx< z%FHJqN*MG3p;38-U7Ede*%G_!j6(!~|8(G4NDBb!iu3xY>{T+*@cuLRTmQXxweLP1 zW?#Mgs-3=DRn_Ms(JyE-r%bS$4r?P&zut-#FXDh3aK7-*nfAghm)M$BDIIx{@z=y9?pWe=%N~${B z9S5>{N8fG`WtgkoBkeN?)XS30t~wo&&?0I>@+U z=^}gkk=yN%^RKnu$DQfn6>IEZcl6ua?)mC>oBYFA`{|3})~e^elK3{T+0&-l0s&Zn zbhWw-M6aakkl&UqTwt@OPZsDdV>M+?4WKyZ_i2ucX!pc%Us7+CI zmDb110)U-3_Dg&D_ABj@C*QH=vW_xG^v>_v(7yiQE!(AI4`0AkltjKxlNKtwgahlj zY8y1F)UM~MB(tae>Wh@+ixztOQ7@UMu(fN}Sf%Q4)*S)}l9ofgllY^AC?U@G-awJ-ZlX>*c18-%wWK&ucsb+Q9cv1;Ht@~f|G#K@6; zpI;5$U0;J~)2fwcaiwng!pjr#5lI|0;{KqYLwbH84e7?|lb=IB_`pH*T0Nk>d-t{$ z($NO|j#XUss#UFO<;u1uA>kxX0MyW;Y<{6GfYKLUdBrMLs9?RicXtEt#D#VNSm(`~ zXYURhX06qpofpGUv{ru8`bH0#~> zOwB`5BVD&vAa-v%;?i5}^C2%bOo!OJPu%4I zw1@!TA?IG>fNWsj-d1bp)}H>4@#E~AhhMh_E!sN3M)C@9th;kd>(lRS>vhbjwph~R z?>>3geigu+{QVePCLnv&f$iK}8mc92WW)O4v#+#SQ>WMq1N+K23h>_d<#dAV8`T3h z^vSz?5%GuAJU$=%qRp82qtrcqvMZh+?y5C!KQ_oFe>d7e{lVv6CGb7Orv3Ph6)#iX z%@m$?+v5(JU%Tged-t(Bt?S_@*{mtQ*a2r=Ze>)zA&=Z)A3b-!Ro$_PRjyUf_CNhn zEm#^$NGMBP;!Cz&9*@SkSK-J;jRByaeg3)i+HXG__x<-)T-yZ;7cH_L`|M-Gh7Wf@ zSG;&}4@c5lMAA-v0WcCrrva!H)dx0kNJLAh(*qhqIR42~r`pl72J-9V$yQRJ@yGGw ztwYbA_WO((wq(f?>(r~4=Vxo6h{`G<+Ay9g^#uGuhkLG+htm8TLx$M*vIs#K^`}nc z^OsuJmHL3pqcXkr=bSnEBz0k(dn@5>K;m6Y=?M!zXwWujL(9uodder9JhY$m#FIZB z4tS<~>P0v|@~&LD((ZZiL3{f7=bZ*0wmI?4Gwm_ei^T#v0MMe1NXz-*LVLX3sz=~4 zZ6ghB;ecqUAMwF652_Jsz*oMm;IHn+>3e$V>e@Q@Acw~y2YiVLh=Cah7=Zau!Y9aXQO zz4Q280`&Q;ev4Mt@qlA&?~^aGT{`uYgmj#paQy>z_TA6f5f|TNZ{B-@>n?xu;b4K# z;&#PzAKH<;_otRx7VR| z!9%awie*c!Qms06ffgty-f+K781tDV{$_q_ghqi5<2ft35WIs=w=!=PZYHQQR zjjf#O^~cPa_KoTbh{r4-0GqOC>lc#Z6Hi@{sG}IQAX>! z`|kFP05$O|1hB_``>p->^UqebQYCBGrj6I@+aG>#@V!9NYo1LtN$Bg=sbfXO?+L0S zivoCnWemW#*IVs_CT&CFzHHet`&xD8$34$Br1wUr{-ijN;y{W6DGsDKumuhz|O=+!?>wXRkeLXSAznkNls#GXd18 zc>nlQ_9gqiUPNU}_AOhs%2rB>MB4Whl@=9RNdDSIdrArIMZ1bfrBy^KW#6-}|LKU+&oUT+22gI?>>1?3qU`2 zJmGWx=gc3hlO`TzD_692Yc^VSS<1m3tClTxd1lJbo%UcCly77uKlzNVhU*9u2C3zL z684J)8UT%@7m)hVXP?=H=b!ID;ktF}oHetafMk7vxHsN@+Xm{}6d+x(a;3G_2Vf?vE-d4H@4CybRvCb0 zUAb&P;}}`9aT}RDb*i(RuM#k3a^NgV^kxMn09aqKfojd@{qDKPKAtqm zO&H)AUaQotYhS5O^wFYyd#58lB68Wa*V>@}`#*a}GB#}4(w=_d1qYt*7%;#FNiM9s zEjx6u*WP%;0eXNeHyzgEKG$96WPf1jPOYy zLu|QZzjNR~7e7{$jyBSJSA8oUP`*}t4Hz`YJ`vxM$aXxU|*zDI32MDzjG@D{9Yu6u+(K?6YpK?6Ypd(psu?1+(z$Y~OV!X?Yd z_xNMy+Z$UTm(>B!zvs*p04^!ZZ8=*Zu#0;K=n9K13)wQrf0|IG;VD+DRR_6aTx0Fz z){s{|wS=tlSq7JG)xx>r$Dbs(jFtA}Etkq)dYSxv>szx<=UR`u9GzcO}x|Jg*#t}p93G%cQYIN&YXvQqo4 z>$YvhKiKTgAE!G&TdQ>k2RN@9_L9K0K4UFRLte2jgWndLHT_FxozIy!pX2!`Z4C$? z8HHT2GkiS^Uh53x-1mCMOD>)UUgHJs~B+8*Y6S=@2Wc;~g(?8GWntVFS5*6or@tWE3IR#3j# z_$lLRaihTZSXr|_{rqzWkm2Js>7ulN^tCtLWFsGb*qWHim5+_|Q`KA$|<+MRl;4bg;vP(zk~;+`8d$_5MIpQVXI zDb>}fTQ}<<7oEnkfJb%Y3WYyG14o_)Vh@KSPwpUb&_LQXu$#Mv@gE=IS}oh#&wAzm zOuuXFoE!QJa2{jRmqf2S

gpU*Dk*230ZJw*mHMWVttwl!>juKbv1yEt|S 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∓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 diff --git a/doc/source/install/_images/logical_view.svg b/doc/source/install/_images/logical_view.svg deleted file mode 100644 index 1498034f..00000000 --- a/doc/source/install/_images/logical_view.svg +++ /dev/null @@ -1,2383 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Deploys - Updates - Monitors - - - - - -Undercloud - -Overcloud - -Your overcloud can contain as few or as many predefined overcloud roles (OpenStack components) as you want. - diff --git a/doc/source/install/_images/overview.png b/doc/source/install/_images/overview.png deleted file mode 100644 index 60e23f539e23db93af93f70c48d538b8795d09a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14348 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 diff --git a/doc/source/install/_images/overview.svg b/doc/source/install/_images/overview.svg deleted file mode 100644 index f0aa9114..00000000 --- a/doc/source/install/_images/overview.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - -Undercloud - -Production OpenStack Cloud (Overcloud) - -Deploys -Updates -Monitors - diff --git a/doc/source/install/_images/physical_view.png b/doc/source/install/_images/physical_view.png deleted file mode 100644 index 59a9e9f999ef479372e019cdf36ec8173026a221..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141792 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≧@1%vkV446HT@Qs_)_+{#xa1bktnb+k})~j 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 Ja@Ric{{U8YtBwEw diff --git a/doc/source/install/_images/physical_view.svg b/doc/source/install/_images/physical_view.svg deleted file mode 100644 index 7f5b1e21..00000000 --- a/doc/source/install/_images/physical_view.svg +++ /dev/null @@ -1,2243 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Controller Node - - Object - Storage - Node - - Block - Storage - Node - - Compute - Node - - - - - - Ceph - Storage - Node - - - - - - -Undercloud - -Overcloud - -Undercloud Node -Ceph-Mon -Ceph-OSD - diff --git a/doc/source/install/_images/tripleo_ansible_arch.png b/doc/source/install/_images/tripleo_ansible_arch.png deleted file mode 100644 index 413373dcbaec8046f1a670152908dd877136c349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205676 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

42cZ4k*w{Ms$2b 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 KppihV#&^hS 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 diff --git a/doc/source/install/advanced_deployment/custom.rst b/doc/source/install/advanced_deployment/custom.rst deleted file mode 100644 index bda8855a..00000000 --- a/doc/source/install/advanced_deployment/custom.rst +++ /dev/null @@ -1,9 +0,0 @@ -Custom Configurations -===================== - -Documentation on how to deploy custom configurations with |project|. - - -.. toctree:: - deploy_openshift - features diff --git a/doc/source/install/advanced_deployment/deploy_openshift.rst b/doc/source/install/advanced_deployment/deploy_openshift.rst deleted file mode 100644 index e0eba46b..00000000 --- a/doc/source/install/advanced_deployment/deploy_openshift.rst +++ /dev/null @@ -1,452 +0,0 @@ -(DEPRECATED) Deploying OpenShift -================================ - -.. note:: This functionality was removed as of Train. - -You can use TripleO to deploy OpenShift clusters onto baremetal nodes. -TripleO deploys the operating system onto the nodes and uses -`openshift-ansible` to then configure OpenShift. TripleO can also be used -to manage the baremetal nodes. - -Define the OpenShift roles -************************** - -TripleO installs OpenShift services using composable roles for -`OpenShiftMaster`, `OpenShiftWorker`, and `OpenShiftInfra`. When you import -a baremetal node using `instackenv.json`, you can tag it to use a certain -composable role. See `Custom Roles `_ for more information. - -.. _custom_roles_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/features/custom_roles.html - -1. Generate the OpenShift roles: - -.. code-block:: bash - - openstack overcloud roles generate -o /home/stack/openshift_roles_data.yaml \ - OpenShiftMaster OpenShiftWorker OpenShiftInfra - -2. View the OpenShift roles: - -.. code-block:: bash - - openstack overcloud role list - -The result should include entries for `OpenShiftMaster`, `OpenShiftWorker`, and -`OpenShiftInfra`. - -3. See more information on the `OpenShiftMaster` role: - -.. code-block:: bash - - openstack overcloud role show OpenShiftMaster - -.. note:: - For development or PoC environments that are more resource-constrained, it is - possible to use the `OpenShiftAllInOne` role to collocate the different - OpenShift services on the same node. The all-in-one role is not recommended - for production. - -Create the OpenShift profiles -***************************** - -This procedure describes how to enroll a physical node as an OpenShift node. - -1. Create a flavor for each OpenShift role. You will need to adjust this - values to suit your requirements: - -.. code-block:: bash - - openstack flavor create --id auto --ram 4096 --disk 40 --vcpus 1 --swap 500 m1.OpenShiftMaster - openstack flavor create --id auto --ram 4096 --disk 40 --vcpus 1 --swap 500 m1.OpenShiftWorker - openstack flavor create --id auto --ram 4096 --disk 40 --vcpus 1 --swap 500 m1.OpenShiftInfra - -2. Map the flavors to the required profile: - -.. code-block:: bash - - openstack flavor set --property "capabilities:profile"="OpenShiftMaster" \ - --property "capabilities:boot_option"="local" m1.OpenShiftMaster - openstack flavor set --property "capabilities:profile"="OpenShiftWorker" \ - --property "capabilities:boot_option"="local" m1.OpenShiftWorker - openstack flavor set --property "capabilities:profile"="OpenShiftInfra" \ - --property "capabilities:boot_option"="local" m1.OpenShiftInfra - -3. Add your nodes to `instackenv.json`. You will need to define them to use the - `capabilities` field. For example: - -.. code-block:: json - - [{ - "arch":"x86_64", - "cpu":"4", - "disk":"60", - "mac":[ - "00:0c:29:9f:5f:05" - ], - "memory":"16384", - "pm_type":"ipmi", - "capabilities":"profile:OpenShiftMaster", - "name": "OpenShiftMaster_1" - }, - { - "arch":"x86_64", - "cpu":"4", - "disk":"60", - "mac":[ - "00:0c:29:91:b9:2d" - ], - "memory":"16384", - "pm_type":"ipmi", - "capabilities":"profile:OpenShiftWorker", - "name": "OpenShiftWorker_1" - }, - { - "arch":"x86_64", - "cpu":"4", - "disk":"60", - "mac":[ - "00:0c:29:91:b9:6a" - ], - "memory":"16384", - "pm_type":"ipmi", - "capabilities":"profile:OpenShiftInfra", - "name": "OpenShiftInfra_1" - }] - -.. TOOD(aschultz): include reference to deploy guide - -4. Import and introspect the TripleO nodes as you normally would for your - deployment. For example: - -.. code-block:: bash - - openstack overcloud node import ~/instackenv.json - openstack overcloud node introspect --all-manageable --provide - -5. Verify the overcloud nodes have assigned the correct profile - -.. code-block:: bash - - openstack overcloud profiles list - +--------------------------------------+--------------------+-----------------+-----------------+-------------------+ - | Node UUID | Node Name | Provision State | Current Profile | Possible Profiles | - +--------------------------------------+--------------------+-----------------+-----------------+-------------------+ - | 72b2b1fc-6ba4-4779-aac8-cc47f126424d | openshift-worker01 | available | OpenShiftWorker | | - | d64dc690-a84d-42dd-a88d-2c588d2ee67f | openshift-worker02 | available | OpenShiftWorker | | - | 74d2fd8b-a336-40bb-97a1-adda531286d9 | openshift-worker03 | available | OpenShiftWorker | | - | 0eb17ec6-4e5d-4776-a080-ca2fdcd38e37 | openshift-infra02 | available | OpenShiftInfra | | - | 92603094-ba7c-4294-a6ac-81f8271ce83e | openshift-infra03 | available | OpenShiftInfra | | - | b925469f-72ec-45fb-a403-b7debfcf59d3 | openshift-master01 | available | OpenShiftMaster | | - | 7e9e80f4-ad65-46e1-b6b4-4cbfa2eb7ea7 | openshift-master02 | available | OpenShiftMaster | | - | c2bcdd3f-38c3-491b-b971-134cab9c4171 | openshift-master03 | available | OpenShiftMaster | | - | ece0ef2f-6cc8-4912-bc00-ffb3561e0e00 | openshift-infra01 | available | OpenShiftInfra | | - | d3a17110-88cf-4930-ad9a-2b955477aa6c | openshift-custom01 | available | None | | - | 07041e7f-a101-4edb-bae1-06d9964fc215 | openshift-custom02 | available | None | | - +--------------------------------------+--------------------+-----------------+-----------------+-------------------+ - -Configure the container registry -******************************** - -Follow `container image preparation `_ to configure TripleO for the -container image preparation. - -.. _container_image_preparation_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/deployment/container_image_prepare.html - -This generally means generating a `/home/stack/containers-prepare-parameter.yaml` file: - -.. code-block:: bash - - openstack tripleo container image prepare default \ - --local-push-destination \ - --output-env-file containers-prepare-parameter.yaml - -Define the OpenShift environment -******************************** - -Create the `openshift_env.yaml` file. This file will define the -OpenShift-related settings that TripleO will later apply as part of the -`openstack overcloud deploy` procedure. You will need to update these values -to suit your deployment: - -.. code-block:: yaml - - Parameter_defaults: - # by default TripleO assigns the VIP random from the allocation pool - # by using the FixedIPs we can set the VIPs to predictable IPs before starting the deployment - CloudName: public.openshift.localdomain - PublicVirtualFixedIPs: [{'ip_address':'10.0.0.200'}] - - CloudNameInternal: internal.openshift.localdomain - InternalApiVirtualFixedIPs: [{'ip_address':'172.17.1.200'}] - - CloudDomain: openshift.localdomain - - ## Required for CNS deployments only - OpenShiftInfraParameters: - OpenShiftGlusterDisks: - - /dev/sdb - - ## Required for CNS deployments only - OpenShiftWorkerParameters: - OpenShiftGlusterDisks: - - /dev/sdb - - /dev/sdc - - ControlPlaneDefaultRoute: 192.168.24.1 - EC2MetadataIp: 192.168.24.1 - ControlPlaneSubnetCidr: 24 - - # The DNS server below should have entries for resolving - # {internal,public,apps}.openshift.localdomain names - DnsServers: - - 10.0.0.90 - - OpenShiftGlobalVariables: - - openshift_master_identity_providers: - - name: 'htpasswd_auth' - login: 'true' - challenge: 'true' - kind: 'HTPasswdPasswordIdentityProvider' - openshift_master_htpasswd_users: - sysadmin: '$apr1$jpBOUqeU$X4jUsMyCHOOp8TFYtPq0v1' - - #openshift_master_cluster_hostname should match the CloudNameInternal parameter - openshift_master_cluster_hostname: internal.openshift.localdomain - - #openshift_master_cluster_public_hostname should match the CloudName parameter - openshift_master_cluster_public_hostname: public.openshift.localdomain - - openshift_master_default_subdomain: apps.openshift.localdomain - -For custom networks or customer interfaces, it is necessary to use custom -network interface templates: - -.. code-block:: yaml - - resource_registry: - OS::TripleO::OpenShiftMaster::Net::SoftwareConfig: /home/stack/master-nic.yaml - OS::TripleO::OpenShiftWorker::Net::SoftwareConfig: /home/stack/worker-nic.yaml - OS::TripleO::OpenShiftInfra::Net::SoftwareConfig: /home/stack/infra-nic.yaml - -Deploy OpenShift nodes -********************** - -As a result of the previous steps, you will have three new YAML files: - -* `openshift_env.yaml` -* `openshift_roles_data.yaml` -* `containers-default-parameters.yaml` - -For a custom network deployments, maybe it is necessary NICs and network -templates like: - -* `master-nic.yaml` -* `infra-nic.yaml` -* `worker-nic.yaml` -* `network_data_openshift.yaml` - -Add these YAML files to your `openstack overcloud deploy` command. - -An example for CNS deployments: - -.. code-block:: bash - - openstack overcloud deploy \ - --stack openshift \ - --templates \ - -r /home/stack/openshift_roles_data.yaml \ - -n /usr/share/openstack-tripleo-heat-templates/network_data_openshift.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/openshift.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/openshift-cns.yaml \ - -e /home/stack/openshift_env.yaml \ - -e /home/stack/containers-prepare-parameter.yaml - -An example for non-CNS deployments: - -.. code-block:: bash - - openstack overcloud deploy \ - --stack openshift \ - --templates \ - -r /home/stack/openshift_roles_data.yaml \ - -n /usr/share/openstack-tripleo-heat-templates/network_data_openshift.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/openshift.yaml \ - -e /home/stack/openshift_env.yaml \ - -e /home/stack/containers-prepare-parameter.yaml - -Deployment for custom networks or interfaces, it is necessary to specify them. -For example: - -.. code-block:: bash - - openstack overcloud deploy \ - --stack openshift \ - --templates \ - -r /home/stack/openshift_roles_data.yaml \ - -n /home/stack/network_data_openshift.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/openshift.yaml \ - -e /usr/share/openstack-tripleo-heat-templates/environments/openshift-cns.yaml \ - -e /home/stack/openshift_env.yaml \ - -e /home/stack/containers-prepare-parameter.yaml \ - -e /home/stack/custom-nics.yaml - -Review the OpenShift deployment -******************************* - -Once the overcloud deploy procedure has completed, you can review the state -of your OpenShift nodes. - -1. List all your baremetal nodes. You should expect to see your master, infra, - and worker nodes. - - .. code-block:: bash - - baremetal node list - -2. Locate the OpenShift node: - - .. code-block:: bash - - openstack server list - -3. SSH to the OpenShift node. For example: - - .. code-block:: bash - - ssh heat-admin@192.168.122.43 - -4. Change to root user: - - .. code-block:: bash - - sudo -i - -5. Review the container orchestration configuration: - - .. code-block:: bash - - cat .kube/config - -6. Login to OpenShift: - - .. code-block:: bash - - oc login -u admin - -7. Review any existing projects: - - .. code-block:: bash - - oc get projects - -8. Review the OpenShift status: - - .. code-block:: bash - - oc status - -9. Logout from OpenShift: - - .. code-block:: bash - - oc logout - -Deploy a test app using OpenShift -********************************* - -This procedure describes how to create a test application in your new -OpenShift deployment. - -1. Login as a developer: - - .. code-block:: bash - - $ oc login -u developer - Logged into "https://192.168.64.3:8443" as "developer" using existing credentials. - You have one project on this server: "myproject" - Using project "myproject". - -2. Create a new project: - - .. code-block:: bash - - $ oc new-project test-project - Now using project "test-project" on server "https://192.168.64.3:8443". - - You can add applications to this project with the 'new-app' command. - For example, to build a new example application in Ruby try: - - .. code-block:: bash - - $ oc new-app centos/ruby-22-centos7~https://github.com/openshift/ruby-ex.git - -3. Create a new app. This example creates a CakePHP application: - - .. code-block:: bash - - $ oc new-app https://github.com/sclorg/cakephp-ex - --> Found image 9dd8c80 (29 hours old) in image stream "openshift/php" under tag "7.1" for "php" - - Apache 2.4 with PHP 7.1 - ----------------------- - PHP 7.1 available as container is a base platform for building and running various PHP 7.1 applications and frameworks. PHP is an HTML-embedded scripting language. PHP attempts to make it easy for developers to write dynamically generated web pages. PHP also offers built-in database integration for several commercial and non-commercial database management systems, so writing a database-enabled webpage with PHP is fairly simple. The most common use of PHP coding is probably as a replacement for CGI scripts. - - Tags: builder, php, php71, rh-php71 - - * The source repository appears to match: php - * A source build using source code from https://github.com/sclorg/cakephp-ex will be created - * The resulting image will be pushed to image stream "cakephp-ex:latest" - * Use 'start-build' to trigger a new build - * This image will be deployed in deployment config "cakephp-ex" - * Ports 8080/tcp, 8443/tcp will be load balanced by service "cakephp-ex" - * Other containers can access this service through the hostname "cakephp-ex" - - --> Creating resources ... - imagestream "cakephp-ex" created - buildconfig "cakephp-ex" created - deploymentconfig "cakephp-ex" created - service "cakephp-ex" created - --> Success - Build scheduled, use 'oc logs -f bc/cakephp-ex' to track its progress. - Application is not exposed. You can expose services to the outside world by executing one or more of the commands below: - 'oc expose svc/cakephp-ex' - Run 'oc status' to view your app. - -4. Review the new app: - - .. code-block:: bash - - $ oc status --suggest - In project test-project on server https://192.168.64.3:8443 - - svc/cakephp-ex - 172.30.171.214 ports 8080, 8443 - dc/cakephp-ex deploys istag/cakephp-ex:latest <- - bc/cakephp-ex source builds https://github.com/sclorg/cakephp-ex on openshift/php:7.1 - build #1 running for 52 seconds - e0f0247: Merge pull request #105 from jeffdyoung/ppc64le (Honza Horak ) - deployment #1 waiting on image or update - - Info: - * dc/cakephp-ex has no readiness probe to verify pods are ready to accept traffic or ensure deployment is successful. - try: oc set probe dc/cakephp-ex --readiness ... - * dc/cakephp-ex has no liveness probe to verify pods are still running. - try: oc set probe dc/cakephp-ex --liveness ... - - View details with 'oc describe /' or list everything with 'oc get all'. - -5. Review the pods: - - .. code-block:: bash - - $ oc get pods - NAME READY STATUS RESTARTS AGE - cakephp-ex-1-build 1/1 Running 0 1m - -6. Logout from OpenShift: - - .. code-block:: bash - - $ oc logout diff --git a/doc/source/install/advanced_deployment/features.rst b/doc/source/install/advanced_deployment/features.rst deleted file mode 100644 index 521576e5..00000000 --- a/doc/source/install/advanced_deployment/features.rst +++ /dev/null @@ -1,11 +0,0 @@ -Feature Configuration -===================== - -Documentation on how to enable and configure various features available in -|project|. - - -.. toctree:: - - - deploy_openshift diff --git a/doc/source/install/deploy-guide.rst b/doc/source/install/deploy-guide.rst deleted file mode 100644 index f1f571ed..00000000 --- a/doc/source/install/deploy-guide.rst +++ /dev/null @@ -1,6 +0,0 @@ -Deploy Guide -============ - -The installation instructions have been moved to the `TripleO Deploy Guide `_. - -.. _tripleo_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/ diff --git a/doc/source/install/deprecated/basic_deployment_ui.rst b/doc/source/install/deprecated/basic_deployment_ui.rst deleted file mode 100644 index d1d78fe0..00000000 --- a/doc/source/install/deprecated/basic_deployment_ui.rst +++ /dev/null @@ -1,290 +0,0 @@ -.. _basic-deployment-ui: - -(DEPRECATED) Basic Deployment (UI) -================================== - -.. note:: The tripleo-ui is no longer available as of Stein. This documentation - is deprecated. - -This document will show you how to access the |project| UI and perform -a simple deployment with some customizations. Validations are -automatically run at every step to help uncover potential issues early. - -.. image:: ../_images/tripleo_ui.png - :width: 768px - :height: 439px - -Prepare Your Environment ------------------------- - -The UI is installed by default with the undercloud. You can confirm -this by opening ``undercloud.conf`` and checking for:: - - enable_ui = true - enable_validations = true - -The validations are optional but strongly recommended. - -#. Make sure you have your environment ready and undercloud running: - - * `Environment Setup `_ - * `Undercloud Installation `_ - -.. _environment_setup_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/environments/index.html -.. _undercloud_installation_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/deployment/install_undercloud.html - -#. Make sure the images are uploaded in Glance on the undercloud: - - * `Get Images `_ - * `Upload Images `_ - -.. _get_images_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/deployment/install_overcloud.html#get-images -.. _upload_images_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/deployment/install_overcloud.html#upload-images - -Access the UI -------------- - -The UI is accessible on the undercloud URL. With the default settings -the URLs may look like the following, depending on whether the -undercloud was set up with `SSL `_: - -.. _undercloud_ssl: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/features/ssl.html#undercloud-ssl - -* http://192.168.24.1:3000 if it was not -* https://192.168.24.2 if set up with SSL - -The username is ``admin`` and the password can be obtained by running -the following command on the undercloud:: - - $ sudo hiera keystone::admin_password - -.. note:: On an undercloud deployed without SSL, the UI and API - endpoints are deployed on the control plane which may not be - routable. In this case you will need to create a tunnel or use a - tool such as sshuttle to be able to use the UI from a local - browser:: - - sshuttle -r user@undercloud 192.168.24.0/24 - -.. admonition:: Virtual - :class: virtual - - If you cannot directly access the undercloud (for example because - the undercloud is installed in a VM on a remote lab host), you will - need to create a tunnel and make some configuration changes in order - to access the UI locally. - - #. Open the tunnel from the virt host, to the undercloud:: - - ssh -Nf user@undercloud -L 0.0.0.0:443:192.168.24.2:443 # If SSL - ssh -Nf user@undercloud -L 0.0.0.0:3000:192.168.24.1:3000 # If no SSL - - .. note:: Quickstart started creating the tunnel automatically - during Pike. If using an older version you will have to create - the tunnel manually, for example:: - - ssh -F /root/.quickstart/ssh.config.ansible undercloud -L 0.0.0.0:443:192.168.24.2:443 - - #. Edit the UI config on the undercloud to replace the undercloud IP - with your virt host name, for example:: - - sudo sed -i.bak s/192.168.24.2/virthost/ /var/www/openstack-tripleo-ui/dist/tripleo_ui_config.js - - Additionally, make sure all the API endpoints are commented out - in this file. - - .. note:: Changes to ``tripleo_ui_config.js`` are overwritten on - undercloud upgrades. - - #. You may have to open port 3000 or 443 on your virt host. - - .. admonition:: Stable Branch - :class: stable - - .. admonition:: Newton - :class: newton - - Starting in Ocata, all the API ports are proxied through - 3000 (non-SSL) or 443 (SSL). If using Newton, you will need - to ensure ports for all the API endpoints specified in - ``tripleo_ui_config.js`` are open and accessible. If using - SSL with self-signed certificates, Firefox will also - require a SSL certificate exception to be accepted for - every port. - - #. The UI should now be accessible at http://virthost:3000 or - https://virthost. - -Manage Plans ------------- - -A default plan named ``overcloud`` is created during the undercloud -installation, based on the default tripleo-heat-templates installed on -the system. This plan can be customized and deployed. - -It is also possible to create and manage additional plans in parallel, -in order to test different configurations. - -By clicking on "Manage Deployments" beside the deployment name, you can -perform actions on plans such as create, export, delete, etc. - -.. note:: - - There can be confusion with node assignments when switching between - plans, particularly in previous releases like Newton. If doing work - with multiple plans, ensure the Node counts are what you expect - before starting the deployment, for example by navigating to Edit - Configuration -> Parameters. - -Manage Nodes ------------- - -Register Nodes -^^^^^^^^^^^^^^ - -Navigate to the **Nodes** tab in the top bar and click on the -*Register Nodes* button. New nodes can be added in two ways: - - * Importing an `instackenv.json `_ file - -.. _instackenv_file: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/environments/baremetal.html#instackenv-json - -* Importing an instackenv.json file -* Manually defining nodes via the *Add New* button. - -Introspect Nodes -^^^^^^^^^^^^^^^^ - -Introspection is a required step when deploying from the UI. Once the -nodes are registered and in the ``manageable`` provision state, select -the nodes and click on the *Introspect Nodes* button. - -Provide Nodes -^^^^^^^^^^^^^ - -Once introspection is completed, nodes need to be "provided" in order -to move to the ``available`` state and be available for -deployments. Select the nodes and click on the *Provide Nodes* button. - -.. note:: For more information about node states, see `Node States `_. - -.. _node_states: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/provisioning/node_states.html - -Tag Nodes -^^^^^^^^^ - -Nodes need to be tagged to match a specific profile/role before they -can be used in a deployment. Select the nodes you want to assign a -profile to, then click on *Tag Nodes* (the option may be in a dropdown -menu). - -.. admonition:: Stable Branch - :class: stable - - In Newton and Ocata, node assignment and node tagging are done at - the same time when assigning nodes on the **Deployment Plan** page. - -Configure the Deployment ------------------------- - -On the **Deployment Plan** tab, you can configure both the overall -deployment, as well as specific roles. - -Clicking on the *Edit Configuration* link displays the list of -environments available and their description, based on the templates -provided in the plan. After enabling environments as desired, click on -*Save Changes* and navigate to the **Parameters** tab. Once saved, the -enabled environments will also be configurable on this tab. - -The **Parameters** tab lets you set configuration options for the -deployment in general, as well as for each individual environment. - -.. admonition:: Stable Branch - :class: stable - - .. admonition:: Newton - :class: newton - - In Newton it was not possible to configure individual - environments. The environment templates should be updated - directly with the required parameters before uploading a new - plan. - -Individual roles can also be configured by clicking on the Pencil icon -beside the role name on each card. - -.. admonition:: Stable Branch - :class: stable - - .. admonition:: Newton - :class: newton - - In Newton, you may need to assign at least one node to the role - before the related configuration options are loaded. - - -Assign Nodes ------------- - -The second number on each card indicates the number of nodes tagged -with this particular profile. The number of nodes manually assigned via -the number picker will be deployed. - -.. admonition:: Stable Branch - :class: stable - - In Newton and Ocata, nodes are tagged as part of assigning a node to - a profile. This can cause issues when switching deployment plans, as - the node counts displayed on the card may not match the value - actually stored in the plan. You can correct this by clicking on - Edit Configuration -> Parameters and checking/updating the node - counts for ControllerCount, ComputeCount, etc. - - Additionally, when using custom roles you should make sure to - unassign the nodes associated with these roles before deleting the - plan, as the role cards are displayed based on the roles in the - current plan only. Therefore it is not possible to unassign a node - which is associated with a role that does not exist in the current - plan. - -Deploy the Overcloud --------------------- - -Click on the *Deploy* button. - -You may see a warning if not all validations passed. While this is -expected in resources-constrained virtual environments, it is -recommended to check the failed validations carefully before -proceeding. - -The ``View detailed information`` link shows the details for all the -Heat resources being deployed. - -Post-Deployment ---------------- - -Once the deployment completes, the progress bar will be replaced with -information about the overcloud such as the IP address and login -credentials. - -If the deployment failed, information about the failure will be -displayed. - -.. admonition:: Virtual - :class: virtual - - To access the overcloud, you will need to update your tunnel in - order to access the new URL. For example, if your overcloud - information is as such:: - - Overcloud IP address: 192.168.24.12 - Username: admin - Password: zzzzzz - - Assuming you deployed the overcloud with SSL enabled, you could - create the following tunnel from your virt host to the undercloud:: - - ssh -Nf user@undercloud -L 0.0.0.0:1234:192.168.24.12:443 - - After opening port 1234 on your virt host, you should be able to - access the overcloud by navigating to https://virthost:1234. diff --git a/doc/source/install/index.rst b/doc/source/install/index.rst deleted file mode 100644 index 68e3776c..00000000 --- a/doc/source/install/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -TripleO Install Guide -========================= - -.. toctree:: - :maxdepth: 2 - :includehidden: - - introduction/introduction - deploy-guide - deprecated/basic_deployment_ui - advanced_deployment/features - advanced_deployment/custom - diff --git a/doc/source/install/introduction/architecture.rst b/doc/source/install/introduction/architecture.rst deleted file mode 100644 index 4783679d..00000000 --- a/doc/source/install/introduction/architecture.rst +++ /dev/null @@ -1,384 +0,0 @@ -|project| Architecture -======================== - -This document lists the main components of |project|, and gives some -description of how each component is used. There are links to additional sources -of information throughout the document. - -.. only:: html - - .. contents:: - :depth: 3 - :backlinks: none - - -Architecture Overview ---------------------- - -|project| is a community developed approach and set of tools for deploying, -and managing an OpenStack cloud. - - -TripleO -^^^^^^^ - -TripleO is the friendly name for “OpenStack on OpenStack”. It is an official -OpenStack project with the goal of allowing you to deploy and manage a -production cloud onto bare metal hardware using a subset of existing OpenStack -components. - -.. image:: ../_images/overview.png - -With TripleO, you start by creating an "undercloud" (a deployment cloud) -that will contain the necessary OpenStack components to deploy and manage an -"overcloud" (a workload cloud). The overcloud is the deployed solution -and can represent a cloud for any purpose (e.g. production, staging, test, etc). - -.. image:: ../_images/logical_view.png - -TripleO leverages several existing core components of OpenStack including Nova, -Ironic, Neutron, Heat, Glance and Ceilometer to deploy OpenStack on baremetal -hardware. Nova and Ironic are used in the undercloud to manage baremetal -instances that comprise the infrastructure for the overcloud. Neutron is -utilized to provide a networking environment in which to deploy the overcloud, -machine images are stored in Glance, and Ceilometer collects metrics about your -overcloud. - -The following diagram illustrates a physical view of how the undercloud may be -hosted on one physical server and the overcloud distributed across many physical -servers. - -.. image:: ../_images/physical_view.png - - -SpinalStack's Inspiration -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Some key aspects of SpinalStack workflow have been incorporated into -|project|, providing options to perform introspection, benchmarking and role -matching of your hardware prior to deploying OpenStack. - -Hardware introspection features enable you to collect data about the properties -of your hardware prior to deployment, such that specific classes of hardware may -be matched to specific roles (e.g. a special hardware configuration for Compute -or Storage roles). There is also the option to enable performance benchmarking -during this phase, such that outliers which do not match the expected -performance profile may be excluded from the deployment. - -|project| also configures servers in a similar way to SpinalStack, using -stable community puppet implementations, applied in a series of steps, such -that granular control and validation of the deployment is possible - - -Benefits --------- - -Using |project|'s combination of OpenStack components, and their APIs, as the -infrastructure to deploy and operate OpenStack itself delivers several benefits: - -* |project|'s APIs are the OpenStack APIs. They're well maintained, well - documented, and come with client libraries and command line tools. Users who - invest time in learning about |project|'s APIs are also learning about - OpenStack itself, and users who are already familiar with OpenStack will find - a great deal in |project| that they already understand. -* Using the OpenStack components allows more rapid feature development of - |project| than might otherwise be the case; |project| automatically - inherits all the new features which are added to Glance, Heat etc., even when - the developer of the new feature didn't explicitly have |project| in mind. -* The same applies to bug fixes and security updates. When OpenStack developers - fix bugs in the common components, those fixes are inherited by |project|. -* Users' can invest time in integrating their own scripts and utilities with - |project|'s APIs with some confidence. Those APIs are cooperatively - maintained and developed by the OpenStack community. They're not at risk of - being suddenly changed or retired by a single controlling vendor. -* For developers, tight integration with the OpenStack APIs provides a solid - architecture, which has gone through extensive community review. - -It should be noted that not everything in |project| is a reused OpenStack -element. - - -Deployment Workflow Overview ----------------------------- - -#. Environment Preparation - - * Prepare your environment (baremetal or virtual) - * Install undercloud - - -#. Undercloud Data Preparation - - * Create images to establish the overcloud - * Register hardware nodes with undercloud - * Introspect hardware - * Create flavors (node profiles) - - -#. Deployment Planning - - * Configure overcloud roles - - * Assign flavor (node profile to match desired hardware specs) - * Assign image (provisioning image) - * Size the role (how many instances to deploy) - - * Configure service parameters - * Create a Heat template describing the overcloud (auto-generated from above) - - -#. Deployment - - * Use Heat to deploy your template - * Heat will use Nova to identify and reserve the appropriate nodes - * Nova will use Ironic to startup nodes and install the correct images - - -#. Per-node Setup - - * When each node of the overcloud starts it will gather its configuration - metadata from Heat Template configuration files - * Hiera files are distributed across all nodes and Heat applies puppet - manifests to configure the services on the nodes - * Puppet runs in multiple steps, so that after each step there can be tests - triggered to check progress of the deployment and allow easier debugging. - - -#. Overcloud Initialization - - * Services on nodes of the overcloud are registered with Keystone - - -Deployment Workflow Detail --------------------------- - -Environment Preparation -^^^^^^^^^^^^^^^^^^^^^^^ - -In the first place, you need to check that your environment is ready. -|project| can deploy OpenStack into baremetal as well as virtual environments. -You need to make sure that your environment satisfies minimum requirements for -given environment type and that networking is correctly set up. - -Next step is to install the undercloud. We install undercloud using `Instack -`_'s script and it calls -puppet scripts in the background. - -For development or proof of concept (PoC) environments, `Quickstart -`_ -can also be used. - - -Undercloud Data Preparation -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Images -"""""" - -Before deploying the overcloud, you must first download or build images which -will be installed on each of the nodes of the overcloud. TripleO uses -`diskimage-builder `_ for -building these so called "Golden Images". The diskimage-builder tool takes a -base image e.g. `CentOS 7 `_ and then layers additional software via -configuration scripts (called elements) on top of that. The final result is a -qcow2 formatted image with software installed but not configured. - -While the diskimage-builder repository provides operating-system specific -elements, ones specific to OpenStack, e.g. nova-api, are found in -`tripleo-image-elements `_. -You can add different elements to an image to provide specific applications and -services. Once all the images required to deploy the overcloud are built, they -are stored in Glance running on the undercloud. - - -Nodes -""""" - -Deploying the overcloud requires suitable hardware. The first task is to -register the available hardware with Ironic, OpenStack's equivalent of a -hypervisor for managing baremetal servers. Users can define the hardware -attributes (such as number of CPUs, RAM, disk) manually or he can leave the -fields out and run introspection of the nodes afterwards. - -The sequence of events is pictured below: - -.. image:: ../_images/introspection_diagram.png - -* The user, via the command-line tools, or through direct API calls, - registers the power management credentials for a node with Ironic. -* The user then instructs Ironic to reboot the node. -* Because the node is new, and not already fully registered, there are no - specific PXE-boot instructions for it. In that case, the default action is to - boot into an introspection ramdisk -* The introspection ramdisk probes the hardware on the node and gathers facts, - including the number of CPU cores, the local disk size and the amount of RAM. -* The ramdisk posts the facts to the ironic-inspector API. -* All facts are passed and stored in the Ironic database. -* There can be performed advanced role matching via the ''ahc-match'' tool, - which simply adds an additional role categorization to Ironic based on - introspected node facts and specified conditions. - - -Flavors -""""""" - -When users are creating virtual machines (VMs) in an OpenStack cloud, the flavor -that they choose specifies the capacity of the VM which should be created. The -flavor defines the CPU count, the amount of RAM, the amount of disk space etc. -As long as the cloud has enough capacity to grant the user's wish, and the user -hasn't reached their quota limit, the flavor acts as a set of instructions on -exactly what kind of VM to create on the user's behalf. - -In the undercloud, where the machines are usually physical rather than virtual -(or, at least, pre-existing, rather than created on demand), flavors have -a slightly different effect. Essentially, they act as a constraint. Of all of -the introspected hardware, only nodes which match a specified flavor are -suitable for a particular role. This can be used to ensure that the large -machines with a great deal of RAM and CPU capacity are used to run Nova in the -overcloud, and the smaller machines run less demanding services, such as -Keystone. - -|project| is capable of handling flavors in two different modes. - -The simpler PoC (Proof of Concept) mode is intended to enable new users to -experiment, without worrying about matching hardware profiles. In this mode, -there's one single, global flavor, and any hardware can match it. That -effectively removes flavor matching. Users can use whatever hardware they wish. - -For the second mode, named Scale because it is suited to larger scale overcloud -deployments, flavor matching is in full effect. A node will only be considered -suitable for a given role if the role is associated with a flavor which matches -the capacity of the node. Nodes without a matching flavor are effectively -unusable. - -This second mode allows users to ensure that their different hardware types end -up running their intended role, though requires either manual node tagging or -using introspection rules to tag nodes (see `Profile Matching `_). - -.. _profile_matching_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/provisioning/profile_matching.html - - -Deployment Planning -^^^^^^^^^^^^^^^^^^^ - -Whole part of planning your deployment is based on concept of **overcloud -roles**. A role brings together following things: - -* An image; the software to be installed on a node -* A flavor; the size of node suited to the role -* A size; number of instances which should be deployed having given role -* A set of heat templates; instructions on how to configure the node for its - task - - -In the case of the "Compute" role: - -* the image must contain all the required software to boot an OS and then run - the KVM hypervisor and the Nova compute service -* the flavor (at least for a deployment which isn't a simple proof of concept), - should specify that the machine has enough CPU capacity and RAM to host - several VMs concurrently -* the Heat templates will take care of ensuring that the Nova service is - correctly configured on each node when it first boots. - - -Currently, the roles in |project| are very prescriptive, and in particular -individual services cannot easily be scaled independently of the Controller role -(other than storage nodes). More flexibility in this regard is planned in a -future release. - -Customizable things during deployment planning are: - -* Number of nodes for each role -* Service parameters configuration -* Network configuration (NIC configuration options, isolated vs. single overlay) -* Ceph rbd backend options and defaults -* Ways to pass in extra configuration, e.g site-specific customizations - - -Deployment -^^^^^^^^^^ - -Deployment to physical servers happens through a collaboration of -Heat, Nova, Neutron, Glance and Ironic. - -The Heat templates and environments are served to Heat which will -orchestrate the whole deployment and it will create a stack. Stack is -Heat's own term for the applications that it creates. The overcloud, -in Heat terms, is a particularly complex instance of a stack. - -In order for the stack to be deployed, Heat makes successive calls to Nova, -OpenStack's compute service controller. Nova depends upon Ironic, which, as -described above has acquired an inventory of introspected hardware by this -stage in the process. - -At this point, Nova flavors may act as a constraint, influencing the -range of machines which may be picked for deployment by the Nova -scheduler. For each request to deploy a new node with a specific role, -Nova filters the list of available nodes, ensuring that the selected -nodes meet the hardware requirements. - -Once the target node has been selected, Ironic does the actual provisioning of -the node, Ironic retrieves the OS image associated with the role from Glance, -causes the node to boot a deployment ramdisk and then, in the typical case, -exports the node's local disk over iSCSI so that the disk can be partitioned and -the have the OS image written onto it by the Ironic Conductor. - -See Ironic's `Understanding Baremetal Deployment `_ -for further details. - - -Per-node Setup -^^^^^^^^^^^^^^ - -TBD - Puppet - - - -High Availability (HA) ----------------------- - -|project| will use Pacemaker to achieve high-availability. - -Reference architecture document: https://github.com/beekhof/osp-ha-deploy - -.. note:: **Current HA solution is being developed by our community.** - - - -Managing the Deployment ------------------------ - -After the overcloud deployment is completed, it will be possible to monitor, -scale it out or perform basic maintenance operations via the CLI. - - -Monitoring the Overcloud -^^^^^^^^^^^^^^^^^^^^^^^^ - -When the overcloud is deployed, Ceilometer can be configured to track a set of -OS metrics for each node (system load, CPU utilization, swap usage etc.) - -Additionally, Ironic exports IPMI metrics for nodes, which can also be stored in -Ceilometer. This enables checks on hardware state such as fan operation/failure -and internal chassis temperatures. - -The metrics which Ceilometer gathers can be queried for Ceilometer's REST API, -or by using the command line client. - -.. Note:: - There are plans to add more operational tooling to the future release. - - -Scaling-out the Overcloud -^^^^^^^^^^^^^^^^^^^^^^^^^ - -The process of scaling out the overcloud by adding new nodes involves these -stages: - -* Making sure you have enough nodes to deploy on (or register new nodes as - described in the "Undercloud Data Preparation" section above). -* Calling Heat to update the stack which will apply the set of changes to the - overcloud. diff --git a/doc/source/install/introduction/components.rst b/doc/source/install/introduction/components.rst deleted file mode 100644 index f023ebb9..00000000 --- a/doc/source/install/introduction/components.rst +++ /dev/null @@ -1,455 +0,0 @@ -|project| Components -====================== - -.. only:: html - - .. contents:: - :depth: 2 - :backlinks: none - -This section contains a list of components that |project| uses. The components -are organized in categories, and include a basic description, useful links, and -contribution information. - -.. - [Example Category Name] - ----------------------- - - [Example Component Name] - ^^^^^^^^^^^^^^^^^^^^^^^^ - This is short description what the project is about and how |project| uses - this project. Three sentences max. - - **How to contribute** - - * Instructions to prepare development environment. Should be mostly pointing to - upstream docs. If upstream docs doesn't exist, please, create one. Add tips - how to test the feature in |project| + other useful information. - - - **Useful links** - - * Upstream Project: `link <#>`_ - * Bugs: `link <#>`_ - * Blueprints: `link <#>`_ - - -Shared Libraries ----------------- -diskimage-builder -^^^^^^^^^^^^^^^^^ - -diskimage-builder is an image building tool. It is used by -``openstack overcloud image build``. - -**How to contribute** - -See the diskimage-builder `README.rst -`_ -for a further explanation of the tooling. Submit your changes via -OpenStack Gerrit (see `OpenStack Developer's Guide -`_). - -**Useful links** - -* Upstream Project Documentation: https://docs.openstack.org/diskimage-builder/ -* Bugs: https://bugs.launchpad.net/diskimage-builder -* Git repository: https://opendev.org/openstack/diskimage-builder/ - - -dib-utils -^^^^^^^^^ - -dib-utils contains tools that are used by diskimage-builder. - -**How to contribute** - -Submit your changes via OpenStack Gerrit (see `OpenStack Developer's Guide -`_). - -**Useful links** - -* Bugs: https://bugs.launchpad.net/diskimage-builder -* Git repository: https://opendev.org/openstack/dib-utils/ - - -os-\*-config -^^^^^^^^^^^^ - -The os-\*-config projects are a suite of tools used to configure instances -deployed via TripleO. They include: - -* os-collect-config -* os-refresh-config -* os-apply-config -* os-net-config - -**How to contribute** - -Each tool uses `tox `_ to manage the -development environment. Submit your changes via OpenStack Gerrit (see -`OpenStack Developer's Guide -`_). - -**Useful links** - -* Bugs: - - * os-collect-config: https://bugs.launchpad.net/os-collect-config - * os-refresh-config: https://bugs.launchpad.net/os-refresh-config - * os-apply-config: https://bugs.launchpad.net/os-apply-config - * os-net-config: https://bugs.launchpad.net/os-net-config - -* Git repositories: - - * os-collect-config: https://opendev.org/openstack/os-collect-config - * os-refresh-config https://opendev.org/openstack/os-refresh-config - * os-apply-config https://opendev.org/openstack/os-apply-config - * os-net-config https://opendev.org/openstack/os-net-config - -tripleo-image-elements -^^^^^^^^^^^^^^^^^^^^^^ - -tripleo-image-elements is a repository of diskimage-builder style elements used -for installing various software components. - -**How to contribute** - -Submit your changes via OpenStack Gerrit (see -`OpenStack Developer's Guide -`_). - -**Useful links** - -* Git repository: https://opendev.org/openstack/tripleo-image-elements - - -Installer ---------- - -instack -^^^^^^^ -instack executes diskimage-builder style elements on the current system. This -enables a current running system to have an element applied in the same way -that diskimage-builder applies the element to an image build. - -instack, in its current form, should be considered low level tooling. It is -meant to be used by higher level scripting that understands what elements and -hook scripts need execution. Using instack requires a rather in depth knowledge -of the elements within diskimage-builder and tripleo-image-elements. - -**How to contribute** - -Submit your changes via OpenStack Gerrit (see -`OpenStack Developer's Guide -`_). - -**Useful links** - -* Git repository: https://opendev.org/openstack/instack -* Bugs: https://launchpad.net/tripleo - -instack-undercloud -^^^^^^^^^^^^^^^^^^ -instack-undercloud is a TripleO style undercloud installer based around -instack. - -**How to contribute** - -Submit your changes via OpenStack Gerrit (see -`OpenStack Developer's Guide -`_). - -**Useful links** - -* Git repository: https://opendev.org/openstack/instack-undercloud -* Bugs: https://launchpad.net/tripleo - -Node Management ---------------- -ironic -^^^^^^ - -Ironic project is responsible for provisioning and managing bare metal -instances. - -For testing purposes Ironic can also be used for provisioning and managing -virtual machines which act as bare metal nodes via special driver ``pxe_ssh``. - -**How to contribute** - -Ironic uses `tox `_ to manage the -development environment, see the `Developer Quick-Start -`_, -`Ironic Developer Guidelines -`_ -and `OpenStack Developer's Guide`_ for details. - -**Useful links** - -* Upstream Project: https://docs.openstack.org/ironic/index.html -* Bugs: https://bugs.launchpad.net/ironic -* Blueprints: https://blueprints.launchpad.net/ironic - - * `Specs process `_ - should be followed for suggesting new features. - * Approved Specs: http://specs.openstack.org/openstack/ironic-specs/ - - -ironic inspector (former ironic-discoverd) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Ironic Inspector project is responsible for inspection of hardware properties -for newly enrolled nodes (see also ironic_). - -**How to contribute** - -Ironic Inspector uses `tox `_ to manage -the development environment, see `upstream documentation -`_ -for details. - -**Useful links** - -* Upstream Project: https://github.com/openstack/ironic-inspector -* PyPI: https://pypi.org/project/ironic-inspector -* Bugs: https://bugs.launchpad.net/ironic-inspector - -VirtualBMC -^^^^^^^^^^ - -A helper command to translate IPMI calls into libvirt calls. Used for testing -bare metal provisioning on virtual environments. - -**How to contribute** - -VirtualBMC uses `tox `_ to manage the -development environment in a similar way to Ironic. - -**Useful links** - -* Source: https://opendev.org/openstack/virtualbmc -* Bugs: https://bugs.launchpad.net/virtualbmc - - -Deployment & Orchestration --------------------------- -heat -^^^^ - -Heat is OpenStack's orchestration tool. It reads YAML files describing -the OpenStack deployment's resources (machines, their configurations -etc.) and gets those resources into the desired state, often by -talking to other components (e.g. Nova). - -**How to contribute** - -* Use `devstack with Heat - `_ - to set up a development environment. Submit your changes via - OpenStack Gerrit (see `OpenStack Developer's Guide - `_). - -**Useful links** - -* Upstream Project: https://wiki.openstack.org/wiki/Heat -* Bugs: https://bugs.launchpad.net/heat -* Blueprints: https://blueprints.launchpad.net/heat - -heat-templates -^^^^^^^^^^^^^^ - -The heat-templates repository contains additional image elements for -producing disk images ready to be configured by Puppet via Heat. - -**How to contribute** - -* Use `devtest with Puppet - `_ - to set up a development environment. Submit your changes via - OpenStack Gerrit (see `OpenStack Developer's Guide - `_). - -**Useful links** - -* Upstream Project: https://opendev.org/openstack/heat-templates -* Bugs: https://bugs.launchpad.net/heat-templates -* Blueprints: https://blueprints.launchpad.net/heat-templates - -tripleo-heat-templates -^^^^^^^^^^^^^^^^^^^^^^ - -The tripleo-heat-templates describe the OpenStack deployment in Heat -Orchestration Template YAML files and Puppet manifests. The templates -are deployed via Heat. - -**How to contribute** - -* Use `devtest with Puppet - `_ - to set up a development environment. Submit your changes via - OpenStack Gerrit (see `OpenStack Developer's Guide - `_). - -**Useful links** - -* Upstream Project: https://opendev.org/openstack/tripleo-heat-templates -* Bugs: https://bugs.launchpad.net/tripleo -* Blueprints: https://blueprints.launchpad.net/tripleo - -nova -^^^^ - -nova provides a cloud computing fabric controller. - -**How to contribute** - -* Read the - `Development Quickstart `_ - to set up a development environment. Submit your changes via OpenStack - Gerrit (see - `OpenStack Developer's Guide `_). - -**Useful links** - -* Git repository: https://opendev.org/openstack/nova -* Bugs: https://bugs.launchpad.net/nova -* Blueprints: https://blueprints.launchpad.net/nova - -puppet-\* -^^^^^^^^^ - -The OpenStack Puppet modules are used to configure the OpenStack -deployment (write configuration, start services etc.). They are used -via the tripleo-heat-templates. - -**How to contribute** - -* Use `devtest with Puppet - `_ - to set up a development environment. Submit your changes via - OpenStack Gerrit (see `OpenStack Developer's Guide - `_). - -**Useful links** - -* Upstream Project: https://wiki.openstack.org/wiki/Puppet - - -tripleo-puppet-elements -^^^^^^^^^^^^^^^^^^^^^^^ - -The tripleo-puppet-elements describe the contents of disk images which -|project| uses to deploy OpenStack. It's the same kind of elements -as in tripleo-image-elements, but tripleo-puppet-elements are specific -for Puppet-enabled images. - -**How to contribute** - -* Use `devtest with Puppet - `_ - to set up a development environment. Submit your changes via - OpenStack Gerrit (see `OpenStack Developer's Guide`_). - -**Useful links** - -* Upstream Project: https://opendev.org/openstack/tripleo-puppet-elements -* Bugs: https://bugs.launchpad.net/tripleo -* Blueprints: https://blueprints.launchpad.net/tripleo - - -User Interfaces ---------------- - -python-openstackclient -^^^^^^^^^^^^^^^^^^^^^^ -The python-openstackclient is an upstream CLI tool which can manage multiple -openstack services. It wraps openstack clients like glance, nova, etc. and maps -them under intuitive names like openstack image, compute, etc. - -The main value is that all services can be controlled by a single (openstack) -command with consistent syntax and behaviour. - -**How to contribute** - -* python-openstackclient uses `tox `_ - to manage the development environment, see the - `python-openstackclient documentation - `_ - for details. Submit your changes via OpenStack Gerrit - (see `OpenStack Developer's Guide`_). - -**Useful links** - -* Upstream Project: https://opendev.org/openstack/python-openstackclient -* Bugs: https://bugs.launchpad.net/python-openstackclient -* Blueprints: https://blueprints.launchpad.net/python-openstackclient -* Human interface guide: https://docs.openstack.org/python-openstackclient/humaninterfaceguide.html - -python-tripleoclient -^^^^^^^^^^^^^^^^^^^^ -The python-tripleoclient is a CLI tool embedded into python-openstackclient. It -provides functions related to instack installation and initial configuration -like node introspection, overcloud image building and uploading, etc. - -**How to contribute** - -* python-tripleoclient uses `tox `_ - to manage the development environment, see the - `python-tripleoclient documentation - `_ - for details. Submit your changes via - `Gerrit `_. - -**Useful links** - -* Project: https://opendev.org/openstack/python-tripleoclient - -.. - - -.. _OpenStack Developer's Guide: http://docs.openstack.org/infra/manual/developers.html - -tripleo-ui -^^^^^^^^^^ - -TripleO UI is the web interface for TripleO. - -**How to contribute** - -* See the `documentation `_ - for details. - - -**Useful links** - -* Bugs: https://bugs.launchpad.net/tripleo-ui -* Blueprints: https://blueprints.launchpad.net/tripleo-ui - -tripleo-validations -------------------- - -Pre and post-deployment validations for the deployment workflow. - -**Useful links** - -* Upstream Project: https://opendev.org/openstack/tripleo-validations/ -* Bugs: https://bugs.launchpad.net/tripleo/+bugs?field.tag=validations -* Documentation for individual validations: https://docs.openstack.org/tripleo-validations/latest/readme.html#existing-validations - -.. note:: When reporting an issue, make sure you add the - ``validations`` tag. - -Deprecated ----------- -Tuskar -^^^^^^ - -The Tuskar project was responsible for planning the deployments and -generating the corresponding Heat templates. This is no longer -necessary as Heat supports this composability out of the box. - -The source code is available below, but please note that it should not -be used for new deployments. - -https://github.com/openstack/tuskar diff --git a/doc/source/install/introduction/introduction.rst b/doc/source/install/introduction/introduction.rst deleted file mode 100644 index ea687e84..00000000 --- a/doc/source/install/introduction/introduction.rst +++ /dev/null @@ -1,38 +0,0 @@ -|project| Introduction -======================== - -|project| is an OpenStack Deployment & Management tool. - - -**Architecture** - -With |project|, you start by creating an **undercloud** (an actual operator -facing deployment cloud) that will contain the necessary OpenStack components to -deploy and manage an **overcloud** (an actual tenant facing workload cloud). The -overcloud is the deployed solution and can represent a cloud for any purpose -(e.g. production, staging, test, etc). The operator can choose any of available -Overcloud Roles (controller, compute, etc.) they want to deploy to the environment. - -Go to :doc:`architecture` to learn more. - -| - -**Components** - -|project| is composed of set of official OpenStack components accompanied by -few other open source plugins which increase |project|'s capabilities. - -Go to :doc:`components` to learn more. - - -**Deployment Guide** - -See additional information about how to deploy TripleO in the `Deploy Guide `_. - -.. _tripleo_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/ - -.. toctree:: - :hidden: - - architecture - components diff --git a/doc/source/links.rst b/doc/source/links.rst deleted file mode 100644 index 9c74b0b5..00000000 --- a/doc/source/links.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. Links, citations, etc. -.. _composable services architecture: - https://blueprints.launchpad.net/tripleo/+spec/composable-services-within-roles -.. _THT repository: - https://github.com/openstack/tripleo-heat-templates/tree/master/puppet/services -.. _puppet-tripleo repository: - https://github.com/openstack/puppet-tripleo/tree/master/manifests/profile diff --git a/doc/source/upgrade/developer/upgrades/ci_upgrades.rst b/doc/source/upgrade/developer/upgrades/ci_upgrades.rst deleted file mode 100644 index ee383d1a..00000000 --- a/doc/source/upgrade/developer/upgrades/ci_upgrades.rst +++ /dev/null @@ -1,267 +0,0 @@ -.. TODO: This is a template which is being - completed. The subsections stated - here might differ from the ones in the - final version. - -Major upgrades & Minor updates CI coverage ------------------------------------------- - -.. include:: links.rst - -This document tries to give a detailed overview of the current -CI coverage for upgrades/updates jobs. Also, it is intended as -a guideline to understand how these jobs work, as well as giving -some tips for debugging. - -Upgrades/Updates CI jobs -~~~~~~~~~~~~~~~~~~~~~~~~~ - -At the moment most of the upgrade jobs have been moved from upstream -infrastructure to `RDO Software Factory job definition`_ due to -runtime constraints of the OpenStack infra jobs. - -Each of these jobs are defined by a `featureset file`_ and a `scenario file`_. The -featureset used in a job can be found in the last part of the job type value. -This can be found in the ci job definition:: - - - '{trigger}-tripleo-ci-{jobname}-{release}{suffix}': - jobname: 'centos-7-containers-multinode-upgrades' - release: - - pike - - master - suffix: '' - type: 'multinode-1ctlr-featureset011' - node: upstream-centos-7-2-node - trigger: gate - -The scenario used is referenced in the featureset file, in the example above -the `featureset011`_ makes use of the following scenarios:: - - composable_scenario: multinode.yaml - upgrade_composable_scenario: multinode-containers.yaml - -As this job covers the upgrade from one release to another, we need to -specify two scenario files. The one used during deployment and the one -used when upgrading. Each of these scenario files defines the services -deployed in the nodes. - -.. note:: - There is a matrix with the different features deployed per feature set - here: `featureset matrix`_ - -Currently, two types of upgrade jobs exist: - -- multinode-upgrade (mixed-version): In this job, an undercloud with - release N+1 is deployed, while the overcloud is deployed with a N - release. Execution time is reduced by not upgrading the undercloud - , instead the heat templates from the (N+1) undercloud are used when - performing the overcloud upgrade. - - .. note:: - If you want your patch to be tested against this job you need - to add *RDO Third Party CI* as reviewer or reply with the comment - *check-rdo experimental*. - -- undercloud-upgrade: This job tests the undercloud upgrade from a - major release to another. The undercloud is deployed with release - N and upgraded to N+1 release. This job does not deploy an overcloud. - -.. note:: - There is an effort to `integrate`_ the new `tripleo-upgrade`_ role into - tripleo-quickstart that defines an unified way to upgrade and update. - -Upgrade/Update CI jobs, where to look -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The best place to check the current CI jobs status is in the `CI Status`_ -page. This webpage contains a log of all the TripleO CI jobs, it's result -status, link to logs, git patch trigger and statistics about the pass/fail -rates. - -To check the status of the Upgrades/Updates jobs, you need to click the -`TripleO CI promotion jobs`_ link from `CI Status`_, where you will find -the RDO cloud upgrades section: - -.. image:: rdo_upgrades_jobs.png - -In this section the CI jobs have a color code, to show its -current status in a glance:: - - - Red: CI job constantly failing. - - Yellow: Unstable job, frequent failures. - - Green: CI job passing consistently. - -If you scroll down after pressing some of the jobs in the section -you will find the CI job statistics and the last 100 (or less, it -can be edited) job executions. Each of the job executions contains:: - - - Date: Time and date the CI job was triggered - - Length: Job duration - - Reason: CI job result or failure reason. - - Patch: Git ref of the patch tha triggered the job. - - Logs: Link to the logs. - - Branch: Release branch used to run the job. - - -Debugging Upgrade/Update CI jobs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When opening the logs from a CI job it might look a little chaotic -(mainly when it is for the first time). It's good to have an idea -where you can find the logs you need, so you will be able to identify -the cause of a failure or debug some issue. - -.. _logs directory: - -The first thing to have a look at when debugging a CI job is the -console output or full log. When clicking in the job, the following -folder structure appears:: - - job-output.json.gz - job-output.txt.gz - logs/ - zuul-info/ - -The job execution log is located in the *job-output.txt.gz* file. Once -opened, a huge log will appear in front of you. What should you look -for? - -(1) Find the job result - - A good string to search is *PLAY RECAP*. At this point, all the - playbooks have been executed and a summary of the runs per node - is displayed:: - - PLAY RECAP ********************************************************************* - 127.0.0.2 : ok=9 changed=0 unreachable=0 failed=0 - localhost : ok=10 changed=3 unreachable=0 failed=0 - subnode-2 : ok=3 changed=1 unreachable=0 failed=0 - undercloud : ok=120 changed=78 unreachable=0 failed=1 - - In this case, one of the playbooks executed in the undercloud has - failed. To identify which one, we can look for the string **fatal**.:: - - fatal: [undercloud]: FAILED! => {"changed": true, "cmd": "set -o pipefail && /home/zuul/overcloud-upgrade.sh 2>&1 - | awk '{ print strftime(\"%Y-%m-%d %H:%M:%S |\"), $0; fflush(); }' > overcloud_upgrade_console.log", - "delta": "0:00:39.175219", "end": "2017-11-14 16:55:47.124998", "failed": true, "rc": 1, - "start": "2017-11-14 16:55:07.949779", "stderr": "", "stdout": "", "stdout_lines": [], "warnings": []} - - From this task, we can guess that something went wrong during the - overcloud upgrading process. But, where can I find the log - *overcloud_upgrade_console.log* referenced in the task? - -(2) Undercloud logs - - From the `logs directory`_ , you need to open the *logs/* - folder. All undercloud logs are located inside the *undercloud/* - folder. Opening it will display the following:: - - etc/ *configuration files* - home/ *job execution logs from the playbooks* - var/ *system/services logs* - - The log we look for is located in */home/zuul/*. Most of the tasks - executed in tripleo-quickstart will store the full script as well as - the execution log in this directory. So, this is a good place to - have a better understanding of what went wrong. - - If the overcloud deployment or upgrade failed, you will also find - two log files named:: - - failed_upgrade.log.txt.gz - failed_upgrade_list.log.txt.gz - - The first one stores the output from the debugging command:: - - openstack stack failures list --long overcloud - - Which prints out the reason why the deployment or upgrade - failed. Although sometimes, this information is not enough - to find the root cause for the problem. The *stack failures* - can give you a clue of which service is causing the problem, - but then you'll need to investigate the OpenStack service logs. - -(3) Overcloud logs - - From the *logs/* folder, you can find a folder named *subnode-2* - which contains most of the overcloud logs.:: - - apache/ - ceph_conf.txt.gz - deprecations.txt.gz - devstack.journal.gz - df.txt.gz - etc/ - home/ - iptables.txt.gz - libvirt/ - listen53.txt.gz - openvswitch/ - pip2-freeze.txt.gz - ps.txt.gz - resolv_conf.txt.gz - rpm-qa.txt.gz - sudoers.d/ - var/ - - To access the OpenStack services logs, you need to go to - *subnode-2/var/log/* when deploying a baremetal overcloud. If the - overcloud is containerized, the service logs are stored under - *subnode-2/var/log/containers*. - - -Replicating CI jobs -~~~~~~~~~~~~~~~~~~~ - -Thanks to `James Slagle`_ there is now a way to reproduce TripleO CI jobs in -any OpenStack cloud. Everything is enabled by the `traas`_ project, -a set of Heat templates and scripts that reproduce the TripleO CI jobs -in the same way they are being run in the Zuul gate. - -When cloning the repo, you just need to set some configuration parameters. A -set of sample templates have been located under -`templates/example-environments`_. The parameters defined in this -template are:: - - parameters: - overcloud_flavor: [*flavor used for the overcloud instance*] - overcloud_image: [*overcloud OS image (available in cloud images)*] - key_name: [*private key used to access cloud instances*] - private_net: [*network name (it must exist and match)*] - overcloud_node_count:[*number of overcloud nodes*] - public_net: [*public net in CIDR notation*] - undercloud_image: [*undercloud OS image (available in cloud images)*] - undercloud_flavor: [*flavor used for the undercloud instance*] - toci_jobtype: [*CI job type*] - zuul_changes: [*List of patches to retrieve*] - -.. note:: The CI job type toci_jobtype can be found in the job definition - under `tripleo-ci/zuul.d`_. - -A good example to deploy a multinode job in RDO Cloud is this -`sample template`_. You can test your out patches by appending -the refs patch linked with the ^ character:: - - zuul_changes: ::[^::]* - -This allows you also to test any patch in a local environment without -consuming CI resources. Or when you want to debug an environment after -a job execution. - -Once the template parameters are defined, you just need to create the stack. -If we would like to deploy the *rdo-cloud-env-config-download.yaml* -`sample template`_ we would need to run:: - - cd traas/ - openstack stack create traas -t templates/traas.yaml \ - -e templates/traas-resource-registry.yaml \ - -e templates/example-environments/rdo-cloud-env-config-download.yaml - -This stack will create two instances in your cloud tenant, one for undercloud -and another for the overcloud. Once created, the stack will directly call -the `traas/scripts/traas.sh`_ script which downloads all required repositories -to start executing the job. - -If you want to follow up the job execution, you can ssh to the undercloud -instance and tail the content from the *$HOME/tripleo-root/traas.log*. All -the execution will be logged in that file. diff --git a/doc/source/upgrade/developer/upgrades/fast_fw_upgrade.plantuml b/doc/source/upgrade/developer/upgrades/fast_fw_upgrade.plantuml deleted file mode 100644 index d6b36818..00000000 --- a/doc/source/upgrade/developer/upgrades/fast_fw_upgrade.plantuml +++ /dev/null @@ -1,190 +0,0 @@ -' The png image can be generated by running: -' -' plantuml fast_fw_upgrade.plantuml - -@startuml - -actor User -participant Mistral -participant Heat -participant Ansible -participant Nodes -' in newer versions of plantuml we should use: collections Nodes - - -' === FFWD-UPGRADE PREPARE === - -User -> Mistral : openstack overcloud\nffwd-upgrade prepare -activate Mistral - -Mistral -> Mistral : plan update - -Mistral -> Heat : stack update -activate Heat - -Heat --> Mistral -deactivate Heat - -Mistral --> User -deactivate Mistral - - -' === FFWD-UPGRADE RUN === - -User -> Mistral : openstack overcloud\nffwd-upgrade run -activate Mistral -note right of Heat - * Operates on all overcloud nodes. - * Intended usage: - * On bootstrap nodes it shuts down services and - performs upgrade to N+1 and N+2. - * On other nodes it just shuts down services. -end note - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : fast_forward_upgrade_playbook.yaml -activate Ansible - -Ansible -> Nodes : fast_forward_upgrade_tasks\n(once per each release) -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : fast_forward_post_upgrade_tasks -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -' === UPGRADE RUN === - -User -> Mistral : openstack overcloud\nupgrade run -activate Mistral -note right of Heat - * Reuse of the normal upgrade command. - * Operates on all selected nodes in parallel. - * Note the separate ansible-playbook invocations: - facts aren't carried over between playbooks. - * Intended usage: - * Upgrades bootstrap nodes from N+2 to N+3. - * Upgrades other nodes from N to N+3. -end note - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : upgrade_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : upgrade_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral -> Ansible : deploy_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : host_prep_tasks -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : deploy_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral -> Ansible : post_upgrade_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : post_upgrade_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -' === FFWD-UPGRADE CONVERGE === - -User -> Mistral : openstack overcloud\nffwd-upgrade converge -activate Mistral -note right of Heat - * Essentially the same as `overcloud deploy`, - asserts that the state of overcloud matches - the latest templates. -end note - -Mistral -> Mistral : plan update - -Mistral -> Heat : stack update -activate Heat - -Heat --> Mistral -deactivate Heat - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : deploy_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : host_prep_tasks -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : deploy_tasks and external_deploy_tasks\nall steps (interleaved) -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -@enduml diff --git a/doc/source/upgrade/developer/upgrades/fast_fw_upgrade.png b/doc/source/upgrade/developer/upgrades/fast_fw_upgrade.png deleted file mode 100644 index 550a2d1ddb3e98b8e2c31e24d42e075193a3a1d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108696 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 N+3 ----------------------------------------------------- - -For a detailed background on how the Fast Forward Upgrade (FFU) workflow was -proposed please refer to the relevant spec_. - -For a guide on running the FFU in your environment see the `FFU Deploy Guide `_. - -.. _ffu_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/post_deployment/upgrade/fast_forward_upgrade.html - -This document will explore some -of the technical details of the Newton to Queens FFU specifically. - -You might find it helpful to consult this high-level diagram as you -read on: - -.. image:: fast_fw_upgrade.png - :scale: 20 % - :alt: Fast forward upgrade workflow diagram - :target: ../../../_images/fast_fw_upgrade.png - -At a high level the FFU workflow consists of the following steps: - -1. Perform a `Minor update`_ on the environment (both undercloud and overcloud) - to bring it to the latest Newton. This will include OS level updates, including kernel - and openvswitch. As usual for minor update the operator will reboot each - node as necessary and so doing this first means the FFU workflow doesn't - (also) have to deal with node reboots later on in the process. - -2. Perform 3 consecutive major upgrades of the undercloud to bring it to - Queens. The undercloud will crucially then have the target version - of the tripleo-heat-templates including the fast_forward_upgrade_tasks - that will deliver the next stages of the workflow. - -3. Generate and then run the fast_forward_upgrade_playbook on the overcloud. This will: - - 3.1 First bring down the controlplane services on **all nodes**. - - 3.2 Then update packages, migrate databases and any other version specific - tasks from Newton to Ocata then Ocata to Pike. This happens only - on a **single node of each role**. - -4. Finally run the Pike to Queens upgrade on all nodes including the Queens - upgrade tasks and service configurations. - -Step 3 above is started by first performing a Heat stack update using the Queens -tripleo-heat-templates from the Queens upgraded undercloud, but without applying any -configuration. This stack update is only used to collect the fast_forward_upgrade_tasks -(ffu_tasks) from each of the services deployed in the given environment and -generate a fast_forward_upgrade_playbook_ ansible playbook. This playbook is -then executed to deliver steps 3.1 and 3.2 above. See below for more information -about how the ffu_tasks are compiled into the fast_forward_upgrade_playbook. - -A notable exception worthy of mention is the configuration of Ceph services -which is managed by ceph-ansible_. That is, for Ceph services there is no -collection of fast_forward_upgrade_tasks from the ceph related service manifests -in the tripleo-heat-templates and so Ceph is not managed by the generated -fast_forward_upgrade_playbook_. Instead ceph-ansible_ will be invoked by -the Queens deployment and service configuration in step 4 above. - -The Heat stack update performed at the start of step 3 also generates the Queens -upgrade_steps_playbook_ and deploy_steps_playbook_ ansible playbooks. One -notable exception is the configuration of Ceph services which is managed -by ceph-ansible_ -Step 4 above (Pike to Queens upgrade tasks and Queens services configuration) -is delivered through execution of these Heat stack update generated playbooks. -Ceph related upgrade and deployment will be applied here with calls to -ceph-ansible_. - -Amongst other things, the P..Q upgrade_tasks stop and disable those systemd -services that are being migrated to run in containers. The Queens `deploy steps playbook `_ -will then apply the required puppet and docker configuration to start the -containers for those services. For this to be possible the Heat stack update -which starts step 3 and that generates the ansible playbooks must include the -required `docker configuration and environment`_ files, including the latest -container images and making sure to set the to-be containerized services to refer -to the equivalent `docker templates`_ for the Heat resource registry. - -.. _Minor update: https://docs.openstack.org/tripleo-docs/latest/install/post_deployment/package_update.html -.. _upgrade_steps_playbook: https://github.com/openstack/tripleo-heat-templates/blob/82f128f15b1b1eb7bf6ac7df0c6d01e5619309eb/common/deploy-steps.j2#L528 -.. _deploy_steps_playbook: https://github.com/openstack/tripleo-heat-templates/blob/82f128f15b1b1eb7bf6ac7df0c6d01e5619309eb/common/deploy-steps.j2#L382 -.. _fast_forward_upgrade_playbook: https://review.opendev.org/#/c/499221/20/common/deploy-steps.j2@541 -.. _docker configuration and environment: https://docs.openstack.org/tripleo-docs/latest/install/containers_deployment/overcloud.html#preparing-the-environment -.. _docker templates: https://github.com/openstack/tripleo-heat-templates/blob/750fa306ce41c949928d5a3a7253aff99dd1af8f/environments/docker.yaml#L7-L58 -.. _ceph-ansible: https://github.com/ceph/ceph-ansible - -FFU and tripleo-heat-templates -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This section will present an overview of how the fast_forward_upgrade_playbook.yaml -is generated from the tripleo-heat-templates. - -FFU uses *fast_forward_upgrade_tasks* (ffu_tasks) to define the upgrade -workflow. These are 'normal' ansible tasks and they are carried as a list in -the outputs section of a given service manifest, see containerized -`neutron-api`_ for an example. - -The ffu_tasks for those services that are enabled in a given deployment are -collected in the outputs of the deploy-steps.j2_ into a -*fast_forward_upgrade_playbook* output. This is then retrieved using the -config-download_ mechanism and written to disk as an ansible playbook. - -The *fast_forward_upgrade_tasks* defined for a given service can use the -**step** and **release** variables to specify when a given task should be -executed. At a high level the fast_forward_upgrade_playbook consists of two -loops - there is a very good explanation in `/#/c/499221 `_ -commit message, but an outer loop for the release (first Ocata tasks then Pike -tasks) and then an inner loop for the steps within each release. - -The *ffu_tasks* which are set to run in steps 0 to 3 are designated the -*fast_forward_upgrade_prep_role_tasks* and these are executed on all nodes for -a given role. Then the *ffu_tasks* which have steps 4 to max (currently 9) are -designated the *fast_forward_upgrade_bootstrap_role_tasks* and these are only -executed on a single node for each role (one controller, one compute etc). - -The top level fast_forward_upgrade_playbook.yaml looks like:: - - - hosts: overcloud - become: true - tasks: - - include_tasks: fast_forward_upgrade_release_tasks.yaml - loop_control: - loop_var: release - with_items: {get_param: [FastForwardUpgradeReleases]} - -The *fast_forward_upgrade_release_tasks.yaml* in turn looks like:: - - - include_tasks: fast_forward_upgrade_prep_tasks.yaml - - include_tasks: fast_forward_upgrade_bootstrap_tasks.yaml - -The *fast_forward_upgrade_prep_tasks.yaml* specifies the loop with -sequence 0 to 3 as explained above:: - - - include_tasks: fast_forward_upgrade_prep_role_tasks.yaml - with_sequence: start=0 end=3 - loop_control: - loop_var: step - -And where the *fast_forward_upgrade_prep_role_tasks.yaml* includes the -*ffu_tasks* on all nodes for each role:: - - - include_tasks: Controller/fast_forward_upgrade_tasks.yaml - when: role_name == 'Controller' - - include_tasks: Compute/fast_forward_upgrade_tasks.yaml - when: role_name == 'Compute' - ...etc - -Similarly for the *fast_forward_upgrade_bootstrap_tasks.yaml* it specifies -the loop sequence for the step variable to be 4 to 9:: - - - include_tasks: fast_forward_upgrade_bootstrap_role_tasks.yaml - with_sequence: start=4 end=9 - loop_control: - loop_var: step - -And where the *fast_forward_upgrade_bootstrap_role_tasks.yaml* include the -*ffu_tasks* only on a single node for each role type:: - - - include_tasks: Controller/fast_forward_upgrade_tasks.yaml - when: role_name == 'Controller' and ansible_hostname == Controller[0] - - include_tasks: Compute/fast_forward_upgrade_tasks.yaml - when: role_name == 'Compute' and ansible_hostname == Compute[0] - ...etc - -.. _neutron-api: https://github.com/openstack/tripleo-heat-templates/blob/master/deployment/neutron/neutron-api-container-puppet.yaml#L415 -.. _spec: https://github.com/openstack/tripleo-specs/blob/master/specs/queens/fast-forward-upgrades.rst -.. _deploy-steps.j2: https://github.com/openstack/tripleo-heat-templates/blob/master/common/deploy-steps.j2#L377 -.. _config-download: https://github.com/openstack/tripleo-common/blob/master/tripleo_common/utils/config.py - diff --git a/doc/source/upgrade/developer/upgrades/links.rst b/doc/source/upgrade/developer/upgrades/links.rst deleted file mode 100644 index b5898615..00000000 --- a/doc/source/upgrade/developer/upgrades/links.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. Links, citations, and others... -.. _RDO Software Factory job definition: - https://github.com/rdo-infra/review.rdoproject.org-config/blob/9668021f655e53413108f8c15988f68caa8d31ba/jobs/tripleo-upstream.yml#L802 -.. _featureset file: - https://github.com/openstack/tripleo-quickstart/tree/master/config/general_config -.. _scenario file: - https://github.com/openstack/tripleo-heat-templates/tree/master/ci/environments -.. _featureset011: - https://github.com/openstack/tripleo-quickstart/blob/master/config/general_config/featureset011.yml -.. _featureset matrix: - https://docs.openstack.org/tripleo-quickstart/latest/feature-configuration.html -.. _tripleo-upgrade: - https://github.com/redhat-openstack/tripleo-upgrade -.. _integrate: - https://review.opendev.org/#/q/topic:link_tripleo_upgrade -.. _James Slagle: - http://lists.openstack.org/pipermail/openstack-dev/2017-February/112993.html -.. _traas: - https://github.com/slagle/traas -.. _templates/example-environments: - https://github.com/slagle/traas/tree/master/templates/example-environments -.. _tripleo-ci/zuul.d: - https://github.com/openstack-infra/tripleo-ci/blob/4042e9c225cf9dac917b8d4c3a245b8ff492056d/zuul.d/multinode-jobs.yaml#L82 -.. _sample template: - https://github.com/slagle/traas/blob/master/templates/example-environments/rdo-cloud-env-config-download.yaml -.. _traas/scripts/traas.sh: - https://github.com/slagle/traas/blob/fb447a585895dd783519dfec68a9728fa72b7609/scripts/traas.sh -.. _CI Status: - http://cistatus.tripleo.org/ -.. _TripleO CI promotion jobs: - http://38.145.34.234/ diff --git a/doc/source/upgrade/developer/upgrades/major_upgrade.plantuml b/doc/source/upgrade/developer/upgrades/major_upgrade.plantuml deleted file mode 100644 index 668505ef..00000000 --- a/doc/source/upgrade/developer/upgrades/major_upgrade.plantuml +++ /dev/null @@ -1,188 +0,0 @@ -' The png image can be generated by running: -' -' plantuml major_upgrade.plantuml - -@startuml - -actor User -participant Mistral -participant Heat -participant Ansible -participant Nodes -' in newer versions of plantuml we should use: collections Nodes - - -' === UPGRADE PREPARE === - -User -> Mistral : openstack overcloud\nupgrade prepare -activate Mistral - -Mistral -> Mistral : plan update - -Mistral -> Heat : stack update -activate Heat - -Heat --> Mistral -deactivate Heat - -Mistral --> User -deactivate Mistral - - -' === UPGRADE RUN === - -User -> Mistral : openstack overcloud\nupgrade run -activate Mistral -note right of Heat - * Operates on all selected nodes in parallel. - * Note the separate ansible-playbook invocations: - facts aren't carried over between playbooks. -end note - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : upgrade_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : upgrade_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral -> Ansible : deploy_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : host_prep_tasks -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : deploy_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral -> Ansible : post_upgrade_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : post_upgrade_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -' === EXTERNAL UPGRADE RUN === - -User -> Mistral : openstack overcloud\nexternal-upgrade run -activate Mistral -note right of Heat - * Executes tasks on undercloud, but can affect - overcloud via delegation or nested Ansible process. - * Single play: facts are carried over between - upgrade and deploy tasks. - * Often limited via `--tags` to perform a particular - upgrade task or an upgrade of a particular service. - * Can be executed before `upgrade run` for some tasks. -end note - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : external_upgrade_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : external_upgrade_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : external_deploy_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -' === UPGRADE CONVERGE === - -User -> Mistral : openstack overcloud\nupgrade converge -activate Mistral -note right of Heat - * Essentially the same as `overcloud deploy`, - asserts that the state of overcloud matches - the latest templates. -end note - -Mistral -> Mistral : plan update - -Mistral -> Heat : stack update -activate Heat - -Heat --> Mistral -deactivate Heat - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : deploy_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : host_prep_tasks -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : deploy_tasks and external_deploy_tasks\nall steps (interleaved) -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -@enduml diff --git a/doc/source/upgrade/developer/upgrades/major_upgrade.png b/doc/source/upgrade/developer/upgrades/major_upgrade.png deleted file mode 100644 index e4943542befce1cd7cfc0579e16e5ce3d51b7974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104158 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 F{vVA|T~Po4 diff --git a/doc/source/upgrade/developer/upgrades/major_upgrade.rst b/doc/source/upgrade/developer/upgrades/major_upgrade.rst deleted file mode 100644 index c2fd8724..00000000 --- a/doc/source/upgrade/developer/upgrades/major_upgrade.rst +++ /dev/null @@ -1,392 +0,0 @@ -Overcloud Major Upgrade Workflow and CLI ----------------------------------------- - -The purpose of this documentation is to deep-dive into the code which -delivers the major upgrade workflow in TripleO. For information about -the steps an operator needs to perform when running this upgrade -please see the `operator docs `_. - -.. _major_upgrade_deploy_guide: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/post_deployment/upgrade/major_upgrade.html - -The major upgrade workflow is delivered almost exclusively via Ansible -playbook invocations on the overcloud nodes. Heat is used to generate -the Ansible playbooks (during the 'prepare' command at the beginning, -and 'converge' command at the end of the upgrade). The -Queens_upgrade_spec_ may be of interest in describing the design of -the workflow. - -CLI code is in python-tripleoclient_, mistral workflows and actions in -tripleo-common_, and upgrade tasks in tripleo-heat-templates_. The -following sections dive into the details top-down per individual CLI -commands which are used to deliver the major upgrade: - -* `openstack overcloud upgrade prepare $ARGS`_ -* `openstack overcloud upgrade run $ARGS`_ -* `openstack overcloud external-upgrade run $ARGS`_ -* `openstack overcloud upgrade converge $ARGS`_ - -You might also find it helpful to consult this high-level diagram as -you read the following sections: - -.. image:: major_upgrade.png - :scale: 20 % - :alt: Major upgrade workflow diagram - :target: ../../../_images/major_upgrade.png - -.. _queens_upgrade_spec: https://github.com/openstack/tripleo-specs/blob/master/specs/queens/tripleo_ansible_upgrades_workflow.rst -.. _python-tripleoclient: https://github.com/openstack/python-tripleoclient/blob/master/tripleoclient/v1/overcloud_upgrade.py -.. _tripleo-common: https://github.com/openstack/tripleo-common/blob/master/workbooks/package_update.yaml -.. _tripleo-heat-templates: https://github.com/openstack/tripleo-heat-templates/blob/8277d675bc9496eb164f429fa265f79252166f2d/common/deploy-steps.j2#L604 - -openstack overcloud upgrade prepare $ARGS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The entry point for the upgrade CLI commands, *prepare*, *run* and -*converge*, is given in the python-tripleoclient setup.cfg_. All three -are also defined in the same file, overcloud-upgrade.py_. - -The 'prepare' Heat stack update does not apply any TripleO -configuration and is exclusively used to generate the Ansible -playbooks that are subsequently invoked to deliver the upgrade. - -As you can see the UpgradePrepare_ class inherits from DeployOvercloud_. The -reason for this is to prevent duplication of the logic concerned with validating -the configuration passed into the prepare command (all the -e env.yaml files), -as well as updating_the_swift_stored_plan_ with the overcloud configuration. - -The prepare_env_file_ is automatically prepended to the list of -environment files passed to Heat (as specified by -prepare_command_prepends_). It contains resource_registry and -parameter_defaults which are intended to be in effect during the -upgrade. - -As a result the UpgradePrepare class inherits all the Deploy_parser_arguments_, -including ``--stack`` and ``-e`` for the additional environment files. We explicitly -set the update_plan_only_ argument so that the Heat stack update does not get -executed by the parent class and returns after completing all the template -processing. - -Instead, the Heat stack update is performed by a mistral workflow. On the -client side the hook is in the update method defined in package_update.py_. -This invokes the package_update_plan_ mistral workflow in tripleo-common. -The package_update_plan_ workflow has a number of tasks, one of which invokes -the heat stack update using the update_stack_action_. - -Back on the tripleoclient side, we use base_wait_for_messages_ to listen -for messages on the Zaqar_queue_ that is used by the mistral workflow. - -The operator must include all environment files previously used with -the `overcloud deploy` command. It is especially important that the -operator includes the environment file containing the references for -the target version container images. - -See the `operator docs `_ for -pointers to how that file is generated and for reference it will look -something like - - .. code-block:: bash - - parameter_defaults: - DockerAodhApiImage: 192.168.24.1:8787/queens/centos-binary-aodh-api:current-tripleo-rdo - DockerAodhConfigImage: 192.168.24.1:8787/queens/centos-binary-aodh-api:current-tripleo-rdo - DockerAodhEvaluatorImage: 192.168.24.1:8787/queens/centos-binary-aodh-evaluator:current-tripleo-rdo - DockerAodhListenerImage: 192.168.24.1:8787/queens/centos-binary-aodh-listener:current-tripleo-rdo - -Once the Heat stack update has been completed successfully and the stack is -in UPDATE_COMPLETE state, you can download the configuration ansible playbooks -using the config download cli - - - .. code-block:: bash - - [stack@521-m--undercloud ~]$ source stackrc - (undercloud) [stack@521-m--undercloud ~]$ openstack overcloud config download --config-dir MYCONFIGDIR - The TripleO configuration has been successfully generated into: MYCONFIGDIR/tripleo-gep7gh-config - -and you can inspect the ansible playbooks which are used by the *upgrade run* -before executing them. - - -.. _setup.cfg: https://github.com/openstack/python-tripleoclient/blob/e9a68430400a6b99005c6aa675bf9bd27ed810a1/setup.cfg#L88-L90 -.. _overcloud-upgrade.py: https://github.com/openstack/python-tripleoclient/blob/f0110cdff0edcf40d8e94d4848c543310ea5c54e/tripleoclient/v1/overcloud_upgrade.py#L14 -.. _UpgradePrepare: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L29 -.. _DeployOvercloud: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_deploy.py#L44 -.. _updating_the_swift_stored_plan: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_deploy.py#L301 -.. _update_plan_only: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L72 -.. _deploy_parser_arguments: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_deploy.py#L689-L890 -.. _package_update.py: https://github.com/openstack/python-tripleoclient/blob/3d9183fc03aa96bce093e774ab4bf51655579a9c/tripleoclient/workflows/package_update.py#L34 -.. _package_update_plan: https://github.com/openstack/tripleo-common/blob/1d3aefbe2f0aac2828eba69ee9efc57a7b7bf385/workbooks/package_update.yaml#L9 -.. _update_stack_action: https://github.com/openstack/tripleo-common/blob/4d7258c2d8a521818146368568da07fd429e5a23/tripleo_common/actions/package_update.py#L100 -.. _base_wait_for_messages: https://github.com/openstack/python-tripleoclient/blob/3d9183fc03aa96bce093e774ab4bf51655579a9c/tripleoclient/workflows/package_update.py#L38 -.. _zaqar_queue: https://github.com/openstack/tripleo-common/blob/1d3aefbe2f0aac2828eba69ee9efc57a7b7bf385/workbooks/package_update.yaml#L17 -.. _prepare_command_prepends: https://github.com/openstack/python-tripleoclient/blob/3d9183fc03aa96bce093e774ab4bf51655579a9c/tripleoclient/v1/overcloud_upgrade.py#L76-L79 -.. _prepare_env_file: https://github.com/openstack/tripleo-heat-templates/blob/3ab23982a2fd3ffcad09e76f226bd4aab4040d4e/environments/lifecycle/upgrade-prepare.yaml#L4-L12 - -openstack overcloud upgrade run $ARGS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Unlike the first step in the workflow, the *upgrade prepare*, the UpgradeRun_ -class does not inherit from DeployOvercloud. There is no need for the operator -to pass all the environment files and configuration here. The template processing -and update of the stack and swift stored plan have already taken place. -The ansible playbooks are ready to be retrieved by config download as demonstrated -above. The upgrade run operation thus will simply execute those ansible playbooks -generated by the upgrade prepare command, against the nodes specified in the -parameters. - -Either ``--nodes`` or ``--roles`` parameters are used to limit the ansible -playbook execution to specific nodes. Both ``--roles`` and ``--nodes`` are -used by ansible with the tripleo-ansible-inventory_. This creates the -ansible inventory based on the Heat stack outputs, so that for example -``Controller`` and ``overcloud-controller-0`` are both valid values for -the ansible-playbook |--limit| parameter. - -See `overcloud upgrade run `_ for additional information. - -.. _overcloud_upgrade_run: https://docs.openstack.org/project-deploy-guide/tripleo-docs/latest/post_deployment/upgrade/major_upgrade.html#openstack-overcloud-upgrade-run - -As documented in the major upgrade documentation and the nodes_or_roles_helptext_, -the operator *must* use ``--roles`` for the controllers. Upgrading the -controlplane, one node at a time is currently not supported, mainly -due to limitations in the pacemaker cluster upgrade which needs to -occur across all nodes in the same operation. The operator may use -``--roles`` for non controlplane nodes or may prefer to specify one or -more specific nodes by name with ``--nodes``. In either case the value -specified by the operator is simply passed through to ansible as the -limit_hosts_ parameter. - -The ``--ssh-user`` and all other parameters are similarly -collected and passed to the ansible invocation which starts on the client side -in the run_update_ansible_action_ method call. The |--skip-tags| -parameter can be used to skip certain ansible tasks with the ansible-skip-tags_ -ansible-playbook parameter. The allowed ``--skip-tags`` values are restricted -to a predefined set, validated against -MAJOR_UPGRADE_SKIP_TAGS_. Finally, the |--playbook| parameter as the name -suggests is used to specify the ansible playbook(s) to run. By default and -as you can see in the definition, this defaults to a special value 'all' -which causes all-upgrade-playbooks-to-run_. The value of all_playbooks -in that previous reference, is stored in the MAJOR_UPGRADE_PLAYBOOKS_ constant. - -As with the *upgrade prepare*, for *upgrade run* a mistral workflow is used -to perform the 'main' operation, which in this case is execution of the -ansible playbooks. On the client side the update_nodes_workflow_invocation_ -is where mistral is invoked and takes as workflow input the various collected -parameters described above. You can see that the update_nodes_workflow_ which -lives in tripleo-common has parameters defined under the 'input:' section which -correspond to the *openstack overcloud upgrade run* parameters. - -There are two main tasks in the update_nodes_workflow_, the download-config_action_ -which is invoked in a first 'download_config' task, and the ansible-playbook_action_ -action which is invoked in the 'node_update' task. This is ultimately where -ansible-playbook-is-executed_ with processutils.execute. - -Finally back on the client side we listen for messages on the run_zaqar_queue_ -before declaring the upgrade-run-success_! - - -.. _UpgradeRun: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L94 -.. _tripleo-ansible-inventory: https://github.com/openstack/tripleo-common/blob/cef9c406514fd0b01b7984b89334d8e8abd7a244/tripleo_common/inventory.py#L1 -.. |--limit| replace:: ``--limit`` -.. _--limit: https://docs.ansible.com/ansible/2.4/ansible-playbook.html#cmdoption-ansible-playbook-l -.. _nodes_or_roles_helptext: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L111-L131 -.. _limit_hosts: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L207-L212 -.. _run_update_ansible_action: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L212-L217 -.. |--skip-tags| replace:: ``--skip-tags`` -.. _--skip-tags: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L211 -.. _ansible-skip-tags: https://docs.ansible.com/ansible/2.4/ansible-playbook.html#cmdoption-ansible-playbook-skip-tags -.. _MAJOR_UPGRADE_SKIP_TAGS: https://github.com/openstack/python-tripleoclient/blob/3931606423a17c40a4458eb4df3c47cc6a829dbb/tripleoclient/constants.py#L56 -.. |--playbook| replace:: ``--playbook`` -.. _--playbook: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L133-L150 -.. _all-upgrade-playbooks-to-run: https://github.com/openstack/python-tripleoclient/blob/3931606423a17c40a4458eb4df3c47cc6a829dbb/tripleoclient/utils.py#L946 -.. _MAJOR_UPGRADE_PLAYBOOKS: https://github.com/openstack/python-tripleoclient/blob/3931606423a17c40a4458eb4df3c47cc6a829dbb/tripleoclient/constants.py#L53 -.. _update_nodes_workflow_invocation: https://github.com/openstack/python-tripleoclient/blob/3931606423a17c40a4458eb4df3c47cc6a829dbb/tripleoclient/workflows/package_update.py#L85 -.. _update_nodes_workflow: https://github.com/openstack/tripleo-common/blob/cef9c406514fd0b01b7984b89334d8e8abd7a244/workbooks/package_update.yaml#L99-L114 -.. _download-config_action: https://github.com/openstack/tripleo-common/blob/cef9c406514fd0b01b7984b89334d8e8abd7a244/tripleo_common/actions/config.py#L65 -.. _ansible-playbook_action: https://github.com/openstack/tripleo-common/blob/cef9c406514fd0b01b7984b89334d8e8abd7a244/tripleo_common/actions/ansible.py#L243 -.. _ansible-playbook-is-executed: https://github.com/openstack/tripleo-common/blob/cef9c406514fd0b01b7984b89334d8e8abd7a244/tripleo_common/actions/ansible.py#L533-L535 -.. _run_zaqar_queue: https://github.com/openstack/python-tripleoclient/blob/3931606423a17c40a4458eb4df3c47cc6a829dbb/tripleoclient/workflows/package_update.py#L89 -.. _upgrade-run-success: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L219-L222 - -openstack overcloud external-upgrade run $ARGS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The `external-upgrade run` command is used to upgrade the services -whose deployment (and upgrade) procedure is not tied to execution on -particular overcloud nodes. The deployment/upgrade procedures are thus -executed from the undercloud, even though a full overcloud inventory -is available for use. - -The `external upgrade playbook` first executes -`external_upgrade_tasks` and then `external_deploy_tasks`. The -execution happens within the same Ansible play, so facts from -`external_upgrade_tasks` are carried over to -`external_deploy_tasks`. This is a mechanism which will allow you to -amend what your deploy tasks do based on whether an upgrade is being -run or not. - -Often it's not desirable to run the tasks for all services at the same -time, so `external-upgrade run` supports ``--tags`` argument to limit -which tasks are run. - -The mechanisms of `external-upgrade` and `external-update` commands -and Ansible tasks are the same, but two commands and task hooks are -provided because generally in OpenStack we distinguish minor update -vs. major upgrade workflows. If your service only has one type of -upgrade, you can make the `external_update_tasks` the same as -`external_upgrade_tasks` by using YAML anchors and references. - -.. _external upgrade playbook: https://github.com/openstack/tripleo-heat-templates/blob/8fd90c2d45e2680b018eae8387d86d420f738f5a/common/deploy-steps.j2#L767-L822 - -openstack overcloud upgrade converge $ARGS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The UpgradeConverge_ class like the UpgradePrepare class also inherits from -the DeployOvercloud_ class thus getting all of its parameters and template -processing. The operator needs to pass in all Heat environment files -used as part of the upgrade prepare including the container images file. - -The main objective of the upgrade converge operation is to unset the -upgrade specific parameters that have been set on the overcloud Heat -stack as part of prepare. These are unset using the converge_env_file_ -which is included in the list of client_converge_env_files_ passed to -the Heat stack update. - -The 'converge' applies all TripleO configuration against all overcloud -nodes and thus serves as a sanity check that the overcloud was -successfully upgraded, since the same configuration will already have -been applied. The 'converge' will also leave the Heat stack in a good -state for subsequent updates, for instance scaling to add nodes. - -As these values are set in parameter_defaults a Heat stack update is required -against the overcloud Heat stack to explicitly unset them. In particular and -as pointed out in the operator_converge_docs_ until converge has completed, -any operations that require a Heat stack update will likely fail, as the -'noop' of the DeploymentSteps in the prepare_env_file_ in particular means -none of the usual docker/puppet/* config is applied. Setting something with -parameter_defaults means it is used until explicitly unset via parameter_defaults -as that value will override any other default value specified via the -tripleo-heat-templates. - -Unlike the prepare command there is no mistral workflow here and instead -we rely on the parent DeployOvercloud_ class to invoke the -converge_heat_stack_update_ and so the implementation is also simpler. - -.. _UpgradeConverge: https://github.com/openstack/python-tripleoclient/blob/3931606423a17c40a4458eb4df3c47cc6a829dbb/tripleoclient/v1/overcloud_upgrade.py#L225 -.. _client_converge_env_files: https://github.com/openstack/python-tripleoclient/blob/c7b7b4e3dcd34f9e51686065e328e73556967bab/tripleoclient/v1/overcloud_upgrade.py#L253 -.. _operator_converge_docs: https://docs.openstack.org/tripleo-docs/latest/install/post_deployment/upgrade.html#openstack-overcloud-upgrade-converge -.. _converge_heat_stack_update: https://github.com/openstack/python-tripleoclient/blob/3931606423a17c40a4458eb4df3c47cc6a829dbb/tripleoclient/v1/overcloud_deploy.py#L223 -.. _converge_env_file: https://github.com/openstack/tripleo-heat-templates/blob/3ab23982a2fd3ffcad09e76f226bd4aab4040d4e/environments/lifecycle/upgrade-converge.yaml#L4-L7 - -Upgrade CLI developer workflow -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This section will give some examples of a potential developer workflow for -testing fixes or in-progress gerrit reviews against python-tripleoclient, -tripleo-common or tripleo-heat-templates for the upgrade workflow. This -may be useful if you are working on an upgrades related bug for example. - -Making changes to the ansible playbooks -....................................... - -If there is a failure running one of the upgrades related ansible playbooks, -you might need to examine and if necessary fix the related ansible task. -The tasks themselves live in each of the tripleo-heat-templates service -manifests, under the upgrade_tasks section of the template outputs. For example -see the containerized rabbitmq_upgrade_tasks_. - -If you make a change in service upgrade_tasks, then to test it you will need to - -1. Patch the tripleo-heat-templates in your environment with the fix -2. Rerun `openstack overcloud upgrade prepare $ARGS`_, so that the resulting - ansible playbooks include your fix. -3. Finally run the playbooks with `openstack overcloud upgrade run $ARGS`_. - -Assuming you are using the default /usr/share/openstack-tripleo-heat-templates -directory for the deployment templates you can use the following as just one -example: - - .. code-block:: bash - - # backup tht in case you want to revert - or just yum re-install ;) - sudo cp -r /usr/share/openstack-tripleo-heat-templates \ - /usr/share/openstack-tripleo-heat-templates.ORIG - # Apply patch from gerrit e.g. https://review.opendev.org/#/c/563073/ - curl -4sSL 'https://review.opendev.org/changes/563073/revisions/current/patch?download' | \ - base64 -d | \ - sudo patch -d /usr/share/openstack-tripleo-heat-templates/ -p1 - -Making changes to the upgrades workflow -....................................... - -If instead you need to add or fix something in the upgrades workflow itself, -for example to handle a new parameter needed passed through to ansible, or any -other change, you will need to patch python-tripleoclient and tripleo-common, -depending on whether your fixes extend to the mistral workflow too. - -There are many ways to patch your environment and the following is a different -approach to the one used in the tripleo-heat-templates above where we patched -the installed templates in place. In the following examples instead we clone -tripleo-common and tripleoclient, patch them using gerrit reviews and then -re-install from source. - - .. note:: - - The following example commands include complete removal and replacement - of the installed tripleoclient and tripleo-common! - -Patching python-tripleoclient: - - .. code-block:: bash - - # python-tripleoclient - clone source, patch from gerrit and install - git clone https://github.com/openstack/python-tripleoclient.git -b stable/queens ~/python-tripleoclient - pushd ~/python-tripleoclient - - # Apply patches from gerrit e.g. https://review.opendev.org/#/c/564267 - curl "https://review.opendev.org/changes/564267/revisions/current/patch" | \ - base64 --decode > /home/stack/"564267.patch" - patch -N -p1 -b -z .first < /home/stack/564267.patch - # Remove current version and re-install - sudo rm -rf /usr/lib/python2.7/site-packages/python_tripleoclient* - sudo rm -rf /usr/lib/python2.7/site-packages/tripleoclient - sudo python setup.py clean --all install - popd - -Patching tripleo-common: - - .. note:: - - After switching to containerized undercloud, local tripleo-common - changes to be applied in all Mistral containers. - - .. code-block:: bash - - # tripleo-common - clone from source, patch from gerrit and install - git clone https://github.com/openstack/tripleo-common -b stable/queens - pushd ~/tripleo-common - # Apply patches from gerrit e.g. https://review.opendev.org/#/c/562995 - curl "https://review.opendev.org/changes/562995/revisions/current/patch" | \ - base64 --decode > /home/stack/"562995.patch" - patch -N -p1 -b -z .first < /home/stack/562995.patch - # Remove current version and re install - sudo rm -rf /usr/lib/python2.7/site-packages/tripleo_common* - sudo python setup.py clean --all install - popd - sudo cp /usr/share/tripleo-common/sudoers /etc/sudoers.d/tripleo-common - -Finally you need to update the mistral workbooks with the newly installed -versions. In code block above, the tripleo-common change at 562995_ has changed -package_update.yaml and so that is what we need to update here: - - .. code-block:: bash - - mistral workbook-update /usr/share/tripleo-common/workbooks/package_update.yaml - # Since entry_points.txt is affected next steps are required: - # Re populate mistral db and restart services - sudo mistral-db-manage populate - sudo systemctl restart openstack-mistral-api.service - sudo systemctl restart openstack-mistral-engine.service - sudo systemctl restart openstack-mistral-executor.service - -.. _rabbitmq_upgrade_tasks: https://github.com/openstack/tripleo-heat-templates/blob/master/deployment/rabbitmq/rabbitmq-messaging-rpc-pacemaker-puppet.yaml#L305 -.. _562995: https://review.opendev.org/#/c/562995 diff --git a/doc/source/upgrade/developer/upgrades/major_upgrade_with_os.plantuml b/doc/source/upgrade/developer/upgrades/major_upgrade_with_os.plantuml deleted file mode 100644 index 3d88e3ff..00000000 --- a/doc/source/upgrade/developer/upgrades/major_upgrade_with_os.plantuml +++ /dev/null @@ -1,214 +0,0 @@ -' The png image can be generated by running: -' -' plantuml major_upgrade_with_os.plantuml - -@startuml - -actor User -participant "undercloud" -participant "controller-0" -participant "controller-1" -participant "controller-2" - -' === PREPARE === - -note left of undercloud #AAFFAA - If controllers == 1, env file - is given to prefer `persist/restore` - instead of `transfer` for MariaDB. -end note -User -> "undercloud" : openstack overcloud upgrade prepare -note right - Update heat outputs using latest templates. -end note -User <-- "undercloud" - -' === REPROVISION === - -User -> "controller-0" : openstack overcloud upgrade run\n --tags system-upgrade-prepare \n --playbook upgrade-playbook.yml \n --node controller-0 -note right - Persist data from the bootstrap node - while it is live. - (Fetch the data to the undercloud.) - - if controllers == 1: - mariadb and other data (composable) - - if controllers > 1: - only other data (composable) -end note - -"undercloud" <- "controller-0" -note left: /var/lib/mistral/tripleo-persist/ -User <-- "controller-0" - -User -> "controller-0" : openstack server rebuild controller-0 -note right - Reprovision to the new OS. -end note - -User <-- "controller-0" - -User -> "controller-0" : openstack overcloud upgrade prepare\n(or enable-ssh-admin.sh, will be improved upon) -note right - Install Mistral ssh keys -end note - -User <-- "controller-0" - -User -> "controller-0" : openstack overcloud upgrade run\n --tags system-upgrade-run \n --playbook upgrade-playbook.yml \n --node controller-0 -note right - Restore the data onto bootstrap node. - (Push the data from the undercloud.) - - if controllers == 1: - mariadb and other data (composable) - - if controllers > 1: - only other data (composable) -end note - -User <-- "controller-0" - -' === TRANSFER DATA === - -group Transfer the data to the freshly re-installed controller\n(only required in multi-controller environments) -note over "undercloud", "controller-2" #AAFFAA - Everything is composable, but diagram showcases MariaDB specifically -end note -User -> "undercloud" : openstack overcloud external-upgrade run -"undercloud" -> "controller-1" : pcs resource disable\ngalera-bundle -note right: Disable MariaDB -"controller-1" -> "controller-2" -note right: Disable MariaDB - -note over undercloud, "controller-2" #FFAAAA - control plane outage. -end note - - -"undercloud" -> "controller-1" : transfer module run in ansible -note right - Transfer data: - - if controllers == 1: - nothing - - if controllers > 1: - mysql data -end note - -"controller-1" -> "undercloud": get the data -note left: /var/lib/mistral/tripleo-transfer/ -User <-- "controller-1" - -"undercloud" -> "controller-0": push the data -note right - extract the data -end note - -User <-- "undercloud" -end - -' === START CONTROLLER 0 === - -"User" -> "controller-0": openstack overcloud upgrade run --nodes controller-0 -note right - Configure OpenStack, - start a new cluster. - (1 node total) -end note - -note over undercloud, "controller-2" #FFAAAA - controller-0 is a one node cluster running the latest version - of tripleo on the new os. - The controller plane is back. -end note - -User <-- "controller-0" - -' === ADD CONTROLLER 1 === - -User -> "controller-1" : openstack overcloud upgrade run\n --tags system-upgrade-prepare \n --playbook upgrade-playbook.yml \n --node controller-1 -note right - Persist data - (composable) -end note - -"undercloud" <- "controller-1" -note left: /var/lib/mistral/tripleo-persist/ - -User -> "controller-1" : openstack server rebuild controller-1 -note right - Reprovision to the new OS. -end note - -User <-- "controller-1" - -User -> "controller-1" : openstack overcloud upgrade prepare\n(os oc reprovision ssh-admin) -note right - Install Mistral ssh keys -end note - -User <-- "controller-1" - -User -> "controller-1" : openstack overcloud upgrade run\n --tags system-upgrade-run \n --playbook upgrade-playbook.yml \n --nodes controller-1 -note right - Restore data - (composable) -end note - -User <-- "controller-1" - -"User" -> "controller-1": openstack overcloud upgrade run --nodes controller-0,controller-1 -"User" -> "controller-0": -note right of "controller-1" - Configure OpenStack, - join the cluster. - (2 nodes total) -end note - -User <-- "controller-1" - -' === ADD CONTROLLER 2 === - -User -> "controller-2" : openstack overcloud upgrade run\n --tags system-upgrade-prepare \n --playbook upgrade-playbook.yml \n --node controller-2 -note right - Persist data - (composable) -end note - -"undercloud" <- "controller-2" -note left: /var/lib/mistral/tripleo-persist/ -User <-- "controller-2" - -User -> "controller-2" : openstack server rebuild controller-2 -note right - Reprovision - to the new OS. -end note - -User <-- "controller-2" - -User -> "controller-2" : openstack overcloud upgrade prepare\n(os oc reprovision ssh-admin) -note right - Install Mistral - ssh keys -end note - -User <-- "controller-2" - -User -> "controller-2" : openstack overcloud upgrade run\n --tags system-upgrade-run \n --playbook upgrade-playbook.yml \n --nodes controller-2 -note right - Restore data - (composable) -end note - -User <-- "controller-2" - -"User" -> "controller-2": openstack overcloud upgrade run --nodes controller-0,controller-1,controller-2 -"User" -> "controller-1": -"User" -> "controller-0": -note right of "controller-2" - Configure OpenStack, - join the cluster. - (3 nodes total) -end note - -User <-- "controller-2" - -@enduml diff --git a/doc/source/upgrade/developer/upgrades/major_upgrade_with_os.png b/doc/source/upgrade/developer/upgrades/major_upgrade_with_os.png deleted file mode 100644 index d678128722b62bcc889ad724cb854346ee742d9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181519 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,Q0x3#W?I(JBN1$>_w6%@6IX&n6 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

Dpo=b___0rSKh25_eeH?$aid6~i#QP!@6T!+i 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 @!m2XUiYecsXc8qCiwv4+3$MWuPsOj1$ zz9?GIT^G(eDDL#Rc{5YOrrLEyyDFwleR(*|JmO7>8papAYyC#x@xxs@K8RbMmpi+; zQhVTMIsuJ&o)(L9L7*S09eW&`wZy zY;3VsR@B(D^?z|07Fugc@}%JtSuKrF!|dG0sK-x>KJC(%lG63F^gPTd4?f3*To59X zW2;qon@9{#1{Vi)cfreHDnfbg8`80br0K!hg|^5;NiPTIMa@0u#r4jM*28ocTc@?y z*wj3BpCs7@G015|loExbQBtEW+pJTR?6vNzlh+Lmk&pVR1w=Gg7w>Sqm3qtlXm35K zUw_d&Fi|yvy)3u&q4@6B$aiJOIN#J1py9!#rlkJ(IfA`Lyy>zduP;(ZHxCr^M$f-oj9>zw*D}X}M*UwsvN6 zN@8!DCO+mm&E3P(#KyB4){mE)LtQvckHtl@I&^b5kO_*(7C$N+P1@hw5HQYAig@Fo zj)6k;_Ry*6 zQ^7{{_9fRXN@_$L$?96Ni2hJb^>RDky3~%BM^BY}`;6u6r7KCXV`JCs)2?{loM@ua zL8<9mdb5Vo-FUNp8BxPpE#h&|&Q}v4p_akd#LC7dNMj1h%7E5+e&ByHV|rAWlJvx! zUtF=Ye33On!6u;GGD-gj& z>0Ke86n**z8coZGdowmaGj%`sc6LCkwX5q%o!94IzgU~XF7ew93$Y;(s6Zkr$rAI> zg%`WSa(C`8TUr?cB1Gi@aaf`5(OF#WEk|ND+yi<{~_y zjl95k24w&?HW}84iGK#W&oSa14KjTrJoTCaiZ=eUeXs$Xob-s!HY%|-!4V4wHc(YI z>dKPOpF{d{u3(1LKAW|7NxCPqDmJjbMtgT~BVUdZ!4hY5G)CnBEA#u{pei@Auq=$| ztV?8Ekm7mlj*ZVX;E9V5AyfF&&6~LYc^$N1|8BrU@G@AG zU1Y}oSohp{3hWzi4f?onZ|W^n_xbnY;(YAIJ$Z@W8~HSdcl(f56XW0{Qi?Zrdxw!Y z?WAf)Qy}2#6?70i`<{V#=UiR6%oIj@zvHqOgjGT#*E?rK|9LeP71a%l6AucCR=2cX zRak;`$)?`k3I;cHed|}?863z7n7o#V7=F%?%A64w|EU2pw-9FTN5Q+to@tjAj^9Sf zr?ClluyUgBHfasd80pzxdbR9O2et<8pV3Fd5n1AKydHTv#638*Xb$ zp2v6DM?QE$1s5S1u3I|Esl2uV4Rmz_a&jCsH1y;92B;cIAns#Rle`IA?SURH#`_g^lpHAohrXcVg@tBcd2c=uJleSg%K8nkq z&tQQBWtoqzhfk|@G_q315fY>Jxq3BK_i~+i;HU!MP`;rQ=hctlv9Wd*3mY723G-Gg zgmLmwYMx^y}2r zhmmS(6jvA|8oD1EKYo12lZPX4QoqDF$7akeQNE{0-yqKk6Z0*I;mJB2Fwrb7uC;Yq zAw5@)Z#1`N`M(cHeEv>84f{}Vu#bt!>jyQ$)z!{s+2{4^QY%(PkgEGOG$g=cMyD6@ z{Q+laWIM%}yJ+3OK%`Yx=F_aVZ#|ThURp0LR89rk%8T@ zhrU}?d1a-6$&_x5wBWOir)MlIq?@w2wBCo)J}wY4&KSPgL5Aoz9%e==dPXxL=ue&j zc6Q(w4jIcNH|x9{DI@yy$;JxBqt`6hyS?1hb1|>Pf#pk_ww1cdpX{EHAY->Gng798qH|ehmq=JlIJPZadFCJZc`WMzqhM z`zwRc6E!9{LPRc??qnb0TIHir&6Q~{u0;4CIK@#?e=J>7z! zm|K&BEGVt@$YSZcV5eyR;)SWeMWhvW219gsr{ob0wan@~A%c?-fddJd4;&=K?_i#f z^W((f!=bMK2&RLWtQeK{p>f)~PK1Xm} zd98RTT3VX;NzKd0Mpv<4Cysa-ar#yS_AIMQv+oFy)&x!{a1Viu1{+|QSN8;u` zy6K8gm?%!NSCpqqQwLW3=eapD_kG=sxyMDOf&0o*62~suu%f=$pBX{N3=hZMzjwac zRrJ04?w{AhH6|_MP%FDYYvj1|oZam8>k8DSARlqMF(~ezC7gq*U_zXDVu6SxDkm#2 zgH=pio}2qY<|+%zLrf1<&S;r6o-pVpf9vc7_o0U}fr)zsGOzz0%De`G5*K8cDSJzv z@m{+RKG~W&7q{m#BINYhBc?gnzwI`MLR%=DDKzDoX5P2*)E?O{H^HUrlx*K+so%7y z6yvR}$)7(7h>0x;ET({^_67hzN?HZ^SLZ{*w~eetDnVAn068^w`?CeZN zM0BY>FyvBp3xQ?1BK5zHhlymBmV?PLodF!?Ai$jQ{oOmN@0|?|TJy6%;tK>VO3m6| zvL26BYq#<77_@RAQ{5E@nmLdHL-L%rsJ~4|^vGRfB_Jr^)KC~^qo(KI{Y-fdn-AdN zbUCA-GQ)}Zrmk~w5D$fLw2*vuR&b#?9jYEM6N{x{ZNJH%OZKSNnLJ)L!OS*RW5 zkbE*T`=Ocrp4?0+t}ltY`uPNa7kRM*SEBnrCZWa4#;~JCG2<2vy3po&dB`b zN+`T^r!epuK2p`70wW6V?-IzPBX{d_yw|(rH1a5$z_~IStzEFUC!BD)S&M#L z0x4*I{^J@L?6vlHBnGD@UAV%^so^>;i>`2#EOFTD%{QnAgqN`JDio$q787>58t7ua z&4N*h_QPTc?Up6sAqs`4iH{HH1jqo=ZM@LXdK79ke-;(?4xyk6& z{$@60fBz~G(HNkxNrOY#r3CHYFZ3+_cS$D_PuNt ziDsN=hkX%N=t(Wb*dLqsl?s1eq5WI8u<-n+)`Cs`x^Mw{cIo0pXc6A`FC?-34j^Yw zcc=Slw_*Y8?y)LOvsnhx7w%9TWgw@(CYC4nH-~fP!exL`?Sr#>$tQkYUL-@&(Mg%EC!PyLeNA3iIc@SCy6Q!j&aLv2Zs%i z9)SW-B?%>>Us=ZJAA-ZqS0wBzSbH&AH;Y?j$txh;?s!BPzV0_R2Pw#ODm*zd!hQC23x z%GwMb01XX3M}RSF8_4?nlw~9!JUm0Z$ru$MKXQCHetfvw=?S3Z@_S4=6%O;AQpevZ zD?yMA6tDoc1OQnOxdIwP=kz#0^r`PDra42Cwl#>M|2aT#(;w*QT$~x~>tmNYZ)iz% zH@ojejm54{^Q`hhr0wBpRfDIhs^o`J<{N+hd~0u46z?iiTY6X2Ea$MW3=79{cL;v?)8)5hmWwHFTUPL4v zii?nru8f7IeeY5c-SVWt(7zUYqE$uNu9aTmU}p4@!mOe~*K?yAe@nXN@9eon-xPM! zt9TmDB3RU{F|=^a(m_^j{?@}skCdLcptRjUO(N|goB_$8So52W2si7LU~paXyt3zR zyJ5_;7bI_GH~viA{S6xMScB(hli*mYUi^U7WDR_^9!P;HqO^bvg{k9%Bal0T+O_up zXJDdnJ3*t8@Y4q4LDOB4p1*9bgVT5KV{SarB1d!xK;H29u?0;=BDZ*}t7(3mV+u5vE*%W$*=Aj&APydV&odP}@49WAMVyw#)mrj28Pd22L+u^T zLs$roN+`8N0}YIN`@znXfOG@`X~lc8gdse9l!i*iOxiVME-3&nTI%Yqa&axzzd8f- z5kMT$+h2JU(Xk4)Q@w^PYqPWE(PO$-k>3Lt`uT1e%lIp4V)XU( zwVA)XTushK6P0MnVJP)Fw5;QU4fL$xE8Cz8ZyPl#U1g=CM)ZeQfYs)Bmr4@P*J*{c zw+-894i5@=#|;{=iu^usmz)ST#oL$Xpbq!C#26S1#9}Vab52^5=CPN+w0(<>k zU00*z85kJ+swY5l4!moHZqLlCn3*?(Ww@E+(&xpmh0t{A18ji4sscU&O2qrKP zw_uGmfpW^(v&L(O2M3RwXQE)wczfXN>RN0p3g{7d7VjLR-oIChx$ccEeGG6)-28-w z-C;x@Gi-rfL~U&gfbqN*41_0sQBf`63i7e${bbYQgAoBM_lGd)AQlea!(2a^Gq732 zfzp(gmKL}&Ze?jp%Y0I+OiWC~QYpff_4N}9MTI~aaja^nsVNPF+UEoo?24D#n-i;>7Ggl0u$r7LLSSX^{8?kVE0(hOoy+~40OB0>Hg zoAVCFZ4csqlhZG17}lmo8O!uaN>MN*dAGTDQwK9}Oij0TCIzLP6}7!Av%9_0Qory|ZkR|xUip7$ z`|fxu|L|{0sT9fzp&~-aURfAt zZcU`>y$eC#Nx;9Rd%F6aOJ-)Kx2i^?{@aSjpGo7sH;W}ZAZs(A1Cpu84o~+DJ-a1t zz9sH$#cV3~iS^W1^Iy$m*3pZ@zQ<2F7MI|rz8cWeiGBO~b+v6Fe=SiVi={a~(PU2dqh!*FJV8R3Po}C-*dGZ`=#yd+Z}RNC7@~COvEHS}o0X zPFF~a@kUJSh^bbmx67QZMrj@vM5D|XQEy^mmcM=wE0uO2Pr|6hdtvea6zjdRIid!W z+fGsUsZ9)P6N-1&1*ZuPVRbMns_7*qFfC_3n{B~)0jVbXJ?n`#=nf~#c1)0V5f_Ra zPCD$BioH<9d>9*hx*B@vkPxo2q@v4iA$O=6IN2R#HR71${&6IkuE<{9gA&fc*3E-Xa_CUPg7wBGvfVa0zO7jn~gW3vC3QvT9ilm9~{zcX0>KX;ddO1_vOU$fR-RZmfK%5wuZU-{TZtuX;4X8M%AaLlIWpsZ z>BX^7ImYiRFP+9toxkVuJKC^5$S*|k`xK{{nI`*P+9a&!%ahQ{RXIBzkv07r5JPE46T7|&T-ooel;E*&f~z82=Oqz9ASBl9Q8MZ0R4EhorDW2`PwoF_6` zk)35a6ZZVMMnv|d1v3A@XjgtPzHzH$Ry`!v{swh*{z${$w}$cpNpd!JVN@*Q-O+53 z6X`+N1QGtEYhKijhTTnJtEW!=97rlH&B=1l;tRdUuJr~b&ghwqii*Eh+B7KCu(&q+ zP>iCe$OM8VeR)_E=9K*PDtA?Re>G@%2 z@c4EP17AR?T~7|xNJ;i4PzCoU4S@j?&i3}PsW)eQ`cxXudH@l4Kn+)l)#QRJRz7Ak zF1G({?Za$%*RyF+(yT(*Cu?Tj%~4URY7K7d_s`o0C)9c{d|}x^E&35bm#xNr3lk^M z>Penm<9;gh8C2^|!6O0Ghu^qD5B8`OK?J6O5SHtuKR^#S5_U^0H3|X$QBZgb%V%@s zlgX*Fxh&0LLqg0)?$dah$0TJOZ~uR86(ag>$!k>YHkXjWY5eQ2it6EB{rC>WIHfP$ zznW~x{VM<9Ii9&@`1m2?{(m5p^Fc4MPc};8VpqeD>a(%?n=nWt9p*k(_}5wmkTxE& zbSR#FugHa#ODaH)K$u57fOH1U_u1Qnm#hiBEMfOUV7^bEoB^-%X}F!A-#6w?yPPQz zI6pF^bCLVWLg@o&?y_1M8I)*v>b(-adox5*pY@TGOZ3>b1k?+<{ODMkd#B);jXor3 zTO)4lS6o@ityW>!cvHRSSA9^yHRG-lnKWsCY(;0%rn0r!8`^CXgDH;2_=bZ|yboq9 z_@Si5VLWwRZ0s*jB7LUni%Hc05a3!z_1=2yon*V=ak0I*>A0zhZ}3Lqwav}O8o&L= zQpNorTu;=wRVcU?Mnlu5_ZL7I``#zPg8R=ol>}zIIvxv6 z2Gmz%EK|NWomn|bQC3VQ;auX?)cz$_%v{-nCl5{o%!uXw9)C?(9|PWciaHd_UH83R z>cvI$n#NRJPC>!pOzbiRQcF1~BP8_GbxKh=e0;avwM@G-1iEa{zkxZ{q)FShbN$-o>J(I58!L0YlVa%j@A7i$9Yu&3BO*zx z`hDlUI+`JXVK5lIpFb_5Pm9-}{_L!Hz>{m^U}&JBEf>9DK3ANIMih+uG)zd~sCE)e za|Wde_a+p+0M_<+0L=D#suj%N^`AZ+Wt6TVC7WoX(Ne4Gu-dp_iKe@-T=?@$Bt!1 z5*CWp=W7ezaB*4g*RSmwrall${GkVub^m@YpL*iGBtQ7+FQ#GtE9MjV{l6Y@nX1G; z)za76w;0Se9RRfPjHk9{v(1CIzi}=W^Hfw-C9YUMi+Qji5V=EuMLkk3y(O8QP zJ};pINf0K-i30O64v+~%>H#k(Oi6jJXbY5*a@HEt*9Tz{<^OuY_ea8LN2I&~NFF_l z7kWxnT|JcYvr!T1{YP}__~5|RL5q?FGomiEm6_T5d}073_aSrA^T3t-DT{zSlElMw zzx@YuMkpd!>-H-d(3Bi#D}X11GXXc`0rvrfySWZdWL`JP+<8<+W+7ox;&aD@$T^UF z+{DALU#ul~Q|!0T@w^)3>J*P$xLR6i<1NVe^}N^qyCZbl1@lzw$hC@e_=P$!963|{r_{`@=nKG_#|;IZ z<-Q08fCLG1WgLOl5j+rcbezH1+hMM`przuD;j5@M-^L9VQipqyl#i7{r9%;DuGVZ} z$%3(TGmO0>E1Phn*< zb$X#1%d&HP0Y?59#p!7K47+n{>5^~axO?J~vP?Q8lUv#avvYBgoH)TFDClHwKZG$P z%()9DOBfUhF{@yagAiVb!VRaUq|De51qY^TuJlhOCbVtM=2V5<#G4feTB3*X%B)TI zi_d@+Ek%MmZ?MvyWr*!dnt6y!Pl0}|LYx4kQ3lv|#y319?Y@d!cZ3La(8LMY(o<1y zep_E415uVSZ-Jif>jEw|*85W3fNk$NXLQaF^`jYgI(j4m~4q1k!gwOKFiptO38tmkr5Q8BP30-PQcbcTqC%mNx=^1pDKw9vm{8?_NV z4n2OhKXhDAA^zc9Vg};x{`4w`Zzy+Nes+`ycX)U#{d1eTV>RW5kc31n=*CCELI98p zcolQ6x5f*Hy<7qm=24~V&$(VO)gf`e_R_e|qisnN`WhOLiMli}ILPz7L8JKM0U8C) zLmOFHUuf03d`2MMqIP>x6oT>rbUG1$&7%A$b?2kBJOMr^%3z05!~NdbPRsNjuBNg? zp?d42l2QDZHIh-kbN4Ig!9I-4XYV zx_Pk@Qb6n*Y{2>3;^64WucoP|$9b2RsOen9g&afoL?OH9tID_o2#ug#vGgo4>c<&m zjVY8C;6P8>Lqi03G~dn__WaIHMziN_8*bZj>$sQ&f=Wg5lH{y zp9qjSzvg2&528HLV9B5pcZFL^pE<1Q`wHbo1x(aNe$U^!c*h&jHvhao)4iQlpA&ENgCS3A|PUWfH680I(KOGHjT@Zf4W~z1wl_^9o zVC=U_Yx|3>HRmw{XypkwqBv?FFU#ksKgm{)i{N+ZO505ng*ynGNhtB{dsZA{a;)k( zShn%Op8L{eEwkO@+3u1#4}m=eumk-G2%d1Rh}+71SX4xW9XxLh?|CBj0CuaHVfCZa zf8n`-4`|%A+X%@Suw1g>1EaG9VH|l*cDAbN^2*9LGSPGiJ1DVQT^Z3s^N|ct%As;4BWaZLhJeIF1Cz(UNY~R~ zCeHsx$}Y|;yPdg?VFSfYt$X;KS>(639HgRUJAA2#bXS65e02?%ZX{tSC zieGzp0y3Bzo&@W{oO)0w7wA+fYiLNzzfNl59|MbYV`HPlla-sLY=6G4->=QhcPn4m z)3G>Cb!Dr9dz0i`Hw>yQpc^bu1)tU}Or zj^R>v>}Q$UjH%7^_W%^24Bx$Z)N64>-7il)OYKl;R&kJ=u}RBW(sMW+)spZlbHkM~ zTe2JvZ0@GIh6+Q!`d*Sn@rK1fHVEPL*TNTJkXGS)@%OC%LmfQHZL#=H$$}vwgZ_!m zsw6k`{Bb}TLRtxU<^fB5&5z1o5P$sRJU4eIIGnFghMk2t5g*p1s3_@6r%s(xvzDDz zaz!=50_)d4$0kl8&rwob%qt+UzP#+~?{7GiTw+#(f;tFuSixt+mu%JRB<5ZVBz_x{ ztEC5@dX<13@C^(+bvwxQ0`sRZ74q=xGo;m^GPq=5;oN-QJhM-IOIb>9#>CW?R_0z2 zxzdtn+P(iX#Lvl+=7P)5%NgnzkN-KL3vJEbBUCs3m7q*iDnL5<4 zyBzGHsilAPJGli>)kxrysT`bO2}%+>)LJ4a8#|2y@W#Q)hG6DOW77n8L%4XT8J$s{H47 zrLPo!{~$P{+{paQn?>ls(H}uB9M6Zw|0;efUbo($^%bD7E_A@-lW!&_BQY+|cMZ>2 z`+gj5EmF}R{;F)PZEd5#-Pz!Y92(p(BT3u2yQAa>bTcTTZBCpxVMc^Z?%H%D!He}= z7dbcrdWAzfr}uTx)#_41%n}kw0?KIgIzApB(Sl>iQYXF4_5)+%OIwUcSwEJ#6 zgs{sUM1((xMguyC&!-(!@mNOu_riFHb{(nd@$dlV04+G8WCxum()6F+ui`~k#(h~z zgXL6$zv^b;nPoKM|LGs{bt^nx&(!&mkPHy2C34hzA@B=cz2ZjwqU=IyXnT#w9Ok@2 z`?i6ThbE%u0PSBD3%Z3=*J}V%Y=2hpW$e{rt6Q2m}y%vP>Y z1o?kZh26oWy|z7vTTHU~YXAOo)IAY7K8~TCjitRGM-+I=JyA5>(Vt4tib*uIof+EEy_`mA&{`|s6SNlb^_+KUh z`UISr$XVwL@$a!?dJQ+f=XFhv%9XBY8v!VY@VB@WL3e$~-&hu%T;PXQymL!-| zkJY^`#ees9u<&BXpuKLTL1R&fWy>_A%O6a_7f1DE9me?yCv(A z?Z@}Ed*hN4V=h3>^+fUVUX#cM-N^;_;6jLVgLr{ znmRxJmL6s0w3IlwvZDNQ4{E*FsdS_fMiSOHnNGY0BpP4*OpguKIcOFbbmmpKPs}SL*D- z1PeK)P~gdyeMchLH39+xWOnD~=i6ayOLX*S_3LbCm>5`9RRtYMdtaY=Z=|X;P`WU? z#pLeY4u~(w5(6tVb3Zu!lOnQLHa3!=;e(;|a00H0iACJTK|;>fh|?GZKH^5IHGsA( z)pYRzPQuk;?HGv9JUyGjS=&Hf6b{3O=ApyNmFLh}>x$+M0wK_i8zY*8KiA!#-OK+u zFMWhyjhmNOQ6WK*|95tpGhm@s!!w|evz4#(kO+#r9wX))edYeQU8upc)iA#Hth55Z zg6QVWY;3L>JnbF-`1(+wh8%#ViXJJ{x_@gRRn(|j%Wt>-;=F}M|2ap4mk#criyafu zr$yH@K_4-l#UU59vK?&ZT^z7`Kb%H&`?=PB(sgZ6I=7}K?wMq z&*DPE)DYe7g@-hrSo0_lIF%5b$>pl~)lPj;Na$By`RJDCp7NE1n_!>5lU)L3dtKf2 zvNP*mm0MfRY)IeA+@Rp zT^qC{o~NYILD!SL2Rg8rB%@nrd}XCR!zXJvd8Y9Ql8xf~{X3ni_M2FH^( z2}4_ZduDw*G(HML6}2I;3oMaX$jPLM-$`0$I|++5HCA=z)h=eN)~%K1}X?wi_|er9Ky z7`K`%$w2k^V`GUiSEs3IuX5Y^06s=xPOC%!d~BR3!aw$2GR^rknANboefcJQ_bQg} zh&*{D&hNEzU%BWxg=kwwHfL-Be2vV<%D=%nSUMi)wU5iuu|nCc4t)BB&VeFh|H?{X z``{5c<0ftKvOF4ES|ShX2yWvb-!c*==N;|q=#V4?bxi8upca3_Ka~Gz`bnbW$74hs z=ipJ7p$5yrZ01}8KL8XOdQUtDpDYaW+uGXR#u@R%$S}cCP`hVput~k~QP} z5k7uvD@D{vh@RQZN=MWVwHL!nxISmR-asW~Rg-DTCH|d_E13CN^S*vniKg6fzPZKP z0$MORwd22iRd56}?Sd#L9M+Z*?W&-rRU(Nofo{jrl=E{J@khNz!u@qV+23yj&=J`P zn20z$GGcFUALIIn*~7y_MFk1!bYE#=3BdCIo8{*-R9BBIOlJ*^ih}qi3p2CN;uOuo zM4QGC0|8o8%_|w9kgTO_Z4YyN?%sU`{1j6LOrrV(fezy05E233kR!I>>00AgJ@ zGfO8S9&91xf_|2o`m*=DR{cyTaTFIE9g zgzTsR>-z4kGdGH*L$%=+5xM0j-s1l_BAFIvdZ16mM|tn>?sX(eB~9CtB4kWxs7X(d zl{b65%3@Gf#N^}$Darg;9IN%#w7S_B8YAq_BWo-(wfnQ6KbnVDaEpXyO=l(1gP5Ns zJ_F${r`0I*Zx%s22aXU7=ELU@uKN1NMKm|X%Tb=vN#bV!)t8T|vR6-!CWuVAjE;we z^nfH#P4fG0ncbDL=?AL`f!hjXe4nW;J=F(z>B^43&CF1PJAm*r~Y+!STRu7 zj&UJ+4o}Z?YvrY)hiqB1-#`1Nk1p@$gxFUZ5-Sz$IV{p#t#iV%=6EFg_$m|z`!z}j zfBE*$)uYm47azSKBOW*ck^*Gc72!wV3xed2ZTK>IN-<)3;vyG$M&3`qawA2yZg7oM z?>+rf5^`8MeDSWzQaGrb?SjVFuB?>aj$-dlna6GgIE>MpG zc?l(E$$gpGj`*Y`rN$W?4tMyecR8Vw)j!7;6`lFdvEV?OnbEm>7t}yXhv)_FKPgvJ zBRAbQa&kpAV+i+clz8!nCF4B9hf|S(++*bwa#0e8izjD(RE3=sWVkCbj#gbdkFB>{CpV)y7!u-bX6F)?u-y z=64LM@-pnsHkeZ!bfa_(iH|Q=|19{)VEQwDt@hmu62HS{3<`ojnu-!H?@4(roRW;& z5F)@w%sarpSZ?$uTyt3|0mV;@Yz|LL=~?f*d^>3ej6oP(rr}nb_#^BR~sP5m7Y4z2G`?S&s zW>s^zE9DG`@;Z~?NvizSgOreUv4yfLUpbQpzF{~PmSK>VaYU!BAYTR#&x}7!jY%U- zlSvCmp;$7}A{i~F*)&x)F{E|I!_zutPSHfcO6eP^!`UB??W~hwGSAv?SCQYA(ERo0 zUS3CAefL{OybeVXP27(!RtRMejnw(4$zeXav5A6Z_;~xL1up(yQhuaKLYT1l!v_{E zpvlC}z)w#lWmpMi`@?<{QX^|lDFN7$@SJs6h*%TMlCItNPOJ7UGbsCLq-!VYU;%_B ztPBY!eRNq6tJ5WsNyHxvpAO|+&yHTRHQ%z-AEa5qnO~MDV%eL?<3CKE!lu{qsjsQ5#^Wsd3|om7>F!mUl=yR=|6di2Ph)_fu-#-6UZIW^03@Aot+J>44&8uN;lt+#J5b)~9X z56>vI8p@51g(xyNYgaA=r~h^TxsK@e}%hIqGf%hqf2)$N0@_YQOFXinm+VnTTWn=aTg zR;KlJSwKeADzz0UW}-%wCs8Xbv^??DnrU zao`0&djgaqDb3t%GJy2&iIJb`mB;jyx$j*0ETp~36AoNe-Xo;jhFU@xLv|L!sK&$B zW9re@m!A=;Y@XI7_TY{K z!RL(ajR`a^`b`0sh#e{s^k`!eA4f(MuLz*#Af+<7MJ00z(n7G!MSdt#Qx^Jb6{gT< zvo~-G3qSe0CjyH7QRTU6F(ht5QscB}n|3!`>U>>)(3V+7Vj)^YSX8^nFEXiC<{l1v z>n`o*B;YDeKaADaxS8S{Oy^7P5)8F@YB(6bENql<(LJ>uBqm0k-NjVw=5hTR;{YyedB|w^9Ro z-lW1Lu$@HWN?0=)QnSiDjm|{v>}(SdiiWjtZ(xrc6*(>+{9X(VI$B{cs)@PWg?lkn zxT_#ae-W%RNZ~HY@gQ+X>`&4DrsN`%&!}=}Xo)AmQ4GUDP%YTwso{iAM{dgFX zC7#mvH(h7@L0_GvqWjq;dIReQp13J7G(f*bhGH)0at!w=5{5eB%2G+3Oc}G1`>rYu zbU2f0e9b%Cb}bd>eS@;HI$vE75Oq=n>Z=HIkZ=MLDphNUIBBC02Dj3{YhVa{eV z|Fw$0hJJj+Bj_piC|KqkGhSIVm7|J_r(c~lU+AYRVX3UrDvqk_B}Y>68geiYeulI> z$lkjq;?JA0U@#2ZYnop!# z5oF0A-f>(=?MYezTr*c~PvSa2Yb*X-gI_=S50%^QIg18Simj%5Ds;V$u*js(tf(#R ztsy)x3qD=+)y=G&M^uH~zQ}L;BN`NUyjiNOlwIE*Mgc-NGl|Mn3)t6qP{UF4U)Xz# z^g7B=8{iOuNt_@tkByD>difH}0n*c-ew??5jqgAN0}aYXJV+&e0-0A>_ye-|rKF?` z8-o^dQ7k{6lva@=jiBQ4*2sIFXZLr2Uh+PZv2LPQJ6Xa?qL`@2C;phaaZjHH7Y9$M0M@- zol1zg>^=7yBpf#{&E8oBw~>inrH*2A3T!yeS6~kB_(yL)6zJ~-5u1)m#??)Q{2u+i zEe$9g%US>ugb@6g@{7lFdtemqrvPg36qb4HxwoxfPSn|aKJYIfw4?~41Njt8RkY6C zYH4k?hOr*;bsq$|#*VUaab@!IsZ1jSJ47P-Jh`SIeWjo7lUMydc{^ZO~<8_gqJa#Y;0RUM@%FRC?PzMp3L|t z*{I&TXSX_~AhOZH=OSKMQgY30i!b4$`0pP#d~ZI2q32(cgzcH19KL`0J7ORT{|5M< z$(L@~@4q)!C$*Q}ZO|tKex}IRsYDqW-E6z3ukQi$a((^HXBa<7wszkbapL6U1WeWV z(dVI=7G&T-+{>@v{n*=@FSw7XcH1t4luwu$Y{tp2kzG|aSYMx(ocxq^b$!Sdl9Ur; zC^cDKT()5=jl6%t)P-Cr-}S?!$~g~@J(yfq`&%p?#K9D=GqKqaS`X2sj2mK zbuZ^0h@Xy3q`z()eTa`rO;6`-d`9h#!1asV4{GpUubFFPzl_}@c@itRXQ-I*3C zaXTDzbO}Y+wSxs4vi7DSax(a|Br^+O7@2G?xKf_$Ln-`?cLNG zf&vpIt>aOdQ{uS1uB}UXZ7o5JeU8>MO_9 zi@hC%>vf*D+S(#nS-UmuFn<(0S-e5%S}#JeA+)l8nX<5hu{^u~0M1ONe*?}-BmTYp zRNPBTbiyk~fXY>pNVwC@HvzKI>;ajVxBu8_(EZT$}q zYc*b&x?>0^+iq?_L1vrB?(Zj4uE~#mNQjBu=kv<<^(UX(+IGL!+PWFeJ!o@X>xY3y z-NII2mj@;}9wjZ-2X?Qvj60q%5F#AraDX@?StRlXQBiR*Esv3mwKd0d?1|hS@Mh-b z<$+y%7H9L|!SYNe;}>$htnhI14Emb&LKcl@-yg9NM`Ws*GPzUk;ghn>oT zcx|&PN!V{GPv6G%JQ+D&>2r`NuoXpfQ0#rmKI^M$&vlor4;)3>WdWucO+%Ll0Su#V zgmFTS%t)8MYO!*2rVvnk%{z zXuTn40BTMWSE7iEe)f!3(B>gAuN64F%q4x~fQaedd}>d6>#NnyKh`n29f)Z~DVc+D z>2)_W*L^VeWyYw|dPra@k`c1ZV&NB+0BgdudU)n7jt<;5F`0UPgea0rzm53)n_^{) zAgmo{e?x<3Z!-9h9|d7qgYsGHgkjx1Lys~1>%^VbuXw4=c?CTO^0L17RC|;K;a!S3 zZ9a7R$oXo}OIE#;EC3Q5SUzr*FJe?y#nAWf7bEV5jG_aB^OS1I&bDbq^-##StFbVu z`hB)0L@PLgO#Nt$)3M?tQ!zIYo!+{vR#lS)tt9ZPo0_!6UK_~Dy)yVETN`WyzP=y6 zH_NNmUa&Mcul#N|r!5`JJi*v;J^dGS(e;Z|9K(!<4;{)-Opu#CIi;SMoP2)W)xg-; zajJz{WCK!@8-|DDD?Qnnm|lL-uYBa$h6Y9MTJh`G&z5kGI4mYDjVU&nr$-pJ(dY+d ze@kgzQcIooy$QpfQh1cJdOABpLQX!XoLpK`nvP3?ro>}++Jk%vlNz=N<0Q;t#UA7o zD-)EOwnTHoD$(+b@P!C_LqB~38OPY8X)w0gPu=N?g>-`BWXy$r6VuZhU)T%YjFMy? z8++?YYu5ATp6dn{Gk=lPzJ__(Q|A2z0K@)fj-{)pfo!r#AT= zqz8u4T90h;xDX|DO`jv5R=#tHpN|#&j~0mo<~r$!irT66JT!^71rt~x?T-HA4|ht_ zK$!>YOhDkhFYWsEe!5}Hr_Ek_NjO1c$2O!DdnK<;M) z%;26|Tuh9MYn}|d4TE$y$k;(D=IFx#4dei6zUm1nuRS285^^b*0) z3IpXQ$R;oS2b(wQxNi@Gh#bCMcyS-nsk>A#1PN4xr)WR}oiQbM+Ce9|>=ZT6P0ZVa zGatr2_Na;F^Wo3T0QqkKe1ckub}zw;7}+Y)uZ&RiZR6K$v@50gBl0CvIl zXl@9KuY6<1D%)FWAF>uU_u6%<+{NieXx>tdi~9&KNQ^QVFM2(aBk8>g&I@=dva`R5 zL!a@JzIvdT5ZqKuG3>0q&YR!e;c+Enct*+AV7mM*>QnF%5pt!1UROG~Sq#m8lOz)8 zkl0-&fr_wRj>TC=BLlJuK}D1KGqCkkR`x$>9P&I&MX#Wjy90SHe-!@#&#XtUwY4dN z9sDYE0Fxk}$~@Te>HbSO@S2#kp-f}0zGm1CxP@Ln7wfsy#j-iw+;qNiW`(!XOu?pBexi;mb@!l*d+ zl=%CM044y5KX&e=lqe8c?8|H_f-qG#&{B=k?;_2)cZY=MZ9VK2&jY*cG+uWRJT$@d zJL_^~Z{Cczl#`u2d2uHMw2SK926#vgh!%XnPenpOUY32sfrG3Xnr=`B7=nHb z07rQdA#`qPW##fye06UUZypGM$(d@SvobWau(SlD+uGuYCi5Qn^D^()Wz>NKN)&y^ zs3HH~<>3jSFj+Y+^YsMoY_Zu>ou9s_>VMCgkK?Z_Bng*yYO*--O`{d)TS?(=>9|x+ zyx&4+CiFy%aEv~=>*$l;^a@g0n<7)@->{;M3;}S_N&K-`jgKp5ICN->;E3>8#WE~Z z_tM<>TEiK{1|Rh0N=+JRUnu1lo&Cw`>DLxNL$bZBHGA7hvImlZsURA*4?4vc)RMpE9+ht#sbLXUWl@jA^&EB*} zK3GZblKDdAABc7B;<=4eOd{@Axxj8&_7uC!aa|3!zLYe+Xd~Thoc;5so^q=xR(yRnb`>bi@gx_lDmE{6L>L`kbm@bVxb zv=Z)bL0%m-P`;KWehuT0B?_<&VlQzxgAw&`hgpdu^Yi^B$~d#Zv09~vg}gD8_J?&K z&_Lx=fB%C6-%?1-lP5n>`}sn65nOCqY*8%nqExaH4B~fGwfYWhOIEADC|_&lrWtw4 zq&fZmbuD`VH*f?*`QjK*%sh8nISiR?Ec;nx``CNddm_Kut+{f`jJKN5;qGO-E5 zWQ*TWSz8rH>xmO+927Ah?FSL?qUhC%?+C`wo_}4IdqGx8stwf9?^zlSkaGZZvXD5} zzaCg2$f-kKjw~uOcHl=r7((+if71uB7{Q@c`3NpIP5bf14jhPFb|4`jvksvm;MzeL z#K9GuLV5R8LUx@b?(qlRB;>>Nz3O63QvB_(#d2JRFo9@4{qF5vX@dY*{_<74RM{d- zOih;n=MemAx*c2YSn|EZ*nGQ7J+jH@Z-k{nk-qEs^XGuenSjL!ABTVKE!DZ#{;e6- za@vt)T-M)#sBy5s!+fOQ=R8Qv4=9_2?c(BM65t`}uic}HQy2;_yJD?B_yt&-|GYE2 zSY#e1#mc02g+29FP#>+rS`B9W`4r9Hkz+S#5n2omDh{d$=jSfjXLTJ(W4cUPNGd~c>*nd>k;hOUj~QC+suu{vsmb|XD>tn^Ib zN4G)Jm%K<`@C5=GSS$7C2ZXtVpE`1cdLCRon@geD%O$4+f%PzXz+igU1$FV{(HEs= zsq*);^CVy@4GU}T)=NC})w3u2p1;qZ{Kx@Ai|AmqE%INv{7>n2ICOUJ7xjt?kI}2J zMS#MyU_IRenFez3n#YBV)g`!g!YkgU%o&vA(Loc$~~NK0e^*PnWmrgCQgmY4w1U z@hAFwu`>_FKE+!S9KCAM&*{F5${I|AfPc;)ouc`U4?XYS*D58Y)b1r%CunmNFqTbC z>A!q=b!amrWU{5eV>_+dt-LyS98j!+T_xWzOs_*sJ$yPT5l{S{Brp)gq z8&!SUex_8CtEx>@I^roeW{y`x@HecZd-Tw7X5%|;^$k{=)yQM+H zQ{JAqv+yM%T!v~nBtJiWs9b-fEReIlq*X6=w#s9@Tgei=G)hW-lgh?~^h}!(w#3#$ z(B34D;rRKT~xer<&^MCy5`%#Fp2qRQ?dHv-bV|4`MP{w37e})1LQQ1*S$Su z12d>nQyfZ4co;8QY%HcLkEcpE|E_bfnYc|z8wb-g>uhOhE@$O0f4z;ICcU5_vaOBG z&XOO^TqC%J`xoyaXG)(7D|;*0=`0^gVx=Y&U$m1{HhuNIB402VKBN*81^1>sI6XGg zt6#jBsn7f&WV@zE*@itH%%}D(>syUM9*>BYk~GT(m&XHfcRsssq^7358&RtE!;5@t zX=Z%b1t_$w`ZGQt57%|}(W;1}h4T8Y9~9D_1)hm$-_zeSZ>HSREOQgJHy`D36A`_B zcdN9ZmXhwrOr5T+b&5e_z*u@a&#TT3R7wG~XeN54*HSxu!@6Y<+X~_kr5U-Kkjb@P7|F7F3@fy^<}g6U361>ugK;+ z{4v>XJ7go`B-WSSTY2_cA=%XH^ABY?7gB>&398{X$Vx(0O2@Jx_rVXVm8bZx-Q7#1 zbb1H69<>+ihp7$gE4N}s%V%P{dZ*cV!JOz@3v2Iu%WuBuaFWywj-kI(~i50HO|#9xNvu_IEKll zbn@sn$Eo#G2^hvy5$Ux>g+%XPzb35*nNBLAG@~v1^Z5d}^B{__sTo9TO%4ikdh%s( zfx{K)i)Q(fd2Xi2X{Wg8Hzc8Mr8bJ4R2>ektFf;|uIYTzZ@_n1@G%NInI2ag^ z{tG&co!_hNuy$7L9)<}8yy#F~^jgHs-f&9Pl>7R+^5MigaP_2x`6>LgQO$eb`?Ccd z0_j9~r5s~t=KHT{>wOyhnIL-HSviucmX=n2hD_M-sBNAy*nLu*60)7qGtmVmYyUf3j}B9e zoHTCEaDLKCE&kSS+rR&u?WcSxjbN%xRsj)_*i9(`QBm-jlJ|SSu2AY&$Vl5;UJ#Ya z7}86P+*;w_?W&VihdOmiAPV~)jSoU5~D+K53R*Rf}8lM?!NO`5BvnxBue_~2? zcW3E@=ePPs1{JT|Q?xh{2h!)d@U451Z=Jyb!AC5o&Yssfmw{Ztq-ri^=f?yU)ntkk zJ3C7sM_t3D*t2Gqi4WGXlsrK~Z0Gt@da*fOLl*mZK?km4&Zcwb+4U+7ZXb$!+ikqA zc61v~b*YZQ-D<};+!24qQs6*9Y1EkV!@Zv&cOZr z)#u^QKD%zFi~dXkDN^|_Fqm}T<2%~zK@XLqrdoV_^vcQxwX|>}&xgnFXA7_vRs+@u zW9|ekEpLd4$w^eWR4yxD|QlqkI$aN85rJ($r=owR(NO) z!H0br8C8RW^dr?=%NtZjs^Qtqw#br@j(@{q){Ni%Xjl!&u>;I zJg6Yv!wj_#23L>Y)huE%A1JEEU|=g1cADc`N^l}2gL?@Io2PUq`z|8uH28dDscFz9 zg~xub8ZJ_JB6~1WgBUG3O@+8{@y0m)`A^&1mqDl-f%1qIqmj zKmA~U)J23+c_(m`TU$j+>4eC~-v4~blz8a>!$y8L#Un`^w|!CKoJ3-r#KW(W>+I{? zd6tP{pGV*5R{v`7e?sy?myY!68x1Z)H#gu-co{FgG|-@luEj_S)~C z<0(N|->!8p9#jQyM(7LPp(j6*JUMd9<$~7DFJhzZ71>b=T4ez%SE=8S3qRa!<}%;b z_t-7=t*QB;hOg`vaN_tZ%G^9TQ+m90pyD*6*hvHLd5@t(qQlql@o_f;pIW8mSkA6) z>;<^)?j{{!y!}SVP+HTlyJlzB$EWf5@w&|4Ft#ocg2uA3*!CAMj_cU$w(tE|fk$Y& zvPy4rj{Qrq)tcG2T9$S_d9Lr#Y;7vlFI7w>c1lb(7Eeh@y}VhcF+z0kVd=41dS$S? zsk}DO%b4v1&v3uq5DdYzR{6kfW5c$-j8Y8`illt@Xkql7>F)38ADyY(T`*j;Vz->5 z@Z*Hy`KJjT(Sm69r1tA}W7v`Ng^ZU^@5DsFIHB4{C8fsay;@a@tZ7R%w{jcClHT2q z|GEUh5j@BVEUh-)a$ru7^y?~c+i`sNj+8Rwk3dLYH|5MOMr%rM(!D%6GsAE z?Rn-qU#FThYxQm<_e8K8pHpdgqBbhWTKp-9rk1vxO`Z!fX6gkyOlb76LLGW#9aG#XZ^nW+n#1AJzT zEpzhH8%CAb4x@8E1p-gp4Nra)r!G%l0oBxnDIx~3s<_h9*NOD$3_3MBqugro8b@$O z&L5DA!e+ptg8rp#i`me0t##(77~hT8wPj$y4V7~XVLyEG!VA$-dZNesp7?0ti@_7n zJi*{=`@dHMWCcT34rKQAA!rF;Awr6Osk`iWqGu15l-OGpPYxZzmU=b`ELu~yuHDvh zeB5c>y~ungw+;_|xB0N>wMB>o!^de6VENy;!}}eK$0L2exJTb|Asi-7iJV-2D|o}; z6TI{O`h~1SnV||ZV|#F>dMpYF_y6+2WIbqcPU89$qrXl}8s!#@O_cTrx&FEkruVO9 z)+Do&snqRvA=}5#}hI#`NL^B^dYsE%u#>6Uatk>+c3i6yfLVWIX+xa3A zQav)#uREV;Z!ZisaOqu9izCO%R<`CuQi0eN|Aq6DmOfM~<`Ct@$Bw#~s%yW+={T$f{{}pU6ZdB}3t94q=yx801lW?AU z&fy-e5)c$xUdEpGh~HULp}`3f9KjUG9((AtVej}3`i7UsponLVe!Oyy#(ny2p8ws6 zI{iIo77^!d+`yQ)%c|H1veP$aS2YX+C*SVMmt26t$GF&hY}est{lrUx80ec6zgX*) zzC9Mbzp@#!tvq>H=!@O%IGb8DEnwqNh#8=z+4|OLI1lwmdTRQuTy>BO#7OK3yRMnt zDCn?>v(>LK7da2&-&4jH_eqk`;hkq90;-U(mFL2*N-&`6c_akLULWZn3Dfb{}K^0|fF$d;u zN1by%_;CGThwV{+pATP9!Sh>R@kWPyOiKWr+a(c0mJ`V8^~9jjBrHpT9A`8fS!w(9 zzB>!Ap_ALR;uv>p>(i6&w2aDKCUW*jPFG9>!mS=5` zGnf+7$qhk$V8qjXfqSi0@B=B74QW9K%bIT3Q#$;cpzj*V%{%pT?HCm?r#@$HVDf`q zpVJ9fuJ{N~on&YmM%}M5lzx?IN@!>(PZpM?r$^DwlAlKN<)5{WqWRKQ1Py?@`bnWS zzfC;!nedcC3`Ho${av9Jiq%p@Mc3LocyT1^*LFVP938Xj z$T2O-igLp6u`5Q;+}Uv5`59_G1n3QX+CBsC#so=N(-Iev66&Dp+6Q(FU{vmTD2xy! z=b)ZD0DO+Z>`Y%GK_%ox`zvG~!TxdkharX3U;ht_nKK1a8ye(|;vwLZg?0)%o$k_1 zwse2Z4q#h(ig?umr_iv9T3CL884L;vFoI6MC8uLuA%vTBf4D^Jm8$wq&mc}Gx%4wp zJ7q`EkB5)<^o7U8$?r8}q@{Iua;>LZzW85+y>}p$|NB2KAxbh6B`YH`vO`2xW@PV8 zW{N{(gk(fyuViIKM`lL$CYxhtCJseLncwSBuh;wi`F_5?U;mZkbk2Q0@8|Qn9@k?W z7Hi{UsPDB4Rh;g6}1X zPd6ZcobpHqr^_+UC&6(VeOY6QYxL2t>Eue3#u4}@!9js`IE*`-9q&Fj`b%Rk{P{ix z6Ov1bz zs4CnO3CrD)4w^VAap5F}3NMM3dj2E=o!c!txc#Vs;a=zS>vpbBz9=I9`|}tEpa`n= zM=zhU->Zck7xQi5B3!sm<|ezNcyjFcVwKn-&0JJ;5NnPEZg8Mr{_$?esiS07U%G4y z9~w#(_&<$ZV{;wn&A;{-}gYHDg&OH2Ly{LTc&u1PaZWZ@UfA$F9vJ|S)jHUUV7#-^ygDlT1E|cjtV-A$MIMM19%V} zJqYt)08P5q`t`heEa1=Dg0Fapn1yE>J_Z#(4X z;c=0Qs;Q+VWTydFB*z%E#Fs@7FGe`8UQPWx`SH>7(vJ4_>>I&x>FKjtMxIRas%jRQ zh@KMLVc?g=3D^9ZIa8`^Xp~{fIsZyM(5Y!JvsacD_yPVSG2fzqrT{#T zculGOY2RdZ?o8sAjt<*;e*%9$pd}3?2lys060L7+5S~7rw$c&HRasg2s4i@bGAB;q z;}r^q%P6PB@HKt6Y-2*7BPBjS^IYyyeJGU%4qjX79WaSsGy^Ae5&FgjXJ_XtQ6>Ra z*p$o>0f?EPpI^Iqf0x;f)Mt=Ms+K}APIBr3H8l@a`76M3Ks(IM9WDS7!#S^DDG+>n zdTANbk9uENpXEtT5Pkg6+M3m#_>S}H_+x-ou04`-32ybf6TAK#S0o-GP4c`oNB}=I zZUYqNf~L)3Wqz$U9he|YQ6Fix%RuqyYOJ|r;~4)qvpI~I*)E)i0&amwxaM%XPw?&KfTxRNB#bh|ZO{Du z=jP{wd@&*0d3o&gboWxTvRIhjW@XvlzfbV>VKzPRPXUtwC1&sIc4uG!Hh`ZPh-c}{ zuk-U)17($|-Ia}#Gb~58o%TH1e3U}^QoD+QopV@HYfXBWn!8K)``CoB(8VXi$Gn&b`i{|rl(bPbVlANM_iP;2w5!vt|aqX z5s6S_$!Do26_VKx*VR33dXtoNsh3J*6-}*`29HSi-V2(4K4Z>rBs0NqgA9d7r1ZPgu?fWKVJM)$jG%S4rs_R zJEI3KP;^;{fRN#rnK=(ts1EW?uj^p0245#^HK6u4H#g`0=1(#`Jv~w3!pp~Zg<1$W z9Gx#F;F3Vv`{I``Z{ELGp@PJgI6`pHu6EzVEJHWn@<-~avz=iyR+i{)@Z zgc3G_O>@)N_*AK%m!s25k?E_jzj@wa{mHEdGVW1LR&s+1=b*qqW23Zo&-xWgn4^&1 zQCBCQ=i}zSz-N6|Svd?zU=jc>T{lETil`Rndi(ldlO*lBwt=ju5a#0>`26`ZSZ7pO zoIW@}d-Wla+-%m?)^f@R%SMNzRga7E^Yep(+TQ6Dy%v4UKz$-!5ECVkV3W>SSy5qW zY1!WL^f5(TSy@>`gzA$gRq7Yu1YBgF_VdjYZi?fG$d;G1DI%_)>*`FtPgW}i104M$S`!{? z;1AM^W#{MLgvZg%P3ZmQUc$yxIC|GKfJqPGc3NyjJqF|zqy(D`t`z8W2@tH)n*}0zMG|Fh?d7k25N7$ z^cR^Swmj-nOrKFPt02q|IkJ*Oy&>Q0Ru@E$gCD?J6J>)AGQH92(8}hn{qnHK%_rq* z#caKHp;#i1;aX!uxVA0bBi*|)b zq@1#HOk3w>xXF8PJy~FUirY(Y&!2Vfz4tzQq%u0~E^Az@Uj&F8wDNTa1F1v=5}}L% zbUt&Yb`DZh{GMDOSYQ?3r5?xluQXW*Lqpv1GkCb-NuX3nhnOLSfve!#An;Nx$NXtP*e;y5cbQ-ffNO!|DJfnk zcv1~25kPil@CI5mt=JRR$oOTGqhnfqY5UNt_&ek+WS@C=j`qoqI;f+b^@g7k*)k}s z5#KF*2>T9?)0;iuY-|QZEK}&|=iZZal&+pB;iP5gok^R_HROPD9v_YWa+W%Yor)A9-nYp?2MQTtjHAKaer09bP&Nk9YZmBVO@Z$Ur~TWv%p|FccAC}3 zEKz=bCly#AD_Y-Qx5!e-&k~Iq%B*iqEHn%0aF$2OroxjvfBVWc&iVYM!P2WHnc|YU z2PdLx9{b|I@If#3(#eZH=F$FjPEWoa2M?W=E?d}iHNu9jBH{XMS5gx3v`S$bRfhF7 zjunH4e*4{9%y!m3rIF5i)jm{gEPES-s=Guq!cob|N{7K(8XD7X zCsEZe4m%Bz0oTo%{hvL%>An#de_M@}oJBe5&7s1gH@S!i)Znz-#y$`1NB*4m<+p!> zY6mLE+`PPx(H-Wf8tolh?C7fh3*dv(pJw(ApUd}SjaLrJPnT)~2 ziONyqU1@&TvoE>N!*d^FE$?5ADd~v)df$evz=-mr?bBLLW=nFeHFy}JtWDFjG)mMr zoLH&|9UR{0@R-R)wfTT4$eEI2@;i5C+1VQ|i|K!~=(vk;x?IKMwy!AA<2EKr5@ z9ZrMEDeq-dETk>fa3eT-7*@OAx3%SMxDmPy)hBoife)$zB#*ZIf(`d=2hT=ucN7*9T3lWx!^z0V_`w$2_5?AszISzGO2HJ_J8jD zxX*6k-#>#3S~|1J-QBUTU%MH|MIKoSdsew}C7nV%KXE=Aq??bTc3XB?e?QhX)>z0!8@_OllzPNmNYC@a8uA%lipj zL`tg~KPjHyqQ}3#e6q5=9f=8^K-hQhNp*~?)}5?ONchn$<}o%osc2-B*cbV#`KMQK zbbI*g%i~2^n0#~Ms^H*--5mtkBt@lD`b&W73koz358h)W$GDF*?pVNss~{&whYSe` zQGgmtMMaA(S_sgh{I3aeEv{;6eG`?gV49PZoD8{Y+YBW)J$Ia;t1B%nMcb2c;Gz=* zh_FO3rO2mCNI!mT;37_S@AH?wd4tt*v9@3Y3O*Weu==l3X#4w=cf=^z*`t$JO0POw-$V*4)1EwCqs&oeps`n~yw_#gnctSTf|8$4pm|U?@ zMk4VMQwpl0>=T$*0=Rz;Y=-0?jhp{?sJOAlp7v6oBms7Pe}AW=3JG2WxLWq656$-5 zVF6qOiwd6WcZbQI?KW({1m4SZm91VlniEua@)mTRrng_m3ih4AZ1g6nfHSNM;3LeF zMG`NIUBXBD>0+U(e??-)Q8t{T=4(ZvfLhJZ%X?1td5mDnA4y_N=gc(XHleO z_G1fZbm!1**{YZrO;yzh#pM45VBkpkoF?;6$Nv~~YOfD@xI8E}pY8^J0plj$-KD_) zYWETGK#`X*B1qxZH!z@~rna%Nva+#}r-~CQ{$Sm)OML#kj2JYbYUZG_^|qg^ibsV0 zQ#AG2)Dm?s+>#p<_enD@v+Sz96X{+uPT|OfkKnbc=zP6$`e-x*wR^JY;}5yHOHhnt zMZ`T;h<-rm^!x5^^y$;5br(_r63(cY7L+&W#W@qnz|LNtczzA6i%|U``zzPavaz0lpLIC+84bkLQTE2 zv1H-2vr$~L*VHmJgld%f?sv{z+zsj5Rr)aVlm)NAkc(5HvdTHjzRcXv7ndN_{leni z2sC;-t}%jfC1u|#Pr@kQ=zG(F7n{ZnO7!YDLAo-)LU9R8syClK`-wVmm=I2Lb!7LU z83=%5>?PV`KC}5tc6K(X6)ZjKd~u-%+TS0sy>ji^H3-(WSh^CP)*tQpa9c%uUy2q= zs*Ju7_X@;{d=7JUZed_`>UyTVgB9$UwZVn2-F>~iSH$uP3}fPN*njIgT>n_$(DZKs z_30reD)i!T!*JPHroyAED%x=(YqV#QPZ8k|Yht6{3}GQ)Of=-i$#8j6)>3XEtOP8x z!326Xw9Z)(>V1IycyMptycxf7hLW?`c6b#K0`+`web}WY=oN;3JTpJPiy6)!H4Omp zqvfrZQf-oxlHd@&cmkH<1uCk-phiJ`%tmNdL%PC4@%58$49Dw;h*bK!Ha0fPA*C-goTLZ>P{y+95%9g#7j=znF@->kDV=5RomZY2lLKc$cF9&KT_E`^R6{F z?-TRypLUx;7cqW^-yy{Rh1wvg7Zvr=+`=a=Kh21U2B@v0a+1y<U%uSJZ?gM3H}`-~ve>*se* z>$W#1lV7^gchGR|RJ(fOE1v0O*NUxgX1r$2i8pT0D+V0bRRcIbQ&!;2v|#({JJA+d zSMQC?A=o27Q^Jk(aOw@Wb8zs25}6?gC@D27Rl{2#<_YTTgF!Y02Hq?V8R9 z{}AePv|`1Dg;YG|fov`@v9V<8E{i>NeSHsMGKlVsR~M$Ftgo+k2V750t^Q{URtNm4 zt*r%!0-g_jB-!RuYhdQbE@lDTG{DskZU>u{UrcD>?oXS_NH8mSX=}PnJF5vC7h#&myzp^$y{;?ogIG&iJD`7LG z(o{kIJRY7f>7kA;HTXr;K1s|J;&EayI|n2EWtq3Y^hR7YTA zhIdys;aKC)D@Bcteh66{tT7@WAOI1+>-Wj7j*dqN#A}FmOPdhh62g&KH+J2yzFYK3 zO>s%}(fjeeJ@km4>j^}7g`Yv>xM;8Sfc0=eGT_><7O!g>&;2E z&qDb0_N!R(Pbc!+10I|K0(tFf^uASqCzgcJktGslqzIUHF7p!|n@1s)cC-q==bGCG#FJ z;gpCgB7*_xYYXxT*!M})HqX&veq3SN1az7uAXo)AK4_DK9?s!MdchM1-U8rU zt*fJ>lp?kd4ZWhfj!t|{P0bI2YLK=9a0VhlkX%NkW@pQxG&M9R=D&eCCyWDN6Yr{G zG0de`ZNWZya>TWXTV>V4FnfMw#opYUoR*gBFNNYfhBR^}q2Xi<)RZvo^yi0P&Ckgh zf$-I}9+Xt9iIyr`a>t#KsQ$6OaX_oIZ1AVtia1c?KUJ0xK&a7_k?E zZ91UNN)dfrZ)*#3P(Qr06%VHClSN!%WTR|+r9V8%tcpsc-4beBNMQuTsAGT`7oq0x zGZz<%(*fUFqM<9832uox65i`fk%5lRoj1Ul=3mfQlh1s0$I6I8gC-9&^!aQzHFvo zZT~?3a{onh@c~v0G0!Fo3i+ZM1I#37dks(oa|e)LHyHjI4X~T^!OTJ7+xV~#spNIz z*gwY}+i)aUbkx&X4uwXm-&PBQX#k{FR+j|%CchXPw|ORkDY!EZV0N5#W)!+((>IjF zxZ(A3b>>!Qfy2+6dw)u_Zk>#GQ$t_>nz)(lVI4PyW6RGENu*5u;his%k@QqZ$cLak zhep})9KUaF6$7^MFy6E11L(|78#_2~8f4y6Q^Qv>r6=$#oH2`cyy{GT>og;7Op>gfq@{RW$EeQDs=h3=H8oO>*f9{s%WXo1_cNuK}8yf)yNU{6t8 zQZiC$`VoiucvW+pL#QWhpX5|_BTNGvw>bCeN7Yx(GfpdhGN-`lBI>~vK|w*tA3FQ$ zuK&l%&N6c0({#@we04N5o;8pfKeuJTc`8ZgUmU@J6tSL-rM#@M8S;VT#1-Py!y7?z zQSufiuB5Uii}6gUEwcKM%bb4u!-^IE-(Nei12!%&kS5P0bL{3&7Gg`Py^ZCBBMAgf zu`Fd8j8A!?Z&(&OHc3SVPl5G*-FTXBH0BmEAfN5 z@ZVQ888euF(Ba#R7(Zw6YcS^4)+;)>f=Ba^aQyweQ&02v=C(^O8j1a>j()W%d**r7 z$pAkcq{0AIoSpC$$9b)i`7+{5er!2}Q-e_WkO2$^mj3>_A3h8x7;C}uJZ3^-f2P_SU4@J-?1cdHwi@LJTJm+%7nk zGmT7VEks_NC_f5L!a+8W5Fq_>7*V}bz7szq^Phix;-Q$M4q;XUgM-sA8l*9H`!FSB zzn7@H39sb8fr>DAk?2wTP}|bf20Uu2?Vh^~{e3eyHn=wdEHN?*S_ydDl9gS5)S|!RW&1Oo`TBtFTyKFNN5Bj>~w?McOqb8W_77?4#+3}wCSDllL)N^-pL zo?1)KHlc7<+UG`+Tjjeus8!X?{j{6UX(vC1JUWlLsKeYqR{n5?(h`n&Q8(mFQ;Sz= zu8a@7Pp`jmi#slo3?{&wkyawVc~`ey{uckdzxO88sOj9}a-kUpOrRB@GS}aoM2?mB zTJ3BIrl$pf{aX{WVFjPoy?d$v5SGe@6%Y6H+-2nxb`>zFnOvT3I7~0r$ipLqMyXZK zwfpsTJB@YmCV-Bnzm4>ww84i#_~y;HuXvH5*Y=8P>A9Pw#TC+@m9;<5C01Gr(3v~! zlb*yTe1{Tf2wDYCo}^)mPTs$qsrVY5y`~>^Z!upz%k5W_n}(x(?nXo+nCKv%o!K2d zYAqvJptX$K=gCfYCGr(L(HwX|DnEpuc*FsN=I~8!6Fm4-#^F+w{`?20X5Q z`0&Bsj>WzCX6`4WUz_4#8}TwzmwUFc2dDpheJCo`^Z>gQ&Xs=Q(bd2H=`MwXH&lXWprofC^+NJZ>=z;cr7Wt z)6^^t)QVXr)=0W3;>T^#{6a9uAn+@`lhu9%{JQ_Mk7P;LYvs}NU#*PvtG={HKX$CK zmmO0xW*LRAtM8auKiK2;(2w!JFnBfj7 zfSYGOCiA0R?R8h;b8f0Y1M<_MQ(k)QPo8W~2tq;mMML3|nRRw#;_jzCmFJ?4FmT$8 zS&n{!xp`gb>Yrip(7BuO5POisM;zkfK4MLdXJYE;@JJCetgg6a(;PN@bl?7dk<$nm z+LL^sdDL8Z&-v>4hQkpja^8khxqqKtny^+-B9xc+HavH=D6QFbc=ha=my*&ifa%}9 zb$9*FY1TJ8+fq@k-EZ8zM=JQhSoS;@;NU@;OeYcJzmWi4i0?h1dwQ}=AIgJ70mw_UQ+Q+cD4~jV2c!#sU^>7c5KRj642ObUAO_z`fa);$>Y}0 zt`2Tt)az*e5;qwvn(Rq{dJs}q&*EaF=gm0Lh>|L#z|r%~#C?$S#tF~PE7 zH`ZoN_Wr95CHn8pZSEDmw0r#*2R}Eza>lYb?30E?voZ=kx7zl*AAeTTX$05=fg2a7 ziGXo|$?=kw#`S2XXraA1cOmZ0Vt3d(IPcU%!fbkMtx^Tt{;aN3ZBGsCSJt;yHc?Xt zt(pZJ7evb=pFUOA9CBuU_6eqPU{Cn)yWua`>|iKIf-7RE!DDRYFv$tC2!`Cyi=Hn+ zT{_y&ueC#)0^ws<%Dneo1Rj^$#@2*|EhLM0?}-V4PXvHh*$+)hc#=)?<{vZNOJwt$ zo2L>ft*oi>ga^y?Ew9zve%W<@of4UEIFCB1MU18#fQKoS7@ixmoUdL^O|CK>!MJnJ z&e@sor=K0v+xPEZ{qFOQqs9fXvvcLPW57z^e!~$H47#s1V~}c-v#=;Qv~$&T0tMG? zHk7Dp%rZa!tcy#@&bIeWz5ysi-85ii0FcMYQwTnuzLklwrMWg^laT-nndz5RO0~VC zR~iVM6d&lj}TIFJb9Gj1m^3U=l*2pj4ko>@%$7;OAw}(-X2Kjq7 zGQL)1N#Nwaze_}9Nkyf!RUagyHR$iam&!kySBiz$#LFTvZdrQ$0X;KC`U50NaG)9Z zJxgRU=7^{;yn)JDXVy_gHVE75H)4Vhp?Kw5#zGq-WAPAfJlLG37(?0<=m%2RXpAQ2 zzm9evng9*_qq7=>JwS&x(LNF#+uXs>8jZQ3NlbfoWCsk4w#q}TI%BRb>V41#VGhJo z{I~epfv&~K8CtnZpFMI^kib#gRRDhX0|NsPG}d(ME^i1CuP|ycJo0hog(LolANBk3 z@$q7)C!@%zoz37ErA}R-v2;fE(t{g)@V#?Khi#QjVxAb(!(i%kzZ`%hCI2^;WHiRk zalLgi&-JCHo4#vXg@#;!*cnNzN=uEgDisj3Md6LYTf_g(hi@a$dqU|3&-!Ta6vFUNDP;jPjpCZjKG;B6yKyxkgb!t^?%g2PpzL(=RZIH-_!$ zvg{_@SJN4MDXV$5X{7d+# ztKuiYl$oqJlF(}-V@@H=DL?7B{jI!Cpp*@OXcYE`{Rm3}#_AtZ4y?RPpPPJJyJ{@r za-vc*eX`mE$Osp2n!nIqM~M>IV>{RD!;xw*ip^8Nif2SBE&yE8H~ zpOKyR)n!6`tgQLuS@}K0918{Y;#1I@1I5yS_cO|Kcclz2r;RSs<7;w3r?=A1&L|iQ z6&9xJ?LW~=5fi9Hgg%L209fhUw>mhi_yvaShn2?$2LW9;-0SR4;YZlHDk%8Djw$nE z5wUKLWCM1|JxXMxt}9eD{}){qO(nnjc;kp&&}PH2VXKEJ7TF^RX=CXPJX(bii8CG zf9}1t1Hhp~ItW~|F_9-gHZ8xPe(xTyWoI1V1w7yM2`)x&Kj})~hrmY}85!^ld>s;U zMz0%!7x?)3qvbP$n`UQcA2&Ad%fH3zy*u_FluY6Yu!sx@ht4@$H@C63cP;PzCsJII z-thKIC+j`g#yzVXAd%tZ|ig~P2flZ1p|0G#1Ak)ze_ zu`GSNpRf1z@$dDj<>A{kzniB9)W6TZJav5vu{X2ISzLA zJdUE|1hG|rJmr5Foy5vxXr#?C^F;FLe=|D2eEllhc>9RbN&NVT(%HQ552X{&Wu^#h z#+DWriE{>qhF*iSqNu38W&78)*%l~PA3b;gJug?J;$-^{j8sT4IV%K z2+=FxmzhKU{&J3tg=kq};SDfq)X>n;$;rx!1#c}aSEcu% zPpy?P6?on;lYQyQ}kRL zQ0Weob|RMWVK8CzcE7z-E&^Q4Sa!5EHJg2WajbLTajAF! z&?M0JWTW8eu;tUeh#{(~?{RSbPoC=ipd+5@^>FL6X`$^N$^-QaNq^a@jeppxXW2eK zir$z1glCd{@iYSGQPk7yush;jd*#HK`{IqcFRZA-iKrZyj{)A8KWXK%aoKYF*l$5LOy%e1cb}LP(>xB?^88X zZ)QZbM&8fa5(iYI8p~F`!iIz=YbG4b-a>maZC4#1VJB!|L*}B_RQu{8x=fK63-N_C z`*&^F&51y)gWugjiWO=%Qq=HWQEj5w<>TYqpoJ_AFs#0IVf2kNHW72-8)G60tG6?) z>+6$QFSXtusE%dasRlaH?vsEve}lo6hZpNYQ&WlhV-~x}c%mcEB?_E1=?e;GtBRF{Q_NPHrwXDyQiML<|%z+QFu5 z>((##mn)n`%y{|)T9MEbl5&A{bek4KP%haO~SIEw;$LIA#1-g*9-=&c(e$NgAGBXs7d;C3I zms%sXXuX8O?^wkyk(pcD+J1PPn-{CP_U_%c;{6HN$ZOX&U?u^M_YB$}JzV1-NQO}} zwBTo1cDnJhu=vMHynVR3B*?rE1IdoN35ptQ1%+mM5kYYSN5a@b$TnFFots-@lyPRi zs$=ai3Hu-S&71itUI`;_s6-qXOlByJ2!{vMFNup~N*Gg;k&yxECN56S?=u_%?=-tn zAQojQSp|p{GiggpjRn`-uU}h;@*s*6t_s8CXz~5X!ourCKWzVktWpY6iyIN~?i9~_ zfY6K~W(u<k(RO2*`ARoI^+?7!;c>#E_qE0-7?b3WWP4C)1onT(N2G=wKHYKP;Q_ z!UR^khSE$AAC2;)sWjC>b7yWavaJHlZ){wv$bVg}x|}?rb%2g~=?~Yr6VxBTb$&O= zk2pqv(>_RPt*)-7LC=FZA_9GBT(=1-|Ko^ww;_vRKx`HiLdz;SUaMGR@JaL~-T@q> z(po{shu1hb;BvR8VV%v()68ek zeZ`?0snHc z2xa-q?CtX*1Y~-;(7cWGJQ`o@4+K2}2l&E|)nFzP!wn!}gBLNF&&X)3C8>h#!0+#K zbB#*saNSXDaNTWYczwBN6s)Yi=IfOWodLf|1IFN2HSC&v89XgMtf(~v?fXP9q4+ov zSo zT1)Q1Skb}40(CrBL{p2bR;L*nCT9ytkQO1jhRZJQ4z@>M_B-VY`3=*bLkq{D+@Z6e z8&6$8tgH|B_EtS&c_Hhi7M+KUfW)+GhT|`*f8J_V$zf2-my>>Hh>X0d;Jvw766DaG zygM5^0&d8o5V)WdRjsDRyts7Wq;+j`zB#n1w>Mo;X>+Jx)7A7C_Yg=6(i`kQvaTqL3me_jSzD?ts3(xJfgm>E0*8#TyiY}(!Xh~hGEyyr8F@D21 zXnFrWr0l929(ebwV$M>Zg-}7^K+aUgcYElfvXzxCeCuq?D7yaY%^X;n;JNWVe zJvnAl@J8!D`tDTdyXn)+0>Ul{do8lEad2S9h&U2G?3w`1BM<_iUC`$Q5f2deUcW6% zL?iA@4(`%eXv5ckM=|(svgH*N?yG+WSqf-8{jQMnx}No=Bd6hYp6gk=EvpJWPVMSE zfy!y0<3R)~8}&=bh_W`;WQ)cP_fK=)p~IK_=iOl{3kZdhKOKhjhlw9L8ZjIx4FA9r zIDf{>7`Y)KVzWTROWm`^x_kP$>#C`iM2~{d>|bq?LD3@M?|_^U{g<>7qk05PUqLVO z(|0j?iH3cjPn6lvssfggJ^yrKh4yE+;;v9(vev6lT4@De#XFz-fo2l(b6rvtAfx~$ zlJf1cSeKKbFk;H1A6!6LC>?OCc0a1APj(9{kup%R=yVnL{t#IjZ;^_^C@J$_kFiX? zelAqiDnNECySKiJ4D=i{$&(s2=MT9d>GjeXM9Zls;iFFK;O2(DjBm5fOC<4E8OOg% z@_VCq);HV#dqvpTA$l0qpe$i5f?t0D6GMeDi<3i|H7S2t8D1B%o&~`K-HW3jDte#0 z3NSYB#F=z@c@8i(P(B`;$=OgDYkkk{_GteQ;;m2%HVupON&l!ykFUkQ!qww7g+XKf zTGrXxm<+P~0V?oM_yY@nTFm}m>pG0E_}Itp7;(ZVPXE1|S2K@61wGHbZ;*)v%?$EK zT2+-k_`#*6NqSbi4d65(yd?*gcbKV^clO}B9SmVp*B|+r8lwURTzyz`07|pPMQe<8 z0xalkoU^XldDp8}XpX3r7y@R#-vkCg$*;B6dW+b=1+BnA5Ac8AD#nAO%6$t9en=hw zC&Qw>V)xA@2|qlb0v*dbc)tB7GXPj%($dm)2OwnJ`St7W0pu54y7AEe&dcE7rM}FN zr%z94L`O#6z6ufq>TYRussH~L-x#Jm|Frm>;6a@-TO3egTf%6}N+A_By9i_3z4GA$k4+fE!s6nuK`o;owJ3F+92#es^oxs& zzx|A%a^^=4|D!s56jIS>tIIqJ+7109?FP*IPN0Lgy74eqhB!2&Q3iCVz~EuJmTr$2 z;N#^LdAxq5w-Zte9866gLePQyIedIN2RgR24U3MLUaY;jHZo@M&>UbpFinmE*&*WW z+1g{VN-9Z3Y3UY}RG{4A0p}xHaWU7`BtO3fxbN}gGXm5LT>9m=Sc?D`#N-p;Vjv|! z!7@;0s$HcJ`L{El`_q}%+jTg%AG0_W+5cP)wFe9H^ZbxlSziZ{qD#uR>y({OJ$848 z(z0BR<2&@bK`eDp6IWf}*0ciwhHuIorm@Mn)r0Hz3-5%T%!vAj|ho{dPSCJ9e4a60+kZjOA6Z2xl*m2$YWRjaZE3 zkJ~Ymdzg0Yhw^{5V*=Ut=J1@<9zI-$>jcK@4a!Y9eOD>0&{AVA4;~oPGqSMAIyZ*_ z*CW~*9=0puW-Z48z&8ItO3qY;dhT{9J#GDVxD~k1u+VfR*dngm!)1=!6b^ZQ)#c)j z)fNVGd;q>T4x`0wC{&!z4?f6r zZuefBk(Mk5r-Pl=OV`tY(Y4qM4&wcI^Ds7o!I#O~5lBiQJAZx)5)LeNkRRl>(J3j1V~#Z|s6xNW<}hOWh0gfmF10|mWQGWF02x6(-lB#`KNGTW3_1K4Z*rY^x z$XtRbW#X;RgmjeWnwGpF1}gGSZ9#k>a?pnc;|&Rj+zqE&|F#;wxS zE;dD;94qlc+Ada@xp?Sb8VID>*x#N?jE~QWRD>q9U)`oXZ;Gj<2hOZLNrVikwv_1 z?Fq`XAWN~GGW_1bHDyv4rgxXZDx2}Y&`b5TP}_Ru4AM*n=F{Mvt|0po@#AL^Xo)iw z1t~ev3e^JqgN*0SocXFcGj(_n78%K;w-sw-X?y=_-1~B(CvT^(92y1#_ZH*tnr;^| zE&(DO*gWAFT84yWP_94v%7r=Uo1fC$*7B$G-sv}HXFqBB26{MQ;RHbY2M0TNc(b6d z;pDxesZ}=9LOWGdCKwWO5uC>KfKpo`@hE3r7!binIjj$nMbZpg@C_eJxqbaTZ;qKN}6F_ER z;0kzee8SR1dEu`vK@QAJofVa{Na*6vohR|BkQtZ;m1!ho3pyYB(iJHCRm3+f$)ekT zcfZa<`uvuYlND_l5O*|8`2w7Ta#ybLdP(u?*KakSxOyy;D>(ZUBh5zPehVK}ZsM2h z+W4Ra0nH~*5gDsU+||PpLGWw4Z1PmR-rHHW8&$p&e`^H)^)c2X6_q)2G|MM@!Yv*| zbO}`mAm2q;FCb1t59RMSJZG1#Q-xEq8rjC+@1L~Awpn2N$vUWr`+drYbJm9(B`qrpF4Et7Qg6f71gyl5IYhwCVkuhH zrg5NuqA@esKUz+hPl#6k<_L2SfN}i0Z35Iqp|Dq1!bVvm&8(sq^^O1$@tDAmAFG=` z4E(2lEU>NAj;j5g3&zW-yvQm2oV~(RgX+&egwxU-C1?5R6S5gl5sr=T_IGQ%elD0Y zudUBNPDnVNCfNJ-)VbA-*qUF&KAc9Ysli&3e;huQ6crT}6m}t?K5>uM3m}u<-HLqs zFjl}=63~h@Uao(Uyae@N2Z-RHNCGc~0aF9;MuD>1tf#ht3=Uwec6Rnd z##;#Gc3%FznOF|;L4jnd6BfKJ*7=%FPUpVQ5UvO9A16s zaW)l?I756!o-(-a0j|{626@kD+pbhid_+UQSxBK*8F~4? zh?crCWTmBDzV$WL)*8b!4z!x}?ir_nuKO$?Ky3tQy<}&(&uz{-K}x-CRdqFFvCPcQ zLJ-K+n*W;9*+bs^Kn3tD^73pgE#F!@sS1ADTUVf@q%3U$eS@`)4bOA_?O54fv4^~J zn-Ndw#J1Mf=%?I|JyuMfNU>8Ysb`i>9g2H6VxMn{-dgFu<=4}L-})*r+b1|8{+5(9 ziIal4s(-o92_?C4epY$%q_}N`jpW6==H9lc7xCUQv!pS%xXshvpZO3-eCKYn6d5tD zd1Nc;Eu8W7n``DvdEW}yNc1Zbr#uJeH9SRKmXfk^cgB;%G+YifaQj^4W$#WS$Z z`-Vdfk4bMWpiCFo^9(`y;_~~dD^w4AMrNQ(agttqhf<~OPPr!?Ku%12S3{%8Fj#sy zN?Tq1N^D14CKQe^K>%ItKnKbAkKtX%bByuj52hu}%x1w0W5l*xz47zp6uV?0>72!8pF0`z!H`W_oHW7z6%-XUXp6_o|m47Qk2P|q~q-FXn#9rIb z@be@Gv+DH^r(WTe8mg*F{Qfv~aOa!c7nIjXAWhBa_?d-|T}`X~> zFj}Dpx0=ivM_VnzS(BEKkh2t{OnT=VSWxXr;+&xzn?0#Oc8Q4a?Ac6;S2xS>zi;Li(kjY2w1d7LHeGoj125ux#SF`CIE~> z_qwqXX?_mYj@dHo$xGWF{RKJ#2dyx}{sIvf8UnG|hsQZuBErJ0E}$PPZ`oSEDT55v z#|x^*or=usQ>?4UCBs!nC+DO?8x%S_fxIM~`hyhMhG^cApGL@2w^ND~prDcPDixe` zGiwT_fV(lo3Bnv7hZoZliSG5-h08jopbXy+s(kEwRz5m5Ht(Fg({1a4esGZ<8q(Y( z5!pN|a>KM`!J< z5NHsf3*MWLH4;1cWmb0sv6pzu&(H6EWLg@-horr|Cp)c|!<9yWo5I7(d&i>GZp75V z;d58vtRtu9S>J>&%geSlHthi;>VF;r_PwWUM~hyB5dj@KPds|AEwb3&!J!~MopC$x zzN6!Jogz!s2dz>-J@_5h=m3`ArmilSqz7#}$g;^I*qk@=`pu;GJ|~CZ%o)Z(h<(JE zW+?ac_7)!HCt=1hOK5-|2G5X;hts9#RXE?T@!FT`IM1Pb#ZBwlRA=iLJoQj6w~GE! zQGRO&JE%Da5XWKa0c*uKF+{`f&Cj?2b5M@6*;`#^9FqC87)Wt&i-PQ$zTL~@ONWe= zB}GN>QbqmXtl4G%+;uLY8EK$$|yLGX<`2s z3+^qn58|oSBf1QgIPazv`S8#**5pey<)YJZJ6Ny3%qk-{!f_#A(+{FC&Pd3Wyr_>$ zCeKt)y!zb0%F|>stsU#N6c(@p4qm%^F71*%y+A;qYv3731Nj*~>_qf~Vr2?d;*vi< z7H&_crW$E0E#UpQf*l8e=P@x`BUULZxHD+CWg2@&Y#LMH9_R8k`Rgus#wU3l1usF_(bc*0%X!M4uBq<}2aYsS9&p|ms~Npr#AXU*f}5hP?b3h#p5)%?Q3+mkfU{{G*I z2?-CXF)1Th*2RNN)NV{m9!|HNlc!=TeuJ9gp0^SFM}*GgfBy?hm4j1|DuRWT(7Ji= zS)1joh`7|Li5B?XAP2T%*2G z5EKQaLs3AwLs5`MKvEhhDMt`dI;9mwx=R`aq+{sD0FhR5C{bw`i*CL(plT37p69vmd#zusFxu7a@*3=Vrp-C{hPEPDw2Sb-V*;UYiR)UuWJ|H@CmD?% zkN)$u%WtBuSVwD9?J{HAq+nrrV)Fft;1b_$fZJ}{f=L3D#CqiHPjd%`1j7@2aH$++ zF!vY!V8+70pM%?t*)|UT4-3J1@;|QzZ5mefm&2j=Scq&r(fys}?e*_NNn63xmlwW! zd*gb)9q8|$o1ce_EJKHc7msd8!99b|fw{Ao<%94$_~n@SC6Z`bqBnj-6OihG`MEgO z?=Nq7HRFyaX40xK(TpDBuPdVZ2#ODAT1}C6A}~MA3T_v znkrcVk5x_%8-R2K1VLa?1ca0agLjAlPS`F1fD|yrr7JWd&L>avy@ceSKn^yxv}jP; zH+V~H19VGR*kO9Hz2?@Nr!aUGX$7m`u5mQRP2)>I^|9LSF|RXJBEXAaV`FpeJ_^}_ zoS=no-@2!3?56`88@((navd|E0-J?B{LURpFp25XHKGEJmO-!|IJL|dfjaI-y?raI zUkv5jxO($bm@W6&j}Biy8dZtF%PB4GotQ|Cfn7nR=z2`0e~UqZB7$DS&U%lB=^oF6 zJj{(DuKOl6&Q}Ah$^d{rxy4ydMNyUIolgxgjyImTC%TuW_TO{giwo z>gOl}r2~>9z*qhndZR8pr)DeHhxhoeuk0z|RAt#8xB($r^S7OxE(@M-o`x}iY`G^F zQxptz8JxaOk%4>7d=pX--u5b_v)wc^V|INgm2ProLw<)G22+K?ZPsUpnZQzznUHBs zq=kHhgBRH)YMF7TCxwQB;u@zZDIk>)_l`At4iUnzY%-5n{oJgAXz~e^o{{0qRO8x( zn#}MtQd3A$OU#QNS{D!G&0`@ny-jT#)3 zZ9qe)j_&u4RAI`~r>nhow*bZyy9_~xUb{WHHU;NqBv+a=UtFh;3JMN};)alO(OS9g7EZ*#KTV%7Z-yo4!4_xY$@nC)+66(Z&;=q%Gqtjp30IMLN0Q z)2{*`xn)TH8Hirs{8LB-mtr@|M}=V2he{A&7#SIXRFr6dEe{5WDk>^M2<7u@LAp;> z1oEO7oqe{Q?Cd^Y%1KL;v~3QRsC_GEdlQMnB!+0MxW+YuxDk0gLbp2e{zn*5wS1U| zhuQx8QJy0p)l3w2;@HGXq@4Nwy~n9nTU#5%nf<@#bt-?xCnS8a1H?_{UCg*nWJ7~t zL6x{O8V<^Hg=#6Fv}~WY7wCj(M&vX!Ktoswa4|)-sicT1xWe37(2&HN5|=a5(WQdu zaBr!Dm(F|Vf_Eql`v`Oa7RhDd-IoH>wl=o55)u+hk(Xr6shPFu_RfhQce|5>_+jal zzbGiM1c!Li7s$=*Nw}=!DSnO)Y1Kmbe(pm?%M8lSD#E`;H>O#NiQbv?@^_f<#me}5 z162JST#%bfPc+w;9TpOzEF*)Nn42!zxbxFdQ`A!-oPLt)a=%;7vtKvUqJK(9N+^mxYttggFTtBjBJ%I`+B z8zOOsKZnyxgFH`onC*FW^|J*5FtdB@bzf2}5cfcmjq)mxo}nMk1U)58^0?CSdEym^ zvrYkK=kibLg=E6^%;TCS?B1H1QEoSz5j@(=NMZ&5WSK5{XXsR(U}@mTs_;Om_T?n* z2)#4n?#Sd9Nh-qkL&n}#78U`zucU}I&a*gI*%Y@dz4Sd2GsAb({QN`IqwMn-ya1pA z;Flp^6Vf>$-{)$93H@<)m?Nx-ZYQ1fw*E4(a+_U+DUBVmUQ#Ab@2t<^3_4w~_rifd zNJt0+AJN^$X`4FdB;`{*u;`tWsYJG_xIVA)qFE_Coa)QVSD?vRSPsTMI13-#gVRY7 z?d4F{EU1BInPJMJprU&76%I;AlKL_VEG%RnE^=~=hf|!w8s@2E!DzLID6#ge=LjKB zvB7>Bu?xuC)^V01*w%REMrfvwI8UiDGyRC`Xc?SsMbbzRL%Xi6m=p0qB<2&*xnLb_ z`IZ%TtaRvD!n4!0HNzfT^W{Zt?+JKO-b)G(S^N#x?=zfctEPEh+M1k0OikV1z!WXk zDFAVJgJu_pA7bOcoqE|I6SMzh6r95LvZc3M3EM61-4li&NAMS{8s?a9fXEdj@zp0C zf1W;lIyxri#2xM8TQI>>ODh_nB46L51F=>ci@Vzj@P8K4zEW3Xc0hpv?bQfmHfL$n zn7s0VgAiX<@=I4XU^iOSmxtfH!4M+Cgyux*1w(!$C6B zVA}o)VRG+7j}g&&tjwt!3^D=UbN%+6-5s?p8pZwYOp3TTgF1U=IW z*oR?X0-82S?}+YksgXA=p|PQ%myaDQ-QD&E5Y#f*sL`W3Bcu2A>nrD9)?}KVPy!{q z{r(>1ix>7bHhw!hLu_Vi==3q;5k@(2CH5OPY@YgxL5L9yy%csSx@q+lzw#^H{@t@@ zMcl@!z3$wR1pp`Dt51_bLv8S0$Jp4rfdRMKZYm*UM)S5e>!P~ZN6(?z!NLlk%Oss^ zlE^3{*xE1`7Mc<35^f+LwVREkR2d-rt{Worw5xTW0=fAvcgIAm<{D-@I(P zr2#;Yc;s%lJyQAI9r2A%II${HEKzN!j#vIae*A!nj3*dnHw?8*Eu{-=p)`v>mO7;0kp~4*o}#lZzKD>U_SpVJ9O{AVUp}NIyTk6OW-IucQNL);$rXraz|R`1RZ@<~0=Q`6rJpM=MS`%o?$t&}5q`XZVS8*X}37 zNM)w!g>7Bk4G0)>b2>v-xBl@gYXgB7lF4CxztJa|P6A|VZ5u%x!CaoEHVI)=M59lS(8S3I7Ez|7t!`TMux6NDe{ z1?^=OzDqUoTqQbsG-5$GCS@-$JzcyiC^mKgppb8(EZ|_gZZ=O^_lc4tP&9H|zVuyy zp~sG+i;KvXapmV{7YG4siY*jD$QkySr+PYX{P>JPVl?Xk6PZ2RtU_=cA3rcO6e0!$ z&PqqNnL_MuW|PvK4LP(DcbJ;t&>onLg}#9c@`f`XEqx!a(>cI=eh|dH3xDhq{DV;8i;E(9+ydGHw zB6&a#%7mPK?9_(qWKJuXns+5+HNxhS*`o3st`3&l(&?0yb9IYDI{JF6TXPxg*xtv1D`x8&U96FR{+q1c-)V}7? zBQBxM>8DTUKt^djDiF|>qnR5ZQ~AxGW>p3>4i*|3q`Nc_tt0V?{uu1O=UG`>K?nl{ zY#W|JFyQDw(L-^w+NtR=Dx9ljAZ|UtmChoxMGSQ${q*hI2A+4#n+gZEXdESXY-7$T~d)14BZX ziTL^X9b8;`V4?ayuC)*Fjqujw-Y?Qc$|?jU%S=NtA&G8o4vhs;f`%rhu<$~;xaU^d zOUc>FKTvU=W(m36a)17Y?aPaA&Tnil2z?SUr1oo(Nsh_oAji_rmkSuiV<9 zVX6`%v8JJ2$mL~+FHn;qSPwRiGn0G{FYY_7CQb!0%8I^e1|cN!`U|ino@@7B(83*v z=NIr&W-4`B&PIW0r-aUQUe(%~<nIHk6a#f|Jfni}oodS7m{gXjB zSXiR2NJgc_zE;zrqKRW)si~jq6jBS>n%MYCsfb5ME?s1fTyEIkdth#^L`EiET0S)u zH~dsj@3Zt%-LupS{0@0Jy0p~7(SfDN3#W+a-gX6Ql8C%A%n>)uv}AWp-!eod3aXZr zX+qFcF!idXRy3=*CC6owjzJnECV&qK3)mPca43{P3*5~EAhD+=1P-&Z3JMBRQBu~{ z)Nt#SW{PA%jE4<45}+oYwoZIciFAkHJgkSTjLy2X=bitd3Y@Q^X+=~mKiWa?DA=I@ zn0)+L8chGtfz)a0L!t!Scp%0KkgYeaqiL zkNc?Vef65Nk8kE&t8>{_uvwg)jSeS1iFxq>;DC8CY;euias#f&j(5lDF1^d+w+Zt_ zJu-IMm^pFqnsuh)YFYxRt#>$VY|c=uBve$ibtT%YN+L6|yuD$}wG_RxBti4H2*+6{ ze4vxOEGW4ChR5YIuD&E4c_DkbwgbxqC5 z`T3d$KM{Ek-FBIqRZ0j!Rf71ATUJ#i0j?`=UJhlJUtEo~mWGB@#TNmh6DR16>mmE* zYpB#!pO)d^Zke04gqi6Rp6fKz0Z^y4Fr_k@WqyYYK2KICqaV~F1TA_W!t$>PgDN48 zm+oUz)3xs(-!h3c?JSKhzRt`0c#^=q`|VpWiaCBWs2UleNYX0Qz3_T;^lEx|U9Enq zxY)Y)p1IUSl|$?uwe)pQYYH(lD^;(38@W8aIcr7loQ4;I zvZEUw{l>iY2~LhDPoI{q9@bYoZu^%>e-&6}k@6p=+r?_OA!8~#4E9^Zynzt#^i0Mi z`AsYS$%-_9Ry6PbjONj5L;-T6ZcAklr2tvPdNfKBc3*HulfK5ekDg?wIq@FkE>657 zq)r>a8KH#PUtl<+ZP4rkX9Sz3s3DS(elpBbIdMiR64Lr$Vq-BpsO)}(U75{xlUtkH zB5`s1dtQ9{vzdXH7CYm0+LAEmZKn2=!xY4*R0G3ALMM^jamQkKu{l7NV5tke4Hf1I#FTCfo2QJ?K;*RU z#+gJ}IP7uWt?2@4e6?R*NvW^lu2O$GKktGs3Onrt!UYc3+8^Fq7W5L*P*EvzvFmk; zQ&Kjn&=ngQzRkS1I2gc{+^@*ecbn0pynd$GdH3utQ@8Sz|snwiqw4*ig-uI{tAIOyyjo9qG!DxZ#W z16a~Hy?^mM;3v5Ox=}!DRd?ksK?ZK7h%lX1fba@2^38Qn6)j`7IWpF@S+77b*Ch%Z zocMOb=kxQ$r>Pel=x*w3_r*y=MHRDYB_!ma@UGf2BEoyh=&I82#$z8?0-(G(9e~i( zG_POjeMx0h;=MW`K~64Hdh+MbzVY#|cd5|4qZe+UW5S;eg3%AvTXd*$0-*THucK@C zGqDyT3lDg&Hl{<~tLWlletEeTOB5#mv!OvuP!N0+5yjMwAHmG3am@Y&UaSzrDuLfE zQnqB+5cp)SCSBn^U+6@kXGt9t%J{+$k^bS~#E~@+I?@)!y4(V{9AI9`#M^KgWTF)A z-oeyUuC}&(mjUw3fgM*uB2~P%vX;c^Vi{x^ip5yQfECH&n|4Sys9LT@QoSP4F*juy$yNxyV}ZtFuV>^H#nu!n>Di;&e6mGhQyU5(Q3W5 za`)1V5&7O!tG*g94{)bxfT_@ zKknW~llTF1e?098>H^-@m!Jvn1g6xR^{5PE3FhHmpQB9^6gSn8qL&=mHd8}FEFNr> zBqZecQPhDlQ=c0 zlPB)=m#M3#9DHbA=P8eT?T~X!XZM@!9^JcRO+4I6S zIfI);S009of5Qq481Hj?S`y2HseAy+{ju^0qzqWiMM0vkmrC zObKWY!jmVpyrpdZ2A<5IM7q7{f<|3{&`eFuKA>~}n9b2i1LKK6rYL~5M%A|T?ymKy zk4Nu=jkvu*@~K#NT!UE$hyXe}xggHE;L-&o+5I3zBynAe5QH?H&!nc6#1wZcj!4GG zKpb7ae}55bECo+cs;n>W>i8VP#f4D`NGjD2!X4iyCm}-gq(&BK2UJy6RnVZS1T$^1 zL5AbcnJehyB~;ruUf zUG#+4^BzPB>3{yn;06;~fPJK(D3_XP?p1gktvC&*d|L>BzJ>l@8|v$m1g4stRzQk# zf^4i#*Xn3XX!-X?StkOMb#H0~`l8awjvmi_iWhG1B=|}F6EqWve?<8CpQ-SKB)|1! z{f3$J8()e5C$ zEe5qN=P!WMJkrO za4KdsuwgVHgDRn@-0y}`XxZS?=?u;W0s)7=E7{csw^^m?73P2oI`RMrsjXNQWo72e zo4~6(ba^Z6@cM=xk-wE`V&61{1?mpQ7mB}FgcHPxaTpe1=@6=41jhr*EovcqCc##o zD_5Q^!Mv@AT5zNGwXUtLLG=%_qSYUjt9Y-!n_h~IrHsLUul;Y$hd`@}<#$BIso#)7 zW!j^F7#8?x2{*L!51rK^U~$5P2{T+tAx%l`R|ejicsYe6+DkJFIE9ju5@>1xS%YkE zTUJM)vH~KY!vh2y`fG?$hj3-4c~DPAqyE-#jF9Y(XBc5G)nqBftt|p#)_(89^J{2m zo#EC9{AuUwIAd*05Lp2M$tE`eqbaXxC#v3{#KLln|0BMrHIM?=*8DqQA^|h(yBe4F zULA`)n7k9BYm;IzEIn3QP&kUFbe%VN_`}L=3n~Ftl5`2)HhHju1^s#X^|iiJ4>7_6 zEW;^-l{H+PV%&xZ)>d8~)hmO^*rHeuDg9|?XmAcR6;`F$MT+m~oW>ScSC9l6+x3|j zANpYdS0K#%yI1U`{p`F>7w_JG+uHe4p0u;q7#8gje}3Y*1k^1^5Fv=At;k$Sadh0M zm%%9p;`|4xKg~u!J*r-8_?Yj@eyqY7Q-YEM(S3b~B|L_V92J}Dp42m%F z_ME3>bN&sBY+}izN0Ndqgk|E`7Z->&w{S5Z=75`@^T&9m{;=~`RY~ebxdl52&(#c| zf~AjQZDIY=NN6MTw`csugcga0w~Zxk_)p^g^LOINx^esEFWaeJo0jKybxINE3J9@Q z4y<3ql4&%E*3?zK^)90LJx;Re+oWb08imG+70E~PaX$St1pOGsOa-fN#a7xe;AzHi z2X51X1dTR)F}S~G2%QLzi*2aH&2v>uXTrG0w^g?|p9~I9FzB`l4}$0+*`W0y8CIp3g~{k&meV>*;UW2)cgc}%HUr*h?B_e@?orx0T-6xy8{99U<|{T9Lfh$n$Ngq zl-JJjVg>|a%^gf2JpWK~vE}e)9!MN8hnxXsD4;(U$Uew$f8ERj6^SszZ=u7%_x-JV zIC!|>vmwcj{pZ!f4ykL9PY*FTUR}98FhgT+Z(Yu|V(8zBhu-J1VlOyDy&J{y98_1ufoX-zk~NG7IyPDxtc&LEfI2Fn= zWo1x~6&u#QP>(PIR$=PCF7tfIFR@_jzVr)mLMd4uieBPU+L8_b`LC#y?HpoU>Yq(%Kp!0YSzpj4BK}Cltx+yz@tS@{=2*JSpfUIJk26qEQMRazCzz zS4ZRC&$p+@kx|9eUW-#go!Jm~D|OXsO5>dw2nwA_k?@#Hh7pS_Y|keqhv<_`c<+mO z0y#Ky>`8SJ0Ki$_9S6nw)_IjOc{P_XqYcY;0C>DTpQ#pISXvs{=t_ZqwBx1R7ngW| zPu@?gmunaqsrVYyIw~}1W(S@+cO~3%=GNKE?rWA?(y7`xWf(6hNII^}65l6xQsFWz z5I68gahp>Ip0C_NSH1s4UFs@!wu^JtsG!MxT8G(1TV(C|!Bnf7;oNlunZ5ZOjP zx;u20>IhbDzfbY!J=srG>Wn*8&nZN+%n2up`rSy2?Zu4cn$k$|T+@r0aCUm}>$}zg zqz`2Kx7#;wp7p%lYdnhPjNGT7`yUk_gJ<6FtHfXQZ5)JQO#}o4M_XW&X29Oei;vM1 za~Rf1Pfu@UH(xwfS_JY(V2J~u(eXwAf;7ylMRV~gEw4&7s;+UanIVNe`6FfY;AICTr>)m8F*7bdayOrkYZcpPf@KH;HTE-%z^2U?+r0VUe06MVvbY{;!2+qC~5L?j;y75jJW zKx?r>mxp<5>0a?)HTy39cr5dNM-zU32J0Xt(!w0`=zjVZ2-)Q6hVQdp^}>SmgjkJk z!PxzVpBvO2q2v#@sIRrOUsL1p6?N zdHvhDY%z4UPBZG_g%lMa75!fB}h(kGr!Wca+UAO*7(<$XVmvt`0VcX zb|hiHOIr7rGFUeMY>ep@YH3HTmE*`a1*!+NaBVwAK|C{=bC&cTN#k$ec%9SxL#7}YD(b_hRyQYeCdm$y+z4hp&K_;T%jZKhN$?<#hw zKnK!8wefp#c{JhhR&M<$`JwbREyiGH`6KRd4yIM{q(ZtRGO&Oy4hsCcg`-wGcr}KB z_OFL{_!~uDDulkzmk3r8)c>r-ea9lo@P4v2^-4EBPA|Ux1lcya^_~AAtOD| ze5bm86?0@7$9C8Uee->U-))TE`Be5oM*#?tug^zL-G=wQuGsp~BQX3+k_^;{gyu}Z zla==@Xt=3vjWy5qmk;a+rZQw+Va1g0Z_b>6H~5Ma-c?8I=m^O8{q?WraLU6Lv+*T# zHu6q>p#Sv`$d3MVF(|z^YPN`J{<#>Kk{m87=FhJ(_y9?Q1&$J9dbW!BRsZO=JxBg^ z^$+_ROkf9ed?3d@pP4`{xu#;orQdLAS2xh%Ec8c*I`5{evBn0m9~3lA(T<{?#Ubad3tS{e=` zc*sibW}!aVf2Qk@sESXDiq0U#7lTdP;dc^Ja67u_oU>8c~DXD@;npw3bfXS8I!p-1gj@l`w|@3mLgECNqnB`Zshpwni$9QauG4 z2z*K%=LrZXt0lPem6Q?{PU$s$++Lby29$btlI{^D<=g#L0!& zLc>=9?`oZHzYTMNZvzv{U~2Pl^l9Qx1?x6nzR2e9kl)m;gb zS?gc#?=|h8ZC?uKRtFs(=P(cAwp`fRp`OmpxtEX9-oBli?(h>4=4czZD+eSS?%7h) zHi8|QQf6ss&)9f;rdz9P&S}Ecb)#lxyW+hp+NCCEIXUArPc?1xXqbHmh57V|O5x0N z`lxyJLeNC{<+a)m4i#sPV>*+!%d>U+OC21Is0dwE;KoYd_0}yJ1(si`PVNr;jZR#{ z%4+$xvnlva!rp!cKk$evg@UZ>W+|smZ1@-33{55mQ>mJoWqFy8?l$Kv=*Xy+IQIN$ zjM0EMA3sH-Z@7EM?&ot7#+3PB)bJ>0X&K|l=+OJtPoG{*`Nr{Zvs?%arB%2y_yH-~ zK%cF;FDHHXCL<$`HXg_O-qN7}GKZWe68pnCxtCtF%SUseWc6XzMYbxP49R_q%`oG9 z;3jg8U|8$2vgt<8K3#m*vu(@+u?d?W*I#blc*blAf|!h?P7hyMIHY^qD6Ymq#)tCpMb-i$yD4i5BtLu24_-6=S;Zh9p4I%ASue0y|)nTM}wT4cz%}n(@wTTNCcZ+LCBbfag#kLzwn0|Pq z-qok3h9vPeD`pXPw8v`9WXQddZ(3N;24dW|K0M@#O5#i@qQ$?mvI-TRd8n)5fI(Bo z<>Z*jMD*`2BX83*?t6(_?Nv2x{+vZQITpC?uFhICFTd(aD*5?c(q5je|(BIT~3+*QolK&oK<<5X87IEL%9yC^OQpnmHWzKcII8p0 zS-xnvADjYu;7bhCG2VRx-x`5n*dIcH!rS0DRA7HJG$s6q^(ne5a)?Z%jm!I_mVtqU zZT543H@$ITIJ_Qen$6!ny-I6t{saOrAD?&d<(gBH@Q{nZ;z99v2$JF>-O(Kt_tjy? ztSCoMe==$G*!)q{PgyBms9sNW#KFiWrpVc@V|uXukFIjN*^V<7R?t)5}j zGnfU}oxG@hvrbBkNN?o7#|p>M?i8_T_wO9;e8ni1kdO}@aYQZ$N(?;QD`hU;xm=(Q zVOIrtZG-#Sp49zqGSAIb68BMHD55MlH8pFhs-(U4?)y-X`*m_9ZJ6YcUbn>~Bl*3GX2zzz$ZAf!dl&N|NbB1)^~ z<|1G_p`p326__B<<=csdqeFg3eCsa0JKhjZ%eOBrN9}98w6z~7bu1($)c~_dUhqu! zXwK`kwLmo5e{JpZX(Ubp!(aDz8KGlP?_ZDu>P{uzU;FcQLv*EO{JTN#J=det?3_2Z zB$1jEPZUloFe$NS!1LCV?4E4gJ>8*H?cy5HmXn5x$Y&?FkLlIoU{S};<2%9T6?ha1 zmG=Qho@m`{;St-Vfa8=Wx#9d}*i>s#CmLlcq8!lG$`>!b2Aza*a{AIY9S{p_`J0$~ z1!g@raw4 zUt&Gdq}%I~$V7oIvz9;-D=QlXn~R=X=SRj{f(YK#F8$uE0-v9}-74&{zq?ag8{@s5 zn7VbY?hOA^Ts$I{ct|O|Xwi$s;w%^Xq{wjbntS>YiA^Roo*^5{VC`bK7h26c7nj07 zCE-5+8?$dz+iX z*HV&pN=;gtIiMs@V8g7Gm+VS3KLuL&krRKe&Blr3nJh5(}x8&>I_oE%Y(2k{?iFA3W|=^m6htziTS*7M{O^s1)miQy5qVv3@Q8y$jD*ZSkm?gwko zlz>P?GOKrE*u0C9dnu>bIQJ1Ed+AP)^_|He8t&cgn;_Ht>xtQJ295BAvO6{QbgatM zlKRr(>&4y;KgS$AXS$shEf9jesaOd@lTc7cKrT*9b2LsCyv{`=!94u5tl|#3g5oHvNZh$yGUH4pX zf(Q8u^3Cs^@e@uKk#4?Bzk=Mw4@Ff}6>q{lfVH*$HIaqQIn|q1iW{?~ksXkB9f}H(i8M!bhgCz|sQ5PWtR1cIqV{FvjFA^JI|T^(_d^q7$Qj+l-Mg6^4f(9W{jE zevZ`)wJnq53l%yp32GyE75B;OJh!KY%lrTz#O(DCRRYGF19k_z1DW&7kQa906X70} z`Y~SoOJ?M%>jn}dMOO96-nN&|P|(>d=0Z^NbVa`fT0!p`lC*uL?*JkvT; zSq#deADUbToZ@?SB&7Rv!5DVRB~f?x7N~HZK9hvH<*ZPhhikx!KWHqP!cgiehe~M| zbx=yD1Bv_=wr;Jxj=tqHph92W%`=5k%i83;(m}1Y1$K$iO64!K!nUnI*2 z>e*92qRA8s4eiQkQ>EP^6jT5=@?{~~=Vp4i1CfHYRfy~U?oZHLv#>lZ&zLfO#L8-J z=1X)2VRbjBXX?6T6UVTCO^S(mHlzWczPvD;!=`!_+0l8@#SV#{)5U?$!uqcr!Ue61 zB6H7r_LLVa8XyY;|NG&Bg}xb18p0rJOu)kLlH(108Mw-a{W4~ILb@YNewT3vYT;i@ z-JurcpkjbvgG0XcG3MQP58v$}EuPb6|4+?zRnqX|js*Vy>ferneM}h=e9&b*Ye(#y zZH9}oE@v|;wZ?_ogC3d(cbr5-l>HZ3$cEv)4}JMlLm%M$9`zuprCdF~`HpoYg7(BVyKf4vqIQU^8Qf9&-CLT`S7Ie^}{ zT33y6iP%nQ-{vO-{~D}N*`Q=pL63+P4b@&fYoAREz570ZMRrM84+{R_SZT2r1ZxG! zccM4HEHS~w10kE=^NS!{?U6p zjKL9X=xYJvvn;nE1A%m<;R;eIGK_tEyN7PCXTl=6i}vLKwcKT3KF;yweX`R^Gf0fU zwV|^b(!1c@vgZvX@!mXn(!FKU?dLns*P9QG^$(_W&iP={0Wj#3m@|fJ2JX7U=31cr zm(Q>G$yOSGS;qX)XLmj~hGi7_d5*k8!4|V6g6p3`4M62CD%rd;< z;ftXEI_LlGh5rq09oqM?(ulBran3Z|^6($ z?6AOpuRjOIkCW`2ftb*Y>};3aEvGJvgk#z#FdyVMeGLDNSbuO@++!m}%>95+#{6W6 z;?liAR#+$5%O)w8e}SRvr%CEm>;7;3`Room505n(g@lN8T3T8_<+&QNvY0tI+96Bu z^=k$`zLJ81;Ew%6W!Ix6B3jW6@WF6-LJBF)v6Fn4FK0amV-FkirAu1hC&DSz@nfVH zFUAMkTcb)ogJZ~Y6dvahD&{p9&HDMZFQhts3Ni#F9fHOo#Y4&4Bm*-lytb~+!L`Vs z<~dl5_4PT%bDS0jH^EmMAK%j2N-*fh>x_7XhNv(I!5nsjp;(tIk;sTah<5s${iS67 z#s03WubZ0zXdlI?nRRGz*7es)N^BwsNFYez5I&X?{O2L@<&Uhr^_#ubFjiVLUH+r~Ey^8=xdewn> znv@_S5cTtyBi$40w`!u+T~=d4b)5Tb1w-Thp8J-rp<&ml<90%z3{~WKQ)^C26)SHj zve^t2mEIo4t>>u0)~*dRWNFjX*mRGHlS;IFLm?S4=0Q+u<%R=YlRJuY!xE4PQ+^+2 z`Ahd8V-f7Ou;2>qy-AXY~}-nVUjtS9&`AIpo_V$Z>d}?$Z=``>! zF^T?JS=UOkNdJHJ)c^JA%Z_(%nLfS_SqtFK0%wQj8RF+jpm_kF^1?NR^+AlrZT|)b zIGPGq>@XfY6nOALp0FQS@Z!rYKmuX;CArz3#_B93C1l@%GwX+1$n$&QR+$iKDI>$B zU+#Z4aPfMEun>Z^+89F3R35|n1P${>#(fXmDhd(FUPfnwLuYmXae%K_3!s=OI!pa$O-&L*3ODui%5b)*vEr@&mOAzOb{I~@I z67a>8OS!^Q=ZxzZ=DP`N93;yygJ-xT{5lIJNO&5~UnfUL)5xpuL%{&TV^qHZxyK$m zKU;T%oHOqN`=9O9Ed>;)&%)$k0@B;w)5#Xmx}F;j=;k$$DPu(5y$OdRZ-+qeWs2P& zv4r$LgMDGscL$kWKhxj9t5YZ)Y?1q7Th1A)HT8IZ`p zbY{pjh*u4dLk$mu*aK!K6dKe-Mx9*BKGfZX{UI++{iL6s%+1M}GtKbFgaD70+!1A3+a2SX?r;(oWhhS9^~ z5+ky45bHKoiO(of^A7%wSj6!;hQ6bBR<+6n(5?YOeET)YMP{5+N9TM-EgAqo!n-d0 zeg}N@82o}9^E=QN?WfAX1O_PkeDJ8n@FB4Ep!TqwIYpF~hH8LzbnW9cfQfmF8=)5w z#ddJ}d~_Qm>kpU^Lv7D%*_~@YJG<$7O8Gr~YR`MZjHv7sBse?8Ul%ZW`4IL9TVC~P ziOfB-c?{_@uR0elTSB@)V4%ID zV|htQ+DPds?*?xP3vg>$<*2dcME*~qeXowo*Kb||tEplJ%VDyOeCwkI{LVjeXRcsS zgs&Jc5aCnakH$w-Xn=FnA6Jkn--9pY**9e5b%GNsnK4^iF-mcbXEC#tfRo_ z4J<{Cd`OW1yV!?HCbsJ%@1))-HEw?s;gEp9y)j>pB8cZv;ezuE_9j0H5m2rK2cI12 zc%ht_^BO&1@#h72;0E;djZ z)p7(&vWG-OAA$nfOx@VodHdY{?%BbY0=$rJip1Ur0RiWgKUf~j4F8wE9*Bk;J$&wK zYSspi?eqF)7Y5AAMI0O$b#xY!MU1DKLrK5yrx(d(HEb946yCglG>Eiw@aUm&zT(4I zM@@9~t4d6a42k;*vDKe{LIKTmD=qaPr=#%wE6|3+yq}17oyGJH#n36NMKt@MpIAvz zF1^B|D{-`^iogEWh*0*4pC33poNqOUb_h7my$91}P|Ks~iE6tH$I}>h*E;nWL@$?g zF;g>NL1b%i#xyAT$=f=-8gXvag&Z#=g6jWv$^%k<>mL(5B=j7qF_7Totj{uYQt2Lp zjxP^O?mQEZgai}#v-f3@6I4>+Yc^uqKOc$5$KTA$7%sytdy67!FBFM`dmhf`mbBN$aT_nQS?NVk-sJjlj zc-^}IxRnN(b8O&R-=;k+>s43{VY*pHHxC{QVR$SE1}m3;Jr<@` zIPnB>0d#49BNg$ehV_qEVpT@6)!ymVe(EAaoB{u^>9;-Ok*0l0kCnU6KBtTfhpB97!tgA6P zk9}-;opTYY8FT<}C^C+x@4&T)>6nK8bmukmMJ5&&P%!p>oAb`%U%oGoi-)J0 zEL@S3<6j=uO|kWE?>GpxyAJblOkpx8CLhNG>_nyQot;eM!=+|HH8nzsp)9BI;Awvn zA>%w)ptq11bXjq{6Zd}B62rv+;#?aZ^-&ed(Z0QCIXQpm_iAZg;_Z=laL4iTei(`~ ztYfhq0$S)}gXRrV5#d3#=LfcU#UFO89A^N6p6~Rh(PJU2Yj2;1RE|Ucmd&_+9nfpm z_OwlG0hVFf=p4>{h@p*&j06P0d*d^nl`H;}!5~8wl~Cw9p!i(u&TXptJI!#Y)wscJ z0329a4=-xc3j4`7Kt$$0K|G}42?==`)iO{2*t~u|iobDBUW1g3Y;tN!WjWN^&wc37!)kDFNgD3;jK)5<)coyG1?+vj_VT z6hFj{%=h6PJtk~iU;R*vi`RzMv)+zT_8R&Sa9YexrR??gTvA9gD4IZ>?t*}>lmEEl zS9e4I_}^Pvf@FgqJPj~ZXhXzb|Gx24NUJ+nlO!}$u^Y8E{aB7axj4&YA0On;_Sf5Dz$A3;b(6%ZcQ@umt zu@m@-QKz3uLL&Rg6O)4%`rXCQy}$$RBpSI#V^CBgYSYz{?@_)er-)WTE6M}fPOOcy zsMQD7N&=O4GlLJ7aLB{BEa2_NhMPBlg-uQ(JlD|dT3#wLd$XCrY(3tlF}~@;okS)D(k@Uoy~7x z8J0u?>2a7o3>BMz)d*xXxhuuE(Rsi}fuLT{nVu7U5T1L|Y~~UIQlde4&}$Yc5Wxc; zF~bHor`JzTly@%$W$_Q>ai5Pi&KTTr`xyvot`I+o?S7DlMuMum@&Cuy3S&vZs0m0 zFm73T*{Afn7CAl7BN^MPxo4s_q)jq%As?nL+@5jLy7c_` zD|#{-DpL}>^H(1j@-d8@Kf-~3Rpur4ghUFs6kKi$pTFC;^DUpJc;OA0b-fG+oZM^k z?jP0R79NSp)6+d&Q!|{E?T55S-VwA~${>7}K;6qABxF+t!?v@trE%O=vctreW*Q|Z z?kDkr-7%tEosbY;N$K{z?3}yURSh?*Lg$BiC=o-k;A)N=bC_=Feg%OegeOkiTK?X& z@AcrpMzJa#;|KWN&CN0a0t%UTZ6>`QY(bjgN-2yMDoDED3dUlOYX$qz1ao*+du(3Z z@6a6S*+5j?>7ssh!#45yMY+|s1>H>y()7i$VeE~D{Ji`_;F$B>EtFP1gOuNVIrA9+ zTxY*R>jW*~BNVnwAl7I(DkA)+T;v6)Y=*tO;+`?$})%*~wI z&DWtiN%u{1IY}$xj+uE6gG0jQMJEl;C7~r4YdbqKn%L5!{3%aQ&*_Snhp^sccIsB- zT1*@-<^9SulhE|^q@99FXV*J3!DbzM`8}sjaeD3iv|?q=N1^O`LzY{tzcd@|?TPUk zr>HtHFp9m~zcMdsd;S?X>$55RR$zgw?wvXl)~@8NIFow+v5yZX!zspruYnl?eBpet zyvobVtL+6K9U+bISfgiR0;Kg$(lXMc?&#|$fD=?l*VtH9+05KLD5lIg2NMnn>-~;@ zvI!l?q-&&>&NhOM<*mIp>6od0(*ALM>z`2Vi(Q63(}~wAK>Y4fnvp+^Wae=-yykE1 zF-KS0z!>4MNr4a3Aa1FD@L0Pju}|aX`gLUcdL9fJX=_&~G`%P$@LI0#rcFa7!k5)s zEu=|SLl${Qp{cX;>7^9=xefuxYGv-Sw$}P245Fy>|MEA|g z&?6TEE@Z;SGq1@9m+Cpl%zjO zm#$O1)J;{_-_Q4d82j&ds{j9g99JooBD=Cjgiv;7l%0{8%^`bKII^W>L?OvmR(8kA z2+2{|n`4s|9eeNZ?NB|R&)55Nx%__p^?Z5NamM4^AGh0eu8^G6J6aKF@6o~zd5j`l zT){UH0E9uVH;0ZFdxT=tO(b|8Kxqxd8UzFc6*et>7PhuZ6yKxbdr~2h6M!29W=y9c z#F=JQ+`iiW1VTzH*9JZKo6k`suxq5k1Q*@_(RW)L8w+5oCk8Zw1Zrb6$O4pE-$seJ zWNiL`EhSmG*m+7Fq{k{MMCHkMT$sUE54Sk+eBv2g!t9LcDOE!a?Hrmf17eI<5OO}G zG^lnpECTTqWKt&t>rZFj8a?^so^oT}uWqW)d#o%sA(NP84r)Hh*Q!1I;PMX9W{j+N z==VQU=7wmZ5%M>TAt?j*?IHz0QcxQO*V>BH7M%3p9D+cMl2AU>{R(b4cmc42vUtsuJ(k;$Q<9pR3YZ6sY2!g~X@9o>3vjLX z=JM3_KA9EB+{$Lr!7_grkh{Yi>Xfrbu{EASPht5XkCUOi}es z@tr043SK*NlCGrWWBhivyPYNn%e*|MjCX%D=b)BWXJyCD4Y3GepS}2L*JQ<@xI&j_ zuU>tWukXsH1|Jui`w^Ml>io#dpH`}2^&V^QiX4e~`Cmco1tmpeWbJYYZH&qjHr1!1 z!WY*OY#8Ca^JOQD%af6q1o!0+V$N3Q(K(I&154ZPx?mE5kU9ec z1O5ISdhhkBy1J9rzrKnBVVli{YmI^ur+;0+jNAsaiA# zV}@a=^9c95?%f$&_@K1(7g&%%;s)0k)Ef8}xQx<5;-WT1S(4m!{gqGzLQ-I@EzK8? zZMMtM-!QYCNl2AnUqHn9r-`GZ&(D^(f-G6E&cMwAm6taSWz-Nu3Q4bhff(!Sy}jEZ zA0wEF7}W9Kj~@yQ7^vSoJt8O~g^k{$C!~3eH|&2s`S_UvOb(d?c48Eq`IKZVeVD@wTTZo9!L3z4xus!?&igqTY`fRVG>Po*t zSDYQ@14IsM>gYfY)eOYqMBWa){Y_IA`#u_Ch2aKIC+^PD8vO09fc~d9ACf24fqXBAZI9eWg(w- z`)Wz3^jl$%)k{7y06u9x+w*NTPLMcr^R5hnmW*7qt-`VhbP}Wk6GEI-;0nsh&St0d zBtMMj8zRLmEh}v#jm)FxC-gV0&xh#4*|PfSX`6`1%H1{9iLUN$zBRx_Alha4yy-Yl z44O?or!KOSlYw;R;O4j?uAr(41F&V10}XU0}4=0~xzv+NEieQtemvHl2ViR1}QdegZN5~y+LWkJY zjW2@NN-0YofmZR7Aw>vTwJ=biMl%!&_Fs_q1T&Mw&aws^k$}CA=I0td+`r1~Bo6_% z&}xnIqIH;4Sy7VH9+khM{-%G;?2IUT{GP1q6`#e0g>w*vr%O_Hn~Q!3!h)PI$Oc z=G$Sox|wNff%Jpc(?frsPWJW$XFLTVUeh7GP^N3yNjb|F)?WhTR)QOeUfxIsU*q!| z>6(;&7E-OZe94)gr0`>H7Lsu=AGAm3azgwK44o?Ni!m>OAA2r9`jKjU5K>Pkr8}OIj?1 z$xxx}1H|R2@zFF+Xs+!oI`NFLL zTDiDrQjLY?b~q8!51j32MmXQl#RUs}56p6pd^JLVZwGSU@eWQt%(3@kQMnQ~p5aU` zc)rX;p-i6zWeukqzvL2$Epdq8Ll8dRFw4m^?1yiFr>Fbma0WPp_8;>Mt~lWTt#tUq zs9!FgCj0%i;U9;j``%8k-UoLDQeVf}aC6*4TUXx;K68cvqUp<7Q`3 z1Iu9IEBOAnmwyd=**X`~>O8y0{d^7^Nf((M&td`MypBwzNz0Q{J~So zY|-TDwKO5LwUR%65|$dC$ojy*iFQwu#BiVoZl-pZmyOHOyFs2my;4xXxgVqLjs5*r z&G8Ec8g0fkvT`2oZZ4oqzweZQoHzk z$m=7$rT6y!PFfKKJE=PCq#Csa)?TnNb!yIKV`S5RQvK@W({DGY-f+ptWTxUeKRlfH zp@2U%o}7ZqWc<#ZpzGI-nIoX@I_^sK%0%M@KgTEx2Rd47D%;(l@q75*>l2cZOjmUW zX7FDW_rCiTRmDkk)}z&!tij9FW&O-`U))#XgPfo-_EUM;%#h?lSN4UkUpFOp_+uz? zjAjH7H(b37pFX9K++8mU57)B83ae0IXBt72JEgjvnq1RVmr=bi+CJB>yE&CsF=jJ9 z9;Ed;MZ}z@t7`r>Y9CgD?J*F-l6 z+%b4^JAZpHu%@#^Y-8kj-~b@#9Rn)k{+#`Jdt32UTg%5ZHg3J>Ih$Gi?CjwiIAb1& zV9_C-O&uK{GC0B}(o|;hty=M--R2oeJzQ&Y3`aYDIrfeT+3Ojr@JQ@p3pl`SR)uX zr0<=ZjQiM1L=?xR#l^+*gtQ;_2Q@t3G`=nTqORv6yYj}yTuZ%e_aGHDN<$Z33P(9b zP-eQ@Vl@eQ8CcG-kQCJN_Bse-6jSnmKo7sG}y`&Pb@ z${e%zO)?cZZLY3EmvU*)NgMNG=AyJW@e8(S8iDv4iYM{jTXiV4{(cK5P zO%mG^cKJ2$=Bx`b>bsQ#ls_eiSG~w`J~h}j<1I}1G@P8WpkP$I6=(X6HHCQF?W<2 zl~ifNi%6?DiL$7f)x8yP@Z`5RkU%+L340)X2}o53olj|(_I$4F#dNqW50&B5US4`z zx3wZ3E>f=RbSq$V-^rO6h0rnHgMSuWGPi3L7_z#&FlAw5^9J6ah!*2Jyya%!QisZ@ zTo%oXA3c&*!)ivuM`HVn2v+sbTiN4)z8r}(_#~{OsybKLEt1(UXlrR{VV(@9A}0yS z5oifZVL$P|i`vt4o<2=zzYE&L=8veTXtS~&E3lLP!lKP6E}rE&rvlf}tb}$&V1PY& zca|c2e>^4xGddU<^@|#+TT#sRv=MBqyMvQ$Z8D6EUZSpoaO|HZbV`5ke+Ck+{`WP( zinUZ33>YqXA0H&V>>P_9(%ss>Lm>#FnUPA7L_drl?TNK7@pt+SSXHI>l)E2#q3kiG zYT;oatV}Api)Xa?#{bdkA)HRn7bEZt>AmzgKVM5$Hc0&LyB_626Cu63Hptvw2(IR% zxq@mR^Dj%gRJmLuA?9}Y_xID#$skQUh&ENw#*oJl%kLJJm53QRCgSPOcnvpSV3-+^ zZ+c;S`{#fnMLau!Aoz0wH+}IKW9o+)DL9E67G?~v^J6D&zA;M1jELC&d62{!G!a=U zm7u`Nq{{y7_nK2;{-rqEspm?Q13P#H=W$w5C^FDyQHv z1mR?&^VNQYyxiMpWtn7{lb5%s^UqL`qh+12W*r$3(HbBKj|{*2=)eDRYU+f}Ht%5x z^!^kiiVfu=ibKF(nlga$K*B@+`t?v@dY9<)-xHh^FZKu?On(RWt;4=fcuYrOCh}Wl zM*h#t6<=H3yH(>sB>BD~=;KLvYw!}Y0|(;h3G*y{?zc!JE}BaWvf+O0Tf~Nh>B4w0 zdcHa{d~M2&=JLYR&izrYKpa)JWL7nGZjWrJO0)_sI{5vU=r5t))lBxX*rvUNO2}j) zxLLkdOEA~I#DIF#d8kEEjz$`$blj+BXe)J|$`M;=JR!x`PwqID(!W96t7{!UllSJE z*u<6GxFzg2)|W>njJw3VXYsA#FrC{5_wRq9SC|k+iAszOjOCcwa&s)K;X{`pbi^fY=wBn&54cf$}Qc zM32z%!ZkR>&wYVJqeJ`44ep5!1P#aMZMRWv!8Nx3t_boRh*tNd&hV2zBX3!%UnZnd zkvx+pVYuddP42)Uj~k%D3IBJPzIHHL{+~|^x4gt08Ke6Yl723nNQ~@|kSbnF$o``N zcqxxuoHyl9wYW(hM`4A`M}7Ct6O9e)V{n=ZPVU>HL8khQJ(_+XDwp|(=vK|mdeb;G^4F0lEA6hEy|FJOR~ctK=7(kcakF8;5L7L2T?hOMIX4*0g*XL@;#?n! zb>jyzGEd^;>1a>&=0|Pk1iDbe)4zsY-VF{7-5uJKcoM-GL74uyA%MDp`C)y%$1|`O z>p?qCd$;im)A2F&tPdaV(s4CC{o%c3IJE8hbG*>DvQW^)CP60XSj#DPoweDMvl$Xi zeexF?8&36<;ycE_w2IyQ01b!Q(7`!gQ$uL%i-AgXGdP)nim!uQZ;l870Re#g;+h;n zS)YP`3ePw40@4nh^T~4|S)rVOX!{7YqmuIJb`55BYu<3S-2tf7R)K6>HSG$sZ@0DI zge^j+W^AU0epxJKb6vE;(%$;F4wbl@)6?&OhA%AOukdg!+4QB!_7~}bwJS?EcXFah zJDs6bc*S(G3AMeL;1j=f80`Rn28aV8NM2Pz;i}K>C+)Z4=@# zcwGd<%H+dk1ib?d4d&yZMFW{A6bC_`7eJ^rH8lo1(D3o%tdvKx4CHu)&|LjeC*(NT zpCm^N?Tt1ZKo2QGXlU^*E0HRV6NT58fG4!^UaW;42{F_9HtU!!nJ2JP#EM3)e)sS^ zospSIE$QuPV#2^VnN*=Z6`!kDSO-X8fB!aQts$M9Mte)3V!?phax0uQ2r$_6v($U4 zq+G{k2S8&A8I-6E=pqSxUs|g7H}bntG)dS(14QEq;>$3kg+~Kw!36F52e0P=0zG zQm~lc{8aR+Zq%EzYB48Hgm*k!MxXc5MSO(Ryxor|Kt9fhDid3a+zX?I1q7#XRvF=M zj?;!%Xeg{wI0`M*nQ9k-!j~DZs;UBF%3MqnT*&uHLxG#h-*k2WK8|%rFW=&HTt{s) zWTTr~S;?oW8youo`VG~80gMTdJ{xz{>1$8V1~mWOxiDs*EQ-_KzwH4V{o0UEGXx^Y z)O>z;1nS~cmC_5Ci_`<+Ax|Vh#3e8q!rXWT1)J*Y&4N53SB_aOq{H*x%3I;x1QxwB z&r8!0lb|~WiefPX+FVb{sbTS%BQOLVLmDd|RqycC=#l+G^7&~ouCogVd{M$X+;I$L z`!$*A?i&VVqhvBJPd3fR;qlUMRyvki_J#4TnHLNPL2LpgB37x%$&b&Mcy8pCa^3m{GKt!U`1)rI(w&=Y^@^jR zS~Ww!)nWr*8>qVdW>@AJ(Pil=R*%28*vOM>+0F@dE)` z>J3}J0SBWGp15Fci1Ubf5q|L#{yv$JQyv7T3yuh0%L83!QyzfX*n+yslhB^{^AWKG zM8T?6rn6nWy3xH?q4vD68sBeM1n3U+hY(Z_DFcLowB`0dHJh7d;h1KQoBOEuWX0=o z+s8oK1qCVD+h=3GX5?y?PQq8VKM#a7vrwU8X2x6+nvyaOi$qL8v7%0iq{7EUIv0(a zkU_rA4|3L!$Aq^MQsG!C>fhq^vvzJ^RZE+Gl%om}ijsc4RK!`ktj^m7E zw#Epy2R)aljiK3ygeF_J&?chpGHK_l`f*@~C|{kGIx#GZ_?dh1$va50Ga@?A@6Y!L z_~V!MEc^6vWULvyx!5|c01%=I{-uZ!;TxQt5Q4(an}J57p%BS!Y2u!l;dyTERkkV0 zj-=FcmX?;O!Z$$X9S))5m#y0T<1i8o>+y?25)n3}*(Z=?ZdJVhVDYw-SMjJan1PR4 zI#l!uw|x|{z|sz1`Vh$Ce~9s3|vy_{c*+Uw<60#=gyzcGc5vfgPg1^*oIyPbJd#X0eh6ULIW?@KTrIFlLIjgVn_-h7= zR6`k2Vi&w?Tj#26PiI%*(V=HcAff&E>C-ciyA>R){NRCb+F@tC;D7)|oy$T(u1-$% z-@luTv(SUV1adF<`S_CBm#Q8STwqCr{AEB6afbsdt0p7tP+H#`8nDoy2Uo3=aNapl zQBjE5gTO>MKkp;t7EyOczQ8FHy4C=-DdRb}{g&V13>YaX+gzmj>8#?GEkrkVT%n$j z%BG_D4Mw4W;jF;MIfb(uDVdpI-q25AM?&HzTToa9r}ky_0IzF+APh=G{C#yd4afWR zp?M+J440(@jGzknz*dPc3})BjO50*mPO#B+3KjWdR_352!NVk6O!f|mJ!RSQ@&}WPF_K)j^_^~kx;rK; zJnby?FQ55`-GHh9W4_)uKGSF0PVb{|1F5}^xeB^FI7N{NI}7MX8XL( z(w()r1bLU+NA&_l)BuQ^P>qXzt9G`#doOfo@ex7mK$$-G?Un>%`NK9Q3~60C#>O{- zK#ytXNwM|gbMWkMK32ZW@KY$&(Fl_taV8U)yuN88&2jHfRc@?16CS_I!M?F`%g}H1 z_B1on+(cKG4@MZTZ4~i2Mg@up)qPxZa=d;C5YzMLrbZ?#x-rGlfDIV00`hvlP+jQ0gtzJS>XXdOJNA9s)?5Ya@Ud7}G`-I@Btlg) zo(A%FpYgd{cI0bi$$+B+%T*dDu|qw@9P~A?32=s3$kKASexY>NqE+1rm(R($p%ysu&xyJ}68`GW!Or#Y0RX z(_ePX&r)x|wabx?c3Z^{F_zALg3;sgL3$S#@< zZm2a`d4GAVlb-J9cNG>tm4tW&p1Fabwi{TM*C{^AH&2nD9Obk0-m(w`?LuSon-Pwm z`T)xYKlg?V?V@o2`$dt@VU{;4?+x-IR+IPc`|j+zWfkjBKml+*lc&MaiqgO9##S#Hrj7x%VUcR+9Uh80vG> zzsgE_76{Jo?XIzRyo%5wP_N$Inb}+Y$e>NM4uXLoMsLnI#|EUJ8V0qf&%Yrs~P$mukS%cH-dCgFw6be2n=wIQI7e_BTJRyFHiign!_` zoNN*XYdMHu-*~2;ehHro|A_+bc{t**4i$?2pG0^e!tjC*0hb8BcK^RgaKxf0-d!R* zplz9eM)X+l82b+v_6H`iD#R!lthh~n^P`{46}O^SbK|9-Bg4z~LgTcBI0~^)49C0e zjF&Objx1NcJif>uwtMN*epvCfHqOL-yoLD$I%$O}ry@B*x?NMl<67d4`nzUcJE)omb~}d;%t_ zqxw<^WB}Q+D&JSt;P}m18Eh!Hu0M^uJV0~r65+5phHEX_H6c~U=0i@qQ-k%o=@5?O z#y{R$gt^zR@!EJ3K_4%6=gieFZ?LjDcv9Dt z9%2+=4^NXYcKZW|;f!_%&m3hdhmh0QOwd8Qt}4AyYQq`z3QvKIudm$WL?WXi7a;eAqlX72{0l!T!ZM*A5l?X4yG`SMA1J^rIZ$qf&DpoFGB7(d>GS6U%yRW z_kz(MHAiAhWp=ju9Ea#IOkf^KRCU}-@OUlPr{d(qRI9g?`A3TGzu%duv`6G<+ z(E0(&6=0o&ee|Fo9n|B{YYnNfP}ijE1}&;LZaju?b7;#0vncci>iB@{npyUF;wE&T zK&|z0PMoCa1)Vs^i__DgON9ekfLphO%w;sCXIehpWKD`r@LU8%rz$27zOe<|93b2r zh0O}O8NX4Lff@;BT>`LqELu8rz(hL*iuKNerCNt0qK&%Hrjx_i*x1Qwskm6UYInXy zf&v4roT539evWVw>sVP`Y&0&pUsGNE2qMJoN$L%< zln^B8pc0PM)aD8;8vcPW?EIh`dt>AR-l2+1D38(8eOj4MiRfodOih=kGrOJ6X^$Q;aoVz$XXS)o zF|A-JmUBXUGgb?4YI%xALnYOeg@Z$ZW%C2&&DH0V>MU%(eEY1EFs&sCgVcgHGO?nr zAx5twBb}<*3>v{_7FKr|#cJc->GZJy|LO zp@7E;V%-}d2vChVlE;{mh7$ap$xf9fgrwBC20efOyX!)Lf5*`I2=4SOJrVn= znxkbIZutj@f@c8Y8#W`=qURg^7N$2k>ui)D2S5DTQ>r7Lgm<}fq)WUWQG1#=jN$^2=_s_eeIe32MKkt&B z%l@6yh5ec`dVj#)g{gkIMAP8Y{Nnfq%WXHeIjh~7$y8R}p}*Zceqo za{IPN={0~jt%j@TC97b%V;e$_=mV^U5M@0Mj9Uo^gpVP*c|S;{LVA7`2~MMyekwst zxx~O5D&$vE!B$8u^|lhew_tg6zY2;w6)d!uNqvFq#CdJjunqjLf+)f{T>NkH5>3w@#H z)zV-&gny$6WNCd>)k9II_Q3zj27Q8Q*?T?a%H@_~pIGJH!e9BFpdOrZg}>(_YIi;t zMW#RZie1C+(IbWLAa>o^-WI-k07+zQu0USEYYLA?Pfwj=LI%@*cScuxuAYLqFv!1xuSER_=EXGv_B-2jh4Fng0mcAgx^a; zRd43Yzgk6PSZaPTTq^Ju9;n|-_=Gmv5A=<)lUsmCrT0@Py`=rEcCQX*g25Q9l-%6g zo6&Z!Zu@|QyvQhwg;zRHK}V+>be#9^f319^g=-GFQ!@x*1U^1KHsPeHCg~E?KeT%& zQ4KYvER>KhassJvr<2s0kej>f;62MG#fc@}C5c;443@v2>3ekQ^fx4CbA}DYI*9#Y-oF;OhV2@@)ZY!u^`KO-OJ+;CJS>w8D=>rTQbRK~~xVwwEx{083 zC|ZjWf{rvkcm#bP1aOlq%4;@>Jc3t1@LxHDCL^P1+g!7zGV!m0vT&ea+}c1;_HPlo z31mq4FJr-%vTEcaT1cM+3hD7>%DzM#m)%`%|ENqzTg`-sOc@elz{e5 zS1FMPQw77HwK&DG0-%QmRQf^Mfvg-sp!5i1J<2!`@5ned)ZY8)Bm`kc+d0b0$^rq= z;gfl8m?aQLe5x!djE6k7=!R`r14UM5w+gjgaUw46^TUUT^thz9XiX204W@h?K1qsZ(x0~o(F;{iUmO0 zuEiahpKyK5XX#>b@b*bWpS%}?B;6GR{tC`t6A>Dy((#Cy{(n0Bu#~0bKY}> z^R;XVca5LJZM{9A!^iYZbnx@%$rKRu(VDQklIvrS`S2D(Yfe5vKp!vMfVGE=0^+yF zd3;9XK%#H})o~^|iS0#m@Fsu${2BB{t7?~`)4sqz0t_`wsk6Hqe10Mv9E#<%RY!fi zHkU7l1^gAP2a7*dlEFgxF<75hezr2ZpQE9nIdkUPtc)yp&hFnAo}kfetgGV?5QwOQ z;!h=!FXB0YmBl7Pa3gpg91O=4=Dg(gd^Px1G9Em~2rkOV*-@txo4*6h9g<>fyRsN( zG)i`Fez=Dc0HwG@K_`R}-9sXGA*M+;;9xSVm4eCa7!l2PDpB>%P+$|#0Y#)eV>VFa zn(8ck%h%ZoR}iO)%WH5Ccmc~HTIEh}L2a&wtCEJsb)MWD5J4)DhZX!Uq8I%b)7f!} zTBzwN!{;d&sXfMY{x9+Ue%@!#wIC?y^haz>kP{>)kNMy~m%nvakQhL`h9esnpUR zWS*K*YnQxwFcL)zp{f5|ME@osOR1Io8|Jd7&D_L|~SLPO~s9FW1moZnZ; zPnzkGWL_UP`?~z{z-{1qEZ?MUit?{QACYy|glzzgof(!;UF7d23>;`Q_-BcnT$gM^L$x&d3SF86qy3 z)FCDLEyPAei$g(kWpCMBMHv)UN}Dr!;YP2o zu?M5q;skE=GG>Cml9ZGZfp&nDuDHOs@~+Z=-I){8$|Ltx8oj$VO$O1l8* zDz@5;Ah@&k0J{mC(AY^FNJ=1OMX{WgZ#gv6QU$%;$8Dl0Kl$vvAjMtfshAxI4}hiD zdwrhKV+wjDp)F>S0(nmN+BG~1IES5qYj#$5w6aQc{nFC%p{PhZ1x}F@9LuY#+!rsd zk4G9qeK&QLEp}b#p-QZ9C}oNB6say${(-eFBF_d4)ewlD%nQWe#}6Ndb5Nr^++C;r z1gn5N#B1_b$Y^!`Wpr6svcMwm`2M&NN929@x;u?o>I%^(GoPd;L zmG5>+NDS<5Pm)}JhJ-c&ae*n2e0QTm;_3l-tjymC3=D)ZS6v*KxcT|J6ZkOc19{>E zc}rKWybbqKR}XV%_9G-6bAs~|3(hy|o=M%U4M^)`U#Id|AGvA{ouYsozldkBWi47pG#lAkeg1;5vt|udfk>mCO!s!9zgI zzFd^e9&?Q|_QZmH^ykmlX1Ra=N)fz(0jVwD?e~oWR1wY0$p5(K#4a(KhTS#|M~5`> z=<>eT;eq^%kH6+KGMFO&kn}%C78DUbSR6vP*7mF%9R)!rK4m0@?frx)T)~Ml677E* zdi2L+9D38{6q@cK)*-H6u9IM1Z@ZQ(n}48;>W=+@Dd^_cX+>$N%8H0^+O2DuVONkn z5*x#2@pH+iV!}Jz3YPKWk%0q1&iv|rfo-etE3-cgC=m{8>_zoWxwSZ>y<}xu@*W{~ z5l0^MvLk6l&SLsvy!Li9#oVOVYC>kx|F}+0r=dfVLQcIY`Rh8Fp%N8SKeb;bgSQ@6 z7rp^L7GYFht|ZH?E8926CRZpv_Ce+uI)^rZmK&z>edEcs>zRFym&bl4>fWhkyKwk1 z3{*y}#jUh|d@`9qLNukS6O4j4x|8WIeg%2wAA06 z^%E#t-hZfwuH(>b^;^q%^A1(Zsk%Vi-z$e%;sEn2@B={{@U-_|!6Q9LJok#?f^5kx zcThweK-X4B0mU|FgJ>}TirBC5UF1}Jem`j$O0;muCAi&Aepdq2NI?x`cZ`1@{^`?W zzrj$eT*R|_i~mRjg-Z9q_x~dil!_rOdses>v_|8t=0)X5fhSCWn^Mm(SY;w~^5(3* zuD=J+HiB(wLE^87@vuFW=t`ypHHS}a{K_rAD4v#P`wrZBflYUTMEThT5+t1 z7l6m?18*zZFCX+uwtPj0NZ$CC+A%`-A6yzu?J*PSc2`?Y<5Otl{YgojuCq;y+WhN( zQ0W2x0r5K zF5SGmq+CEl;y8Bn!|`BftExxu0*xWxY8TyCc5Hx4`g!o50lE@y^~f|&CSbG_YhPj zEbDmsnTHuZt9=KN2Mdri&-Sfp`=ZyFUS@fRAgma@#;^Ce=j+DUtFWlcd(Ci{F z;l!wbIsD@t1;xZCr%9qoRfzYZ5wv^rXEtZ$%!SZJfB(C8?|vvKICb(Q2RHY`G^`@- zkX5Kzc`%Qgj)T5xwl(QldOEv61T_9$07t3&-qS39#rL$)k+tTUOW~>#U=Tf_Uj&Yd zKcXntS@<@sBXo3hguJ)c;gr3?K?KA9xZciW# zNrU8TN;WcI{wx{Jd1p2(V*8uXD98WFf73xzTN??vPa@rIVy zrKw47Yj79Zwv*)kHME~_qYkKlLP#Zl9P~-6J8MHu2%THEuG}5|jH`)LKkon$BoQEQ zFfyXcTpD>s58AV^MkTvf2WD7|9{yG}MEG2;A^&z@vQ2&jR>*>@$`qniLf`A_IU%ZZ z0+dHTMns*CpGhNeFv|wPvqllp2KpzKD6j|d-Y1HEAw--WYXqEBP?`9XMA+mEM2v8aX4y9pY zium~Sf1fpESDiX_syGsmZ|B#IO-&Y-#=9wIAljq%oR^Z7eHwor25WHSrZ{HNPF!2= zzGC+EWo=`;I0zPv)v!NCM+XK56b|V=GBPsKd=np^1I?pQxdNl# zV`xZQPQ!0?h7AeXxeTU?ii)KkYuwhb2E|~WxIzz30WeJO)6y)pw6wwn152ffLjR7# z+EUfQZFkWscgsN%6MJlYVgj<^7v#Fvk8^Xb9#eRMx!1?^y5x2w3lnLOQt9OWT?d|) zG&VyOB4)u99_I6*{>$ORhl|4tATmHt?|j@A&>oJard8Y{(ZctbIxAr=W!J;arSL4y zi0acH%(nd3U68Z=)>c;EpZ0*6oBrInjro!5f|ppJ7co{?$_4T}VIh8Fex`uQ(Qyv& zWY8Lo$2eAu7@Nrjt`2(4wTf9XM%$4~?JOK9jm)f1DGMrQNp9O>(OpnI{t8^|ZPAdX z2?3cZ_n?P8RV6ONTbza-2UR69UVjQ$**E*38wX!+X)KHTAQ)`BbwN;tJ1BD~aB0Zz z-ua0oLcuE7MY9E&JMJxaZq~* zd7xVIii!vdUOv99VCD#0wzb@VL zq6b#&R$v-`wI+RIOYr<6ej{R!@S}c_-N(A50-FYdTXccOHVzfOfo3 z@v|J3F&=Ji%B-xxY6!}K_Xlnj(5pPnr9a=DwiXT$UYj3y(K~8=c77S-%A4Cj_wn`( z+2KAzwREBZWQvoHl{>E^9=N%sOSVlziVA@9EaHDDMRjYr4~G>_)l#M@LS)0*+8R|R zyg>Lms%HX_*wxX|l4ouRQJ@yz-+6CNvDx_GKqvk&C!h}A($)_Sf{3vq9btLrPDFIH zqAlD=xm@0e_bOc`&`#*OKi$C|sKO)*X9DbI!2IUFe{ThFX#WocbqY6fyHMUap5}_E zXjx8<1KeC8WiwXSFVg$qHHuxcMkS@A?twVUZf$mmVCLUGU7}OY92|O|>mYXO*Wf@K zJj?n_Ta~6hOI3ku*Jk*WC$|zL;)?9t!pTHAJVja(<>EGeGS3kZzdP!|bbBTW!6pvlJ2+6< zl~JR|`al$FYz?x$K&}Nn9i0l_vV|+W^eb0xz2mKXcGDQXEEuIc zdUfui<2?gbMzpu?xTGl>+2(#swXedGS|{{PSQQv z@5e4i%ccj>`f!oPL6#^pCnS)*TLi3Nbd;Ly77RC4OF^{MD89=tjXw!T?pXhgjq;gn zYWprv3_exfO3*^V#tW(>@RNck6;$D8XxNxt_JwtBd()jqtDlLsh_NA8S1rz+8v*zW zt^KyG+O)b9*rS-63vDTGM~-1KpJQ%`{$p7Nsn?24^NK;>*jUj|WG^=oCfkXu*rrVm zp3WL>35mghfjImiT#&@OF9ikskn58ZqMknX_~~E~+^^M`A)&3Qxmjn<*8~P7ZU{^r z0oim1JzNiPGRtdDtX*bizOH&&Z@PPL*Lny92<@zQy&kL$xJF*meHZ_N;n$}&hd zkiTGV(QgtjZ5kW7Mx^j2DvGgD-t&+i$QNI8aYQ#8O-xn-Y-;F{5HJ9=tbDHD(52e` z_CtO(*m2Oa`5D(Z?3AK@y1_rcy9?a-1a6)QMUeDAuku_QbD6r8@` z80aamCM(NQMkEJPn=^&0?ZaVywzqPJfBh;mtv<#Z|MRESRNXcmq`-e4zt1aO)tY4) z7$*X^p9aDJAV@2yv-Juy6d+!-w*~=-*C-|M_yP8>X2sA%``3Y#?Q;yoi^cP&uK}rL zVrHG5ZaTfkhhqtS-uYOwFQy#?Pi5z5{En{D0=IbDo%}otUQ{2->=I|>?W01sG{!>v zmBM6Hus?pV7MJw28u$1C5JW*Pin0Mj!+CZPK4xfWhtO=;QtVI#Y$~w~*{n6lyLU}wrJ?Qj#!heEZ;CMa;q+X8N&7xf_IjxJ#uHp@4@8Vk zL&tKS( zL6J2`-I*c1682psPDBf+)8H^l(SWAw*n-vl{nf_JxB1i8oV@$#kjj)>Nq2ooC+E`3 z`a41n{)4G4m|_I5tNW2vyzUCJ5Z@}t1yNS5>RH=SnQHVXQTOFFk}?Rhn)+2wO3JFG zB_r|RO!>Xhi%6L`MOBsz@fVoZbWZ^P7Zw&kiH@UFIV%shPWa5S@bTqCNcpj2$8Ji< zBMz#O#l*#7ji@_U3wK&vAeG~L-p;q;Pdm!~t$1c3gF%@iSV{B2{P06q44@-CL032B znYrG9QkumjDeMseu|zX2Wc1_5j}S6?AY(&Ag4;OAV6 zqJWUq?TyJ2eo!^46fyGsRKZ?6-8N(WR5)-$Vt0fzMxxGiH}zqvzT zAV_$if|DXVhLd5IkL}$a{_s1&B{5|mJab-pNhkK;@*b6Y%wtwpx=-JcdXQLtGGb`y zdT;i}r~~B*4rOCNs-4Cm2nUAwNHBunG-=bc*Kn8M2lz4v44LJ=}1RQ`3 z){s#O2rHzNA}aabEg>SK&#!{mhnVgf*64V)YtJQI;wj1_RL-F6DA77?}zp7*K^P=_Ew*bFHOw?)%B`4+*$9L374Kr@=VWPy}r)b3u9(JcFeWM`IZaHsDqFSxKdzcHDR@1}ke z;@^W;0aL3%qj9?oymj*5*O~Q4zg`Vzi4)&)xHH}cHyo$=VR8-#tf1VFT-kbLY#krY z(Uyh9>YA(MTa>HV$VkX}BNu)cczEPPri+09XC@J3La^CxgO|6hVsWts@h9db;g2q? z$7iMFt!d2*$%>gVa|&uvmC}0^80Eiqh;$Y6WP%NPwm1SJ{BUh)Y=IxFs=s!qdFdh| zv9B5=yZ`WwlP2y;AmeOoXu$XZXp*%JLK9jM=VGtDqoN{sc#@|SZb)fv2?_xH@=cun z=7&ZY=paxl=cRb8gs7-~R&3$*MhKz-4Vd6{EdG{>gF_QV*wB0px1iwbt?*&i_8*$> zDjxhnZb~DIZqOJ1S_0E%qw3Uv>yTldIq1*1Y*F-A+H_6gDC*lIUd589+{6sVlgD=&reTH>1t_R!1w?irG8N`Att6?=i-Wl zJYX<3OhvWeh3Nm$;Z|axQkt{`L9=h;{AvH#X35FRLYd2)jBDbB7hYFX+#Kg_g^Wlr zb@$i9aK1bh9U-7GzFE}JaE`^?pzt6$hGEiZTdE3DbtQMK-{1J1B7+?o^6tv&c5<@J zKY8ySS${v)io(vy1R@+sAzzbQK;Wj=V?XVOxd`JgK9}N+u?GXwcb0>J>Fxc_NcHqr z`;!`EtU(Ih{kwOEGmn+q!ycyjFm@`+e)B*G#_wl1KmkIq>7WQc!w2wHIM8X`T8R3O zM~ohFAh#}?e?Nn=#R?0AV$4aS;ft5S1Cp2*1e>RZbnE5r_DfXHiL#U}Uzwh`e&;I&|IO$BaMidVdcWIb+eY@+;`OFxmbH z7Ut^EFC4fvB3|`%10k2WKg`|m9}v4@`TrI6-tkoaZ~VAW5h^=GB3Ypb*(xh!lr7Xj zva^mo8ulnz83z$6^VnO3$li_}vJbMef7j7_eZJq{@A318a@@|j@7MjhU$5(WUeD+A z3S+?eV;Vqr_U#}@<>TY^VeajSymkEYUpU93_utS;(7XTur1zix0g#3pV|7G~XjxcU zp(q4W$xmJ06j#6%8l=I0_*APn_f!)Bz;H|e2ws1;n6d+$<(g0X7=O&=HQP^9W7JCb zsHv%Y3(QpQ=|6e=`f(F=M_(3Ow*#gRI3ji)23&(dtNXtCU@J+C_>?`pP}TyD>s(#6 z&gZ>i){nsnrS0>1k=GJH=)WO$FRi`}6g!|2dT$D>w7k5lh?pP=*5^uoKuXHboQGvmaTTRgVHM^G^SG(!N?aCk zS|uBU8@AD|RZ&jOf`l>`c?5+&AE&roYX1H`EtxvGunb}UffQ=VQFNwd#m8sneBzA2 z1*zH_W{*dgTf~+fMg^K1^@_xu>f2_&I^}{SD6cw;gUvMI2Et>HWBYz|>Yg@AbV}Hk z$q%C&ijipSZeCqm zG>@8{m9lvtSdJMU)?Ka{tMBh`?(J2VJV(CL5D_6e_({vj8OaOKYthI1`tw1kPTz$f z)Qzzax@@RtGwXlYy*~Z+ExDJM;e04n0E#Dg1SkMBJbD^n9lpWh)=XQ`(a{kQ5CAom zOYH2z=3OS>%iG6-jDB6rwroeQ&cY_mp@jx3dKYx{J>>;;hcli;M87m`M`W=VfSfK|1svJ(2mU2~f6vFy*$4aVr+8jP-N$WHrqESw_Q z_v8mqGAz)2)e=1_HU0W^6MMFzONqSt%Er57cOI!%I^b*I&w&&YVnzlq;;=LL?vJ^M ztT`M_kqw?|j*)tR2B+(}-pm-lnSnA7#*QDvWq}-dR;=zcS|G;Xec%crLkWEJae#!R z^Y35d;J*2aUNC4ab@7Yuyo{oc&;@3APl=y=G-pa*0(M<}u(O~lv7rH)04C4%PH^uw zjDs1u*GCAX3Ip1Q35eX_|P7nk(djl%cC@W#3?^jrGHa$vX#>Q+Cx&`o*HoOW5&o zG|ZyxH1j}|mhL)@B};F8FfDK%V+3Fuh+-#%TQPK6E&VFhcjzQ|9ZmUSpvK!9(j!>O z*yrJiM~y94Q4~U!1}Je;aE8f)*cxEF;hd2*MS<(l9L=MNW)OFIDlPrl`*7EYya)($ z&Y<84m2R8R17?=RphT(bU$*J^Uqc!?-H|AMWtR2@YNsITk|}B*h6|e6;%wM9Gs* z7SlawE5~Ayp@O<+NSzcNovy5HM9s&~&N{Cz0~yu300TF-@{j-#&TiQkkY0KNSZBuy z7OZrgdb@zWO}!|$W!&E%)&Clj0}cB^gHTV#JYybffaE)+M2GTp z=6m>sqj&&H3fT;wqoBygXTl>^LquNf^#lDuG8afWEH=!VU`3zX-`+L45E~y8lkr4L zSve#%HMRV#=?=7(F)d%Rls0AOM3jJqsu+QZe3SU9EdZJ_mB5CINJz*kaRoIA0RQT4 zBN~N$IYmWs^)|pN+%kw$M+>OajMUR#{-}on>KiD5MGXE7jONL=k&%UPyBZr6)FYzQ zI4+6)IWH#4x;84=-DzUYs7S*cP>;kdp(6~^0#Ge;KYly~+uiIUa6s4Zo0yx6jgPl{ z{0cQbco#f{wX)aiR8XyTT_HiJ!2IE@DsoUwY^|(_c>KOPqp0so(i<3wr=;ownKkHC zy1KqQ?>^wW7qdX*ecf4SZ^E4+bTjLwMU7AmzD#?;fvF zHN-$k-2E8yY`9%e^*ww3yvN$~-P9B5Mc1<}u_4h@)zB?tv{J9gLKl{6JiLc-z~C22 z16Op&j22(sy4ZQgha&Z*IgjeG0$nt&*BTJYV66fgqlEoW17d*;Av03?6(e31tMq%qCwJdhZbeNvEHoi8 zol9x0Wd7El1g=h9;9hG>V3&q4|B1{q1>%mTEZ+HWNioq7Bctkt>UX(`1N5ps58ojg zG?VapZosSk<8zmk1Ei$CXleuzNZjY;@cI)1~)G!XT4TdL;Ux`*yu z=6yfLMZ-azRHIEkb1W0?qAe-Je8q%q(^`zsXt$aU_bO+7`ZEnU_fx#AdsvO0)0KJr z)^K%CkA`Rgy0It`MxL&;=8*#vJvOyT9|hvqc*oG(_)G3do4tkI^0fY|)5Jb+KH9racd4Czw{(U!aXY%*| zCowIWNsui-BaxyhD^+MgQ2jfFC||;1Is}D+#_`cpRIT{J--AwRDhsM?xp03nZbx)- zV}}Ujq7uK-G$c+9dgBwuQ;5ZvsWPB%W3y7!>NO@63oxN2nZcOOQyn4r2(v(WlVBR2 zXg;Gb*uK+rv8S|2f{M3mpqnb}GF>C~~e))Il2?*ye9ztsY=UJ-0^U1T8PKv*Xy$%*@HKs0&>| zo`S34B17~8fdiJQz;>LZ$8Pc)P+Y$%ofYHYLB#ye*3NYZ0KSHIoS3r>&S@!%yB`RD z@V8vuAk>9Qt{x6!nQDf8e+y1xelNG?VCTN71lyX_&TQ(K_hA+P{^TpEockGJ(82Hu z7t~GC2~V6D+&?4Y{hdlTEChU9niIOZKn5tkos|$}V!)5S<$DV7of@#y$-zJ!{Pel2 zxJHmo>$^1bNr!u81&>>MTn~1~4n=R=0MSz{Zx5W&zkx#PP^$Z>zEcHm8}pz_(Eirl z-JO;Pfb1JP^Sh=_Z*+kC4nJ9F+$faHEP4TOG8<1}ehZsY^oQmi?qIEHz4-Uk;fW3l zIbZ9d86-4LUD}e1NsjWqNn+~KG5=^?p+kSSW-;+Py2!6cnolA-|B2w?W2Ra^`Iz&U znp_kWgREMB34TglXJk!og&G|1zf$*|M;9b~mHd&|Yq~N~4>!0T20Bj=-CaI^zl~%< z4&oBf`^6``GkG9k3AH>~dHLqpr3;6@{XrZ8`;5sBv@57*s0%XL0Vqk96Kc8HEqob? z0Idhx;_N=`+bFbexUGMPh={l$|4*c%?2%dp9|n6Y=xHE^vosBIi7(88z@>obOTKCI z&ycL35r}p4imm9Vs4gY(7pT$l89Lh8-BDD$H@!VHcF#eHO%E(13R$|= zct$keV(e>grzIoI9EtU|X+Nmxoy_Kydqr4PR%fiiH=Nr)mX!olg`F%FUZ^rS#>z^=g=TF-IuX~^_g8-Q8+i*_^_bTFB>8|*zDXizg}J)D#La4dkZn-0 z36GY>Ob1tFLT=QY-cV}d^SfF7A0`4!8UrwX{J56OzO(4=p_}=x}C-rK9#EL^Ii$sOLebaf-rKz9;VrPwP>q%0Hj`WKvk^*IE;o7??(9eb6fIxAFQ- zQ^vh}_j))XgzDZs-tqX9Wf*3_@R2XfS&b|mb&F%xSEWDVJY3HKCwQYBQU9D);V-R>{l=%E!NgSi$dWU3M5^4 z1d%yRV%v!p>&>&U4y=p51jG1~C(X}(03UbJ-gUZ`)-7p3Phr~d+Yda z{j{FLj#J^MH=V2VefU)a%2!&Stl3UqvugCrMHi%f1!xH+NP|4s+lGoeSSh7%9OsZl zumjAD3q9>0tMmRQA|g_2r>ExDid>HA+T;V8%7ZfdCbkDJPLRFX2F*2Bw!y7i&-Y@J zl5(BG;39@#K{b_`)`b?0uqt%5;<};!`0)b>UtAI#(D@AH%WqsKCMGO;Kcy-7F>}vj z(5Z#OAdCg^VLN2_5ps}sp!suzFw<0uuNR?VRROHut30}25^kAWzgn8pv8;mf1*5o2 z-jmiqN_OCg<#2`7)Eo-5iyOO0B=G7b^$y+yAiTT$n+i{GAPmhNZWcX=8YD_m8N3bDzy;kl};YH6;gjfiz6U3fQ2?GF3~U0)3{(;XEbkq~z_RGIQ-zz_}R)9sQ7(6>Z-U(YNfTG;pvaJ6G z!6Lgdva+!^8VqW@Jik0Y4voWrJHvn5#N<7HEp#4Wxc=k^*slG4>2e1qK1c~*G{t}m zsLB6xSk%1hlDSLW!^_HVlbyA*n9bT7nB1>ONQ|`HBDPPDu(lj7MKA5ah*`Qjs(#U1 zpiX+-cgrgOPQ+zUz6XA~QSO{)F+!cWp_|QkDO(oI3r%C+) z>MtSxcadC<-4Fji7s*MmH3AAsmd3|7R7l`n%sXI#p9M*nvDYJ~c7}RwosH?huhd#J zX`7F&>urIK>+gvHy_n=kDSlOmgJcOp}0R|V_{T&3DM%8|-D9HJKHvJuQw4%b1>HP*UEKSFd(7H)qO) z(gR+gxwLm2pq1nJm3-d|q7@VwEH}q?emjImxy?KMAZOMofg+4xm;!MgRk^`i1IzDR zUkettc;sZYmOdhJzfZtiyL$9R_2hTD-q@djaO@Fc7OfA~+ zQIUN6_S$97DCcSM@gu|5hn`xrOA{BCx-O>AL<;Cn1|C0(*B1)P;hk#F4|d3&#Idz~ zs3VHlT~Y34<+GpT>cZq76R1r>EdJ&7pE!SMNLJqGp)R7qbMQ}+z>G^MeCXwIVJZaF zjCj^~XE~2iFf$|1hvO9)~uK05Qhrh{wCeuE_gt91@T`mX}BhPxe4G9A&CAFkLqFSBKg z?MO0?INdXeGIacL43m!en0x*4L-^ugt1ZuG6cQ#SARB~9EK-?k8_TJEJ%;8Y%cbrQa>HC z6Za07e2g8Khv07aS)#L6xV}{Ib(CJ=!t@_rKhw?9<*^gJMBvnX3=e~UG$$*Es36I5 zI7+M%*c@gz+HWxq`VAKKxs`B++biP+-TUj&jUky?BEc>WS-DP>EoL{!z!d6#Cjb6? z1nv&WU&0e?8ysF5RZ^+h@Dwdyc;CoX)pJ^$W$G<18#}O<;fHCa)1Q}P<=;w1P}@`( zx=Ng^TdzcP_N-W#0-i;J;L408cA0FvZLwE4iGs7?5+o&C>_@k?fIidV3FUN;;c{z+ zOw+YHkh&bh(+TbM6)7euu+2txh7%v%xIX#5#Gg(!sP*z$9C(L^$IU7%A>cG8iu?I! z9DKUi|DGxMg!qIEI#ow+l{~G z*g|JDLi4Twq0fpte@7EhYKa3!z?%fNlA@~{ymozebinaV?lzQGXHrUQA?EbtEzDZ z0Nh)h#h9G&)yk`zC~*jx^~nItKnUi0p7-~VUri&%{c>^3fOX=9a==r=f+UURK=Rk| zB^ol9Kqd1iPd|$ma0Z|`Y9`4RIMc%))J-q7?2QMqf6CJ7%sq?HR{QUf6;hmzYA;Si zwIwCx>Oupef#=*42E37t%paut;|ZdVY)Sw*Jw1iQ9Jw%zs--&JENmE)Lf932Q*X=wdW3B)+5c*j*IhsNFpN@K7x#D-YGD+EdEn5-ow!sy0 zuJZyaACEz zE#cA}PV}z6^LYBYrp$D!jdBSb3{E>1L*PwY6aXU4&k9bK~Qck6V3|VxDIxo2zF= zXOzZe&0^4jawPnA6A|T<_0eF385wK(j3w*fK+uFCPB4?6VOL%?zVA(F^h(c1&U{~~ zgBxRKta=Wt!cEK~DLC;;H6uy0rh&bFG3rx9Tu^br?@K)`? zFb8?K^XS~A!Hj@lmnfT8C@|TvHDbM*H$Kar{;W$2cuvdsVOR`H|8h!kP81Zn`s3Gh)r}t&{8V+yJ z7n{h+(C}hEDN8xq#3@VJA>I(9#q3QgE$sQNhJ=RCqbX5cC|<9Rdz=$&deM>VDUWWN zs8rnxNT}MiVJ~V>L5(KgWLx2)RO;hO-Q%vO(uR!x$xyMI%kLk%2UNSA@+1CamK>~5 z#*Um)p!buiZz}Hnc;7H&?brpse8>%6zkUtH5B5u!AWMf+l?1wS7gYI##h#+1tbAD;*{gndGU3z}I{+yYn zNVK+hbT4(qC(RKC!A~A@_kIxsjRZk7o%4W>iK!Y;=UV?Wz;o4wQ%n{6`xK=Cie2Zu z+r5Yu^YTdPWU9aqLG{;jftN2|0`OaR+D8ZvLJXx~3@5br<5~FK#BJ@pZR&yC3_0AJ zVIyar%E5#&T5c{baPwz8Fz&B#mgw#>o}jNNw$5az`exJky5R(wn}&(XdZvDfs9e2@ z-!p=R=4g(s#cvI--bm#dqSCa_lFOLQR5;f+^*w&9qF-HUw7trkTeFmF<4_-D>b&Hk zVq*E_c}7!|gH{f@TQ9$pKk>%3JC6?zcE?kUX4+K`e?}Ni_$t0KK0E-UmZGL+ciFi& zg(W3J)%&`-J&6*mmc6SQbt)&eUHnfAo@S)yzHo>w7%lI|7}QAa*3-r}xyXHMZffy9 zbf1C6j7kA}>-KF~EXaq7APd7_Fu+OpXBfgUobBj^{&v+$dDpO!-DPL>L}PeHWUaF7 zO|@Y~BWI=0G_V2R;_z(4s-;otU5s&5UFJ_#m@C>l$7LOdhZE?9Hx0`RGomqpp{;K_ z%WXzZf&EQBW@8~qNbj{lMIxox`md)*JI?MbUCog(In!qaW+l)=-fz#gJ6*G9rrn%J zH#20+L!i)oOVrTN6ja}d9$hn;xjUa;bws4VwB|U?ZknanYaml_H{RlYMzKb{iU%*p z2iMlP#5ctzX^=gTBK%)T>ZzCMfT#O(s=SmTGa3w7y7vWz1O=(l1V`KS=PouR+u>&s za@JtaiWgI)Wb_*Myib)JM^EPK{(+9E9{HS6$5tP>N$X&egK1w-QZ`(-!Des#6t7!4 zW}Em2k@iVhtaaCEv)jb>JgTL4bBzMm!Qn_wo>N;*`~Vk%Fw_UEqDXPkEgt4MhT7FO zcFCIV&(8>LygP2v;kTd=S%I_I`}_H&SU`8Xlf9SOu^_y6c)~8J9Lf5rH=ec{C4@72mHn?p@ z#g%QJ;g!o&9zuW`e{ zij2|7VyD{>R{nxhj4HIG-`?$4P;mJ&>t}B5vwDD5L0P!D+{o1xz(c1h5_J5j!v&%~ zC`eo|1h$quy}pI?$q6f45}3U3 z^cZ$tW{ORcif0o0bp1~-qnCt9OIJC|EsDIN5Sy5=m$C=`*AZm(HsfD&ntsDlV3J75 zetAS2ODdJ3@K)hHzd=Y-cQ+g7ob1Tdc_~SC&zP9#5PE7cJ3(h>_Nufw>$ibqugPeR zO=VzM{6I{4gnL8G6-QHn5=#PIms$olpF(IbgDD46&M3uVS`axepOPw%p*u?_BC|Y_ zYubci*d&TuyPtIh8l{%!v%#!Pe0$^D(^_RKA1kn9+CSP(^JXP0cQ-K~`PcM4{?-aBCwsHjxb1QdVLG?vt=1(P&mC z_pCRmsV|`T)%of{dPF7)=++$yFIfu4a=R4Z&xw`XyXgxbulG*ZPMD zvi@{TEB;Xg`i_X;I#tD(SNwx_&y|#0h_Z;#+<|;F8cKgX_L@F!2zJSt@o{mBo=FaJ zgnZPAWb)$>*e}qCou~`rB9mr41!a%o%gCV;smx(zHT>IdJ5*q*yirW5bk5PXes-k7 z@X0LmzlZj5A@!W!N8dsRhcT(wc*)kvv#=s%@&0>4T*#BBE7d-}Stzpf79U(}3}31B z7yk5MK-14G(fr}>@~Z%BR|)Hj|F9}Yu-{%BoGP&*KFZuackTWnwSG8SxykZ$KB+sS z1S+Rbwffd48`vRK-P!Huuto?YtqLH-IZ~EC^h7{~AGI~QV5LD-_p2$|>H5w$p3W}- z+(&WGJgD)iZ;kio>=xiRWRk25FDcQF;<9O%8oMOm5VxZiCF$v5I(>qSi$}NXHg&~6 z@uwN=X#BNkWADmVZ0f6WfG$T{TkjO|UmQPPRdj}-PtCI^)80I}bA!I^a^`D0cXu(} z-$S;}8s4_OlohIybG?P;)JGMfELE&bv15@Oqe^1Ja7|6pY`8j_k^$0%D3rt`%2_l} zh4T$~HMIKR8Eq%8%JI`_PcL`8`v$=C*_Sjt9vWzd>$9DsRSWw&mL0w%-7j9~ z3tMV!>}(8ha!!KI9APZ~^JmL&#nv{RfZkXMw~A$zoI7@P&FsRBU(a)M`#)*!!tyO@@`u+mT!YG}-kD0%uw+jMWZ%$z@?B|1*@rd${!$-Q*;zvIGi5jyhB z`{~|?`%h)DU0s*I2Vmav8$`DKSzT7dVLhR{wkE8Vy%Bf7xd~&H*%pL}I{SA$_9Y8x z#|MnlqTbN23=D(t(t#H}RZk_-x*e8JKZM!urT)Lxn;G@=hWgMqb1W9~j@PcrV*goe zro+A6H?z3)gxuCA0|SkfgHe5Mu<$JoK7$1|Dpb9%x7w4;D~MS+cqA#Fl)NahT zBIkP|`AxB`EQ!@F*K`VVy6fU8=9hROv^8h_&f6{)4F)PgKHrUV~G8Lq30&y)>(Wz>WDfpr*X8 zssbO6_9ny@mQEM)r)Uf=zOG^<{C6J{3`8M>7=%dGzp=9V7n`nR@j#*JoNmys%G~5683@IsT)ofN~s81N`bHK z?F%s00gRgTK5|qLsAk{87F#nIB66t;eqCh#>MuPwIUufg=C*~-1#Ya!tvE!xfW{O_~EMO4n!|(g0_#`}%M>|~_ueAAU z+IY;g(IsY5E0TX+=Kfq-S_)K9zn3qw@bqOiv#>@3&EU!MHxf7K;saU?Fw+VN385m; zAujgC-XAE)_crANGZLNuCM~Q$WbS$SlF)n?^u6a!|L4G?)Bz`6uzL-XjBGEc*F1PI ztdhrLlGKzKwa@J?A|`gU+2q;1uWD~VEp;!w;XT z(4syQnSYnpsU^ITodYE_X%UYWDBJ&Z^U}JEoFlLJYOtr7cK<}|o8k%mZ5o!zCTH?* zbY=;5@NM|%`Ogz>*qn5fN@9_Tr>_kIm!oE#&23*Bb;+s%?>oj@5OCt@L|{0F%Uro7 z5dCdoll^7Lkk?;QNx)wi;Lf`UGfYGl@`rDfIfHH)yUj_pEWy(-!-&tGtzfymAZeXO zz?VMslOqXl_;hlq<@vvmRW>^r!@FXhj&>ZjiFkisXeO-~-v0%U5!U4p{x1&$ZX-^M zf%|?G5dZyulpQ!k{P%`rkp15z100$cNhHi`@I6GO@WV}u1YfJ~q0J&PdaFS5IHsqU z2G%5>E!5h|Nag$;t_A+*b$v=P@RW$Btzf<2`I?TgDfzU#gO;PUK7O&U&jHo~U)B1XrAX+0Gc+&&9mT`> z0iAQR{@iz_CIC8jfGYj&-Bzf7LFa`o3fxe3ba4p+U<)kB!eisMJcB?7XhVrnQc%37 z1LiQxzX$1LVys8XH^8pV5nOoJ*7WlpegW@6lZijv$)8|7Ix*1&zQNFRe9f%_x;1?7 z!Y3eT2GT&96741>Gg7GUL{_4h)TK+8`1$X}9or7#8(R)6#8LS03kwy=v^bH#90a%x zvRWz76oLk9x(&r$@!+w`?qUhBiVLABO)L{7<>caG6_5foalUO*yI6tkD`LcF#fB^i zw5oQtAg@;tU^ZF-lH1P~>Gy27IdL?6ijc_fm4+mUyWZRKHZ8BH*oCroFXx0S)QGg} zbAb7e1(AzY5gC#D8i6^%A9R3sY#Bhx|2;_%$PyC~eE{M`2%UhC^`IlTPHc}sIkM?6 zx(u+07gbeNd%D26(!_$N<$#0_rW2?shPQkI7{v+E3&2K)L2}FhH)M9OLxNr=2m7N_ zj=<>1t=b%#V0b;+!b6z3ox7IOuEa;i_4WAa^BB|B zpO5Oxeba7Y9gVN7Dk!~(Ih&k)f~fBj5_obp;G4G;nVg(_`EJ~~wgIU4L$M$9@?f;= z1vX>>j6fkp9S<@9Wq8J2_qLR{UTW@9C^$wJ6x^TuRz2oXfcaWg*M;BmeW1i@U;&_< zyn+J#qIrpCS}`S(Ukw*-`;jfELrpb^x_N89m-pH=LUe&0AWT043JTUNbF08GZU7{4 z;3u^rG|;eW1nN29b*QSSK(`*4hR~FJ8`M80J76XN9iQkZC|K5#ZrI(r3^sQaM`y=~ zFuP$jTG`Wy4k;b+CAoINulW!7sK8S)Ip*_1uOrrmEx@EJa1qJRY zo2#qJs$)TzfqV=x`10L`;^-%hkN3d86zIKKhE;m8Ucdl0ZH@-lUk#01Ab@!94vj^Q znfc6a{kTYaSHbo*-H9_^iu?EbIN}Wo4G}}fKHXjk zG~gsw^Q)}9@H4Ys+o;MHGf;{-CaoTbf;pOSy`W$Vj0?F`RkwindUvWOUDaDfr3res z=<0T^S{t_gp3fL{)^{Dh)e>*3@;ds*@0Gh-BQBKsI>U$zO%BTA z*T{vF)P*knWPS(5rW2Hij4Y*+0kHoH*zq;AoV;uG$SxSA z^-h^qhT9^w_0v*9I;~})E>DN#VBVu}H_u*}Rhsxx^$?7)F(cD1eHI=|VAjeolnek? zo45VAbkp|^Yjf`EyRR@#+a1?72_uEj3teex9xJ{3bii_riDy`zKq4-n=caGwx`DR=;92sI&qV~ zah5dy&U_NsU-Aydvs+1iezVQlS4^Oh#VfR_lxXaa+5g^}VCg@$gD?*DvOha}dTd7m zf`eI9d0c)-VQGu8KUZDzyv?rVpfjEvoW zqxKpPS5>`1=fj=;Vdv4<_fAbTJZqbqJJa#?0|V|96n#%d#MLV{S*7;!<|pbgC1Z&n z+|7#vLxs`4^`2`lVIZmM9D5kWgtYlC3Ac3AA&Phn_&Ox{S4tybDWGYXRIw8KOi}9k zwV1$TYvj9J_GvVCFT$B~ZuT3!=b@Rs=cJ$N;NjPG&)YAA`exIVhr50bWSVCTaI4YR zskHU8%5Q#Dd-q^tUNc>p7&}%IA%Yv>!--&msr8*k)+nGQWo=yzPg63o?)i{dP!ORL zb7c)Xz^Io2DmzNrD{r-O4L9;lQA361DI28`u>wiCdcBRcRLWMBb39j;8c^qWA_Jel z4bU4@@IC|$vT3jX-C5Ho2=wJdmd6K@{5w7fshYSZf}qqCNv^OAC(Kiyp<+*qE$trG z2)tHewK{b^=}wut9F5=+Ujj}botli<+A?sQd^SoR!Bpnq@Z#BO4Nwb886!`iCyU-x zaz_gz$eE+)vox_b56UT~y7iGBdyO%+W4}9R!|f&&_i}7fO%v~uC5kvtFD-C`=w#sb ze>Pj4XbfY*!8`1Rfq|TbE@~bbKYylFY=%4d=UWJXq?Z8@gdn)`B_6q09y7Wk%GqF> zd~@Q9?UK94dwJd%k=o3SFz9LpA(N6)b5j%a$oS765J9w!%*C!UGA0VHogMhmeS3QB z*UF5&35QJ#*stf{*M$lBD6CN6%V2+u2aklG>1*UwP27l!^;cN;vEx7Nzdxo|<5e|* z1pc4n;4y?egYw4txt`lUwy3ytcn$)_nA34$2IX+&`>W~I!Y zhfxT2toOL}z{0NIiP+-uAz`oKK?}^ty4n zzH1~ZkbALienPG?%dy`#`@sv$vm%E{`?j*TGNzcFaassm^(34RK4~BFW=Q$vO=X@^ z{}Q-?G z5)q4HcgDVb-Y?ufn`-nsRtqC-K=AXMbTY zc$QHoo^toT1KOD%Kcj5q!gX(|K5EK&|+V|AzRMsJS z=4D}FS!d#>pr%gSWtBLxEPPmo$auZClfi-{E|8*m791L?$y*f}{`G}LAMF++(utS?9pP;%?zZYN^5yAc-OKJIa7gm|dKK}kMx$Ho%_g?Ej4-kg(`kH^ zlCmPqE-N-9c2UQyYGba!ukdJ~*UrEID2*x)DZ(sLwlhjQ%ONEXi+@S*BYKWAVP_6m;#7!J4rAN$<-L&g0UGFXheb zN|VNR6^qKD6q}ZjVLLCSneMNRrC~tdsZ+T;fh%?6(QqNPyH(`32?MIwLiQ{8WsAxo zooHAbU>MkO-5%R0+Fc%_=BA`BF+PJEL0J1go)HdQlALO5)vp;_$hn`*%f@C3;w*P( zncQ4qwdw8j`hdxgHC#6G8Mwli&+$Mw=^Wmh2rK-l}n zRFrn;=zM}OoXcdvzh*sPGhggm zZDj?MYrgjGdRAM)kO6gxnA7iB;p!L5yw-K%MG>!5aDomW3W^G>QCHm}kjD;3FsutL z-qNVmfz-|w{fZO&g<{pxNgz>#`5vUV8X}S3wr5!KbpzOCIA&2j2lA9}sfxHXtfpux@|$IFPhQFZ-UUpNSkl4V75`BL)tE;2pEd2!$cj1UB(czuhn)h`B_s2{yz vaM4#ehUEd(5w@e2@?VJOkFjUktHYD+#Vgl&RYJ;ee{n}vMJDIg!{`4G^%J!n diff --git a/doc/source/upgrade/developer/upgrades/minor_update.plantuml b/doc/source/upgrade/developer/upgrades/minor_update.plantuml deleted file mode 100644 index 52c6b27a..00000000 --- a/doc/source/upgrade/developer/upgrades/minor_update.plantuml +++ /dev/null @@ -1,174 +0,0 @@ -' The png image can be generated by running: -' -' plantuml minor_update.plantuml - -@startuml - -actor User -participant Mistral -participant Heat -participant Ansible -participant Nodes -' in newer versions of plantuml we should use: collections Nodes - - -' === UPDATE PREPARE === - -User -> Mistral : openstack overcloud\nupdate prepare -activate Mistral - -Mistral -> Mistral : plan update - -Mistral -> Heat : stack update -activate Heat - -Heat --> Mistral -deactivate Heat - -Mistral --> User -deactivate Mistral - - -' === UPDATE RUN === - -User -> Mistral : openstack overcloud\nupdate run -activate Mistral -note right of Heat - * Operates on all selected nodes one-by-one. -end note - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : update_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : update_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : host_prep_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : common_deploy_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : post_update_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -' === EXTERNAL UPDATE RUN === - -User -> Mistral : openstack overcloud\nexternal-update run -activate Mistral -note right of Heat - * Executes tasks on undercloud, but can affect - overcloud via delegation or nested Ansible process. - * Single play: facts are carried over between - update and deploy tasks. - * Often limited via `--tags` to perform a particular - update task or an update of a particular service. - * Can be executed before `update run` for some tasks. -end note - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : external_update_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : external_update_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : external_deploy_tasks all steps -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -' === UPDATE CONVERGE === - -User -> Mistral : openstack overcloud\nupdate converge -activate Mistral -note right of Heat - * Essentially the same as `overcloud deploy`, - asserts that the state of overcloud matches - the latest templates. -end note - -Mistral -> Mistral : plan update - -Mistral -> Heat : stack update -activate Heat - -Heat --> Mistral -deactivate Heat - -Mistral -> Heat : query stack outputs -activate Heat - -Heat --> Mistral : stack outputs -deactivate Heat - -Mistral -> Mistral : generate playbooks - -Mistral -> Ansible : deploy_steps_playbook.yaml -activate Ansible - -Ansible -> Nodes : host_prep_tasks -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible -> Nodes : deploy_tasks and external_deploy_tasks\nall steps (interleaved) -activate Nodes - -Nodes --> Ansible -deactivate Nodes - -Ansible --> Mistral -deactivate Ansible - -Mistral --> User : -deactivate Mistral - - -@enduml diff --git a/doc/source/upgrade/developer/upgrades/minor_update.png b/doc/source/upgrade/developer/upgrades/minor_update.png deleted file mode 100644 index b181dd46c4978e70f6c7e26d0604d7a93a3ecc54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94426 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

t8(oyF{-Rom`pYoaOng0UTU2M)*5(X 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ⅈ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
T$R8zxr{d#aj0}~eYgY*37vo{~!2MlZ)>PP6E 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 diff --git a/doc/source/upgrade/developer/upgrades/minor_update.rst b/doc/source/upgrade/developer/upgrades/minor_update.rst deleted file mode 100644 index c4512ff9..00000000 --- a/doc/source/upgrade/developer/upgrades/minor_update.rst +++ /dev/null @@ -1,171 +0,0 @@ -==================== -Minor version update -==================== - -.. TOOD(aschultz): update to reference in the deploy guide -.. To get developer understanding of minor updates, first read the -.. :doc:`operator docs for minor updates <../../minor_update>` -.. and perhaps try to go through the update as an operator would, to get -.. the basic idea. - -Assuming operator-level familiarity with the minor updates, let's look -at individual pieces in more detail. - -How update commands work -======================== - -The following subsections describe the individual update commands: - -* `openstack overcloud update prepare`_ -* `openstack overcloud update run`_ -* `openstack overcloud external-update run`_ -* `openstack overcloud update converge`_ - -You might also find it helpful to consult this high-level diagram as -you read: - -.. image:: minor_update.png - :scale: 20 % - :alt: Minor update workflow diagram - :target: ../../../_images/minor_update.png - -`openstack overcloud update prepare` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The `update prepare` command performs a Heat stack update, mapping -some resources to ``OS::Heat::None`` in order to prevent the usual -deployment config management tasks being performed (running Puppet, -starting containers, running external installers like -ceph-ansible). See the `update prepare environment file`_. - -.. _`update prepare environment file`: https://github.com/openstack/tripleo-heat-templates/blob/4286727ae70b1fa4ca6656c3f035afeac6eb2a95/environments/lifecycle/update-prepare.yaml - -The purpose of this stack update is to regenerate fresh outputs of the -Heat stack. These outputs contain Ansible playbooks and task lists -which are then used in the later in the `update run` phase. - -`openstack overcloud update run` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The `update run` command utilizes the previously generated Heat stack -outputs. It downloads the playbook yamls and their included task list -yaml via the config-download mechanisms, and executes the -`update steps playbook`_. - -.. _`update steps playbook`: https://github.com/openstack/tripleo-heat-templates/blob/4286727ae70b1fa4ca6656c3f035afeac6eb2a95/common/deploy-steps.j2#L558-L592 - -The command accepts ``--nodes`` or ``--roles`` argument to limit which -nodes will be targeted during a particular `update run` -execution. Even if the limit matches multiple nodes (e.g. all nodes -within one role), the play is executed with ``serial: 1``, meaning -that all actions are finished on one node before starting the update -on another. - -The play first executes `update_steps_tasks.yaml` which are tasks -collected from the ``update_tasks`` entry in composable -services. - -After the update tasks are finished, deployment workflow is -performed on the node being updated. That means reusing -`host_prep_tasks.yaml` and `common_deploy_steps_tasks.yaml`, which are -executed like on a fresh deployment, except during minor update -they're within a play with the aforementioned ``serial: 1`` limiting. - -Finally, ``post_update_tasks`` are executed. They are utilized by -services which need to perform something *after* deployment workflow -during the minor update. The update of the node is complete and the -Ansible play continues to update another node. - -`openstack overcloud external-update run` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The `external-update run` command is used to update the services whose -deployment (and update) procedure is not tied to execution on -particular overcloud nodes. The deployment/update procedures are thus -executed from the undercloud, even though a full overcloud inventory -is available for use. - -The `external update playbook` first executes `external_update_tasks` -and then `external_deploy_tasks`. The execution happens within the -same Ansible play, so facts from `external_update_tasks` are carried -over to `external_deploy_tasks`. This is a mechanism which will allow -you to amend what your deploy tasks do based on whether an update is -being run or not. - -Often it's not desirable to run the tasks for all services at the same -time, so `external-update run` supports ``--tags`` argument to limit -which tasks are run. - -The mechanisms of `external-upgrade` and `external-update` commands -and Ansible tasks are the same, but two commands and task hooks are -provided because generally in OpenStack we distinguish minor update -vs. major upgrade workflows. If your service only has one type of -upgrade, you can make the `external_update_tasks` the same as -`external_upgrade_tasks` by using YAML anchors and references. - -.. _external update playbook: https://github.com/openstack/tripleo-heat-templates/blob/8fd90c2d45e2680b018eae8387d86d420f738f5a/common/deploy-steps.j2#L644-L699 - -`openstack overcloud update converge` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. note:: - Update Converge is only required for versions less than Wallaby. - Update Converge has been removed for Wallaby and beyond. - -The `update converge` command performs a Heat stack update, reverting -the previous ``OS::Heat::None`` resource mappings back to the values -used for regular deployments and configuration updates, and -potentially also resets some parameter values. For environments with -Ceph, majority of this already happened on `ceph-upgrade run`, so the -final `update converge` effectively just resets the -CephAnsiblePlaybook parameter. - -See the `update converge environment file`_. - -.. _`update converge environment file`: https://github.com/openstack/tripleo-heat-templates/blob/4286727ae70b1fa4ca6656c3f035afeac6eb2a95/environments/lifecycle/update-converge.yaml - -The purpose of this stack update is to re-run config management -mechanisms and assert that the overcloud state matches what is -provided by the templates and environment files. - -Writing update logic for a service -================================== - -Simple config/image replacement -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If the service is managed by Paunch_ or tripleo_container_manage_ Ansible role, -it may be that there's no need to write any update tasks. Paunch or -tripleo_container_manage can automatically handle simple updates: change in -configuration or change of container image URL triggers automatic removal of -the old container and creation of new one with latest config and latest image. -If that's all the service needs for updates, you don't need to create any -``update_tasks``. - -Custom tasks during updates -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If the service is not managed by Paunch_ nor tripleo_container_manage_, or if -the simple container replacement done by Paunch is not sufficient for the -service update, you will need to include custom update logic. This is done via -providing these outputs in your composable service template: - -* ``update_tasks`` -- these are executed before deployment tasks on the - node being updated. - -* ``post_update_tasks`` -- these are executed after deployment tasks on - the node being updated. - -.. _Paunch: https://opendev.org/openstack/paunch/src/branch/master/README.rst -.. _tripleo_container_manage: https://docs.openstack.org/tripleo-ansible/latest/roles/role-tripleo_container_manage.html - -Update tasks are generally meant to bring the service into a stopped -state (sometimes with pre-fetched new images, this is necessary for -services managed by Pacemaker). Then the same workflow as during -deployment is used to bring the node back up into a running state, and -the post-update tasks can then perform any actions needed after the -deployment workflow. - -Similarly as deployment tasks, the update tasks and post-update tasks -are executed in steps_. - -.. _steps: https://github.com/openstack/tripleo-heat-templates/blob/4286727ae70b1fa4ca6656c3f035afeac6eb2a95/common/deploy-steps.j2#L17-L18 diff --git a/doc/source/upgrade/developer/upgrades/rdo_upgrades_jobs.png b/doc/source/upgrade/developer/upgrades/rdo_upgrades_jobs.png deleted file mode 100644 index 7663e185be5ff4a7348f0d69d17a02482783ab46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51229 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 diff --git a/doc/source/upgrade/developer/upgrades/upgrades.rst b/doc/source/upgrade/developer/upgrades/upgrades.rst deleted file mode 100644 index de8be9d7..00000000 --- a/doc/source/upgrade/developer/upgrades/upgrades.rst +++ /dev/null @@ -1,14 +0,0 @@ -Upgrades Development -==================== - -This section is intended to give a better understanding of the upgrade/update -process in TripleO. As well as a walkthrough for developers on the way upgrade -workflow enables OpenStack services upgrade. - -.. toctree:: - :maxdepth: 2 - - major_upgrade - minor_update - fast_fw_upgrade - ci_upgrades diff --git a/doc/source/upgrade/index.rst b/doc/source/upgrade/index.rst deleted file mode 100644 index c288ab7e..00000000 --- a/doc/source/upgrade/index.rst +++ /dev/null @@ -1,9 +0,0 @@ -Upgrade, Update, FFWD Upgrade Guide -=================================== - -.. toctree:: - :maxdepth: 3 - :includehidden: - - developer/upgrades/upgrades.rst - diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 570933f6..00000000 --- a/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -openstackdocstheme>=2.2.1 # Apache-2.0 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index feac6034..00000000 --- a/setup.cfg +++ /dev/null @@ -1,17 +0,0 @@ -[metadata] -name = tripleo-docs -summary = TripleO documentation -description_file = - README.rst -author = OpenStack -author_email = openstack-discuss@lists.openstack.org -home_page = https://docs.openstack.org/tripleo-docs/latest/ -classifier = - Environment :: OpenStack - Intended Audience :: Information Technology - Intended Audience :: System Administrators - License :: OSI Approved :: Apache Software License - Operating System :: POSIX :: Linux - Programming Language :: Python - Programming Language :: Python :: Implementation :: CPython - Programming Language :: Python :: 3 :: Only diff --git a/setup.py b/setup.py deleted file mode 100644 index cd35c3c3..00000000 --- a/setup.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import setuptools - -setuptools.setup( - setup_requires=['pbr>=2.0.0'], - pbr=True) diff --git a/tox.ini b/tox.ini deleted file mode 100644 index c165f4c9..00000000 --- a/tox.ini +++ /dev/null @@ -1,35 +0,0 @@ -[tox] -minversion = 3.18.0 -envlist = docs,deploy-guide - -[testenv] -basepython = python3 -usedevelop = True -setenv = VIRTUAL_ENV={envdir} -deps = -r{toxinidir}/requirements.txt - - -[testenv:venv] -commands = {posargs} - -[testenv:docs] -deps = - -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} - -r{toxinidir}/doc/requirements.txt -commands = - sphinx-build -a -E -W -d doc/build/doctrees --keep-going -b html doc/source doc/build/html - -[testenv:pdf-docs] -allowlist_externals = - make -description = - Build PDF documentation. -envdir = {toxworkdir}/docs -deps = {[testenv:docs]deps} -commands = - sphinx-build --keep-going -b latex doc/source doc/build/pdf - make -C doc/build/pdf - -[testenv:deploy-guide] -deps = {[testenv:docs]deps} -commands = sphinx-build -a -E -W -d deploy-guide/build/doctrees --keep-going -b html deploy-guide/source deploy-guide/build/html

aMr`VGyRQeCaT_GwSD^uc1vZ~7gZ>C>R| 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%0A3Yufqh61j|yJ!beYtE+`UDUU}U$ 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%0AWQle)TIn%{!h6EFCIfSeT`Uq%*rE@kD?qm1X zKibvTfi8!iv?RVnSJC@38&W%Vv6q`%XIlj)Q8RBGz^>+Y^m;p5Fn<;Gk_MX_@yrrc zuAI&94e>8d3E#p{M3SHOvh^f#mVBJZ%e}LUZSTHDF9bo_;~s!ppceVYlN9cQ>0-Nq z1#>NnxCpZh@kyjq#ei0;?WSm<-&ZqBmw z?Z3bw6h~pjc*P_eo>3+Us8Nsa@fH{hxHxT8X_`C@--cv-cIk_fOxp=u|Irr*PB~)O zM@omqD<9pu9@JIYa0^tm)eY30?BZ4VhfCm?ETSgpEP`h^YDRm+zPGLz8vdZ#YNbb< zPdZKobWRyBQ=;OgRGGfeRWfC{va-$X(e6wgEyU3LyfAG4WsD7Z);<9LS+rTIR z%D1p->I}oip;}p6EXo`fkbO^_YXIAhL4gHzlo!*zlzcnxgQd^hlc6r& zR(XF=d01+%7GfLg_0T5Eceq6d@Go6YLZ&+rV5Nb#Xop&P? zLT^l>orTa{8cf&**FUg^xt(dWndmROAlBrTL5r2Hg)30;$>#BR)6t5JIoB_SXS^+G zDLTU@FFVn*lIO764l|i6A-#h85#W>PiwlL)oH=!v;*6YO+$P>g6%b(=9P)Xv9tH9L zvuKvwKLYk|h-=20i!8#*s`aNKoB`m?Qj$I&6^^HUB}@e3gV_3w5f@fVPs(w%Sk~~f z>P?8|I~b&|;oVG^<`C5ZuVMt(d`bbKLN;tv>=*346!nF#(X7uFd`iXKnjEDCk?t+Y zsGf6gEHdB18iz0HdO`_tI#WRi@E6zbr_tz;51*nd9_I^st%slj(=KoK^iWwv1j3-O zT9Qv=Gi|}qL^&;*;)ucS!)hi)ARN^B(zPaBejH}Y zHAOObM@`lSU9C4{Qtr4qLZ#HebIJavU2MHWzwFIbiO%!TD=}I%>SbvO8lkt3KojF0 zO5})uj4$it9{CxfE%_aF^r_9qJG!2itVE(G%R*(swFR!LBYA-ukmKn2&=306JdUy=fhr$0SMzgjB`~3=R+zS{EyE=b&4c?#i)6<}B zNT2QcWto1e;p(t$r=k9GcXL}*)?qX-=3lVT(O>;0vTVopHCzw0lM+SH!DOjx1#a>i zexYq+*+dO#)SZ6{SO6Zo6l_#Pu>aYI1ENiwak%ihM>KYer>LUm)g5bKs3OV~NCbeG znKU2NMQ^1em|d=70EGH};mX6K_)w1KU}V<4)BgkEQOpQ?&ZW_Gtb8g2;Xm$ZQeq@u zq~14WK!?7e4(KZUk<*4S(C&-T>4<8zc#4hjdWht`fq!+UN`BZ;Bm)C*wP5bZTbFsc zaOifyXrn1%zxM6LXM>okB2GV4ubTA|^U4uZ>-yS5KwF@Jr&r*VG<(s#Xx(JWDw-!{ z$xXJoHH^~s($3Ic!qb|VYb%QJ{O~H>RKbk3xw-DR=_2=&wAU(mtq9oTdQ`LD#e=xh zcx__zBfgiksh)TWLx_5C6t&(>T9EFno$sDI-j`M(qGRiM(^N>}IL?`Sjf0*=}q_KK?m5Euyh6&^G4{tGy-HQ3KTzRbhJ`v_@k?e;_OTIc^8RwM9l;^DgYXVxn(sl@YI z7eS@V5S@W}N!$7NdDaxYd2N#bUl^riGs2G;|J6a-(flh?|2GXoE4)=z9pkqGTv~a6 N57N%bwhG~w_#bPDOyU3l diff --git a/doc/source/install/_images/tripleo_ui.png b/doc/source/install/_images/tripleo_ui.png deleted file mode 100644 index e49d93edf14195c3e2b79cb92093bc7a78f08e05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140771 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�JN}~~P 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

dUbyl$g-It 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%0DJ13Q_Xn0~{{SIBgb!2`QY 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 X=6$DTW(-_Va4E>#y_I=G@7ezWlLW2l diff --git a/doc/source/ci/_images/grafana3.png b/doc/source/ci/_images/grafana3.png deleted file mode 100644 index 8949dff1f6e71566e6122d463024ff2db99842e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246127 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

_XbXxqo4XE81!RIgIJNhz$AGwr?EL6 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 z