diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml
index 5a2861f97..fe87b4e60 100644
--- a/.github/workflows/docs.yaml
+++ b/.github/workflows/docs.yaml
@@ -10,7 +10,6 @@ on: # yamllint disable-line rule:truthy
paths:
- .github/workflows/docs*
- docs_dev/**
- - docs_user/**
- Gemfile
- Makefile
jobs:
@@ -31,22 +30,9 @@ jobs:
- name: Install Asciidoc
run: make docs-dependencies
- - name: Build upstream user docs
- run: make docs-user
- - name: Build downstream preview of user docs
- run: BUILD=downstream make docs-user
- name: Build dev docs
run: make docs-dev
- - name: Test user docs
- run: |
- INSTALL_YAMLS_REF=$(grep -o install_yamls docs_build/adoption-user/index-downstream.html | wc -l)
- if [[ $INSTALL_YAMLS_REF -gt 0 ]]; then
- echo user facing docs should NOT mention install_yamls
- grep install_yamls docs_build/adoption-user/index-downstream.html
- exit 1
- fi
-
- name: Prepare gh-pages branch
run: |
git config user.name github-actions
@@ -103,12 +89,11 @@ jobs:
-
+
@@ -117,14 +102,10 @@ jobs:
- name: Commit asciidoc docs
run: |
- mv -T docs_build/adoption-user user
mv -T docs_build/adoption-dev dev
- mv user/index-upstream.html user/index.html
- mv user/index-downstream.html user/downstream.html
mv dev/index-upstream.html dev/index.html
- git add user
git add dev
git add index.html
git commit -m "Rendered docs"
diff --git a/AGENTS.md b/AGENTS.md
index 0f1c4ddf4..e358ca41a 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -34,7 +34,6 @@ There are other adjacent procedures described or linked in the repo that are opt
- There should be parity between the docs and the tests. There may be some legitimate minor differences to account for CI specifics, but in general the intent of the tests is to verify the procedure and the commands from the docs.
- Tests use the `shell` Ansible module liberally, we do not strive for "beautiful Ansible that just uses Python modules". Using `shell` tends to allow verbatim correspondence of tests to the commands/snippets in the docs, which is more important than having beautiful Ansible code.
-- Docs must support multiple variants (upstream/downstream/OSPDO). Do not hardcode product names like "Red Hat OpenStack Services on OpenShift". Use the AsciiDoctor attributes defined in `docs_user/adoption-attributes.adoc` (e.g. `{rhos_long}`, `{OpenStackShort}`).
## Important
@@ -43,17 +42,10 @@ There are other adjacent procedures described or linked in the repo that are opt
## Repository map
-- `docs_build` - Generated content. Do not read or edit files in this directory as a source of truth. Always use `docs_user` or `docs_dev`.
+- `docs_build` - Generated content. Do not read or edit files in this directory as a source of truth. Always use `docs_dev`.
- `docs_build/adoption-dev/index-upstream.html` - Rendered developer documentation.
- - `docs_build/adoption-user/index-{upstream,downstream,downstream-ospdo}.html` - Rendered user documentation (the adoption procedure).
- `docs_dev` - Sources for developer documentation.
-- `docs_user` - Sources for user documentation (the adoption procedure).
- - `main.adoc` is the root.
- - `*-attributes.adoc` files distinguish upstream and downstream variants.
- - `assemblies` are higher-level building blocks.
- - `modules` are lower-level building blocks.
-- `docs_user` - Sources for user documentation (the adoption procedure).
-- `Makefile` - The main Makefile for docs building and running tests. For docs it calls nested `make` using `docs_dev/Makefile` and `docs_user/Makefile`.
+- `Makefile` - The main Makefile for docs building and running tests. For docs it calls nested `make` using `docs_dev/Makefile`.
- `scenarios` - Configuration of CI jobs doing end-to-end testing.
- `tests` - Ansible test suite utilized in the end-to-end tests.
- `vars.sample.yaml,secrets.sample.yaml` - Example files with variables and secrets that are typically customized before running end-to-end tests.
@@ -62,7 +54,7 @@ There are other adjacent procedures described or linked in the repo that are opt
## Building docs
-`make docs` is the easiest way to build both user docs in all variants and developer docs.
+`make docs` is the easiest way to build developer docs.
More detailed info is in `docs_dev/assemblies/documentation.adoc`.
diff --git a/Makefile b/Makefile
index 372ff518a..fcc6a1e99 100644
--- a/Makefile
+++ b/Makefile
@@ -117,21 +117,7 @@ docs-dependencies: .bundle
bundle config set --local path 'local/bundle'; bundle install
-docs: docs-dependencies docs-user-all-variants docs-dev ## Build documentation
-
-docs-user-all-variants:
- cd docs_user; BUILD=upstream $(MAKE) html
- cd docs_user; BUILD=downstream $(MAKE) html
- cd docs_user; BUILD=downstream BUILD_VARIANT=ospdo $(MAKE) html
-
-docs-user:
- cd docs_user; $(MAKE) html
-
-docs-user-open:
- cd docs_user; $(MAKE) open-html
-
-docs-user-watch:
- cd docs_user; $(MAKE) watch-html
+docs: docs-dependencies docs-dev ## Build documentation
docs-dev:
cd docs_dev; $(MAKE) html
diff --git a/docs_dev/assemblies/documentation.adoc b/docs_dev/assemblies/documentation.adoc
index 878dff1ee..d76f836f2 100644
--- a/docs_dev/assemblies/documentation.adoc
+++ b/docs_dev/assemblies/documentation.adoc
@@ -9,13 +9,6 @@ Install docs build requirements:
make docs-dependencies
----
-To render the user-facing documentation site locally:
-
-[,bash]
-----
-make docs-user
-----
-
To render the contributor documentation site locally:
[,bash]
@@ -23,8 +16,7 @@ To render the contributor documentation site locally:
make docs-dev
----
-The built HTML files are in `docs_build/adoption-user` and
-`docs_build/adoption-dev` directories respectively.
+The built HTML files are in `docs_build/adoption-dev` directory.
There are some additional make targets for convenience. The following
@@ -33,8 +25,6 @@ resulting HTML in your browser so that you don't have to look for it:
[,bash]
----
-make docs-user-open
-# or
make docs-dev-open
----
@@ -46,22 +36,9 @@ browser page" loop when working on the docs, without having to run
[,bash]
----
-make docs-user-watch
-# or
make docs-dev-watch
----
-=== Preview of downstream documentation
-
-To render a preview of what should serve as the base for downstream
-docs (e.g. with downstream container image URLs), prepend
-`BUILD=downstream` to your make targets. For example:
-
-[,bash]
-----
-BUILD=downstream make docs-user
-----
-
== Patterns and tips for contributing to documentation
* Pages concerning individual components/services should make sense in
diff --git a/docs_user/.vale.ini b/docs_user/.vale.ini
deleted file mode 100644
index 669dee073..000000000
--- a/docs_user/.vale.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-StylesPath = .vale/styles
-MinAlertLevel = warning
-Packages = https://github.com/jhradilek/asciidoctor-dita-vale/releases/latest/download/AsciiDocDITA.zip
-
-[*.adoc]
-BasedOnStyles = AsciiDocDITA
diff --git a/docs_user/.vale/styles/AsciiDocDITA/AdmonitionTitle.yml b/docs_user/.vale/styles/AsciiDocDITA/AdmonitionTitle.yml
deleted file mode 100644
index 0485a3449..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/AdmonitionTitle.yml
+++ /dev/null
@@ -1,70 +0,0 @@
-# Report that admonition titles are not supported.
----
-extends: script
-message: "Admonition titles are not supported in DITA."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_block_title := text.re_compile("^\\.{1,2}[^ \\t.].*$")
- r_admonition_para := text.re_compile("^(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION):[ \\t]")
- r_admonition_block := text.re_compile("^\\[(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\][ \\t]*$")
- r_empty_line := text.re_compile("^[ \\t]*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- in_comment_block := false
- expect_title := false
- expect_admonition := false
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
- if r_empty_line.match(line) { continue }
-
- if r_block_title.match(line) {
- if expect_title {
- matches = append(matches, {begin: start, end: start + end - 1})
- expect_title = false
- expect_admonition = false
- } else {
- expect_admonition = {begin: start, end: start + end - 1}
- }
- } else if r_admonition_block.match(line) {
- if expect_admonition {
- matches = append(matches, expect_admonition)
- expect_admonition = false
- expect_title = false
- } else {
- expect_title = true
- }
- } else if r_admonition_para.match(line) {
- if expect_admonition {
- matches = append(matches, expect_admonition)
- expect_admonition = false
- }
- expect_title = false
- } else {
- expect_title = false
- expect_admonition = false
- }
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/AttributeReference.yml b/docs_user/.vale/styles/AsciiDocDITA/AttributeReference.yml
deleted file mode 100644
index d6f33422c..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/AttributeReference.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-# Report custom attribute references.
----
-extends: existence
-message: "%s"
-level: suggestion
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#suggestions
-scope: raw
-nonword: true
-tokens:
- - '(?[ \t]+.*$'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/ConditionalCode.yml b/docs_user/.vale/styles/AsciiDocDITA/ConditionalCode.yml
deleted file mode 100644
index ddeeff66d..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/ConditionalCode.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Report conditional directives.
----
-extends: existence
-message: "%s"
-level: suggestion
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#suggestions
-scope: raw
-nonword: true
-tokens:
- - '^(?:ifn?def|ifeval)::\S*\[.*\][ \t]*$'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/ContentType.yml b/docs_user/.vale/styles/AsciiDocDITA/ContentType.yml
deleted file mode 100644
index acfe938b6..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/ContentType.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-# Report a missing content type definition.
----
-extends: occurrence
-message: "The '_mod-docs-content-type' attribute definition is missing."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-min: 1
-token: '(?:^|[\n\r]):_(?:mod-docs-content|content|module)-type:[ \t]+\S'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/DiscreteHeading.yml b/docs_user/.vale/styles/AsciiDocDITA/DiscreteHeading.yml
deleted file mode 100644
index 5fe0c3e5f..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/DiscreteHeading.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Report that discrete headings are not supported.
----
-extends: existence
-message: "Discrete headings are not supported in DITA."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-nonword: true
-tokens:
- - '^\[discrete\b[^\n\]]*?\]'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/EntityReference.yml b/docs_user/.vale/styles/AsciiDocDITA/EntityReference.yml
deleted file mode 100644
index 084b2c69a..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/EntityReference.yml
+++ /dev/null
@@ -1,80 +0,0 @@
-# Report unsupported character entity references.
----
-extends: script
-message: "HTML character entity references are not supported in DITA."
-level: error
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#errors
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_attribute_list := text.re_compile("^\\[(?:|[\\w.#%{,\"'].*)\\][ \\t]*$")
- r_block_title := text.re_compile("^\\.{1,2}[^ \\t.].*$")
- r_code_block := text.re_compile("^(?:\\.{4,}|-{4,})[ \\t]*$")
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_empty_line := text.re_compile("^[ \\t]*$")
- r_entity_reference := text.re_compile("&[a-zA-Z][a-zA-Z0-9]*;")
- r_list_continue := text.re_compile("^\\+[ \\t]*$")
- r_sub_disabled := text.re_compile("-replacements")
- r_sub_replacements := text.re_compile("subs=['\\x22](?:[^'\\x22]*,[ \\t]*|)\\+?(?:replacements|normal)(?:[ \\t]*,[^'\\x22]*|)['\\x22]")
- r_supported_entity := text.re_compile("&(?:amp|lt|gt|apos|quot);")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- in_code_block := false
- in_comment_block := false
- replacements := false
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_code_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_code_block {
- in_code_block = delimiter
- } else if in_code_block == delimiter {
- in_code_block = false
- replacements = false
- }
- continue
- }
- if in_code_block && ! replacements { continue }
-
- if r_block_title.match(line) { continue }
- if r_empty_line.match(line) { continue }
- if r_list_continue.match(line) { continue }
-
- if r_attribute_list.match(line) {
- if r_sub_replacements.match(line) && ! r_sub_disabled.match(line) {
- replacements = true
- }
- continue
- }
-
- if replacements && ! in_code_block {
- replacements = false
- }
-
- for i, entry in r_entity_reference.find(line, -1) {
- if ! r_supported_entity.match(entry[0].text) {
- matches = append(matches, {begin: start + entry[0].begin, end: start + entry[0].end - 1})
- }
- }
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/EquationFormula.yml b/docs_user/.vale/styles/AsciiDocDITA/EquationFormula.yml
deleted file mode 100644
index 4ccd48e4d..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/EquationFormula.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# Report that equations and formulas are not implemented.
----
-extends: existence
-message: "Equations and formulas are not implemented."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-nonword: true
-tokens:
- - '^:stem:(?:|[ \t]+asciimath|[ \t]latexmath)[ \t]*$'
- - '^\[(?:stem|asciimath|latexmath)\][ \t]*$'
- - '\b(?:stem|asciimath|latexmath):(?:[a-z,-]+)?\[.*?[^\\]\]'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/ExampleBlock.yml b/docs_user/.vale/styles/AsciiDocDITA/ExampleBlock.yml
deleted file mode 100644
index 2742a5de7..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/ExampleBlock.yml
+++ /dev/null
@@ -1,143 +0,0 @@
-# Report unsupported example blocks.
----
-extends: script
-message: "Examples can not be inside of other blocks in DITA."
-level: error
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#errors
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_admonition_block := text.re_compile("^\\[(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\][ \\t]*$")
- r_attribute := text.re_compile("^:!?\\S[^:]*:")
- r_block_title := text.re_compile("^\\.{1,2}[^ \\t.].*$")
- r_code_block := text.re_compile("^(?:\\.{4,}|-{4,})[ \\t]*$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_conditional := text.re_compile("^(?:ifn?def|ifeval|endif)::\\S*\\[.*\\][ \\t]*$")
- r_empty_line := text.re_compile("^[ \\t]*$")
- r_example_block := text.re_compile("^\\[example\\][ \\t]*$")
- r_example_delim := text.re_compile("^={4,}[ \\t]*$")
- r_list_continue := text.re_compile("^\\+[ \\t]*$")
- r_list_item := text.re_compile("^[ \\t]*[\\*-.]+[ \\t]+\\S.*$")
- r_other_block := text.re_compile("^(?:\\*{4,}|-{2})[ \\t]*$")
- r_section := text.re_compile("^={2,}[ \\t]\\S.*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- in_comment_block := false
- in_example_block := false
- in_code_block := false
- in_other_block := false
- in_section := false
- in_list := false
- in_continue := false
- expect_admonition := false
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_code_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_code_block {
- in_code_block = delimiter
- } else if in_code_block == delimiter {
- in_code_block = false
- }
- in_continue = false
- continue
- }
- if in_code_block { continue }
-
- if r_attribute.match(line) { continue }
- if r_conditional.match(line) { continue }
-
- if r_example_delim.match(line) {
- delimiter := text.trim_space(line)
- if ! in_example_block {
- in_example_block = delimiter
-
- if expect_admonition { continue }
-
- if in_section || in_other_block || in_list {
- matches = append(matches, {begin: start, end: start + end - 1})
- }
- } else if in_example_block == delimiter {
- in_example_block = false
- }
- in_continue = false
- continue
- }
-
- if r_empty_line.match(line) {
- if ! in_continue {
- in_list = false
- }
- continue
- }
-
- if r_list_continue.match(line) {
- in_continue = true
- in_list = true
- continue
- } else {
- in_continue = false
- }
-
- if r_block_title.match(line) && expect_admonition {
- if in_continue {
- in_continue = false
- }
- continue
- }
-
- if r_list_item.match(line) {
- in_list = true
- continue
- }
-
- if r_admonition_block.match(line) {
- expect_admonition = true
- continue
- }
-
- if r_section.match(line) {
- in_section = true
- continue
- }
-
- if r_example_block.match(line) {
- if in_section || in_other_block || in_list {
- matches = append(matches, {begin: start, end: start + end - 1})
- }
- continue
- }
-
- if r_other_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_other_block {
- in_other_block = delimiter
- } else if in_other_block == delimiter {
- in_other_block = false
- }
- continue
- }
-
- expect_admonition = false
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/IncludeDirective.yml b/docs_user/.vale/styles/AsciiDocDITA/IncludeDirective.yml
deleted file mode 100644
index 773657382..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/IncludeDirective.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Report include directives.
----
-extends: existence
-message: "%s"
-level: suggestion
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#suggestions
-scope: raw
-nonword: true
-tokens:
- - '^include::(?:[^\s\[]|[^[]*[^\s\[])\[.*\][ \t]*$'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/LineBreak.yml b/docs_user/.vale/styles/AsciiDocDITA/LineBreak.yml
deleted file mode 100644
index 03fc03e15..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/LineBreak.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-# Report that hard line breaks ara not supported.
----
-extends: existence
-message: "Hard line breaks are not supported in DITA."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-nonword: true
-tokens:
- - '^[^/]{2}.* \+[ \t]*$'
- - '^. \+[ \t]*$'
- - '^:hardbreaks-option:(?:|.*?)[ \t]*$'
- - '^\[[^\]]*%hardbreaks[^\n\]]*?\]'
- - '^\[[^\]]*options=hardbreaks\b[^\n\]]*?\]'
- - '^\[[^\]]*options="[^"]*hardbreaks\b[^\n\]]*?\]'
- - "^\\[[^\\]]*options='[^']*hardbreaks\\b[^\\n\\]]*?\\]"
diff --git a/docs_user/.vale/styles/AsciiDocDITA/NestedSection.yml b/docs_user/.vale/styles/AsciiDocDITA/NestedSection.yml
deleted file mode 100644
index eed8d9c16..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/NestedSection.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Report that level 2, 3, 4, and 5 sections are not supported.
----
-extends: existence
-message: "Level 2, 3, 4, and 5 sections are not supported in DITA."
-level: error
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#errors
-scope: raw
-nonword: true
-tokens:
- - '^={3,6}[ \t]\S.*$'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/PageBreak.yml b/docs_user/.vale/styles/AsciiDocDITA/PageBreak.yml
deleted file mode 100644
index 34ac27a1f..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/PageBreak.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Report that page breaks are not supported.
----
-extends: existence
-message: "Page breaks are not supported in DITA."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-nonword: true
-tokens:
- - '^<{3,}[ \t]*$'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/RelatedLinks.yml b/docs_user/.vale/styles/AsciiDocDITA/RelatedLinks.yml
deleted file mode 100644
index be8dc46a4..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/RelatedLinks.yml
+++ /dev/null
@@ -1,89 +0,0 @@
-# Report text outside of links in additional resources.
----
-extends: script
-message: "Content other than links cannot be mapped to DITA related-links."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_add_resources := text.re_compile("^(?:={2,}[ \\t]+|\\.{1,2})Additional resources[ \\t]*$")
- r_any_title := text.re_compile("^(?:={2,}[ \\t]+|\\.{1,2})[^ \\t.].*$")
- r_attribute := text.re_compile("^:!?\\S[^:]*:")
- r_attribute_ref := text.re_compile("^[ \\t]*[\\*-][ \\t]+\\{(?:[0-9A-Za-z_][0-9A-Za-z_-]*|set:.+?|counter2?:.+?)\\}(?:|[^\\[\\s]*\\[.*?\\])[ \\t]*$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_conditional := text.re_compile("^(?:ifn?def|ifeval|endif)::\\S*\\[.*\\][ \\t]*$")
- r_content_type := text.re_compile("^:_(?:mod-docs-content|content|module)-type:[ \\t]+(?i:assembly)")
- r_empty_line := text.re_compile("^[ \\t]*$")
- r_id_attribute := text.re_compile("^\\[(?:id=['\\x22]|#|\\[)[A-Za-z_:{}][A-Za-z0-9_.:{}-]*(?:['\\x22],?[^\\]]*|,[^\\]]*\\]?|\\]?)\\][ \\t]*$")
- r_include := text.re_compile("^include::(?:[^ \\t\\[]|[^[]*[^ \\t\\[])\\[.*\\][ \\t]*$")
- r_inline_link := text.re_compile("^[ \\t]*[\\*-][ \\t]+(?:|link:|<)(?:|\\+\\+)(?:https?|file|ftp|irc)://[^ \\t\\[\\]]+(?:|\\+\\+)(?:|\\[.*?\\])>?[ \\t]*$")
- r_inline_xref := text.re_compile("^[ \\t]*[\\*-][ \\t]+<<[A-Za-z0-9/.:{].*?>>[ \\t]*$")
- r_link_macro := text.re_compile("^[ \\t]*[\\*-][ \\t]+(?:link|mailto):(?:|[^: \\t\\[][^: \\t\\[]*)\\[.*?\\][ \\t]*$")
- r_role_attribute := text.re_compile("^\\[(?:role=['\\x22]|\\.)_additional-resources['\\x22]?\\][ \\t]*$")
- r_xref_macro := text.re_compile("^[ \\t]*[\\*-][ \\t]+xref:[A-Za-z0-9/.:{].*?\\[.*?\\][ \\t]*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- is_assembly := false
- in_comment_block := false
- in_add_resources := false
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_content_type.match(line) {
- is_assembly = true
- continue
- }
-
- if r_empty_line.match(line) { continue }
- if r_attribute.match(line) { continue }
- if r_conditional.match(line) { continue }
-
- if r_role_attribute.match(line) || r_id_attribute.match(line) {
- continue
- }
-
- if r_include.match(line) && is_assembly {
- continue
- }
-
- if r_add_resources.match(line) {
- in_add_resources = true
- continue
- }
-
- if ! in_add_resources { continue }
-
- if r_any_title.match(line) {
- in_add_resources = false
- continue
- }
-
- if r_link_macro.match(line) || r_inline_link.match(line) ||
- r_xref_macro.match(line) || r_inline_xref.match(line) ||
- r_attribute_ref.match(line) {
- continue
- }
-
- matches = append(matches, {begin: start, end: start + end - 1})
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/ShortDescription.yml b/docs_user/.vale/styles/AsciiDocDITA/ShortDescription.yml
deleted file mode 100644
index 7b178acdb..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/ShortDescription.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Suggest assigning the [role="_abstract"] attribute list to a paragraph to
-# be used as short description in DITA.
----
-extends: occurrence
-message: "Assign [role=\"_abstract\"] to a paragraph to use it as in DITA."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-min: 1
-token: '(?:^|[\n\r])\[role=(["\x27]?)_abstract\1\]'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/SidebarBlock.yml b/docs_user/.vale/styles/AsciiDocDITA/SidebarBlock.yml
deleted file mode 100644
index c2bea8f77..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/SidebarBlock.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-# Report that sidebars are not supported.
----
-extends: script
-message: "Sidebars are not supported in DITA."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_code_block := text.re_compile("^(?:\\.{4,}|-{4,})[ \\t]*$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_sidebar_block := text.re_compile("^\\[sidebar\\b[^\\]]*?\\][ \\t]*$")
- r_sidebar_delim := text.re_compile("^\\*{4,}[ \\t]*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- in_code_block := false
- in_comment_block := false
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_code_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_code_block {
- in_code_block = delimiter
- } else if in_code_block == delimiter {
- in_code_block = false
- }
- continue
- }
- if in_code_block { continue }
-
- if r_sidebar_block.match(line) || r_sidebar_delim.match(line) {
- matches = append(matches, {begin: start, end: start + end - 1})
- }
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/TableFooter.yml b/docs_user/.vale/styles/AsciiDocDITA/TableFooter.yml
deleted file mode 100644
index f26153cec..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/TableFooter.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-# Report that table footers are not supported.
----
-extends: existence
-message: "Table footers are not supported in DITA."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-nonword: true
-tokens:
- - '^\[[^\]]*%footer[^\n\]]*?\]'
- - '^\[[^\]]*options=footer\b[^\n\]]*?\]'
- - '^\[[^\]]*options="[^"]*footer\b[^\n\]]*?\]'
- - "^\\[[^\\]]*options='[^']*footer\\b[^\\n\\]]*?\\]"
diff --git a/docs_user/.vale/styles/AsciiDocDITA/TagDirective.yml b/docs_user/.vale/styles/AsciiDocDITA/TagDirective.yml
deleted file mode 100644
index 01315dea5..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/TagDirective.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Report tag directives.
----
-extends: existence
-message: "%s"
-level: suggestion
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#suggestions
-scope: raw
-nonword: true
-tokens:
- - '\btag::\S+?\[\][ \t]*$'
diff --git a/docs_user/.vale/styles/AsciiDocDITA/TaskDuplicate.yml b/docs_user/.vale/styles/AsciiDocDITA/TaskDuplicate.yml
deleted file mode 100644
index de25025de..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/TaskDuplicate.yml
+++ /dev/null
@@ -1,65 +0,0 @@
-# Report duplicate titles inside of procedure modules.
----
-extends: script
-message: "Duplicate titles cannot be mapped to DITA tasks."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_content_type := text.re_compile("^:_(?:mod-docs-content|content|module)-type:[ \\t]+(?i:procedure)")
-
- titles := {}
- titles.prereq = text.re_compile("^\\.{1,2}Prerequisites?[ \\t]*$")
- titles.steps = text.re_compile("^\\.{1,2}Procedure[ \\t]*$")
- titles.result = text.re_compile("^\\.{1,2}(?:Verification|Results?)[ \\t]*$")
- titles.trouble = text.re_compile("^\\.{1,2}(?:Troubleshooting|Troubleshooting steps?)[ \\t]*$")
- titles.postreq = text.re_compile("^\\.{1,2}Next steps?[ \\t]*$")
- titles.links = text.re_compile("^\\.{1,2}Additional resources[ \\t]*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- in_comment_block := false
- is_procedure := false
- start := 0
- end := 0
- block_titles := {}
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_content_type.match(line) {
- is_procedure = true
- }
-
- for title, r in titles {
- if ! r.match(line) { continue }
-
- if block_titles[title] {
- matches = append(matches, {begin: start, end: start + end - 1})
- } else {
- block_titles[title] = true
- }
- }
- }
-
- if ! is_procedure {
- matches = []
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/TaskExample.yml b/docs_user/.vale/styles/AsciiDocDITA/TaskExample.yml
deleted file mode 100644
index c33fd9be4..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/TaskExample.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-# Report extra examples inside of procedure modules.
----
-extends: script
-message: "Examples are allowed only once in DITA tasks."
-level: error
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#errors
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_admonition_block := text.re_compile("^\\[(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\][ \\t]*$")
- r_block_title := text.re_compile("^\\.{1,2}[^ \\t.].*$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_code_block := text.re_compile("^(?:\\.{4,}|-{4,})[ \\t]*$")
- r_conditional := text.re_compile("^(?:ifn?def|ifeval|endif)::\\S*\\[.*\\][ \\t]*$")
- r_content_type := text.re_compile("^:_(?:mod-docs-content|content|module)-type:[ \\t]+(?i:procedure)")
- r_empty_line := text.re_compile("^[ \\t]*$")
- r_example_block := text.re_compile("^\\[example\\][ \\t]*$")
- r_example_delim := text.re_compile("^={4,}[ \\t]*$")
- r_list_continue := text.re_compile("^\\+[ \\t]*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- expect_admonition := false
- expect_example := false
- in_comment_block := false
- in_code_block := false
- in_example_block := false
- is_procedure := false
- count := 0
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_code_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_code_block {
- in_code_block = delimiter
- } else if in_code_block == delimiter {
- in_code_block = false
- }
- continue
- }
- if in_code_block { continue }
-
- if r_conditional.match(line) { continue }
- if r_empty_line.match(line) { continue }
-
- if r_content_type.match(line) {
- is_procedure = true
- continue
- }
-
- if r_admonition_block.match(line) {
- expect_admonition = true
- continue
- }
-
- if expect_admonition || expect_example {
- if r_block_title.match(line) || r_list_continue.match(line) {
- continue
- }
- }
-
- if r_example_delim.match(line) {
- delimiter := text.trim_space(line)
- if ! in_example_block {
- in_example_block = delimiter
-
- if expect_admonition {
- expect_admonition = false
- continue
- }
- if expect_example {
- expect_example = false
- continue
- }
-
- count++
-
- if count > 1 {
- matches = append(matches, {begin: start, end: start + end - 1})
- }
- } else if in_example_block == delimiter {
- in_example_block = false
- }
- continue
- }
-
- if r_example_block.match(line) {
- count++
-
- if count > 1 {
- matches = append(matches, {begin: start, end: start + end - 1})
- }
-
- expect_example = true
- continue
- }
-
- expect_admonition = false
- expect_example = false
- }
-
- if ! is_procedure {
- matches = []
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/TaskSection.yml b/docs_user/.vale/styles/AsciiDocDITA/TaskSection.yml
deleted file mode 100644
index 5087c2923..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/TaskSection.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-# Report sections inside of procedure modules.
----
-extends: script
-message: "Sections are not allowed in DITA tasks."
-level: error
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#errors
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_content_type := text.re_compile("^:_(?:mod-docs-content|content|module)-type:[ \\t]+(?i:procedure)")
- r_section := text.re_compile("^={2,}[ \\t]\\S.*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- in_comment_block := false
- is_procedure := false
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_content_type.match(line) {
- is_procedure = true
- } else if r_section.match(line) {
- matches = append(matches, {begin: start, end: start + end - 1})
- }
- }
-
- if ! is_procedure {
- matches = []
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/TaskStep.yml b/docs_user/.vale/styles/AsciiDocDITA/TaskStep.yml
deleted file mode 100644
index 252b8b93d..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/TaskStep.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-# Report content other than steps in procedures.
----
-extends: script
-message: "Content other than a single list cannot be mapped to DITA tasks."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_admonition := text.re_compile("^\\[(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\][ \\t]*$")
- r_any_title := text.re_compile("^\\.{1,2}[^ \\t.].*$")
- r_attribute_list := text.re_compile("^\\[(?:|[\\w.#%{,\"'].*)\\][ \\t]*$")
- r_attribute := text.re_compile("^:!?\\S[^:]*:")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_conditional := text.re_compile("^(?:ifn?def|ifeval|endif)::\\S*\\[.*\\][ \\t]*$")
- r_content_type := text.re_compile("^:_(?:mod-docs-content|content|module)-type:[ \\t]+(?i:procedure)")
- r_dlist := text.re_compile("^[ \\t]*\\S.*?(?::{2,4}|;;)(?:|[ \\t]+.*)$")
- r_empty_line := text.re_compile("^[ \\t]*$")
- r_example_delim := text.re_compile("^={4,}[ \\t]*$")
- r_list_continue := text.re_compile("^\\+[ \\t]*$")
- r_other_block := text.re_compile("^(?:\\.{4,}|-{4,}|={4,}|-{2}|\\|={3,})[ \\t]*$")
- r_procedure := text.re_compile("^(?:={2,}[ \\t]+|\\.{1,2})Procedure[ \\t]*$")
- r_step := text.re_compile("^[ \\t]*[\\*-.]+[ \\t]+\\S.*$")
- r_supported_title := text.re_compile("^\\.{1,2}(?:Prerequisites?|Procedure|Verification|Results?|Troubleshooting|Troubleshooting steps?|Next steps?|Additional resources)[ \\t]*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- is_procedure_mod := false
- in_comment_block := false
- in_continue := false
- in_list := false
- in_other_block := false
- in_procedure := false
- in_step := false
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_content_type.match(line) {
- is_procedure_mod = true
- continue
- }
-
- if r_conditional.match(line) { continue }
- if r_attribute.match(line) { continue }
- if r_attribute_list.match(line) && ! r_admonition.match(line) {
- continue
- }
-
- if r_procedure.match(line) {
- in_procedure = true
- continue
- }
-
- if ! in_procedure { continue }
-
- if r_supported_title.match(line) { break }
- if r_any_title.match(line) { continue }
-
- if in_step {
- if r_other_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_other_block {
- in_other_block = delimiter
- } else if in_other_block == delimiter {
- in_other_block = false
- in_continue = false
- }
- continue
- }
- if in_other_block { continue }
- }
-
- if r_empty_line.match(line) {
- if ! in_continue {
- in_step = false
- }
- continue
- }
-
- if r_list_continue.match(line) {
- in_continue = true
- in_step = true
- continue
- } else {
- in_continue = false
- }
-
- if r_step.match(line) {
- in_list = true
- in_step = true
- continue
- }
-
- if in_list && r_dlist.match(line) {
- in_step = true
- continue
- }
-
- if in_step { continue }
-
- if r_example_delim.match(line) { break }
-
- matches = append(matches, {begin: start, end: start + end - 1})
-
- if in_list { break }
- }
-
- if ! is_procedure_mod {
- matches = []
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/TaskTitle.yml b/docs_user/.vale/styles/AsciiDocDITA/TaskTitle.yml
deleted file mode 100644
index 0dcc75ee8..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/TaskTitle.yml
+++ /dev/null
@@ -1,101 +0,0 @@
-# Report unsupported titles inside of procedure modules.
----
-extends: script
-message: "Unsupported titles cannot be mapped to DITA tasks."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-script: |
- text := import("text")
- matches := []
-
- r_attribute_list := text.re_compile("^\\[(?:|[\\w.#%{,\"'].*)\\][ \\t]*$")
- r_attribute := text.re_compile("^:!?\\S[^:]*:")
- r_block_title := text.re_compile("^\\.{1,2}[^ \\t.].*$")
- r_code_block := text.re_compile("^(?:\\.{4,}|-{4,})[ \\t]*$")
- r_comment_block := text.re_compile("^/{4,}\\s*$")
- r_comment_line := text.re_compile("^(//|//[^/].*)$")
- r_conditional := text.re_compile("^(?:ifn?def|ifeval|endif)::\\S*\\[.*\\][ \\t]*$")
- r_content_type := text.re_compile("^:_(?:mod-docs-content|content|module)-type:[ \\t]+(?i:procedure)")
- r_example_block := text.re_compile("^\\[example\\][ \\t]*$")
- r_example_delim := text.re_compile("^={4,}[ \\t]*$")
- r_image := text.re_compile("^image::(?:\\S|\\S.*\\S)\\[.*\\][ \\t]*$")
- r_list_continue := text.re_compile("^\\+[ \\t]*$")
- r_supported_title := text.re_compile("^\\.{1,2}(?:Prerequisites?|Procedure|Verification|Results?|Troubleshooting|Troubleshooting steps?|Next steps?|Additional resources)[ \\t]*$")
- r_table := text.re_compile("^\\|={3,}[ \\t]*$")
-
- document := text.split(text.trim_suffix(scope, "\n"), "\n")
-
- in_code_block := false
- in_comment_block := false
- is_procedure := false
- is_list_continue := false
- expect_block := false
- start := 0
- end := 0
-
- for line in document {
- start += end
- end = len(line) + 1
-
- if r_comment_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_comment_block {
- in_comment_block = delimiter
- } else if in_comment_block == delimiter {
- in_comment_block = false
- }
- continue
- }
- if in_comment_block { continue }
- if r_comment_line.match(line) { continue }
-
- if r_code_block.match(line) {
- delimiter := text.trim_space(line)
- if ! in_code_block {
- in_code_block = delimiter
- } else if in_code_block == delimiter {
- in_code_block = false
- }
- continue
- }
- if in_code_block { continue }
-
- if r_content_type.match(line) {
- is_procedure = true
- continue
- }
-
- if r_attribute_list.match(line) && ! r_example_block.match(line) { continue }
- if r_attribute.match(line) { continue }
- if r_conditional.match(line) { continue }
-
- if r_list_continue.match(line) {
- is_list_continue = true
- continue
- }
-
- if r_table.match(line) || r_image.match(line) ||
- r_example_block.match(line) || r_example_delim.match(line) {
- expect_block = false
- is_list_continue = false
- continue
- }
-
- if r_block_title.match(line) && ! r_supported_title.match(line) {
- if ! is_list_continue {
- expect_block = {begin: start, end: start + end - 1}
- }
- } else if expect_block {
- matches = append(matches, expect_block)
- expect_block = false
- }
-
- is_list_continue = false
- }
-
- if ! is_procedure {
- matches = []
- } else if expect_block {
- matches = append(matches, expect_block)
- }
diff --git a/docs_user/.vale/styles/AsciiDocDITA/ThematicBreak.yml b/docs_user/.vale/styles/AsciiDocDITA/ThematicBreak.yml
deleted file mode 100644
index c59e76b40..000000000
--- a/docs_user/.vale/styles/AsciiDocDITA/ThematicBreak.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-# Report that thematic breaks are not supported.
----
-extends: existence
-message: "Thematic breaks are not supported in DITA."
-level: warning
-link: https://github.com/jhradilek/asciidoctor-dita-vale/blob/main/README.md#warnings
-scope: raw
-nonword: true
-tokens:
- - "^'{3,}[ \\t]*$"
- - '^[*_]{3}[ \t]*$'
- - '^\* \* \*[ \t]*$'
- - '^- - -[ \t]*$'
- - '^_ _ _[ \t]*$'
diff --git a/docs_user/Makefile b/docs_user/Makefile
deleted file mode 100644
index c330e8583..000000000
--- a/docs_user/Makefile
+++ /dev/null
@@ -1,64 +0,0 @@
-BUILD ?= upstream
-ABUILD_VARIANT ?=
-BUILD_VARIANT_WITH_SEPARATOR ?= $(if $(strip $(BUILD_VARIANT)),-$(BUILD_VARIANT),)
-BUILD_DIR = ../docs_build
-ROOTDIR = $(realpath .)
-NAME = adoption-user
-DEST_DIR = $(BUILD_DIR)/$(NAME)
-DEST_HTML = $(DEST_DIR)/index-$(BUILD)$(BUILD_VARIANT_WITH_SEPARATOR).html
-DEST_PDF = $(BUILD_DIR)/$(NAME)-$(BUILD)$(BUILD_VARIANT_WITH_SEPARATOR).pdf
-IMAGES_DIR = $(DEST_DIR)/images
-IMAGES_TS = $(DEST_DIR)/.timestamp-images
-MAIN_SOURCE = main.adoc
-OTHER_SOURCES = $(shell find ./assemblies ./modules -type f)
-IMAGES = $(shell find ./images -type f)
-ALL_SOURCES = $(MAIN_SOURCE) $(OTHER_SOURCES) $(IMAGES)
-UNAME = $(shell uname)
-BUNDLE_EXEC ?= bundle exec
-
-ifeq ($(UNAME), Linux)
-BROWSER_OPEN = xdg-open
-endif
-ifeq ($(UNAME), Darwin)
-BROWSER_OPEN = open
-endif
-
-all: html
-
-html: html-latest
-
-html-latest: prepare $(IMAGES_TS) $(DEST_HTML)
-
-pdf: prepare $(DEST_PDF)
-
-prepare:
- @if [ "$(BUILD)" != upstream -a "$(BUILD)" != downstream ]; then echo "BUILD must be 'upstream' or 'downstream'."; exit 1; fi
- @mkdir -p $(BUILD_DIR)
- @mkdir -p $(DEST_DIR) $(IMAGES_DIR)
-
-clean:
- @rm -rf "$(DEST_DIR)" "$(DEST_PDF)"
-
-watch-html:
- @which inotifywait > /dev/null || ( echo "ERROR: inotifywait not found, install inotify-tools" && exit 1 )
- while true; do \
- inotifywait -r -e modify -e create -e delete .; \
- sleep 0.5; \
- $(MAKE) html; \
- done
-
-open-html: html
- ${BROWSER_OPEN} "file://$(realpath $(ROOTDIR)/$(DEST_HTML))"
-
-open-pdf: pdf
- ${BROWSER_OPEN} "$(realpath $(ROOTDIR)/$(DEST_PDF))"
-
-$(IMAGES_TS): $(IMAGES)
- cp $? $(IMAGES_DIR)
- touch $(IMAGES_TS)
-
-$(DEST_HTML): $(ALL_SOURCES)
- $(BUNDLE_EXEC) asciidoctor -a source-highlighter=highlightjs -a highlightjs-languages="yaml,bash" -a highlightjs-theme="monokai" --failure-level WARN -a build=$(BUILD) -a build_variant=$(BUILD_VARIANT) -b xhtml5 -d book -o $@ $(MAIN_SOURCE)
-
-$(DEST_PDF): $(ALL_SOURCES)
- $(BUNDLE_EXEC) asciidoctor-pdf -a build=$(BUILD) -a build_variant=$(BUILD_VARIANT) -d book -o $@ $(MAIN_SOURCE) $(IMAGES)
diff --git a/docs_user/adoption-attributes.adoc b/docs_user/adoption-attributes.adoc
deleted file mode 100644
index 21d2e7093..000000000
--- a/docs_user/adoption-attributes.adoc
+++ /dev/null
@@ -1,242 +0,0 @@
-:ProductVersion: 18.0
-:context: assembly
-:build: downstream
-
-ifeval::["{build}" != "downstream"]
-:rhocp_long: OpenShift
-:rhos_long: Red{nbsp}Hat OpenStack Services on OpenShift (RHOSO)
-:rhos_long_noacro: Red{nbsp}Hat OpenStack Services on OpenShift
-:rhos_acro: RHOSO
-:rhos_prev_long: OpenStack
-:OpenStackShort: OSP
-:OpenShiftShort: OCP
-:ocp_curr_ver: 4.16
-:rhos_curr_ver: Antelope
-:rhos_prev_ver:
-:rhos_z_stream: 0
-:rhel_curr_ver: 9.4
-:rhel_prev_ver: 9.2
-:OpenStackPreviousInstaller: TripleO
-:Ceph: Ceph
-:CephCluster: Ceph Storage
-:CephVernum: Reef
-
-//Components and services
-
-//Identity service (keystone)
-:identity_service_first_ref: Identity service (keystone)
-:identity_service: Identity service
-
-//Shared File Systems service (manila)
-:rhos_component_storage_file_first_ref: Shared File Systems service (manila)
-:rhos_component_storage_file: Shared File Systems service
-
-//OpenStack Key Manager (barbican)
-:key_manager_first_ref: Key Manager service (barbican)
-:key_manager: Key Manager service
-
-//OpenStack Networking service (neutron)
-:networking_first_ref: Networking service (neutron)
-:networking_service: Networking service
-
-//OpenStack Loadbalancer service (octavia)
-:loadbalancer_first_ref: Load-balancing service (octavia)
-:loadbalancer_service: Load-balancing service
-
-//Openstack DNS service (designate)
-:dns_first_ref: DNS service (designate)
-:dns_service: DNS service
-
-//Object Storage service (swift)
-:object_storage_first_ref: Object Storage service (swift)
-:object_storage: Object Storage service
-
-//Image service (glance)
-:image_service_first_ref: Image Service (glance)
-:image_service: Image service
-
-//Compute service (nova)
-:compute_service_first_ref: Compute service (nova)
-:compute_service: Compute service
-
-//Block Storage (cinder)
-:block_storage_first_ref: Block Storage service (cinder)
-:block_storage: Block Storage service
-
-//Dashboard service (horizon)
-:dashboard_first_ref: Dashboard service (horizon)
-:dashboard_service: Dashboard service
-
-//Bare Metal Provisioning service (ironic)
-:bare_metal_first_ref: Bare Metal Provisioning service (ironic)
-:bare_metal: Bare Metal Provisioning service
-
-//Orchestration service (heat)
-:orchestration_first_ref: Orchestration service (heat)
-:orchestration: Orchestration service
-
-//Telemetry service
-:telemetry: Telemetry service
-
-endif::[]
-
-ifeval::["{build}" == "downstream"]
-:rhos_long: Red{nbsp}Hat OpenStack Services on OpenShift (RHOSO)
-:rhos_long_noacro: Red{nbsp}Hat OpenStack Services on OpenShift
-:rhos_acro: RHOSO
-:rhos_prev_long: Red{nbsp}Hat OpenStack Platform
-:OpenStackShort: RHOSP
-:rhos_curr_ver: 18.0
-:rhos_prev_ver: 17.1
-:rhos_z_stream: 0
-:rhel_curr_ver: 9.4
-:rhel_prev_ver: 9.2
-:rhocp_long: Red Hat OpenShift Container Platform (RHOCP)
-:OpenShiftShort: RHOCP
-:ocp_curr_ver: 4.16
-:OpenStackPreviousInstaller: director
-:Ceph: Red Hat Ceph Storage
-:CephCluster: Red Hat Ceph Storage
-:CephVernum: 7
-
-
-// Ceph 9 IBM PDF paths - update these when Ceph 9 minor version changes
-:ceph9_pdf_path: SSEG27_9.9.1/out/91
-:ceph9_version: 9.9.1
-
-//Components and services
-
-//Identity service (keystone)
-:identity_service_first_ref: Identity service (keystone)
-:identity_service: Identity service
-
-//Shared File Systems service (manila)
-:rhos_component_storage_file_first_ref: Shared File Systems service (manila)
-:rhos_component_storage_file: Shared File Systems service
-
-//OpenStack Key Manager (barbican)
-:key_manager_first_ref: Key Manager service (barbican)
-:key_manager: Key Manager service
-
-//OpenStack Networking service (neutron)
-:networking_first_ref: Networking service (neutron)
-:networking_service: Networking service
-
-//OpenStack Loadbalancer service (octavia)
-:loadbalancer_first_ref: Load-balancing service (octavia)
-:loadbalancer_service: Load-balancing service
-
-//Openstack DNS service (designate)
-:dns_first_ref: DNS service (designate)
-:dns_service: DNS service
-
-//Object Storage service (swift)
-:object_storage_first_ref: Object Storage service (swift)
-:object_storage: Object Storage service
-
-//Image service (glance)
-:image_service_first_ref: Image Service (glance)
-:image_service: Image service
-
-//Compute service (nova)
-:compute_service_first_ref: Compute service (nova)
-:compute_service: Compute service
-
-//Block Storage (cinder)
-:block_storage_first_ref: Block Storage service (cinder)
-:block_storage: Block Storage service
-
-//Dashboard service (horizon)
-:dashboard_first_ref: Dashboard service (horizon)
-:dashboard_service: Dashboard service
-
-//Bare Metal Provisioning service (ironic)
-:bare_metal_first_ref: Bare Metal Provisioning service (ironic)
-:bare_metal: Bare Metal Provisioning service
-
-//Orchestration service (heat)
-:orchestration_first_ref: Orchestration service (heat)
-:orchestration: Orchestration service
-
-//Telemetry service
-:telemetry: Telemetry service
-endif::[]
-
-ifeval::["{build_variant}" == "ospdo"]
-:OpenStackPreviousInstaller: director Operator
-endif::[]
-
-
-// Common URLs. Do not override. Do not delete.
-:base_url: https://access.redhat.com/documentation
-:defaultURL: https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html
-:defaultOCPURL: https://access.redhat.com/documentation/en-us/openshift_container_platform/{ocp_curr_ver}/html
-:defaultCephURL: https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/{CephVernum}/html
-
-// books - URLs and titles
-:adopting-data-plane: {defaultURL}/adopting_the_red_hat_openstack_platform_data_plane
-:auto-scaling: {defaultURL}/auto-scaling_for_instances
-:backing-up-volumes: {defaultURL}/backing_up_block_storage_volumes
-:backing-up: {defaultURL}/backing_up_and_restoring_the_undercloud_and_control_plane_nodes
-:barbican: {defaultURL}/managing_secrets_with_the_key_manager_service
-:bare-metal: {defaultURL}/configuring_the_bare_metal_provisioning_service
-:bgp: {defaultURL}/configuring_dynamic_routing
-:bgp-t: Configuring dynamic routing
-:commandline-ref: {defaultURL}/command_line_interface_reference
-:commandline-ref-t: Command line interface reference
-:configuration-ref: {defaultURL}/configuration_reference
-:configure-compute: {defaultURL}/configuring_the_compute_service_for_instance_creation
-:configure-compute-t: Configuring the Compute service for instance creation
-:configuring-storage: {defaultURL}/configuring_persistent_storage
-:configuring-storage-t: Configuring persistent storage
-:creating-images: {defaultURL}/creating_and_managing_images
-:creating-instances: {defaultURL}/creating_and_managing_instances
-:creating-instances-t: Creating and managing instances
-:customizing-rhoso: {defaultURL}/customizing_the_red_hat_openstack_services_on_openshift_deployment
-:customizing-rhoso-t: Customizing the Red Hat OpenStack Services on OpenShift deployment
-:dashboard: {defaultURL}/managing_cloud_resources_with_the_openstack_dashboard
-:dcn: {defaultURL}/deploying_a_distributed_compute_node_dcn_architecture
-:deploy-at-scale: {defaultURL}/deploying_red_hat_openstack_platform_at_scale
-:deploy-in-rhocp: {defaultURL}/deploying_an_overcloud_in_a_red_hat_openshift_container_platform_cluster_with_director_operator
-:deploying-rhoso: {defaultURL}/deploying_red_hat_openstack_services_on_openshift
-:deploying-rhoso-t: Deploying Red Hat OpenStack Services on OpenShift
-:designate: {defaultURL}/configuring_dns_as_a_service
-:designate-t: Configuring DNS as a service
-:existing-ceph: {defaultURL}/integrating_an_overcloud_with_an_existing_red_hat_ceph_storage_cluster
-:external-identity: {defaultURL}/integrating_openstack_identity_with_external_user_management_services
-:ffu: {defaultURL}/framework_for_upgrades_16.2_to_17.1
-:firewall-rules: {defaultURL}/firewall_rules_for_red_hat_openstack_platform
-:ha-for-instances: {defaultURL}/configuring_high_availability_for_instances
-:hci: {defaultURL}/deploying_a_hyperconverged_infrastructure_environment
-:hci-t: Deploying a hyperconverged infrastructure environment
-:identity: {defaultURL}/managing_openstack_identity_resources
-:installing-director: {defaultURL}/installing_and_managing_red_hat_openstack_platform_with_director
-:intro-to-containers: {defaultURL}/introduction_to_containerized_services_in_red_hat_openstack_platform
-:intro-to-rhosp: {defaultURL}/introduction_to_red_hat_openstack_platform
-:ipv6: {defaultURL}/configuring_ipv6_networking_for_the_overcloud
-:managing-ha: {defaultURL}/managing_high_availability_services
-:migrating-to-ovn: {defaultURL}/migrating_to_the_ovn_mechanism_driver
-:minor-update: {defaultURL}/performing_a_minor_update_of_red_hat_openstack_platform
-:network-config: {defaultURL}/configuring_networking_services
-:network-config-t: Configuring networking services
-:network-manage: {defaultURL}/managing_networking_resources
-:network-manage-t: Managing networking resources
-:nfv: {defaultURL}/deploying_a_network_functions_virtualization_environment
-:nfv-t: Deploying a Network Functions Virtualization environment
-:observability: {defaultURL}/managing_overcloud_observability
-:oc-params: {defaultURL}/overcloud_parameters
-:octavia: {defaultURL}/configuring_load_balancing_as_a_service
-:octavia-t: Configuring load balancing as a service
-:planning: {defaultURL}/planning_your_deployment
-:planning-t: Planning your deployment
-:release-notes: {defaultURL}/release_notes
-:rhos-deployed-ceph: {defaultURL}/deploying_red_hat_ceph_storage_and_red_hat_openstack_platform_together_with_director
-:security-guide: {defaultURL}/hardening_red_hat_openstack_platform
-:spine-leaf: {defaultURL}/configuring_spine-leaf_networking
-:spine-leaf-t: Configuring spine-leaf networking
-:stf-release-notes: {defaultURL}/service_telemetry_framework_release_notes_1.5
-:stf: {defaultURL}/service_telemetry_framework_1.5
-:test-suite: {defaultURL}/validating_your_cloud_with_the_red_hat_openstack_platform_integration_test_suite
-
-// Specific links
-:setup-tlse: {defaultURL}/hardening_red_hat_openstack_platform/assembly_securing-rhos-with-tls-and-pki_security_and_hardening#proc_implementing-tls-e-with-ansible_encryption-and-key-management[Implementing TLS-e with Ansible]
diff --git a/docs_user/assemblies/assembly_adopting-key-manager-service-with-hsm.adoc b/docs_user/assemblies/assembly_adopting-key-manager-service-with-hsm.adoc
deleted file mode 100644
index feafa9145..000000000
--- a/docs_user/assemblies/assembly_adopting-key-manager-service-with-hsm.adoc
+++ /dev/null
@@ -1,34 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="adopting-key-manager-service-with-hsm_{context}"]
-
-:context: hsm-integration
-
-= Adopting the {key_manager} with HSM integration
-
-[role="_abstract"]
-Adopt the {key_manager_first_ref} with HSM integration to {rhos_long} to preserve HSM functionality and maintain access to HSM-backed secrets.
-
-For additional information about the {key_manager} before you start the adoption, see the following resources:
-
-* {key_manager} service configuration documentation
-* Hardware security module vendor-specific documentation
-* OpenStack Barbican PKCS#11 plugin documentation
-
-include::../modules/con_key-manager-service-hsm-adoption-approaches.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-key-manager-service-with-proteccio-hsm.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-key-manager-service-with-hsm-integration.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_troubleshooting-key-manager-hsm-adoption.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_troubleshooting-key-manager-proteccio-adoption.adoc[leveloffset=+1]
-
-include::../modules/proc_rolling-back-the-hsm-adoption.adoc[leveloffset=+1]
-
-
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_adopting-openstack-control-plane-services.adoc b/docs_user/assemblies/assembly_adopting-openstack-control-plane-services.adoc
deleted file mode 100644
index e8d333688..000000000
--- a/docs_user/assemblies/assembly_adopting-openstack-control-plane-services.adoc
+++ /dev/null
@@ -1,60 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="adopting-openstack-control-plane-services_{context}"]
-
-:context: adopt-control-plane
-
-= Adopting {rhos_prev_long} control plane services
-
-[role="_abstract"]
-Adopt your {rhos_prev_long} {rhos_prev_ver} control plane services to deploy them in the {rhos_long} {rhos_curr_ver} control plane.
-
-include::../modules/proc_adopting-the-identity-service.adoc[leveloffset=+1]
-
-include::../modules/proc_configuring-federation-for-keystone.adoc[leveloffset=+1]
-
-include::../modules/proc_configuring-ldap-with-domain-specific-drivers.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-key-manager-service.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_adopting-key-manager-service-with-hsm.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-networking-service.adoc[leveloffset=+1]
-
-include::../modules/proc_configuring-control-plane-networking-for-spine-leaf.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-object-storage-service.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_adopting-the-image-service.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-placement-service.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_adopting-the-bare-metal-provisioning-service.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-compute-service.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-block-storage-service.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-block-storage-service-with-dcn-backend.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-openstack-dashboard.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_adopting-the-shared-file-systems-service.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-orchestration-service.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-loadbalancer-service.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-telemetry-services.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-the-dns-service.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-autoscaling.adoc[leveloffset=+1]
-
-include::../modules/proc_pulling-configuration-from-a-tripleo-deployment.adoc[leveloffset=+1]
-
-include::../modules/proc_rolling-back-the-control-plane-adoption.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_adopting-the-bare-metal-provisioning-service.adoc b/docs_user/assemblies/assembly_adopting-the-bare-metal-provisioning-service.adoc
deleted file mode 100644
index 48d1eaa50..000000000
--- a/docs_user/assemblies/assembly_adopting-the-bare-metal-provisioning-service.adoc
+++ /dev/null
@@ -1,18 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="adopting-the-bare-metal-provisioning-service_{context}"]
-
-:context: adopting-bare-metal-provisioning
-
-= Adopting the Bare Metal Provisioning service
-
-[role="_abstract"]
-Review information about your {bare_metal_first_ref} configuration and then adopt the {bare_metal} to the {rhos_long_noacro} control plane.
-
-include::../modules/con_bare-metal-provisioning-service-configurations.adoc[leveloffset=+1]
-
-include::../modules/proc_deploying-the-bare-metal-provisioning-service.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_adopting-the-data-plane.adoc b/docs_user/assemblies/assembly_adopting-the-data-plane.adoc
deleted file mode 100644
index d0ef53c54..000000000
--- a/docs_user/assemblies/assembly_adopting-the-data-plane.adoc
+++ /dev/null
@@ -1,40 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="adopting-data-plane_{context}"]
-
-:context: data-plane
-
-= Adopting the data plane
-
-[role="_abstract"]
-Adopting the {rhos_long} data plane involves the following steps:
-
-ifeval::["{build_variant}" != "ospdo"]
-. Stop any remaining services on the {rhos_prev_long} ({OpenStackShort}) {rhos_prev_ver} control plane.
-endif::[]
-. Deploy the required custom resources.
-. Perform a fast-forward upgrade on Compute services from {OpenStackShort} {rhos_prev_ver} to {rhos_acro} {rhos_curr_ver}.
-. Adopt Networker services to the {rhos_acro} data plane.
-
-[WARNING]
-After the {rhos_acro} control plane manages the newly deployed data plane, you must not re-enable services on the {OpenStackShort} {rhos_prev_ver} control plane and data plane. If you re-enable services, workloads are managed by two control planes or two data planes, resulting in data corruption, loss of control of existing workloads, inability to start new workloads, or other issues.
-
-include::../modules/proc_stopping-infrastructure-management-and-compute-services.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-compute-services-to-the-data-plane.adoc[leveloffset=+1]
-
-include::../modules/proc_configuring-dcn-data-plane-nodesets.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-compute-services-with-dcn-backend.adoc[leveloffset=+1]
-
-include::../modules/proc_performing-a-fast-forward-upgrade-on-compute-services.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-networker-services-to-the-data-plane.adoc[leveloffset=+1]
-
-include::../modules/proc_enabling-high-availability-for-instances.adoc[leveloffset=+1]
-
-include::../modules/proc_performing-post-adoption-cleanup-of-load-balancers.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_adopting-the-image-service.adoc b/docs_user/assemblies/assembly_adopting-the-image-service.adoc
deleted file mode 100644
index 4f79f331b..000000000
--- a/docs_user/assemblies/assembly_adopting-the-image-service.adoc
+++ /dev/null
@@ -1,43 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="adopting-the-image-service_{context}"]
-
-:context: image-service
-
-= Adopting the {image_service}
-
-[role="_abstract"]
-To adopt the {image_service_first_ref} you patch an existing `OpenStackControlPlane` custom resource (CR) that has the {image_service} disabled. The patch starts the service with the configuration parameters that are provided by the {rhos_prev_long} ({OpenStackShort}) environment.
-
-The {image_service} adoption is complete if you see the following results:
-
-* The `GlanceAPI` service up and running.
-* The {identity_service} endpoints are updated, and the same back end of the source cloud is available.
-
-To complete the {image_service} adoption, ensure that your environment meets the following criteria:
-
-* You have a running {OpenStackPreviousInstaller} environment (the source cloud).
-* You have a Single Node OpenShift or OpenShift Local that is running in the {rhocp_long} cluster.
-* Optional: You can reach an internal/external `Ceph` cluster by both `crc` and {OpenStackPreviousInstaller}.
-
-If you have image quotas in {OpenStackShort} {rhos_prev_ver}, these quotas are transferred to {rhos_long} {rhos_curr_ver} because the image quota system in {rhos_curr_ver} is disabled by default. If you enable image quotas in {rhos_acro} {rhos_curr_ver}, the new quotas replace the legacy quotas from {OpenStackShort} {rhos_prev_ver}.
-
-include::../modules/proc_adopting-image-service-with-object-storage-backend.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-image-service-with-block-storage-backend.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-image-service-with-nfs-backend.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-image-service-with-ceph-backend.adoc[leveloffset=+1]
-
-include::../modules/proc_adopting-image-service-with-dcn-backend.adoc[leveloffset=+1]
-
-include::../modules/proc_verifying-the-image-service-adoption.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* link:{defaultURL}/customizing_persistent_storage/assembly_glance-configuring-quotas_osp[Customizing Image service (glance) quota limits]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_adopting-the-shared-file-systems-service.adoc b/docs_user/assemblies/assembly_adopting-the-shared-file-systems-service.adoc
deleted file mode 100644
index 1908d406b..000000000
--- a/docs_user/assemblies/assembly_adopting-the-shared-file-systems-service.adoc
+++ /dev/null
@@ -1,32 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="adopting-the-shared-file-systems-service_{context}"]
-
-:context: adopting-shared-file-systems
-
-= Adopting the {rhos_component_storage_file}
-
-[role="_abstract"]
-The {rhos_component_storage_file_first_ref} provides a self-service API to create and manage file shares. File shares are built for concurrent read/write access from multiple clients, making the Shared File Systems service in cloud environments that require a ReadWriteMany persistent storage.
-
-File shares in {rhos_acro} require network access. Ensure that network plans match the {rhos_prev_long} environment to maintain tenant connectivity during adoption. The {rhos_component_storage_file} control plane services are not in the data path. Shutting down the API, scheduler, and share manager services do not impact access to existing shared file systems.
-
-Typically, storage and storage device management are separate networks. Shared File Systems services only need access to the storage device management network.
-For example, if you used a {CephCluster} cluster in the deployment, the "storage"
-network refers to the {CephCluster} cluster's public network, and the Shared File Systems service's share manager service needs to be able to reach it.
-
-The {rhos_component_storage_file} supports the following storage networking scenarios:
-
-* You can directly control the networking for your respective file shares.
-* The {rhos_acro} administrator configures the storage networking.
-
-
-include::../modules/con_preparing-the-shared-file-systems-service-configuration.adoc[leveloffset=+1]
-
-include::../modules/proc_deploying-file-systems-service-control-plane.adoc[leveloffset=+1]
-
-include::../modules/proc_decommissioning-rhosp-standalone-ceph-NFS-service.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_configuring-isolated-networks.adoc b/docs_user/assemblies/assembly_configuring-isolated-networks.adoc
deleted file mode 100644
index 613feaa79..000000000
--- a/docs_user/assemblies/assembly_configuring-isolated-networks.adoc
+++ /dev/null
@@ -1,35 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="configuring-isolated-networks_{context}"]
-
-:context: isolated-networks
-
-= Configuring isolated networks
-
-[role="_abstract"]
-Before you begin replicating your existing VLAN and IPAM configuration in the {rhos_long} environment, you must have the following IP address allocations for the new control plane services:
-
-* 1 IP address for each isolated network on each {rhocp_long} worker node. You configure these IP addresses in the `NodeNetworkConfigurationPolicy` custom resources (CRs) for the {OpenShiftShort} worker nodes.
-* 1 IP range for each isolated network for the data plane nodes. You configure these ranges in the `NetConfig` CRs for the data plane nodes.
-* 1 IP range for each isolated network for control plane services. These ranges
-enable pod connectivity for isolated networks in the `NetworkAttachmentDefinition` CRs.
-* 1 IP range for each isolated network for load balancer IP addresses. These IP ranges define load balancer IP addresses for MetalLB in the `IPAddressPool` CRs.
-
-[NOTE]
-The exact list and configuration of isolated networks in the following procedures should reflect the actual {rhos_prev_long} environment. The number of isolated networks might differ from the examples used in the procedures. The IPAM scheme might also differ. Only the parts of the configuration that are relevant to configuring networks are shown. The values that are used in the following procedures are examples. Use values that are specific to your configuration.
-
-include::../modules/proc_configuring-openshift-worker-nodes.adoc[leveloffset=+1]
-
-include::../modules/proc_configuring-networking-for-control-plane-services.adoc[leveloffset=+1]
-
-include::../modules/proc_configuring-data-plane-nodes.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* xref:configuring-openshift-worker-nodes_isolated-networks[Configuring {OpenShiftShort} worker nodes]
-* xref:configuring-data-plane-nodes_isolated-networks[Configuring data plane nodes]
-* xref:configuring-networking-for-control-plane-services_isolated-networks[Configuring the networking for control plane services]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_configuring-network-for-RHOSO-deployment.adoc b/docs_user/assemblies/assembly_configuring-network-for-RHOSO-deployment.adoc
deleted file mode 100644
index 07e6705fa..000000000
--- a/docs_user/assemblies/assembly_configuring-network-for-RHOSO-deployment.adoc
+++ /dev/null
@@ -1,42 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="configuring-network-for-RHOSO-deployment_{context}"]
-
-:context: configuring-network
-
-= Configuring the network for the {rhos_long_noacro} deployment
-
-[role="_abstract"]
-When you adopt a new {rhos_long} deployment, you must align the network
-configuration with the adopted cluster to maintain connectivity for existing
-workloads.
-
-Perform the following tasks to incorporate the existing network configuration:
-
-* Configure {rhocp_long} worker nodes to align VLAN tags and IP Address Management (IPAM) configuration with the existing deployment.
-* Configure control plane services to use compatible IP ranges for service and load-balancing IP addresses.
-* Configure data plane nodes to use corresponding compatible configuration for VLAN tags and IPAM.
-
-When configuring nodes and services, the general approach is as follows:
-
-* For IPAM, you can either reuse subnet ranges from the existing deployment or, if there is a shortage of free IP addresses in existing subnets, define new ranges for the new control plane services. If you define new ranges, you configure IP routing between the old and new ranges.
-* For VLAN tags, always reuse the configuration from the existing deployment.
-
-include::../modules/proc_retrieving-network-information-from-your-existing-deployment.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_planning-your-ipam-configuration.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_configuring-isolated-networks.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-ifeval::["{build_variant}" == "ospdo"]
-* link:https://docs.redhat.com/en/documentation/red_hat_openstack_platform/17.1/html-single/deploying_an_overcloud_in_a_red_hat_openshift_container_platform_cluster_with_director_operator/index#proc_creating-an-overcloud-network-with-the-openstacknetconfig-CRD_OSPdO-networks[Creating networks with director Operator]
-endif::[]
-* xref:planning-your-ipam-configuration_configuring-network[Planning your IPAM configuration]
-* link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/deploying_red_hat_openstack_services_on_openshift/assembly_preparing-rhoso-networks_preparing[Preparing networks for Red Hat OpenStack Services on OpenShift]
-
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_migrating-ceph-cluster.adoc b/docs_user/assemblies/assembly_migrating-ceph-cluster.adoc
deleted file mode 100644
index 00431b17f..000000000
--- a/docs_user/assemblies/assembly_migrating-ceph-cluster.adoc
+++ /dev/null
@@ -1,55 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="ceph-migration_{context}"]
-
-= Migrating the {Ceph} cluster
-
-:context: migrating-ceph
-
-[role="_abstract"]
-In the context of data plane adoption, where the {rhos_prev_long}
-({OpenStackShort}) services are redeployed in {rhocp_long}, you migrate a
-{OpenStackPreviousInstaller}-deployed {CephCluster} cluster by using a process
-called “externalizing” the {CephCluster} cluster.
-
-There are two deployment topologies that include an internal {CephCluster}
-cluster:
-
-* {OpenStackShort} includes dedicated {CephCluster} nodes to host object
- storage daemons (OSDs)
-
-* Hyperconverged Infrastructure (HCI), where Compute and Storage services are
- colocated on hyperconverged nodes
-
-In either scenario, there are some {Ceph} processes that are deployed on
-{OpenStackShort} Controller nodes: {Ceph} monitors, Ceph Object Gateway (RGW),
-Rados Block Device (RBD), Ceph Metadata Server (MDS), Ceph Dashboard, and NFS
-Ganesha. To migrate your {CephCluster} cluster, you must decommission the
-Controller nodes and move the {Ceph} daemons to a set of target nodes that are
-already part of the {CephCluster} cluster.
-
-== Prerequisites
-
-* Before you begin the migration, complete the tasks in your {rhos_prev_long} {rhos_prev_ver} environment. For more information, see "{Ceph} prerequisites" in the Adoption overview chapter.
-
-include::../modules/ref_ceph-migration-dcn.adoc[leveloffset=+1]
-
-include::../modules/ref_ceph-daemon-cardinality.adoc[leveloffset=+1]
-
-include::assembly_migrating-ceph-monitoring-stack.adoc[leveloffset=+1]
-
-include::../modules/proc_migrating-ceph-mds.adoc[leveloffset=+1]
-
-include::assembly_migrating-ceph-rgw.adoc[leveloffset=+1]
-
-include::assembly_migrating-ceph-rbd.adoc[leveloffset=+1]
-
-include::../modules/proc_migrating-ceph-post.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* xref:red-hat-ceph-storage-prerequisites_configuring-network[{Ceph} prerequisites]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_migrating-ceph-monitoring-stack.adoc b/docs_user/assemblies/assembly_migrating-ceph-monitoring-stack.adoc
deleted file mode 100644
index 20978422b..000000000
--- a/docs_user/assemblies/assembly_migrating-ceph-monitoring-stack.adoc
+++ /dev/null
@@ -1,35 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="migrating-ceph-monitoring_{context}"]
-
-:context: migrating-ceph-monitoring
-
-= Migrating the monitoring stack component to new nodes within an existing {Ceph} cluster
-
-[role="_abstract"]
-The {Ceph} Dashboard module adds web-based monitoring and administration to the
-Ceph Manager. With {OpenStackPreviousInstaller}-deployed {Ceph}, the {Ceph} Dashboard is enabled as part of the overcloud deploy and is composed of the following components:
-
-* Ceph Manager module
-* Grafana
-* Prometheus
-* Alertmanager
-* Node exporter
-
-The {Ceph} Dashboard containers are included through `tripleo-container-image-prepare` parameters, and high availability (HA) relies
-on `HAProxy` and `Pacemaker` to be deployed on the {rhos_prev_long} ({OpenStackShort}) environment. For an external {CephCluster} cluster, HA is not supported.
-
-== Prerequisites
-You migrate and relocate the Ceph Monitoring components to free Controller nodes. Before you begin the migration, complete the tasks in your {rhos_prev_long} {rhos_prev_ver} environment. For more information, see "{Ceph} prerequisites" in the "Adoption overview" chapter.
-
-
-include::../assemblies/assembly_migrating-monitoring-stack-to-target-nodes.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* xref:red-hat-ceph-storage-prerequisites_configuring-network[{Ceph} prerequisites]
-
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_migrating-ceph-rbd.adoc b/docs_user/assemblies/assembly_migrating-ceph-rbd.adoc
deleted file mode 100644
index 6d5790e1e..000000000
--- a/docs_user/assemblies/assembly_migrating-ceph-rbd.adoc
+++ /dev/null
@@ -1,28 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="migrating-ceph-rbd_{context}"]
-
-= Migrating Red Hat Ceph Storage RBD to external RHEL nodes
-
-:context: migrating-ceph-rbd
-
-[role="_abstract"]
-For Hyperconverged Infrastructure (HCI) or dedicated Storage nodes that are
-running {Ceph} {CephVernum} or later, migrate the daemons from the {rhos_prev_long} control plane into the existing external Red Hat Enterprise Linux (RHEL) nodes.
-
-The external RHEL nodes typically include the Compute nodes for an HCI environment or dedicated storage nodes.
-
-== Prerequisites
-Before you begin the migration, complete the tasks in your {rhos_prev_long} {rhos_prev_ver} environment. For more information, see the "{Ceph} prerequisites" in the "Adoption overview" chapter.
-
-include::../modules/proc_migrating-mgr-from-controller-nodes.adoc[leveloffset=+1]
-
-include::assembly_migrating-mon-from-controller-nodes.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* xref:red-hat-ceph-storage-prerequisites_configuring-network[{Ceph} prerequisites]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_migrating-ceph-rgw.adoc b/docs_user/assemblies/assembly_migrating-ceph-rgw.adoc
deleted file mode 100644
index 8c469184c..000000000
--- a/docs_user/assemblies/assembly_migrating-ceph-rgw.adoc
+++ /dev/null
@@ -1,30 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="migrating-ceph-rgw_{context}"]
-
-:context: migrating-ceph-rgw
-
-= Migrating {Ceph} RGW to external RHEL nodes
-
-[role="_abstract"]
-For Hyperconverged Infrastructure (HCI) or dedicated Storage nodes, migrate the Ceph Object Gateway (RGW) daemons from the {rhos_prev_long} Controller nodes into the existing external Red Hat Enterprise Linux (RHEL) nodes.
-
-The RHEL nodes include the Compute nodes for an HCI environment or {Ceph} nodes. Your environment must have {Ceph} {CephVernum} or later and be managed by `cephadm` or Ceph Orchestrator.
-
-== Prerequisites
-
-Before you begin the migration, complete the tasks in your {rhos_prev_long} {rhos_prev_ver} environment. For more information, see the "{Ceph} prerequisites" in the "Adoption overview" chapter.
-
-include::../modules/proc_migrating-the-rgw-backends.adoc[leveloffset=+1]
-
-include::../modules/proc_deploying-a-ceph-ingress-daemon.adoc[leveloffset=+1]
-
-include::../modules/proc_updating-the-object-storage-endpoints.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* xref:red-hat-ceph-storage-prerequisites_configuring-network[{Ceph} prerequisites]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_migrating-databases-to-the-control-plane.adoc b/docs_user/assemblies/assembly_migrating-databases-to-the-control-plane.adoc
deleted file mode 100644
index 7442298b5..000000000
--- a/docs_user/assemblies/assembly_migrating-databases-to-the-control-plane.adoc
+++ /dev/null
@@ -1,26 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="migrating-databases-to-the-control-plane_{context}"]
-
-:context: migrating-databases
-
-= Migrating databases to the control plane
-
-[role="_abstract"]
-To begin creating the control plane, enable back-end services and import the databases from your original {rhos_prev_long} {rhos_prev_ver} deployment.
-
-include::../modules/proc_retrieving-topology-specific-service-configuration.adoc[leveloffset=+1]
-
-include::../modules/proc_deploying-backend-services.adoc[leveloffset=+1]
-
-include::../modules/proc_configuring-a-ceph-backend.adoc[leveloffset=+1]
-
-include::../modules/proc_stopping-openstack-services.adoc[leveloffset=+1]
-
-include::../modules/proc_migrating-databases-to-mariadb-instances.adoc[leveloffset=+1]
-
-include::../modules/proc_migrating-ovn-data.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_migrating-mon-from-controller-nodes.adoc b/docs_user/assemblies/assembly_migrating-mon-from-controller-nodes.adoc
deleted file mode 100644
index d63c4962c..000000000
--- a/docs_user/assemblies/assembly_migrating-mon-from-controller-nodes.adoc
+++ /dev/null
@@ -1,38 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="migrating-mon-from-controller-nodes_{context}"]
-
-= Migrating Ceph Monitor daemons to {Ceph} nodes
-
-:context: migrating-ceph-mon
-
-[role="_abstract"]
-Move Ceph Monitor daemons from the {rhos_prev_long} ({OpenStackShort}) Controller nodes to a set of existing {Ceph} nodes, or to a set of {OpenStackShort} Compute nodes if {Ceph} is deployed by {OpenStackPreviousInstaller} with a Hyperconverged Infrastructure (HCI) topology.
-
-Additional Ceph Monitors are deployed to the target nodes and promoted as _admin nodes to manage the {CephCluster} cluster and perform day 2 operations.
-
-To migrate the Ceph Monitor daemons, you must perform the following high-level steps:
-
-. Configure the target nodes for Ceph Monitor migration.
-. Drain the source node
-. Migrate your Ceph Monitor IP addresses to the target nodes
-. Redeploy the Ceph Monitor on the target node
-. Verify that the {Cephcluster} cluster is healthy
-
-Repeat these steps for any additional Controller node that hosts a Ceph Monitor until you migrate all the Ceph Monitor daemons to the target nodes.
-
-
-include::../modules/proc_migrating-mon-from-controller-nodes-config-target-nodes.adoc[leveloffset=+1]
-
-include::../modules/proc_migrating-mon-from-controller-nodes-drain-host.adoc[leveloffset=+1]
-
-include::../modules/proc_migrating-mon-from-controller-nodes-network.adoc[leveloffset=+1]
-
-include::../modules/proc_migrating-mon-from-controller-nodes-redeploy-mon.adoc[leveloffset=+1]
-
-include::../modules/proc_migrating-mon-from-controller-nodes-verification.adoc[leveloffset=+1]
-
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_migrating-monitoring-stack-to-target-nodes.adoc b/docs_user/assemblies/assembly_migrating-monitoring-stack-to-target-nodes.adoc
deleted file mode 100644
index 8ac73a4b2..000000000
--- a/docs_user/assemblies/assembly_migrating-monitoring-stack-to-target-nodes.adoc
+++ /dev/null
@@ -1,25 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="migrating-monitoring-stack-to-target-nodes_{context}"]
-
-:context: migrating-monitoring-stack
-
-= Migrating the monitoring stack to the target nodes
-
-[role="_abstract"]
-To migrate the monitoring stack to the target nodes, you add the monitoring label to your existing nodes and update the configuration of each daemon. You do not need to migrate node exporters. These daemons are deployed across
-the nodes that are part of the {Ceph} cluster (the placement is ‘*’).
-
-[NOTE]
-Depending on the target nodes and the number of deployed or active daemons, you can either relocate the existing containers to the target nodes, or
-select a subset of nodes that host the monitoring stack daemons. High availability (HA) is not supported. Reducing the placement with `count: 1` allows you to migrate the existing daemons in a Hyperconverged Infrastructure, or hardware-limited, scenario without impacting other services.
-
-include::../modules/proc_migrating-existing-daemons-to-target-nodes.adoc[leveloffset=+1]
-
-ifeval::["{build}" != "downstream"]
-include::../modules/proc_relocating-one-instance-of-a-monitoring-stack-to-migrate-daemons-to-target-nodes.adoc[leveloffset=+1]
-endif::[]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_migrating-the-object-storage-service.adoc b/docs_user/assemblies/assembly_migrating-the-object-storage-service.adoc
deleted file mode 100644
index 6fbf3c3bc..000000000
--- a/docs_user/assemblies/assembly_migrating-the-object-storage-service.adoc
+++ /dev/null
@@ -1,39 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="migrating-the-object-storage-service_{context}"]
-
-:context: migrate-object-storage-service
-
-= Migrating the {object_storage} to {rhos_long_noacro} nodes
-
-[role="_abstract"]
-If you are using the {rhos_prev_long} {object_storage_first_ref} as an Object Storage service, you must migrate your Object Storage service to {rhos_long} nodes.
-
-If you are using the Object Storage API of the Ceph Object Gateway (RGW), you can skip this chapter and migrate your Red Hat Ceph Storage cluster. For more information, see "Migrating the {Ceph} cluster". If you are not planning to migrate Ceph daemons from Controller nodes, you must perform the steps that are described in "Deploying a Ceph ingress daemon" and "Create or update the Object Storage service endpoints".
-
-You have two options for handling the existing {object_storage} storage nodes:
-
-* *Migrate data to new {rhos_acro} nodes* : Provision new storage nodes on {rhocp_long} and gradually move data by using the `swift-ring-tool`.
-* *Convert existing nodes to data plane nodes*: Keep the data on the same nodes and convert them to data plane nodes that are managed by the data plane operator.
-
-The data migration happens replica by replica. For example, if you have 3 replicas, move them one at a time to ensure that the other 2 replicas are still operational, which enables you to continue to use the {object_storage} during the migration.
-
-[NOTE]
-Data migration to the new deployment is a long-running process that executes mostly in the background. The {object_storage} replicators move data from old to new nodes, which might take a long time depending on the amount of storage used. To reduce downtime, you can use the old nodes if they are running and continue with adopting other services while waiting for the migration to complete. Performance might be degraded due to the amount of replication traffic in the network.
-
-
-include::../modules/proc_migrating-object-storage-data-to-rhoso-nodes.adoc[leveloffset=+1]
-
-include::../modules/con_troubleshooting-object-storage-migration.adoc[leveloffset=+1]
-
-include::../modules/proc_converting-object-storage-nodes.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* xref:ceph-migration_adopt-control-plane[Migrating the {Ceph} cluster]
-* xref:deploying-a-ceph-ingress-daemon_migrating-ceph-rgw[Deploying a Ceph ingress daemon]
-* xref:updating-the-object-storage-endpoints_migrating-ceph-rgw[Create or update the Object Storage service endpoints]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_planning-your-ipam-configuration.adoc b/docs_user/assemblies/assembly_planning-your-ipam-configuration.adoc
deleted file mode 100644
index 63cc99f70..000000000
--- a/docs_user/assemblies/assembly_planning-your-ipam-configuration.adoc
+++ /dev/null
@@ -1,61 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="planning-your-ipam-configuration_{context}"]
-
-:context: ipam-configuration
-
-= Planning your IPAM configuration
-
-[role="_abstract"]
-In a {rhos_long} deployment, each service that is deployed on the {rhocp_long}
-worker nodes requires an IP address from the IP Address Management (IPAM) pool.
-In a {rhos_prev_long} ({OpenStackShort}) deployment, all services that are
-hosted on a Controller node share the same IP address.
-
-The {rhos_acro} control plane has different requirements for the number of IP
-addresses that are made available for services. Depending on the size of the IP
-ranges that are used in the existing {rhos_acro} deployment, you might reuse
-these ranges for the {rhos_acro} control plane.
-
-The total number of IP addresses that are required for the new control plane services in each isolated network is calculated as the sum of the following:
-
-* The number of {OpenShiftShort} worker nodes. Each worker node requires 1 IP address in the `NodeNetworkConfigurationPolicy` custom resource (CR).
-* The number of IP addresses required for the data plane nodes. Each node requires an IP address from the `NetConfig` CRs.
-* The number of IP addresses required for control plane services. Each service requires an IP address from the `NetworkAttachmentDefinition` CRs. This number depends on the number of replicas for each service.
-* The number of IP addresses required for load balancer IP addresses. Each service requires a Virtual IP address from the `IPAddressPool` CRs.
-
-For example, a simple single worker node {OpenShiftShort} deployment
-with Red Hat OpenShift Local has the following IP ranges defined for the `internalapi` network:
-
-* 1 IP address for the single worker node
-* 1 IP address for the data plane node
-* `NetworkAttachmentDefinition` CRs for control plane services:
- `X.X.X.30-X.X.X.70` (41 addresses)
-* `IPAllocationPool` CRs for load balancer IPs: `X.X.X.80-X.X.X.90` (11
- addresses)
-
-This example shows a total of 54 IP addresses allocated to the `internalapi`
-allocation pools.
-
-// TODO: update the numbers above for a more realistic multinode cluster.
-
-The requirements might differ depending on the list of {OpenStackShort} services
-to be deployed, their replica numbers, and the number of {OpenShiftShort} worker nodes and data plane nodes.
-
-Additional IP addresses might be required in future {OpenStackShort} releases, so you must plan for some extra capacity for each of the allocation pools that are used in the new environment.
-
-After you determine the required IP pool size for the new deployment, you can choose to define new IP address ranges or reuse your existing IP address ranges. Regardless of the scenario, the VLAN tags in the existing deployment are reused in the new deployment. Ensure that the VLAN tags are properly retained in the new configuration.
-
-ifeval::["{build_variant}" != "ospdo"]
-include::../modules/proc_using-new-subnet-ranges.adoc[leveloffset=+1]
-endif::[]
-
-include::../modules/proc_reusing-existing-subnet-ranges.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* xref:configuring-isolated-networks_configuring-network[Configuring isolated networks]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_post-adoption-tasks.adoc b/docs_user/assemblies/assembly_post-adoption-tasks.adoc
deleted file mode 100644
index d67227fe5..000000000
--- a/docs_user/assemblies/assembly_post-adoption-tasks.adoc
+++ /dev/null
@@ -1,27 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-[id="post-adoption-tasks_{context}"]
-
-= Post-adoption tasks
-
-:context: post-adoption
-
-[role="_abstract"]
-Perform the following post-adoption tasks to ensure that your {rhos_long} environment is functioning optimally.
-
-* After adoption, {rhos_acro} data plane nodes run Red Hat Enterprise Linux (RHEL) 9.2. The data plane nodes can remain on RHEL 9.2; however, you must perform a system update to use the full feature set from the release, and to align your environment with the maximum support lifecycle of {rhos_acro}.
-** You can perform a system update any time after you complete the adoption procedure.
-** You can defer the system update to a separate maintenance window.
-** You can perform the system update on one node set at a time. For example, you can update one node set from RHEL 9.2 to RHEL 9.4 or 9.6 in one maintenance window, and then update a different node set in another maintenance window later.
-* If you enabled the high availability for Compute instances (Instance HA) service, remove the Pacemaker components from your Compute nodes.
-* Enable TLS Everywhere (TLS-e).
-* Verify that you migrated all services from the Controller nodes, and then power off the nodes. If any services are still running in the Controller nodes, such as Open Virtual Networking (ML2/OVN), {object_storage_first_ref}, or {Ceph}, do not power off the nodes.
-* Optional: Run tempest to verify that the entire adoption process is working correctly.
-
-[role="_additional-resources"]
-.Additional resources
-* link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/updating_your_environment_to_the_latest_maintenance_release/index[Updating your environment to the latest maintenance release]
-* xref:enabling-high-availability-for-instances_data-plane[Enabling the high availability for Compute instances service]
-* link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html-single/configuring_security_services/index#assembly_enabling-TLS-on-a-deployed-RHOSO-environment[Enabling TLS on a deployed RHOSO environment]
-* link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/validating_and_troubleshooting_the_deployed_cloud/index[Validating and troubleshooting the deployed cloud]
-
-include::../modules/proc_updating-shiftstack-credentials.adoc[leveloffset=+1]
diff --git a/docs_user/assemblies/assembly_prepare-director-operator-and-rhoso-for-adoption-process.adoc b/docs_user/assemblies/assembly_prepare-director-operator-and-rhoso-for-adoption-process.adoc
deleted file mode 100644
index a37c1c036..000000000
--- a/docs_user/assemblies/assembly_prepare-director-operator-and-rhoso-for-adoption-process.adoc
+++ /dev/null
@@ -1,18 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="prepare-director-operator-and-rhoso-for-adoption-process_{context}"]
-
-:context: prepare-director-operator
-
-= Preparing director Operator for adoption
-
-[role="_abstract"]
-You must prepare your existing director Operator environment and the {rhos_long} environment for adoption.
-
-include::../modules/proc_preparing-controller-nodes-for-director-operator-adoption.adoc[leveloffset=+1]
-
-include::../modules/proc_preparing-RHOSO-for-director-operator-adoption.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_preparing-an-instance-HA-deployment-for-adoption.adoc b/docs_user/assemblies/assembly_preparing-an-instance-HA-deployment-for-adoption.adoc
deleted file mode 100644
index bb10d19e2..000000000
--- a/docs_user/assemblies/assembly_preparing-an-instance-HA-deployment-for-adoption.adoc
+++ /dev/null
@@ -1,21 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="preparing-an-instance-HA-deployment-for-adoption_{context}"]
-
-:context: preparing-instance-HA
-
-= Preparing an Instance HA deployment for adoption
-
-[role="_abstract"]
-To enable the high availability for Compute instances (Instance HA) service after you adopt the {rhos_long_noacro} ({rhos_acro}) {rhos_curr_ver} data plane, perform the following preparation tasks:
-
-* Create a fencing configuration file to use after you adopt the {rhos_acro} data plane.
-* Prevent Pacemaker from monitoring or recovering the Compute nodes.
-
-include::../modules/proc_maintaining-the-instance-ha-functionality-after-adoption.adoc[leveloffset=+1]
-
-include::../modules/proc_preventing-pacemaker-from-monitoring-compute-nodes.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_preparing-the-block-storage-service-for-adoption.adoc b/docs_user/assemblies/assembly_preparing-the-block-storage-service-for-adoption.adoc
deleted file mode 100644
index ca575b0b6..000000000
--- a/docs_user/assemblies/assembly_preparing-the-block-storage-service-for-adoption.adoc
+++ /dev/null
@@ -1,55 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="preparing-the-block-storage-service_{context}"]
-//kgilliga: The content in this file was integrated with "Block storage requirements" (con_block-storage-service-requirements.adoc)
-:context: preparing-block-storage
-
-= Preparing the {block_storage} configurations for adoption
-
-[role="_abstract"]
-The recommended way to deploy {block_storage} volume back ends is to use a {block_storage} volume service for each back end.
-
-For example, you have an LVM and a Ceph back end and two entries in `cinderVolume`, and you cannot set global defaults for all volume services. You must define a service for each of them:
-
-[source,yaml]
-----
-apiVersion: core.openstack.org/v1beta1
-kind: OpenStackControlPlane
-metadata:
- name: openstack
-spec:
- cinder:
- enabled: true
- template:
- cinderVolume:
- lvm:
- customServiceConfig: |
- [DEFAULT]
- debug = True
- [lvm]
-< . . . >
- ceph:
- customServiceConfig: |
- [DEFAULT]
- debug = True
- [ceph]
-< . . . >
-----
-+
-[WARNING]
-Check that all configuration options are still valid for the new {rhos_long} version. Configuration options might be deprecated, removed, or added. This applies to both back-end driver-specific configuration options and other generic options.
-
-ifeval::["{build}" != "downstream"]
-There are two ways to prepare a {block_storage} configuration for adoption. You can customize the configuration or prepare a quick configuration. There is no difference in how {block_storage} operates with both methods, but you should customize the configuration whenever possible.
-endif::[]
-
-
-ifeval::["{build}" != "downstream"]
-include::../modules/proc_preparing-block-storage-service-by-using-agnostic-config-file.adoc[leveloffset=+1]
-
-include::../modules/con_block-storage-service-config-generation-helper-tool.adoc[leveloffset=+1]
-endif::[]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_red-hat-ceph-storage-prerequisites.adoc b/docs_user/assemblies/assembly_red-hat-ceph-storage-prerequisites.adoc
deleted file mode 100644
index 59e71a272..000000000
--- a/docs_user/assemblies/assembly_red-hat-ceph-storage-prerequisites.adoc
+++ /dev/null
@@ -1,37 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="red-hat-ceph-storage-prerequisites_{context}"]
-
-:context: ceph-prerequisites
-
-= {Ceph} prerequisites
-
-[role="_abstract"]
-Before you migrate your {Ceph} cluster daemons from your Controller nodes, you must complete the following tasks in your {rhos_prev_long} {rhos_prev_ver} environment to prepare for the {rhos_long} adoption.
-
-* Upgrade your {Ceph} cluster to release {CephVernum}. For more information, see "Upgrading Red Hat Ceph Storage 6 to 7" in _Framework for upgrades (16.2 to 17.1)_.
-* Your {Ceph} {CephVernum} deployment is managed by `cephadm`.
-* The undercloud is still available, and the nodes and networks are managed by {OpenStackPreviousInstaller}.
-* If you use an externally deployed {Ceph} cluster, you must recreate a `ceph-nfs` cluster in the target nodes as well as propogate the `StorageNFS` network.
-* Complete the prerequisites for your specific {Ceph} environment:
-** {Ceph} with monitoring stack components
-** {Ceph} RGW
-** {Ceph} RBD
-** NFS Ganesha
-
-
-include::../modules/proc_completing-prerequisites-for-migrating-ceph-monitoring-stack.adoc[leveloffset=+1]
-
-include::../modules/proc_completing-prerequisites-for-migrating-ceph-rgw.adoc[leveloffset=+1]
-
-include::../modules/con_completing-prerequisites-for-migrating-ceph-rbd.adoc[leveloffset=+1]
-
-include::../modules/proc_creating-a-ceph-nfs-cluster.adoc[leveloffset=+1]
-
-[role="_additional-resources"]
-== Additional resources
-* link:https://docs.redhat.com/en/documentation/red_hat_openstack_platform/17.1/html-single/framework_for_upgrades_16.2_to_17.1/index#assembly_ceph-6-to-7_upgrade_post-upgrade-external-ceph[Upgrading Red Hat Ceph Storage 6 to 7]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_rhoso-180-adoption-overview.adoc b/docs_user/assemblies/assembly_rhoso-180-adoption-overview.adoc
deleted file mode 100644
index cd34fab09..000000000
--- a/docs_user/assemblies/assembly_rhoso-180-adoption-overview.adoc
+++ /dev/null
@@ -1,52 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="rhoso-180-adoption-overview_{context}"]
-
-:context: planning
-
-= {rhos_long_noacro} {rhos_curr_ver} adoption overview
-
-[role="_abstract"]
-Adoption is the process of migrating a {rhos_prev_long} {rhos_prev_ver} control plane to {rhos_long_noacro} {rhos_curr_ver} and upgrading the data plane in-place. Retain existing infrastructure investments and modernize your {OpenStackShort} deployment on a containerized {rhocp_long} foundation.
-
-To understand the adoption process and to prepare your {OpenStackShort} environment, review the prerequisites, adoption process, and post-adoption tasks.
-
-[IMPORTANT]
-Read the whole adoption guide before you start
-the adoption to ensure that you understand the procedure. Prepare the necessary configuration snippets for each {OpenStackShort} service in advance, and test the migration in a representative test environment before you apply it to production.
-
-include::../modules/con_adoption-limitations.adoc[leveloffset=+1]
-
-//include::../modules/con_known-issues-adoption.adoc[leveloffset=+1]
-
-include::../modules/ref_adoption-prerequisites.adoc[leveloffset=+1]
-
-include::../modules/con_adoption-guidelines.adoc[leveloffset=+1]
-
-include::../modules/ref_adoption-process-overview.adoc[leveloffset=+1]
-
-include::../modules/ref_adoption-duration-and-impact.adoc[leveloffset=+1]
-
-include::../modules/con_dcn-adoption-overview.adoc[leveloffset=+1]
-
-include::../modules/proc_installing-the-systemd-container-package-on-compute-hosts.adoc[leveloffset=+1]
-
-include::../modules/con_identity-service-authentication.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_configuring-network-for-RHOSO-deployment.adoc[leveloffset=+1]
-
-include::../modules/con_adopting-spine-leaf-networks.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_storage-requirements.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_red-hat-ceph-storage-prerequisites.adoc[leveloffset=+1]
-
-include::../assemblies/assembly_preparing-an-instance-HA-deployment-for-adoption.adoc[leveloffset=+1]
-
-include::../modules/proc_comparing-configuration-files-between-deployments.adoc[leveloffset=+1]
-
-include::../modules/con_preventing-config-loss-when-using-oc-patch.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_storage-requirements.adoc b/docs_user/assemblies/assembly_storage-requirements.adoc
deleted file mode 100644
index 2145cca45..000000000
--- a/docs_user/assemblies/assembly_storage-requirements.adoc
+++ /dev/null
@@ -1,33 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="storage-requirements_{context}"]
-
-:context: storage-requirements
-
-= Storage requirements
-
-[role="_abstract"]
-Storage in a {rhos_prev_long} ({OpenStackShort}) deployment refers to the following types:
-
-* The storage that is needed for the service to run
-* The storage that the service manages
-
-Before you can deploy the services in {rhos_long}, you must review the storage requirements, plan your {rhocp_long} node selection, prepare your {OpenShiftShort} nodes, and so on.
-
-//*TODO: Galera, RabbitMQ, Swift, Glance, etc.*
-
-include::../modules/con_storage-driver-certification.adoc[leveloffset=+1]
-
-include::../modules/ref_block-storage-service-requirements.adoc[leveloffset=+1]
-
-include::../modules/con_block-storage-service-limitations.adoc[leveloffset=+1]
-
-include::../modules/ref_openshift-preparation-for-block-storage-adoption.adoc[leveloffset=+1]
-
-include::../modules/ref_preparing-block-storage-service-by-customizing-configuration.adoc[leveloffset=+1]
-
-include::../modules/con_changes-to-cephFS-via-NFS.adoc[leveloffset=+1]
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_troubleshooting-key-manager-hsm-adoption.adoc b/docs_user/assemblies/assembly_troubleshooting-key-manager-hsm-adoption.adoc
deleted file mode 100644
index 244f93f1d..000000000
--- a/docs_user/assemblies/assembly_troubleshooting-key-manager-hsm-adoption.adoc
+++ /dev/null
@@ -1,41 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="troubleshooting-key-manager-hsm-adoption_{context}"]
-
-= Troubleshooting Key Manager HSM adoption
-
-:context: troubleshooting-hsm
-
-[role="_abstract"]
-Review troubleshooting guidance for common issues that you might encounter while you perform the HSM-enabled Key Manager (Barbican) service adoption.
-
-If issues persist after following the troubleshooting guide:
-
-* Collect adoption logs and configuration for analysis.
-* Check the HSM vendor documentation for vendor-specific troubleshooting.
-* Verify HSM server status and connectivity independently.
-* Review the adoption summary report for additional diagnostic information.
-
-include::../modules/proc_resolving-config-validation-failures.adoc[leveloffset=+1]
-
-include::../modules/proc_resolving-missing-HSM-file-prerequisites.adoc[leveloffset=+1]
-
-include::../modules/proc_resolving-connectivity-issues.adoc[leveloffset=+1]
-
-include::../modules/proc_resolving-HSM-secret-creation-failures.adoc[leveloffset=+1]
-
-include::../modules/proc_resolving-custom-image-registry-issues.adoc[leveloffset=+1]
-
-include::../modules/proc_resolving-hsm-backend-detection-failures.adoc[leveloffset=+1]
-
-include::../modules/proc_resolving-database-migration-issues.adoc[leveloffset=+1]
-
-include::../modules/proc_resolving-service-startup-failures.adoc[leveloffset=+1]
-
-include::../modules/proc_resolving-performance-and-connectivity-issues.adoc[leveloffset=+1]
-
-
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/assemblies/assembly_troubleshooting-key-manager-proteccio-adoption.adoc b/docs_user/assemblies/assembly_troubleshooting-key-manager-proteccio-adoption.adoc
deleted file mode 100644
index 4d589bc89..000000000
--- a/docs_user/assemblies/assembly_troubleshooting-key-manager-proteccio-adoption.adoc
+++ /dev/null
@@ -1,23 +0,0 @@
-:_mod-docs-content-type: ASSEMBLY
-ifdef::context[:parent-context: {context}]
-
-[id="troubleshooting-key-manager-proteccio-adoption_{context}"]
-
-:context: troubleshooting-proteccio
-
-= Troubleshooting {key_manager} Proteccio HSM adoption
-
-[role="_abstract"]
-Use this reference to troubleshoot common issues that might occur during {key_manager_first_ref} adoption with Proteccio HSM integration. If Proteccio HSM issues persist, consult the Eviden Trustway documentation and ensure that HSM server configuration matches the client settings.
-
-include::../modules/proc_resolving-prerequisite-validation-failures.adoc[leveloffset=+1]
-include::../modules/proc_resolving-ssh-connection-failures.adoc[leveloffset=+1]
-include::../modules/proc_resolving-database-import-failures.adoc[leveloffset=+1]
-include::../modules/proc_resolving-custom-image-pull-failures.adoc[leveloffset=+1]
-include::../modules/proc_resolving-hsm-certificate-mounting-issues.adoc[leveloffset=+1]
-include::../modules/proc_resolving-service-startup-failures.adoc[leveloffset=+1]
-include::../modules/proc_resolving-adoption-verification-failures.adoc[leveloffset=+1]
-
-
-ifdef::parent-context[:context: {parent-context}]
-ifndef::parent-context[:!context:]
diff --git a/docs_user/images/.gitkeep b/docs_user/images/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/docs_user/main.adoc b/docs_user/main.adoc
deleted file mode 100644
index 409244f32..000000000
--- a/docs_user/main.adoc
+++ /dev/null
@@ -1,35 +0,0 @@
-= Adopting a Red Hat OpenStack Platform 17.1 deployment
-:toc: left
-:toclevels: 3
-:icons: font
-:compat-mode:
-:doctype: book
-:context: adoption-rhoso
-:sectnums:
-
-include::adoption-attributes.adoc[]
-
-
-include::assemblies/assembly_rhoso-180-adoption-overview.adoc[leveloffset=+1]
-
-ifeval::["{build_variant}" == "ospdo"]
-include::assemblies/assembly_prepare-director-operator-and-rhoso-for-adoption-process.adoc[leveloffset=+1]
-endif::[]
-
-include::modules/proc_migrating-tls-everywhere.adoc[leveloffset=+1]
-
-include::assemblies/assembly_migrating-databases-to-the-control-plane.adoc[leveloffset=+1]
-
-ifeval::["{build_variant}" == "ospdo"]
-include::modules/proc_ospdo-scale-down-pre-database-adoption.adoc[leveloffset=+1]
-endif::[]
-
-include::assemblies/assembly_adopting-openstack-control-plane-services.adoc[leveloffset=+1]
-
-include::assemblies/assembly_adopting-the-data-plane.adoc[leveloffset=+1]
-
-include::assemblies/assembly_migrating-the-object-storage-service.adoc[leveloffset=+1]
-
-include::assemblies/assembly_migrating-ceph-cluster.adoc[leveloffset=+1]
-
-include::assemblies/assembly_post-adoption-tasks.adoc[leveloffset=+1]
diff --git a/docs_user/modules/cinder-cfg.py b/docs_user/modules/cinder-cfg.py
deleted file mode 100644
index 2f7826ed9..000000000
--- a/docs_user/modules/cinder-cfg.py
+++ /dev/null
@@ -1,801 +0,0 @@
-#!/usr/bin/env python
-# Helper tool for adoption of a Director deployed OpenStack.
-# Conde is anything but good, though it should be somewhat useful.
-# It helps create a draft patch file (cinder.patch) with the cinder
-# configuration.
-# It may also create a file (cinder-prereq.yaml) with manifests for secrets and
-# MachineConfigs depending on the provider cinder configuruation file.
-#
-import argparse
-import base64
-import collections
-import copy
-import logging
-import os
-
-import yaml
-
-
-LOG = logging
-PATCH_FILE = 'cinder.patch'
-PREREQ_FILE = 'cinder-prereq.yaml'
-VERSION_FILE = 'openstackversion.yaml'
-
-CINDER_TEMPLATE = """
-spec:
- cinder:
- enabled: true
- apiOverride:
- route: {}
- template:
- databaseInstance: openstack
- secret: osp-secret
- cinderAPI:
- replicas: 3
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: 172.17.0.80
- spec:
- type: LoadBalancer
- cinderScheduler:
- replicas: 1
- cinderBackup:
- networkAttachments:
- - storage
- replicas: 0
-"""
-
-EXTRAMOUNTS_CEPH = """
- extraMounts:
- - extraVol:
- - propagation:
- - CinderVolume
- - CinderBackup
- - Glance
- extraVolType: Ceph
- volumes:
- - name: ceph
- projected:
- sources:
- - secret:
- name: ceph-conf-files
- mounts:
- - name: ceph
- mountPath: "/etc/ceph"
- readOnly: true
-"""
-
-MACHINECONFIGS = {
- 'iscsid': '''apiVersion: machineconfiguration.openshift.io/v1
-kind: MachineConfig
-metadata:
- labels:
- machineconfiguration.openshift.io/role: master
- service: cinder
- name: 99-master-cinder-enable-iscsid
-spec:
- config:
- ignition:
- version: 3.2.0
- systemd:
- units:
- - enabled: true
- name: iscsid.service
-''',
-
- 'multipathd': '''apiVersion: machineconfiguration.openshift.io/v1
-kind: MachineConfig
-metadata:
- labels:
- machineconfiguration.openshift.io/role: worker
- service: cinder
- name: 99-master-cinder-enable-multipathd
-spec:
- config:
- ignition:
- version: 3.2.0
- storage:
- files:
- - path: /etc/multipath.conf
- overwrite: false
- # Mode must be decimal, this is 0600
- mode: 384
- user:
- name: root
- group:
- name: root
- contents:
- # Source can be a http, https, tftp, s3, gs, or data as per rfc2397
- # This is the rfc2397 text/plain string format
- source: data:,defaults%20%7B%0A%20%20user_friendly_names%20no%0A%20%20recheck_wwid%20yes%0A%20%20skip_kpartx%20yes%0A%20%20find_multipaths%20yes%0A%7D%0A%0Ablacklist%20%7B%0A%7D
- systemd:
- units:
- - enabled: true
- name: multipathd.service
-''',
-
- 'nvmeof': '''apiVersion: machineconfiguration.openshift.io/v1
-kind: MachineConfig
-metadata:
- labels:
- machineconfiguration.openshift.io/role: worker
- service: cinder
- name: 99-master-cinder-load-nvme-fabrics
-spec:
- config:
- ignition:
- version: 3.2.0
- storage:
- files:
- - path: /etc/modules-load.d/nvme_fabrics.conf
- overwrite: false
- # Mode must be decimal, this is 0644
- mode: 420
- user:
- name: root
- group:
- name: root
- contents:
- # Source can be a http, https, tftp, s3, gs, or data as per rfc2397
- # This is the rfc2397 text/plain string format
- source: data:,nvme-fabric
-'''
-}
-
-DRIVER_TO_IMAGE_NAME = {'PureISCSIDriver': 'pure',
- 'PureFCDriver': 'pure',
- 'PureNVMEDriver': 'pure',
- 'HPE3PARFCDriver': '3par',
- 'HPE3PARISCSIDriver': '3par',
- 'VNXDriver': 'dellemc',
- 'UnityDriver': 'dellemc',
- 'FJDXFCDriver': 'fujitsu',
- 'FJDXISCSIDriver': 'fujitsu'}
-
-# Image location and whether it's outdated or not
-IMAGES = {
- 'pure': ('registry.connect.redhat.com/purestorage/'
- 'openstack-cinder-volume-pure-rhosp-17-0', True),
- '3par': ('registry.connect.redhat.com/hpe3parcinder/'
- 'openstack-cinder-volume-hpe3parcinder17-0', True),
- 'dellemc': ('registry.connect.redhat.com/dellemc/',
- 'openstack-cinder-volume-dellemc-rhosp16', True),
- 'fujitsu': ('registry.connect.redhat.com/fujitsu/'
- 'rhosp15-fujitsu-cinder-volume-161', True),
-}
-
-
-def str_presenter(dumper, data):
- """Configures yaml for dumping multiline strings
-
- Ref: https://stackoverflow.com/questions/8640959/how-can-i-control-what-scalar-form-pyyaml-uses-for-my-data
- """
- if data.count('\n') > 0: # check for multiline string
- return dumper.represent_scalar('tag:yaml.org,2002:str',
- data, style='|')
- return dumper.represent_scalar('tag:yaml.org,2002:str', data)
-
-
-yaml.add_representer(str, str_presenter)
-yaml.representer.SafeRepresenter.add_representer(str, str_presenter)
-
-
-class CinderTransformer(object):
- # None means remove the whole section
- remove_config = {
- 'os_brick': None,
- 'coordination': None,
- 'oslo_messaging_rabbit': None,
- 'oslo_concurrency': None,
- 'database': ['connection'],
- 'oslo_messaging_notifications': None,
- 'keystone_authtoken': ['www_authenticate_uri',
- 'auth_url',
- 'memcached_servers',
- # This should have been set in a secret
- 'password',
- # We'll add this to Spec.ServiceUser
- 'username'],
-
- # "password" and "username" will probably not be like we want them
- # we usually want the cinder user to have access to the nova API
- 'service_user': None,
- 'barbican': None,
- 'DEFAULT': ['transport_url', 'api_paste_config', 'log_dir',
- 'glance_api_servers', 'state_path',
- 'image_conversion_dir', 'volumes_dir'],
- # "password" and "username" will probably not be like we want them
- # we usually want the cinder user to have access to the nova API
- 'nova': None,
- }
-
- def __init__(self, config_file, skip_machineconfig=False,
- only_backends=False, name=None):
- self.config_file = config_file
- self.do_machineconfig = not skip_machineconfig
- self.do_only_backends = only_backends
- self.name = name
-
- self._backends = None
- self.processed_data = None
- self._username = None
- self._secrets = {}
- self._machineconfigs = []
- self._extra_volumes = []
- self._custom_images = {}
-
- self.parse_config()
- self.sanity_checks()
-
- def parse_config(self):
- result_cfg = {}
-
- section_name = ''
- # Ignore anything that's out of a section at the beginning of the file
- section_options = 0
-
- for line in self.config_file:
- line = line.strip()
- # Remove comments
- if not line or line.startswith('#'):
- continue
- if line.startswith('[') and line.endswith(']'):
- section_name = line[1:-1]
- # Use setdefault in case section defined multiple times
- section_options = result_cfg.setdefault(
- section_name, collections.OrderedDict())
- continue
-
- try:
- name, value = line.split('=', 1)
- except ValueError:
- LOG.warning('Line %s is not a configuration option', line)
- continue
- name = name.strip()
- if not name:
- LOG.warning('Weird line is not a valid configuration option '
- 'skipping it', line)
- continue
-
- # Don't use a dict because we can have multiOpt options
- section_options.setdefault(name, []).append(value.strip())
-
- # Remove empty sections
- result = {key: value for key, value in result_cfg.items() if value}
- self.config = result
-
- def get(self, section, option=None, default=None):
- res = self.config.get(section, {})
- if option is None:
- return res
- return res.get(option, default)
-
- def remove(self, section, option=None, logmsg=False):
- if option is None:
- if logmsg:
- LOG.info('Removing section %s', section)
- self.config.pop(section, None)
- else:
- if logmsg:
- LOG.info('Removing option %s from section %s', option, section)
- self.config.get(section, {}).pop(option, None)
-
- @property
- def username(self):
- if not self._username:
- self._username = self.get('keystone_authtoken', 'username')
- return self._username
-
- def sanity_checks(self):
- if not self.username:
- LOG.warning('Missing keystone username, will use default\n')
-
- if self.get('barbican'):
- LOG.warning("Barbican is configured but it won't match the new "
- "deployment configuration, dropping it. Make sure "
- "you update the path file include the right "
- "configuration.")
-
- # TODO: Check ssh_hosts_key_file
- # TODO: netapp_copyoffload_tool_path
- # TODO: nfs_mount_point_base
- # TODO: disable_by_file_path
- # TODO: disable_by_file_paths
- # TODO: FC fc_fabric_ssh_cert_path
-
- policy_path = self.get('oslo_policy', 'policy_file')
- if policy_path:
- LOG.warning('Cinder is configured to use %s as policy file, '
- 'please ensure this file is available for the '
- 'podified cinder services using "extraMounts" or '
- 'remove the option.\n', policy_path)
-
- for section in self.backends + ['backend_defaults']:
- verify = self.get(section, 'driver_ssl_cert_verify')
- cert_path = self.get(section, 'driver_ssl_cert_path')
- if verify and cert_path:
- LOG.warning('Using certs in %s from %s, ensure certs are '
- 'available for the podified cinder services using '
- '"extraMounts" or remove the option.\n',
- section, cert_path)
-
- backends = self.get('DEFAULT', 'enabled_backends', [''])[-1].split(',')
- if not backends:
- LOG.warning('There are no backends configured, cinder volume will '
- 'not be configured.\n')
- else:
- valid_backends = self.backends
- if len(valid_backends) != len(backends):
- missing = ','.join(set(backends) - set(valid_backends))
- LOG.warning('Ignoring backends %s that are missing a '
- 'section.\n', missing)
-
- backends_custom_image = []
- outdated_images = []
- for backend in self.backends:
- image, outdated = self.get_image(self.get(backend))
- if image:
- backends_custom_image.append(backend)
- if outdated:
- outdated_images.append(backend)
-
- if backends_custom_image:
- LOG.warning('There are backends (%s) that requires a vendor '
- 'container image, existing OpenStackVersion CR needs '
- 'to be modified, please look at %s file for the '
- 'contents.\n',
- ', '.join(backends_custom_image), VERSION_FILE)
-
- if outdated_images:
- LOG.error('Images in %s for some backends (%s) are just '
- 'templates, as there is no certified image '
- 'available yet. THEY WILL NOT WORK\n',
- VERSION_FILE, ', '.join(outdated_images))
-
- if any('RBDDriver' == self.get_driver(b) for b in self.backends):
- LOG.warning('Deployment uses Ceph, so make sure the Ceph '
- 'credentials and configuration are present in '
- 'OpenShift as a secret and then use the extra '
- 'volumes to make them available in all the services '
- 'that would need them. A reference is included in '
- 'the .path file\n')
-
- if not self.do_only_backends:
- username = self.username
- nova_username = self.get('nova', 'username')
- if nova_username and nova_username != username:
- LOG.warning('You were using user %s to talk to Nova, but in '
- 'podified we prefer using the service keystone '
- 'username, in this case %s. Dropping that '
- 'configuration.\n', nova_username, username)
-
- if self.using_protocol('fc'):
- LOG.warning('Configuration is using FC, please ensure all your '
- 'OpenShift nodes have HBAs or use labels to ensure '
- 'that Volume and Backup services are scheduled on '
- 'nodes with HBAs.\n')
-
- if not self.do_machineconfig:
- protocols = []
- if self.using_protocol('iscsi'):
- protocols.append('is running iscsid')
- if self.using_protocol('nvme'):
- protocols.append('have loaded nvme fabrics kernel modules')
- if self.using_multipath():
- protocols.append('is running multipathd')
-
- if protocols:
- msg = ' and '.join(protocols)
- LOG.warning('Make sure your deployment %s (may require using '
- 'MachineConfig).\n', msg)
-
- def using_multipath(self):
- if self.get('backend_defaults', 'use_multipath_for_image_xfer'):
- return True
- for backend in self.backends:
- if self.get(backend, 'use_multipath_for_image_xfer'):
- return True
- return False
-
- def using_protocol(self, protocol):
- for backend in self.backends:
- method_name = f'uses_{protocol}'
- if getattr(self, method_name)(backend):
- return True
- return False
-
- def get_driver(self, input):
- if isinstance(input, str):
- input = self.get(input)
- driver = input.get('volume_driver', ['lvm.LVMVolumeDriver'])
- class_name = driver[-1].rsplit('.')[-1]
- return class_name
-
- def uses_fc(self, backend_name):
- class_name = self.get_driver(backend_name)
- if 'fc' in class_name.lower():
- return True
- if ('NetAppDriver' == class_name
- and 'fc' == self.get(backend_name,
- 'netapp_storage_protocol')[-1]):
- return True
- if (class_name in ('VNXDriver', 'UnityDriver')
- and 'FC' == self.get(backend_name, 'storage_protocol')[-1]):
- return True
- return False
-
- def uses_iscsi(self, backend_name):
- class_name = self.get_driver(backend_name)
- if 'iscsi' in class_name.lower():
- return True
- if ('NetAppDriver' == class_name
- and 'iscsi' == self.get(backend_name,
- 'netapp_storage_protocol')[-1]):
- return True
- if (class_name in ('VNXDriver', 'UnityDriver')
- and 'iSCSI' == self.get(backend_name, 'storage_protocol')[-1]):
- return True
-
- if ('LVMVolumeDrivers' == class_name
- and self.get(backend_name, 'target_protocol')[-1]
- in ('lioadm', 'tgtadm', 'iscsictl')):
- return True
- return False
-
- def uses_nvme(self, backend_name):
- class_name = self.get_driver(backend_name)
- if 'nvme' in class_name.lower():
- return True
- if ('NetAppDriver' == class_name
- and 'iscsi' == self.get(backend_name,
- 'netapp_storage_protocol')[-1]):
- return True
-
- if ('LVMVolumeDrivers' == class_name
- and 'nvme' in self.get(backend_name,
- 'target_protocol')[-1]):
- return True
- return False
-
- @property
- def processed(self):
- return bool(self.processed_data)
-
- def _process(self):
- self.username # Ensure we save the username
-
- # Remove sections and options defined in class's remove_config
- for section, options in list(self.remove_config.items()):
- for option in (options if options else [None]):
- self.remove(section, option)
-
- if self.do_machineconfig:
- if self.using_multipath():
- self._machineconfigs.append('multipathd')
- if self.using_protocol('iscsi'):
- self._machineconfigs.append('iscsid')
- if self.using_protocol('nvme'):
- self._machineconfigs.append('nvmeof')
-
- res = {}
- res.update(self.get_backup())
- res.update(self.get_volumes())
- res.update(self.get_scheduler())
- res.update(self.get_api())
- res.update(self.get_global())
- self.processed_data = res
-
- def get_image(self, config):
- class_name = self.get_driver(config)
- image_name = DRIVER_TO_IMAGE_NAME.get(class_name)
- if image_name:
- return IMAGES[image_name]
- return (None, None)
-
- def get_custom_images_manifest(self):
- template = {'apiVersion': 'core.openstack.org/v1beta1',
- 'kind': 'OpenStackVersion',
- 'metadata': {'name': 'openstack'},
- 'spec': { 'customContainerImages': {
- 'cinderVolumeImages': self._custom_images.copy()} } }
- return template
-
- def generate_patch(self):
- res = yaml.safe_load(CINDER_TEMPLATE)
- template = res['spec']['cinder']['template']
-
- if self.username:
- template['serviceUser'] = self.username[0]
-
- self.svc_cfg(template, 'global_defaults')
- self.svc_cfg(template['cinderAPI'], 'api')
- self.svc_cfg(template['cinderScheduler'], 'scheduler')
- if self.processed_data['backup']:
- self.svc_cfg(template['cinderBackup'], 'backup')
- template['cinderBackup']['replicas'] = 3
-
- vols = template.setdefault('cinderVolumes', {})
- # TODO: Uncomment once cinder-operator supports config for all volumes
- # self.svc_cfg(vols, 'volume_global')
- volumes = self.processed_data['volumes']
-
- if any('RBDDriver' == self.get_driver(v[k])
- for k, v in volumes.items()):
- res['spec'].update(yaml.load(EXTRAMOUNTS_CEPH,
- Loader=yaml.SafeLoader))
-
- for backend, config in volumes.items():
- # Names cannot use _ in the operator
- manifest_backend_name = backend.replace('_', '-')
- backend_data = vols[manifest_backend_name] = {
- 'networkAttachments': ['storage'],
- }
-
- # TODO:Remove once cinder-operator supports config for all volumes
- config.update(self.processed_data['volume_global'])
-
- config.setdefault('DEFAULT', {})['enabled_backends'] = [backend]
- self.svc_cfg(backend_data, 'volumes', backend)
-
- image = self.get_image(config[backend])[0]
- if image:
- self._custom_images[backend] = image
- return res
-
- def generate_manifest(self):
- # Generate Secrets
- template = {'apiVersion': 'v1',
- 'kind': 'Secret',
- 'metadata': {'name': None},
- 'data': {}}
- result = []
- for secret, files in self._secrets.items():
- new_secret = copy.deepcopy(template)
- new_secret['metadata']['name'] = secret
- for name, contents in files.items():
- LOG.debug('Encoding %s: %s\n', name, contents)
- contents = base64.b64encode(contents.encode()).decode()
- new_secret['data'][name] = contents
- result.append(new_secret)
-
- # Generate MachineConfig
- for name in self._machineconfigs:
- result.append(yaml.load(MACHINECONFIGS[name],
- Loader=yaml.SafeLoader))
- return result
-
- def write_manifest(self, output_file):
- if not self.processed:
- self._process()
- data = self.generate_manifest()
- manifest = ''
- for element in data:
- manifest += yaml.dump(element)
- manifest += '---\n'
- output_file.write(manifest)
- return bool(data)
-
- def write_version(self, filename):
- if not self._custom_images:
- return False
-
- version = self.get_custom_images_manifest()
- manifest = yaml.dump(version)
- with open(filename, 'wt') as f:
- f.write(manifest)
- return True
-
- def write_patch(self, output_file):
- if not self.processed:
- self._process()
- data = self.generate_patch()
- patch = yaml.dump(data)
- output_file.write(patch)
-
- @staticmethod
- def options_to_str(options):
- res = ''
- for key, values in options.items():
- for value in values:
- res += key + '=' + value + '\n'
- return res
-
- def merge_remove(self, remove_config):
- res = copy.deepcopy(self.remove_config)
- for key, value in remove_config.items():
- if key in res:
- res[key].extend(value)
- else:
- res[key] = value
- self.remove_config = res
-
- def _sensitive_info(self, data):
- for key in data:
- if 'password' in key:
- return True
- return False
-
- def svc_cfg(self, template, section, subsection=None):
- name = 'cinder-' + section
- data = self.processed_data[section]
- if data and subsection:
- name += '-' + subsection
- data = data[subsection]
- if not data:
- return
- res = ''
- secret_res = ''
- for key, values in data.items():
- new_section = f'[{key}]\n' + self.options_to_str(values)
- if self._sensitive_info(values):
- secret_res += new_section
- else:
- res += new_section
-
- if res:
- template['customServiceConfig'] = res
- if secret_res:
- secret_name = self.name + name
- self._secrets[secret_name] = {name: secret_res}
- template['customServiceConfigSecrets'] = [secret_name]
-
- @property
- def backends(self):
- if self._backends is None:
- value = self.get('DEFAULT', 'enabled_backends', [''])[-1]
- value = value.split(',')
- self._backends = [backend for backend in value
- if backend in self.config]
- return self._backends
-
- def get_global(self):
- res = {}
- if not self.do_only_backends:
- # Assume sections have been removed as they have been used
- res = {key: self.get(key) for key in self.config}
- return {'global_defaults': res}
- return {'global_defaults': res}
-
- def get_api(self):
- res = {}
- if not self.do_only_backends:
- # compute_api_class used by API and Volume services
- for key, value in list(self.get('DEFAULT').items()):
- if (key != 'compute_api_class'
- and (key.startswith('api_')
- or key.startswith('osapi_')
- or key.endswith('_api_class'))):
- res[key] = value
- self.remove('DEFAULT', key)
- if res:
- res = {'DEFAULT': res}
- return {'api': res}
-
- def get_scheduler(self):
- res = {}
- if not self.do_only_backends:
- for key, value in list(self.get('DEFAULT').items()):
- if key.startswith('scheduler_'):
- res[key] = value
- self.remove('DEFAULT', key)
- if res:
- res = {'DEFAULT': res}
- return {'scheduler': res}
-
- def get_volumes(self):
- backend_defaults = self.get('backend_defaults')
- defaults = {}
- fc_zm = {}
- volumes = {}
- if backend_defaults:
- self.remove('backend_defaults')
- defaults['backend_defaults'] = backend_defaults
-
- if self.get('DEFAULT', 'zoning_mode') == ['fabric']:
- fc_zm['DEFAULT'] = {'zoning_mode': ['fabric']}
- self.remove('DEFAULT', 'zoning_mode')
-
- zone_manager_cfg = self.get('fc-zone-manager')
- fc_zm['fc-zone-manager'] = zone_manager_cfg
- self.remove('fc-zone-manager')
-
- fc_sections = zone_manager_cfg['fc_fabric_names'][-1].split(',')
- fc_fabric_cfg = {section: self.config[section]
- for section in fc_sections
- if section in self.config}
- fc_zm.update(fc_fabric_cfg)
- for section in fc_sections:
- self.remove(section)
-
- volumes = {backend: {backend: self.config[backend]}
- for backend in self.backends}
- if fc_zm:
- for backend in volumes:
- if self.uses_fc(backend):
- volumes[backend].update(fc_zm)
-
- self.remove('DEFAULT', 'enabled_backends')
- if volumes:
- for volume in volumes:
- self.remove(volume)
- return {'volume_global': defaults,
- 'volumes': volumes,
- 'fc_zonemgr': fc_zm}
-
- def get_backup(self):
- leave = ('backup_use_temp_snapshot', # Used by the volume service
- 'backup_use_same_host') # Used by the scheduler
- res = {}
- for key, value in list(self.get('DEFAULT').items()):
- if key.startswith('backup_') and key not in leave:
- res[key] = value
- self.remove('DEFAULT', key)
- if res:
- res = {'DEFAULT': res}
- return {'backup': res}
-
-
-WARNING_MSG = 'ALWAYS REVIEW RESULTS, OUTPUT IS JUST A ROUGH DRAFT!!\n'
-
-
-def arg_parser():
- parser = argparse.ArgumentParser(
- description=('Cinder Configuration Migration Helper: '
- 'From Director to Operator'),
- epilog=WARNING_MSG)
- parser.add_argument('-b', '--only-backends', action='store_true',
- help=('Only keep the volume and backup related '
- 'sections and drop everything else.'))
- parser.add_argument('-c', '--config',
- type=argparse.FileType('rt'), default='cinder.conf',
- help=('Cinder configuration to convert (defaults to '
- 'cinder.conf)'))
- parser.add_argument('-o', '--out-dir', default='.',
- help=('Directory to write the resulting patch and '
- 'manifest (defaults to current directory)'))
- parser.add_argument('-m', '--no-machineconfig', action='store_true',
- help=('Assume OpenShift has all storage related '
- 'services or kernel modules loaded so there is '
- 'no need to generate the MachineConfig objects '
- 'in the manifest'))
- parser.add_argument('-n', '--name', default='openstack',
- help=('Name of the OpenStackControlPlane object '
- 'deployed in OpenShift. Defaults to openstack'))
- parser.add_argument('-v', '--verbose', action='count', default=0,
- help=("Increase verbose level each time it's passed, "
- "-v=Info, -vv=Debug")),
- args = parser.parse_args()
- return args
-
-# TODO: Do the extra mounts for all file warnings
-# TODO: Support labels for Cinder services
-# TODO: Support changing IPs
-# TODO: Service user: Maybe don't just remove it? For director it is fine
-
-
-LOG_LEVELS = {0: logging.WARNING, 1: logging.INFO, 2: logging.DEBUG}
-
-
-if __name__ == '__main__':
- args = arg_parser()
- LOG.basicConfig(level=LOG_LEVELS[min(args.verbose, 2)])
- transformer = CinderTransformer(args.config, args.no_machineconfig,
- args.only_backends, args.name)
- file_names = ['cinder.patch']
- with open(os.path.join(args.out_dir, PATCH_FILE), 'wt') as f:
- transformer.write_patch(f)
- with open(os.path.join(args.out_dir, PREREQ_FILE), 'wt') as f:
- wrote_manifests = transformer.write_manifest(f)
- if wrote_manifests:
- file_names.append(PREREQ_FILE)
- else:
- os.remove(PREREQ_FILE)
- if transformer.write_version(os.path.join(args.out_dir, VERSION_FILE)):
- file_names.append(VERSION_FILE)
- LOG.warning(WARNING_MSG)
- print(f'Output written at {args.out_dir}: {", ".join(file_names)}')
diff --git a/docs_user/modules/con_adopting-spine-leaf-networks.adoc b/docs_user/modules/con_adopting-spine-leaf-networks.adoc
deleted file mode 100644
index dfbdbcfc2..000000000
--- a/docs_user/modules/con_adopting-spine-leaf-networks.adoc
+++ /dev/null
@@ -1,123 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="adopting-spine-leaf-networks_{context}"]
-
-= Configuring spine-leaf networks for the {rhos_long_noacro} deployment
-
-[role="_abstract"]
-When you adopt a {rhos_prev_long} ({OpenStackShort}) deployment with spine-leaf networking, such as a Distributed Compute Node (DCN) architecture, adopt each L2 network segment with a separate IP subnet and create routed provider networks.
-
-Traffic between sites is routed at L3 through spine routers or similar network infrastructure. You must configure routing for Compute nodes at edge sites to connect with control plane services, such as RabbitMQ or the database at the central site. The cloud will not function correctly without routes configured.
-
-[NOTE]
-====
-DHCP relay is not supported in adopted {rhos_long} environments with spine-leaf topologies. This affects bare-metal provisioning scenarios that use PXE boot.
-
-If you need to provision bare-metal nodes at edge sites, use Redfish virtual media or similar BMC virtual media features instead of PXE boot.
-====
-
-.Example routes required on DCN1 Compute nodes
-[options="header"]
-|===
-| Destination network | Next hop | Purpose
-| 172.17.0.0/24 | 172.17.10.1 | Route to central internalapi
-| 172.17.20.0/24 | 172.17.10.1 | Route to DCN2 internalapi
-| 172.18.0.0/24 | 172.18.10.1 | Route to central storage
-| 172.18.20.0/24 | 172.18.10.1 | Route to DCN2 storage
-|===
-
-You configure these routes in the `edpm_network_config_template` within the `OpenStackDataPlaneNodeSet` custom resource (CR) for each site.
-
-.Example network topology for a three-site DCN deployment
-[options="header"]
-|===
-| Network | Central site | DCN1 site | DCN2 site
-| Control plane | 192.168.122.0/24 | 192.168.133.0/24 | 192.168.144.0/24
-| Internal API | 172.17.0.0/24 | 172.17.10.0/24 | 172.17.20.0/24
-| Storage | 172.18.0.0/24 | 172.18.10.0/24 | 172.18.20.0/24
-| Tenant | 172.19.0.0/24 | 172.19.10.0/24 | 172.19.20.0/24
-|===
-
-When you adopt a spine-leaf deployment, you configure the `NetConfig` CR with multiple subnets for each service network. Each subnet represents a different site.
-
-.Example NetConfig with multiple subnets per network
-[source,yaml]
-----
-apiVersion: network.openstack.org/v1beta1
-kind: NetConfig
-metadata:
- name: netconfig
-spec:
- networks:
- - name: ctlplane
- dnsDomain: ctlplane.example.com
- subnets:
- - name: subnet1 # Central site
- allocationRanges:
- - end: 192.168.122.120
- start: 192.168.122.100
- cidr: 192.168.122.0/24
- gateway: 192.168.122.1
- - name: ctlplanedcn1 # DCN1 site
- allocationRanges:
- - end: 192.168.133.120
- start: 192.168.133.100
- cidr: 192.168.133.0/24
- gateway: 192.168.133.1
- - name: ctlplanedcn2 # DCN2 site
- allocationRanges:
- - end: 192.168.144.120
- start: 192.168.144.100
- cidr: 192.168.144.0/24
- gateway: 192.168.144.1
- - name: internalapi
- dnsDomain: internalapi.example.com
- subnets:
- - name: subnet1 # Central site
- allocationRanges:
- - end: 172.17.0.250
- start: 172.17.0.100
- cidr: 172.17.0.0/24
- vlan: 20
- - name: internalapidcn1 # DCN1 site
- allocationRanges:
- - end: 172.17.10.250
- start: 172.17.10.100
- cidr: 172.17.10.0/24
- vlan: 30
- - name: internalapidcn2 # DCN2 site
- allocationRanges:
- - end: 172.17.20.250
- start: 172.17.20.100
- cidr: 172.17.20.0/24
- vlan: 40
-----
-
-* Each network defines multiple subnets, one for each site.
-* Each site uses unique VLAN IDs. In this example, central uses VLANs 20-23, DCN1 uses VLANs 30-33, and DCN2 uses VLANs 40-43.
-* The subnet naming convention typically uses `subnet1` for the central site and site-specific names like `internalapidcn1` for edge sites.
-
-Because the sites are geopgraphically distributed, each site requires its own provider network (physnet). The {networking_first_ref} must be configured to recognize all physnets.
-
-.Example Neutron ML2 configuration for multiple physnets
-[source,yaml]
-----
-[ml2_type_vlan]
-network_vlan_ranges = leaf0:1:1000,leaf1:1:1000,leaf2:1:1000
-
-[neutron]
-physnets = leaf0,leaf1,leaf2
-----
-
-* `leaf0` corresponds to the central site.
-* `leaf1` corresponds to the DCN1 site.
-* `leaf2` corresponds to the DCN2 site.
-
-When you create routed provider networks in {rhos_acro}, you create network segments that map to these physnets:
-
-* Segment for central: `physnet=leaf0`, subnet=192.168.122.0/24
-* Segment for DCN1: `physnet=leaf1`, subnet=192.168.133.0/24
-* Segment for DCN2: `physnet=leaf2`, subnet=192.168.144.0/24
-
-[role="_additional-resources"]
-.Additional resources
-* xref:configuring-control-plane-networking-for-spine-leaf_hsm-integration[Configuring control plane networking for spine-leaf topologies]
diff --git a/docs_user/modules/con_adoption-guidelines.adoc b/docs_user/modules/con_adoption-guidelines.adoc
deleted file mode 100644
index 85f45bd4c..000000000
--- a/docs_user/modules/con_adoption-guidelines.adoc
+++ /dev/null
@@ -1,24 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="adoption-guidelines_{context}"]
-
-= Guidelines for planning the adoption
-
-[role="_abstract"]
-Adoption is similar in scope to a data center upgrade. Different firmware levels, hardware vendors, hardware profiles, networking interfaces, and storage interfaces can affect the adoption process and change behavior.
-
-Review the following guidelines to adequately plan for the adoption and increase the chance that you complete the adoption successfully:
-
-[IMPORTANT]
-All commands in the adoption documentation are examples. Do not copy and paste the commands without understanding what the commands do.
-
-* To minimize the risk of an adoption failure, reduce the number of environmental differences between the staging environment and the production sites.
-* If the staging environment is not representative of the production sites or if a staging environment is not available, you must plan to include contingency time in case the adoption fails.
-* Review your custom {rhos_prev_long} ({OpenStackShort}) service configuration at every major release.
-** Every major release upgrades through multiple OpenStack releases.
-** Each major release might deprecate configuration options or change the format of the configuration.
-* Prepare a Method of Procedure (MOP) that is specific to your environment to reduce the risk of variance or omitted steps when running the adoption process.
-* You can use representative hardware in a staging environment to prepare a MOP and validate any content changes.
-** Include a cross-section of firmware versions, additional interface or device hardware, and any additional software in the representative staging environment to ensure that it is broadly representative of the variety that is present in the production environments.
-** Ensure that you validate any Red Hat Enterprise Linux update or upgrade in the representative staging environment.
-* Use Satellite for localized and version-pinned RPM content where your data plane nodes are located.
-* In the production environment, use the content that you tested in the staging environment.
diff --git a/docs_user/modules/con_adoption-limitations.adoc b/docs_user/modules/con_adoption-limitations.adoc
deleted file mode 100644
index c96923c8e..000000000
--- a/docs_user/modules/con_adoption-limitations.adoc
+++ /dev/null
@@ -1,38 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="adoption-limitations_{context}"]
-
-= Adoption limitations
-
-[role="_abstract"]
-Before you proceed with the adoption, check which features are Technology Previews or unsupported.
-
-Technology Preview::
-+
-The following features are Technology Previews and have not been tested within the context of the {rhos_long} adoption:
-+
-* {key_manager_first_ref} adoption with Proteccio hardware security module (HSM) integration
-* {dns_first_ref}
-
-{compute_service} Technology Previews::
-+
-The following {compute_service_first_ref} features are Technology Previews:
-+
-* NUMA-aware vswitches
-* PCI passthrough by flavor
-* SR-IOV trusted virtual functions
-* vGPU
-* Emulated virtual Trusted Platform Module (vTPM)
-* UEFI
-* AMD SEV
-* Direct download from Rados Block Device (RBD)
-* File-backed memory
-* Defining a custom inventory of resources in a YAML file, `provider.yaml`
-
-Unsupported features::
-+
-The adoption process does not support the following features:
-+
-* Adopting Border Gateway Protocol (BGP) environments to the {rhos_acro} data plane
-* Adopting a Federal Information Processing Standards (FIPS) environment
-
-//* When you adopt a {OpenStackShort} {rhos_prev_ver} FIPS environment to {rhos_acro} {rhos_curr_ver}, your adopted cluster remains a FIPS cluster. There is no option to change the FIPS status during adoption. If your cluster is FIPS-enabled, you must deploy a FIPS {rhocp_long} cluster to adopt your {OpenStackShort} {rhos_prev_ver} FIPS control plane. For more information about enabling FIPS in {OpenShiftShort}, see link:{defaultOCPURL}/installing/installation-overview#installing-fips[Support for FIPS cryptography] in the {OpenShiftShort} _Installing_ guide.
diff --git a/docs_user/modules/con_bare-metal-provisioning-service-configurations.adoc b/docs_user/modules/con_bare-metal-provisioning-service-configurations.adoc
deleted file mode 100644
index da5c228ee..000000000
--- a/docs_user/modules/con_bare-metal-provisioning-service-configurations.adoc
+++ /dev/null
@@ -1,44 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="con_bare-metal-provisioning-service-configurations_{context}"]
-
-= {bare_metal} configurations
-
-[role="_abstract"]
-You configure the {bare_metal_first_ref} by using configuration snippets.
-
-Some {bare_metal} configuration is overridden in {OpenStackPreviousInstaller}, for example, PXE Loader file names are often overridden at intermediate layers. You must pay attention to the settings you apply in your {rhos_long} deployment. The `ironic-operator` applies a reasonable working default configuration, but if you override them with your prior configuration, your experience might not be ideal or your new {bare_metal} fails to operate. Similarly, additional configuration might be necessary, for example, if you enable and use additional hardware types in your `ironic.conf` file.
-
-The model of reasonable defaults includes commonly used hardware-types and driver interfaces. For example, the `redfish-virtual-media` boot interface and the `ramdisk` deploy interface are enabled by default. If you add new bare metal nodes after the adoption is complete, the driver interface selection occurs based on the order of precedence in the configuration if you do not explicitly set it on the node creation request or as an established default in the `ironic.conf` file.
-
-Some configuration parameters do not need to be set on an individual node level, for example, network UUID values, or they are centrally configured in the `ironic.conf` file, as the setting controls security behavior.
-
-It is critical that you maintain the following parameters that you configured and formatted as `[section]` and parameter name from the prior deployment to the new deployment. These parameters that govern the underlying behavior and values in the previous configuration would have used specific values if set.
-
-* [neutron]cleaning_network
-* [neutron]provisioning_network
-* [neutron]rescuing_network
-* [neutron]inspection_network
-* [conductor]automated_clean
-* [deploy]erase_devices_priority
-* [deploy]erase_devices_metadata_priority
-* [conductor]force_power_state_during_sync
-
-You can set the following parameters individually on a node. However, you might choose to use embedded configuration options to avoid the need to set the parameters individually when creating or managing bare metal nodes. Check your prior `ironic.conf` file for these parameters, and if set, apply a specific override configuration.
-
-* [conductor]bootloader
-* [conductor]rescue_ramdisk
-* [conductor]rescue_kernel
-* [conductor]deploy_kernel
-* [conductor]deploy_ramdisk
-
-The instances of `kernel_append_params`, formerly `pxe_append_params` in the `[pxe]` and `[redfish]` configuration sections, are used to apply boot time options like "console" for the deployment ramdisk and as such often must be changed.
-
-// TODO:
-// Conductor Groups?!
-
-[WARNING]
-You cannot migrate hardware types that are set with the `ironic.conf` file `enabled_hardware_types` parameter, and hardware type driver interfaces starting with `staging-` into the adopted configuration.
-
-[role="_additional-resources"]
-.Additional resources
-* link:{customizing-rhoso}/index[{customizing-rhoso-t}]
diff --git a/docs_user/modules/con_block-storage-service-config-generation-helper-tool.adoc b/docs_user/modules/con_block-storage-service-config-generation-helper-tool.adoc
deleted file mode 100644
index 4e585a17e..000000000
--- a/docs_user/modules/con_block-storage-service-config-generation-helper-tool.adoc
+++ /dev/null
@@ -1,103 +0,0 @@
-:_mod-docs-content-type: REFERENCE
-[id="block-storage-configuration-generation-helper-tool_{context}"]
-
-= About the {block_storage} configuration generation helper tool
-
-[role="_abstract"]
-Creating the right {block_storage_first_ref} configuration files to deploy by using Operators can
-sometimes be complex. There is a helper tool that can create a draft of the files from a `cinder.conf` file.
-
-This tool is not meant to be an automation tool. You can use the tool to get a general understanding of how to create the configuration files, or to point out some potential pitfalls and reminders.
-
-[IMPORTANT]
-The tool requires the `PyYAML` Python package to be installed (`pip
-install PyYAML`).
-
-This link:helpers/cinder-cfg.py[cinder-cfg.py script] defaults to reading the
-`cinder.conf` file from the current directory (unless `--config` option is used)
-and outputs files to the current directory (unless `--out-dir` option is used).
-
-In the output directory, you always get a `cinder.patch` file with the Cinder-
-specific configuration patch to apply to the `OpenStackControlPlane` custom resource, but you might also get an additional file called `cinder-prereq.yaml` with some
-`Secrets` and `MachineConfigs`, and an `openstackversion.yaml` file with the
-`OpenStackVersion` sample.
-
-Example of an invocation setting input and output explicitly to the defaults for
-a Ceph backend:
-
-----
-$ python cinder-cfg.py --config cinder.conf --out-dir ./
-WARNING:root:The {block_storage} is configured to use ['/etc/cinder/policy.yaml'] as policy file, please ensure this file is available for the control plane {block_storage} services using "extraMounts" or remove the option.
-
-WARNING:root:Deployment uses Ceph, so make sure the Ceph credentials and configuration are present in OpenShift as a secret and then use the extra volumes to make them available in all the services that would need them.
-
-WARNING:root:You were using user ['nova'] to talk to Nova, but in podified using the service keystone username is preferred in this case ['cinder']. Dropping that configuration.
-
-WARNING:root:ALWAYS REVIEW RESULTS, OUTPUT IS JUST A ROUGH DRAFT!!
-
-Output written at ./: cinder.patch
-----
-
-The script outputs some warnings to let you know that you might need to do some things
-manually, such as add the custom policy or provide the Ceph configuration files, and
-also let you know that the service_user was removed.
-
-A different example when using multiple backends, one of them being a 3PAR FC
-could be:
-
-----
-$ python cinder-cfg.py --config cinder.conf --out-dir ./
-WARNING:root:The {block_storage} is configured to use ['/etc/cinder/policy.yaml'] as policy file, please ensure this file is available for the control plane Block Storage services using "extraMounts" or remove the option.
-
-ERROR:root:Backend hpe_fc requires a vendor container image, but there is no certified image available yet. Patch will use the last known image for reference, but IT WILL NOT WORK
-
-WARNING:root:Deployment uses Ceph, so make sure the Ceph credentials and configuration are present in OpenShift as a secret and then use the extra volumes to make them available in all the services that would need them.
-
-WARNING:root:You were using user ['nova'] to talk to Nova, but in podified using the service keystone username is preferred, in this case ['cinder']. Dropping that configuration.
-
-WARNING:root:Configuration is using FC, please ensure all your OpenShift nodes have HBAs or use labels to ensure that Volume and Backup services are scheduled on nodes with HBAs.
-
-WARNING:root:ALWAYS REVIEW RESULTS, OUTPUT IS JUST A ROUGH DRAFT!!
-
-Output written at ./: cinder.patch, cinder-prereq.yaml
-----
-
-In this case there are additional messages. The following list provides an explanation of each one:
-
-* There is one message mentioning how this backend driver needs external vendor
-dependencies so the standard container image will not work. Unfortunately this
-image is still not available, so an older image is used in the output patch file
-for reference. You can then replace this image with one that you build or
-with a Red Hat official image once the image is available. In this case you can
-see in your `cinder.patch` file that has an `OpenStackVersion` object:
-+
-[source,yaml]
-----
-apiVersion: core.openstack.org/v1beta1
-kind: OpenStackVersion
-metadata:
- name: openstack
-spec:
- customContainerImages:
- cinderVolumeImages:
- hpe-fc:
- containerImage: registry.connect.redhat.com/hpe3parcinder/openstack-cinder-volume-hpe3parcinder17-0
-----
-+
-The name of the `OpenStackVersion` must match the name of your `OpenStackControlPlane`, so in your case it may be other than `openstack`.
-
-* The FC message reminds you that this transport protocol requires specific HBA
-cards to be present on the nodes where Block Storage services are running.
-* In this case it has created the `cinder-prereq.yaml` file and within the file
-there is one `MachineConfig` and one `Secret`. The `MachineConfig` is called `99-master-cinder-enable-multipathd` and like the name suggests enables multipathing on all the OCP worker nodes. The `Secret` is
-called `openstackcinder-volumes-hpe_fc` and contains the 3PAR backend
-configuration because it has sensitive information (credentials). The
-`cinder.patch` file uses the following configuration:
-+
-[source,yaml]
-----
- cinderVolumes:
- hpe-fc:
- customServiceConfigSecrets:
- - openstackcinder-volumes-hpe_fc
-----
diff --git a/docs_user/modules/con_block-storage-service-limitations.adoc b/docs_user/modules/con_block-storage-service-limitations.adoc
deleted file mode 100644
index a448549fc..000000000
--- a/docs_user/modules/con_block-storage-service-limitations.adoc
+++ /dev/null
@@ -1,11 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="block-storage-limitations_{context}"]
-
-= Limitations for adopting the {block_storage}
-
-[role="_abstract"]
-Before you begin the {block_storage_first_ref} adoption, review the following limitations:
-
-* There is no global `nodeSelector` option for all {block_storage} volumes. You must specify the `nodeSelector` for each back end.
-* There are no global `customServiceConfig` or `customServiceConfigSecrets` options for all {block_storage} volumes. You must specify these options for each back end.
-* Support for {block_storage} back ends that require kernel modules that are not included in Red Hat Enterprise Linux is not tested in {rhos_long}.
diff --git a/docs_user/modules/con_changes-to-cephFS-via-NFS.adoc b/docs_user/modules/con_changes-to-cephFS-via-NFS.adoc
deleted file mode 100644
index bafd8b2c0..000000000
--- a/docs_user/modules/con_changes-to-cephFS-via-NFS.adoc
+++ /dev/null
@@ -1,28 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="changes-to-cephFS-through-NFS_{context}"]
-
-= Changes to CephFS through NFS
-
-[role="_abstract"]
-Before you begin the adoption, review the following information to understand the changes to CephFS through NFS between {rhos_prev_long} ({OpenStackShort}) {rhos_prev_ver} and {rhos_long} {rhos_curr_ver}:
-
-* If the {OpenStackShort} {rhos_prev_ver} deployment uses CephFS through NFS as a back end for {rhos_component_storage_file_first_ref}, you cannot directly import the `ceph-nfs` service on the {OpenStackShort} Controller nodes into {rhos_acro} {rhos_curr_ver}. In {rhos_acro} {rhos_curr_ver}, the {rhos_component_storage_file} only supports using a clustered NFS service that is directly managed on the {Ceph} cluster. Adoption with the `ceph-nfs` service involves a data path disruption to existing NFS clients.
-
-* On {OpenStackShort} {rhos_prev_ver}, Pacemaker manages the high availability of the `ceph-nfs` service. This service is assigned a Virtual IP (VIP) address that is also managed by Pacemaker. The VIP is typically created on an isolated `StorageNFS` network. The Controller nodes have ordering and collocation constraints established between this VIP, `ceph-nfs`, and the {rhos_component_storage_file_first_ref} share manager service. Prior to adopting {rhos_component_storage_file}, you must adjust the Pacemaker ordering and collocation constraints to separate the share manager service. This establishes `ceph-nfs` with its VIP as an isolated, standalone NFS service that you can decommission after completing the {rhos_acro} adoption.
-
-* In {Ceph} {CephVernum}, a native clustered Ceph NFS service has to be deployed on the {Ceph} cluster by using the Ceph Orchestrator prior to adopting the {rhos_component_storage_file}. This NFS service eventually replaces the standalone NFS service from {OpenStackShort} {rhos_prev_ver} in your deployment. When the {rhos_component_storage_file} is adopted into the {rhos_acro} {rhos_curr_ver} environment, it establishes all the existing exports and client restrictions on the new clustered Ceph NFS service. Clients can continue to read and write data on existing NFS shares, and are not affected until the old standalone NFS service is decommissioned. After the service is decommissioned, you can re-mount the same share from the new clustered Ceph NFS service during a scheduled downtime.
-
-* To ensure that NFS users are not required to make any networking changes to their existing workloads, assign an IP address from the same isolated `StorageNFS` network to the clustered Ceph NFS service. NFS users only need to discover and re-mount their shares by using new export paths. When the adoption is complete, {rhos_acro} users can query the {rhos_component_storage_file} API to list the export locations on existing shares to identify the preferred paths to mount these shares. These preferred paths correspond to the new clustered Ceph NFS service in contrast to other non-preferred export paths that continue to be displayed until the old isolated, standalone NFS service is decommissioned.
-
-* When you migrate your workloads from the old NFS service, you must ensure that exports are not consumed from both the old NFS service and the new clustered Ceph NFS service at the same time. This simultaneous access to both services is considered dangerous and bypasses the protections for concurrent access that is ensured by the NFS protocol. When you migrate the workloads to use exports from the new NFS service, you must ensure that you migrate the use of each export entirely so that no part of the workload stays connected to the old NFS service.
-
-* You can no longer control the old Pacemaker-managed `ceph-nfs` service through the {rhos_prev_long} {OpenStackPreviousInstaller} after the control plane adoption is complete. This means that there is no support for updating the NFS Ganesha software, or changing any configuration. While data is protected from server crashes or restarts, high availability and data recovery is still limited, and these maintenance issues are no longer visible to {rhos_component_storage_file}.
-
-* Cloud administrators must ensure a reasonably short window to switch over all end-user workloads to the new NFS service.
-
-* While the old `ceph-nfs` service only supported NFS version 4.1 and later, the new clustered NFS service supports NFS protocols 3 and 4.1 and later. Mixing protocol versions with an export results in unintended consequences. You should mount a given share across all clients by using a consistent NFS protocol version.
-
-
-[role="_additional-resources"]
-.Additional resources
-* xref:creating-a-ceph-nfs-cluster_ceph-prerequisites[Creating an NFS Ganesha cluster]
diff --git a/docs_user/modules/con_completing-prerequisites-for-migrating-ceph-rbd.adoc b/docs_user/modules/con_completing-prerequisites-for-migrating-ceph-rbd.adoc
deleted file mode 100644
index 3939b735b..000000000
--- a/docs_user/modules/con_completing-prerequisites-for-migrating-ceph-rbd.adoc
+++ /dev/null
@@ -1,65 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="completing-prerequisites-for-rbd-migration_{context}"]
-
-= Completing prerequisites for a {Ceph} RBD migration
-
-[role="_abstract"]
-Complete the following prerequisites before you begin the {Ceph} Rados Block Device (RBD) migration.
-
-* The target CephStorage or ComputeHCI nodes are configured to have both `storage` and `storage_mgmt` networks. This ensures that you can use both {Ceph} public and cluster networks from the same node. From {rhos_prev_long} {rhos_prev_ver} and later you do not have to run a stack update.
-* NFS Ganesha is migrated from a {OpenStackPreviousInstaller} deployment to `cephadm`. For more information, see "Creating an NFS Ganesha cluster".
-* Ceph Metadata Server, monitoring stack, Ceph Object Gateway, and any other daemon that is deployed on Controller nodes.
-ifeval::["{build}" != "upstream"]
-* The daemons distribution follows the cardinality constraints that are
-described in "Red Hat Ceph
-Storage: Supported configurations".
-endif::[]
-* The {Ceph} cluster is healthy, and the `ceph -s` command returns `HEALTH_OK`.
-* Run `os-net-config` on the bare metal node and configure additional networks:
-.. If target nodes are `CephStorage`, ensure that the network is defined in the
-bare metal file for the `CephStorage` nodes, for example, `/home/stack/composable_roles/network/baremetal_deployment.yaml`:
-+
-[source,yaml]
-----
-- name: CephStorage
-count: 2
-instances:
-- hostname: oc0-ceph-0
-name: oc0-ceph-0
-- hostname: oc0-ceph-1
-name: oc0-ceph-1
-defaults:
-networks:
-- network: ctlplane
-vif: true
-- network: storage_cloud_0
-subnet: storage_cloud_0_subnet
-- network: storage_mgmt_cloud_0
-subnet: storage_mgmt_cloud_0_subnet
-network_config:
-template: templates/single_nic_vlans/single_nic_vlans_storage.j2
-----
-.. Add the missing network:
-+
-----
-$ openstack overcloud node provision \
--o overcloud-baremetal-deployed-0.yaml --stack overcloud-0 \
-/--network-config -y --concurrency 2 /home/stack/metalsmith-0.yaml
-----
- .. Verify that the storage network is configured on the target nodes:
-+
-----
-(undercloud) [stack@undercloud ~]$ ssh heat-admin@192.168.24.14 ip -o -4 a
-1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
-5: br-storage inet 192.168.24.14/24 brd 192.168.24.255 scope global br-storage\ valid_lft forever preferred_lft forever
-6: vlan1 inet 192.168.24.14/24 brd 192.168.24.255 scope global vlan1\ valid_lft forever preferred_lft forever
-7: vlan11 inet 172.16.11.172/24 brd 172.16.11.255 scope global vlan11\ valid_lft forever preferred_lft forever
-8: vlan12 inet 172.16.12.46/24 brd 172.16.12.255 scope global vlan12\ valid_lft forever preferred_lft forever
-----
-
-[role="_additional-resources"]
-.Additional resources
-ifeval::["{build}" != "upstream"]
-* link:https://access.redhat.com/articles/1548993[Red Hat Ceph Storage: Supported configurations]
-endif::[]
-* xref:creating-a-ceph-nfs-cluster_ceph-prerequisites[Creating an NFS Ganesha cluster]
diff --git a/docs_user/modules/con_dcn-adoption-overview.adoc b/docs_user/modules/con_dcn-adoption-overview.adoc
deleted file mode 100644
index a7c02434c..000000000
--- a/docs_user/modules/con_dcn-adoption-overview.adoc
+++ /dev/null
@@ -1,75 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="dcn-adoption-overview_{context}"]
-
-= Overview of Distributed Compute Node adoption
-
-[role="_abstract"]
-The process to adopt Distributed Compute Node (DCN) deployment from {rhos_prev_long} ({OpenStackShort}) to {rhos_long} requires additional adoption tasks:
-
-* You must map a multi-stack deployment to multiple node sets.
-* You must map additional networking configurations.
-
-Multi-stack to multi-node set mapping:: In {OpenStackPreviousInstaller} deployments, DCN environments use multiple Heat stacks:
-+
-** The Central stack is templating for Controllers and central Compute nodes.
-** An edge stack is templating for Edge Compute nodes in a stack. There is one stack per DCN site.
-+
-When you perform an adoption, map {OpenStackPreviousInstaller} stacks to `OpenStackDataPlaneNodeSet` custom resources (CRs):
-+
-.Mapping {OpenStackPreviousInstaller} stacks to {rhos_acro} nodesets
-[options="header"]
-|===
-| {OpenStackPreviousInstaller} stack | {rhos_acro} nodeset | Availability zone
-| Central stack (Compute role) | `openstack-edpm` or `openstack-cell1` | az-central
-| DCN1 stack (ComputeDcn1 role) | `openstack-edpm-dcn1` or `openstack-cell1-dcn1` | az-dcn1
-| DCN2 stack (ComputeDcn2 role) | `openstack-edpm-dcn2` or `openstack-cell1-dcn2` | az-dcn2
-|===
-+
-[NOTE]
-====
-Keep all node sets in the same Nova cell to maintain unified scheduling through a shared cell. The default cell is `cell1`.
-====
-
-Key differences from standard adoption:: The following table summarizes the differences between standard adoption and DCN adoption:
-+
-.Comparison of standard and DCN adoption
-[options="header"]
-|===
-| Aspect | Standard adoption | DCN adoption
-| Director stacks | Single stack | Multiple stacks (central + edge sites)
-| Network topology | Flat L2 networks | Routed L3 networks with multiple subnets
-| Data plane node sets | Single node set | Multiple node sets (one per site minimum)
-| Network routes | Usually not required | Required for inter-site connectivity
-| Physnets | Single physnet (e.g., `datacentre`) | Multiple physnets (e.g., `leaf0`, `leaf1`, `leaf2`)
-| Availability zones | Often single AZ | Multiple AZs (one per site)
-| OVN bridge mappings | Single mapping | Site-specific mappings
-| Provider networks | Single segment | Multi-segment routed provider networks
-|===
-
-Requirements for DCN adoption:: Before adopting a DCN deployment, ensure you have:
-+
-** Network topology information for all sites (IP ranges, VLANs, gateways)
-** Inter-site routing configuration (routes between site subnets)
-** Mapping of {OpenStackPreviousInstaller} roles to availability zones
-** OVN bridge mapping configuration for each site
-
-[IMPORTANT]
-====
-The adoption of the control plane must complete before adopting any data plane nodes. However, once the control plane is adopted, the edge site data plane adoptions can proceed in parallel with the central site data plane adoption.
-====
-
-DCN Adoption workflow overview:: The adoption of a Distributed Compute Node (DCN) deployment from {rhos_prev_long} ({OpenStackShort}) to {rhos_long}
-+
-. **Control plane adoption**: Adopt all control plane services from the central {OpenStackPreviousInstaller} stack to the {rhos_acro} control plane. This is identical to standard adoption.
-. **Network configuration**: Configure multi-subnet `NetConfig` and `NetworkAttachmentDefinition` CRs to support all site networks.
-. **Data plane node set creation**: Create separate `OpenStackDataPlaneNodeSet` CRs for each site, each with site-specific network configurations:
-+
-** Network subnet references
-** OVN bridge mappings (physnets)
-** Inter-site routing configuration
-. **Data plane deployment**: Deploy all node sets. The edge site node sets can be deployed in parallel after the central site control plane is adopted.
-
-
-[role="_additional-resources"]
-.Additional resources
-* xref:adopting-spine-leaf-networks_configuring-network[Configuring spine-leaf networks for the {rhos_long_noacro} deployment]
diff --git a/docs_user/modules/con_fips-support.adoc b/docs_user/modules/con_fips-support.adoc
deleted file mode 100644
index 831d2573c..000000000
--- a/docs_user/modules/con_fips-support.adoc
+++ /dev/null
@@ -1,15 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="fips-support_{context}"]
-
-= FIPS support
-
-[role="_abstract"]
-If you are adopting a {rhos_prev_long} ({OpenStackShort}) {rhos_prev_ver} FIPS environment to {rhos_long} {rhos_curr_ver}, your adopted cluster remains a FIPS cluster. There is no option to change FIPS status during adoption.
-
-There is a major difference with how FIPS was configured in {OpenStackPreviousInstaller} and how it is enabled and enforced in operator deployments. In {OpenStackPreviousInstaller}, FIPS is enabled as part of its configuration, whereas in operator deployments, there is no specific FIPS configuration.
-
-If your cluster is FIPS enabled, you must deploy a FIPS {rhocp_long} cluster to adopt your {OpenStackShort} {rhos_prev_ver} FIPS control plane.
-
-[role="_additional-resources"]
-.Additional resources
-* link:https://docs.openshift.com/container-platform/latest/installing/installing-fips.html[Support for FIPS cryptography]
diff --git a/docs_user/modules/con_identity-service-authentication.adoc b/docs_user/modules/con_identity-service-authentication.adoc
deleted file mode 100644
index e18990e89..000000000
--- a/docs_user/modules/con_identity-service-authentication.adoc
+++ /dev/null
@@ -1,20 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="identity-service-authentication_{context}"]
-
-= {identity_service} authentication
-
-[role="_abstract"]
-If you have custom policies enabled, complete the following steps for adoption:
-
-. Remove custom policies.
-. Run the adoption.
-. Re-add custom policies by using the new SRBAC syntax.
-
-[IMPORTANT]
-Red Hat does not support customized roles or policies. Syntax errors or misapplied authorization can negatively impact security or usability. If you need customized roles or policies in your production environment, contact Red Hat support for a support exception before you begin the adoption.
-
-After you adopt a {OpenStackPreviousInstaller}-based OpenStack deployment to a {rhos_long_noacro} deployment, the {identity_service} performs user authentication and authorization by using Secure RBAC (SRBAC). If SRBAC is already enabled, then there is no change to how you perform operations. If SRBAC is disabled, then adopting a {OpenStackPreviousInstaller}-based OpenStack deployment might change how you perform operations due to changes in API access policies.
-
-[role="_additional-resources"]
-.Additional resources
-* link:{defaultURL}/performing_security_operations/assembly_srbac-in-rhoso_performing-security-services#assembly_srbac-in-rhoso_performing-security-services[Secure role based access control in Red Hat OpenStack Services on OpenShift]
diff --git a/docs_user/modules/con_key-manager-service-hsm-adoption-approaches.adoc b/docs_user/modules/con_key-manager-service-hsm-adoption-approaches.adoc
deleted file mode 100644
index 2434bb772..000000000
--- a/docs_user/modules/con_key-manager-service-hsm-adoption-approaches.adoc
+++ /dev/null
@@ -1,65 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="key-manager-service-hsm-adoption-approaches_{context}"]
-
-= {key_manager} HSM adoption approaches
-
-[role="_abstract"]
-The {key_manager_first_ref} adoption approach depends on your source {OpenStackPreviousInstaller} environment configuration.
-
-* Use the standard adoption approach if your environment includes only the `simple_crypto` plugin for secret storage and has no HSM integration.
-* Use the HSM-enabled adoption approach if your source environment has HSM integration that uses Public Key Cryptography Standard (PKCS) #11, Key Management Interoperability Protocol (KMIP), or other HSM back ends alongside `simple_crypto`.
-
-Standard adoption approach::
-* Uses the existing {key_manager} adoption procedure
-* Migrates a simple crypto back-end configuration
-* Provides a single-step adoption process
-* Is suitable for development, testing, and standard production environments
-
-HSM-enabled adoption approach::
-* Patches the `OpenStackControlPlane` custom resource with HSM-enabled configuration
-* Creates required Kubernetes secrets (`hsm-login` and `proteccio-data`) for HSM credentials and certificates
-* Preserves HSM metadata during database migration
-* Supports both simple crypto and HSM back ends in the target environment
-* Requires custom container images with HSM client libraries that are built by using the `rhoso_proteccio_hsm` Ansible role
-* Requires HSM client certificates and configuration files
-* Requires proper HSM partition and key configuration that matches your source environment
-* The HSM-enabled adoption approach currently supports:
-** Proteccio (Eviden Trustway): Fully supported with PKCS#11 integration
-** Luna (Thales): PKCS#11 support available
-** nCipher (Entrust): PKCS#11 support available
-
-[IMPORTANT]
-====
-HSM adoption requires additional configuration steps, including:
-
-* Custom Barbican container images with HSM client libraries that are built using the `rhoso_proteccio_hsm` Ansible role
-* HSM client certificates and configuration files that are accessible from the host where you run the adoption commands
-* Proper HSM partition and key configuration that matches your source environment
-
-These approaches are mutually exclusive. Choose an approach based on your source environment configuration.
-====
-
-[options="header"]
-|===
-| Source environment characteristic | Approach | Rationale
-
-| Only `simple_crypto` back-end configured
-| Standard adoption
-| No HSM complexity needed
-
-| HSM integration present (PKCS#11, KMIP, and so on)
-| HSM-enabled adoption
-| Preserves HSM functionality and secrets
-
-| Development or testing environment
-| Standard adoption
-| Simpler setup and maintenance
-
-| Production with compliance requirements
-| HSM-enabled adoption
-| Maintains security compliance
-
-| Unknown back-end configuration
-| Check source environment first
-| Determine appropriate approach
-|===
diff --git a/docs_user/modules/con_key-manager-service-support-for-crypto-plugins.adoc b/docs_user/modules/con_key-manager-service-support-for-crypto-plugins.adoc
deleted file mode 100644
index f96b531fd..000000000
--- a/docs_user/modules/con_key-manager-service-support-for-crypto-plugins.adoc
+++ /dev/null
@@ -1,24 +0,0 @@
-:_mod-docs-content-type: REFERENCE
-[id="key-manager-service-support-for-crypto-plug-ins_{context}"]
-
-= Key Manager service support for crypto plug-ins
-
-[role="_abstract"]
-The {key_manager_first_ref} supports multiple crypto plug-ins for different security requirements and deployment scenarios.
-
-The following crypto plug-ins are supported in {rhos_long}:
-
-* Simple Crypto Plug-in: Software-based cryptographic back end suitable for development and testing environments
-* Public Key Cryptography Standard (PKCS) #11 Plug-in: Hardware security module (HSM) integration for production environments that requires enhanced security
-
-//*TODO: Talk about Ceph Storage and Swift Storage nodes, HCI deployments,
-//etc.*
-
-The {key_manager} supports HSM integration through the PKCS#11 plugin. This enables:
-
-* Enhanced security for secret storage and retrieval
-* Hardware-based key management
-* Compliance with security requirements for production environments
-* Preservation of existing HSM-protected secrets during adoption
-
-For environments that require HSM integration during adoption, see xref:adopting-the-key-manager-service-with-proteccio-hsm_hsm-integration[Adopting the {key_manager} with Proteccio HSM integration].
diff --git a/docs_user/modules/con_known-issues-adoption.adoc b/docs_user/modules/con_known-issues-adoption.adoc
deleted file mode 100644
index 3ca5c401c..000000000
--- a/docs_user/modules/con_known-issues-adoption.adoc
+++ /dev/null
@@ -1,7 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="known-issues-adoption_{context}"]
-
-= Known issues
-
-[role="_abstract"]
-Review the following known issues that might affect a successful adoption:
diff --git a/docs_user/modules/con_node-roles.adoc b/docs_user/modules/con_node-roles.adoc
deleted file mode 100644
index 0410afb46..000000000
--- a/docs_user/modules/con_node-roles.adoc
+++ /dev/null
@@ -1,59 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="about-node-roles_{context}"]
-
-= About node roles
-
-[role="_abstract"]
-In {OpenStackPreviousInstaller} deployments you had 5 different standard roles
-for the nodes: `Controller`, `Compute`, `Networker`, `Ceph Storage`, `Swift
-Storage`, but in the control plane you make a distinction based on where things
-are running, in {OpenShift} ({OpenShiftShort}) or external to it.
-
-When adopting a {OpenStackPreviousInstaller} {rhos_prev_long} ({OpenStackShort}) your `Compute` nodes will directly become
-external nodes, so there should not be much additional planning needed there.
-Your `Networker` nodes will also become external nodes.
-In most cases your `Controller` nodes would also become external nodes to avoid dataplane outage during adoption. This is because when there are no
-dedicated `Networker` nodes in {OpenStackPreviousInstaller}, `Controller` nodes act as OVN gateway chassis i.e external SNAT and Centralized
-Floating IP(if DVR disabled) traffic goes through these nodes and removing these nodes during adoption will lead to some outage and this
-should be avoided. Such disruption should be planned post adoption.
-
-In many deployments being adopted the `Controller` nodes will require some
-thought because you have many {OpenShiftShort} nodes where the Controller services
-could run, and you have to decide which ones you want to use, how you are going to use them, and make sure those nodes are ready to run the services.
-
-In most deployments running {OpenStackShort} services on `master` nodes can have a
-seriously adverse impact on the {OpenShiftShort} cluster, so it is recommended that you place {OpenStackShort} services on non `master` nodes.
-
-By default {OpenStackShort} Operators deploy {OpenStackShort} services on any worker node, but
-that is not necessarily what's best for all deployments, and there may be even
-services that won't even work deployed like that.
-
-When planing a deployment it's good to remember that not all the services on an
-{OpenStackShort} deployments are the same as they have very different requirements.
-
-Looking at the Block Storage service (cinder) component you can clearly see different requirements for
-its services: the cinder-scheduler is a very light service with low
-memory, disk, network, and CPU usage; cinder-api service has a higher network
-usage due to resource listing requests; the cinder-volume service will have a
-high disk and network usage since many of its operations are in the data path
-(offline volume migration, create volume from image, etc.), and then you have
-the cinder-backup service which has high memory, network, and CPU (to compress
-data) requirements.
-
-The {image_service_first_ref} and {object_storage_first_ref} components are in the data path, as well as RabbitMQ and Galera services.
-
-Given these requirements it may be preferable not to let these services wander
-all over your {OpenShiftShort} worker nodes with the possibility of impacting other
-workloads, or maybe you don't mind the light services wandering around but you
-want to pin down the heavy ones to a set of infrastructure nodes.
-
-There are also hardware restrictions to take into consideration, because if you
-are using a Fibre Channel (FC) Block Storage service backend you need the cinder-volume,
-cinder-backup, and maybe even the {image_service_first_ref} (if it's using the Block Storage service as a backend)
-services to run on a {OpenShiftShort} host that has an HBA.
-
-The {OpenStackShort} Operators allow a great deal of flexibility on where to run the
-{OpenStackShort} services, as you can use node labels to define which {OpenShiftShort} nodes
-are eligible to run the different {OpenStackShort} services. Refer to the xref:about-node-selector_{context}[About node
-selector] to learn more about using labels to define
-placement of the {OpenStackShort} services.
diff --git a/docs_user/modules/con_preparing-the-shared-file-systems-service-configuration.adoc b/docs_user/modules/con_preparing-the-shared-file-systems-service-configuration.adoc
deleted file mode 100644
index 474a29d13..000000000
--- a/docs_user/modules/con_preparing-the-shared-file-systems-service-configuration.adoc
+++ /dev/null
@@ -1,175 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="preparing-the-shared-file-systems-service-configuration_{context}"]
-
-= Guidelines for preparing the {rhos_component_storage_file} configuration
-
-[role="_abstract"]
-Copy the {rhos_component_storage_file_first_ref} configuration from {rhos_prev_long} {rhos_prev_ver}, and review it to ensure that you copy the correct configuration for {rhos_long} {rhos_curr_ver}.
-
-Review the following guidelines for preparing your {rhos_component_storage_file} configuration file for adoption:
-
-* The {rhos_component_storage_file} operator sets up the following configurations and can be ignored:
-** Database-related configuration (`[database]`)
-** Service authentication (`auth_strategy`, `[keystone_authtoken]`)
-** Message bus configuration (`transport_url`, `control_exchange`)
-** The default paste config (`api_paste_config`)
-** Inter-service communication configuration (`[neutron]`, `[nova]`, `[cinder]`, `[glance]` `[oslo_messaging_*]`)
-* Ignore the `osapi_share_listen` configuration. In {rhos_long} {rhos_curr_ver}, you rely on {rhocp_long} routes and ingress.
-* Check for policy overrides. In {rhos_acro} {rhos_curr_ver}, the {rhos_component_storage_file} ships with a secure default Role-based access control (RBAC), and overrides might not be necessary.
-ifeval::["{build}" != "downstream"]
-Review RBAC defaults by using the Oslo policy generator tool.
-endif::[]
-* If a custom policy is necessary, you must provide it as a `ConfigMap`. The following example spec illustrates how you can set up a `ConfigMap` called `manila-policy` with the contents of a file called `policy.yaml`:
-+
-[source,yaml]
-----
- spec:
- manila:
- enabled: true
- template:
- manilaAPI:
- customServiceConfig: |
- [oslo_policy]
- policy_file=/etc/manila/policy.yaml
- extraMounts:
- - extraVol:
- - extraVolType: Undefined
- mounts:
- - mountPath: /etc/manila/
- name: policy
- readOnly: true
- propagation:
- - ManilaAPI
- volumes:
- - name: policy
- projected:
- sources:
- - configMap:
- name: manila-policy
- items:
- - key: policy
- path: policy.yaml
-----
-
-* The value of the `host` option under the `[DEFAULT]` section must be `hostgroup`.
-* To run the {rhos_component_storage_file} API service, you must add the `enabled_share_protocols` option to the `customServiceConfig` section in `manila: template: manilaAPI`.
-* If you have scheduler overrides, add them to the `customServiceConfig`
-section in `manila: template: manilaScheduler`.
-* If you have multiple storage back-end drivers configured with {OpenStackShort} {rhos_prev_ver}, you need to split them up when deploying {rhos_acro} {rhos_curr_ver}. Each storage back-end driver needs to use its own instance of the `manila-share` service.
-* If a storage back-end driver needs a custom container image, find it in the
-Red Hat Ecosystem Catalog, and create or modify an `OpenStackVersion` custom resource (CR) to specify the custom image using the same `custom name`.
-+
-The following example shows a manila spec from the `OpenStackControlPlane` CR that includes multiple storage back-end drivers, where only one is using a custom container image:
-+
-[source,yaml]
-----
- spec:
- manila:
- enabled: true
- template:
- manilaAPI:
- customServiceConfig: |
- [DEFAULT]
- enabled_share_protocols = nfs
- replicas: 3
- manilaScheduler:
- replicas: 3
- manilaShares:
- netapp:
- customServiceConfig: |
- [DEFAULT]
- debug = true
- enabled_share_backends = netapp
- host = hostgroup
- [netapp]
- driver_handles_share_servers = False
- share_backend_name = netapp
- share_driver = manila.share.drivers.netapp.common.NetAppDriver
- netapp_storage_family = ontap_cluster
- netapp_transport_type = http
- replicas: 1
- pure:
- customServiceConfig: |
- [DEFAULT]
- debug = true
- enabled_share_backends=pure-1
- host = hostgroup
- [pure-1]
- driver_handles_share_servers = False
- share_backend_name = pure-1
- share_driver = manila.share.drivers.purestorage.flashblade.FlashBladeShareDriver
- flashblade_mgmt_vip = 203.0.113.15
- flashblade_data_vip = 203.0.10.14
- replicas: 1
-----
-+
-The following example shows the `OpenStackVersion` CR that defines the custom container image:
-+
-[source,yaml]
-----
-apiVersion: core.openstack.org/v1beta1
-kind: OpenStackVersion
-metadata:
- name: openstack
-spec:
- customContainerImages:
- cinderVolumeImages:
- pure: registry.connect.redhat.com/purestorage/openstack-manila-share-pure-rhosp-18-0
-----
-+
-The name of the `OpenStackVersion` CR must match the name of your `OpenStackControlPlane` CR.
-* If you are providing sensitive information, such as passwords, hostnames, and usernames, use {OpenShiftShort} secrets, and the `customServiceConfigSecrets` key. You can use `customConfigSecrets` in any service. If you use third party storage that requires credentials, create a secret that is referenced in the manila CR/patch file by using the `customServiceConfigSecrets` key. For example:
-
-. Create a file that includes the secrets, for example, `netapp_secrets.conf`:
-+
-----
-$ cat << __EOF__ > ~/netapp_secrets.conf
-
-[netapp]
-netapp_server_hostname = 203.0.113.10
-netapp_login = fancy_netapp_user
-netapp_password = secret_netapp_password
-netapp_vserver = mydatavserver
-__EOF__
-----
-+
-----
-$ oc create secret generic osp-secret-manila-netapp --from-file=~/
-----
-+
-** Replace `` with the name of the file that includes your secrets, for example, `netapp_secrets.conf`.
-
-. Add the secret to any {rhos_component_storage_file} file in the `customServiceConfigSecrets` section. The following example adds the `osp-secret-manila-netapp` secret to the `manilaShares` service:
-+
-[source,yaml]
-----
- spec:
- manila:
- enabled: true
- template:
- < . . . >
- manilaShares:
- netapp:
- customServiceConfig: |
- [DEFAULT]
- debug = true
- enabled_share_backends = netapp
- host = hostgroup
- [netapp]
- driver_handles_share_servers = False
- share_backend_name = netapp
- share_driver = manila.share.drivers.netapp.common.NetAppDriver
- netapp_storage_family = ontap_cluster
- netapp_transport_type = http
- customServiceConfigSecrets:
- - osp-secret-manila-netapp
- replicas: 1
- < . . . >
-----
-
-[role="_additional-resources"]
-.Additional resources
-ifeval::["{build}" != "downstream"]
-* https://docs.openstack.org/oslo.policy/latest/cli/oslopolicy-policy-generator.html[Oslo policy generator]
-endif::[]
-* link:https://catalog.redhat.com/software/containers/search?gs&q=manila[Red Hat Ecosystem Catalog]
diff --git a/docs_user/modules/con_preventing-config-loss-when-using-oc-patch.adoc b/docs_user/modules/con_preventing-config-loss-when-using-oc-patch.adoc
deleted file mode 100644
index ec66b4792..000000000
--- a/docs_user/modules/con_preventing-config-loss-when-using-oc-patch.adoc
+++ /dev/null
@@ -1,18 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="preventing-config-loss-when-using-oc-patch_{context}"]
-
-= Preventing configuration loss when using the `oc patch` command
-
-[role="_abstract"]
-When you use `oc patch` to modify a resource, the changes are applied directly to live objects in your OpenShift cluster. If you later apply updates to the custom resource (CR) file by using `oc apply -f `, your previous patched changes are overwritten and lost from the resource.
-
-To prevent configuration loss, use the `--patch-file` option or export your `openstackcontrolplane` CR after the patch is applied.
-
-----
-$ oc get -o yaml > .yaml
-----
-
-For example:
-----
-$ oc get OpenStackControlPlane openstack-control-plane -o yaml > openstack_control_plane.yaml
-----
diff --git a/docs_user/modules/con_service-configurations.adoc b/docs_user/modules/con_service-configurations.adoc
deleted file mode 100644
index bc61f3b6d..000000000
--- a/docs_user/modules/con_service-configurations.adoc
+++ /dev/null
@@ -1,84 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="service-configurations_{context}"]
-
-= Service configurations
-
-[role="_abstract"]
-There is a fundamental difference between the {OpenStackPreviousInstaller} and operator deployments
-regarding the configuration of the services.
-
-In {OpenStackPreviousInstaller} deployments many of the service configurations are abstracted by
-{OpenStackPreviousInstaller}-specific configuration options. A single {OpenStackPreviousInstaller} option may trigger
-changes for multiple services and support for drivers, for example, the Block Storage service (cinder), that
-require patches to the {OpenStackPreviousInstaller} code base.
-
-In operator deployments this approach has changed: reduce the installer specific knowledge and leverage {OpenShift} ({OpenShiftShort}) and
-{rhos_prev_long} ({OpenStackShort}) service specific knowledge whenever possible.
-
-To this effect {OpenStackShort} services will have sensible defaults for {OpenShiftShort} deployments and human operators will provide configuration snippets to provide
-necessary configuration, such as the Block Storage service backend configuration, or to override
-the defaults.
-
-This shortens the distance between a service specific configuration file (such
-as `cinder.conf`) and what the human operator provides in the manifests.
-
-These configuration snippets are passed to the operators in the different
-`customServiceConfig` sections available in the manifests, and then they are
-layered in the services available in the following levels. To illustrate this,
-if you were to set a configuration at the top Block Storage service level (`spec: cinder:
-template:`) then it would be applied to all the Block Storage services; for example to
-enable debug in all the Block Storage services you would do:
-
-[source,yaml]
-----
-apiVersion: core.openstack.org/v1beta1
-kind: OpenStackControlPlane
-metadata:
- name: openstack
-spec:
- cinder:
- template:
- customServiceConfig: |
- [DEFAULT]
- debug = True
-< . . . >
-----
-
-If you only want to set it for one of the Block Storage services, for example the
-scheduler, then you use the `cinderScheduler` section instead:
-
-[source,yaml]
-----
-apiVersion: core.openstack.org/v1beta1
-kind: OpenStackControlPlane
-metadata:
- name: openstack
-spec:
- cinder:
- template:
- cinderScheduler:
- customServiceConfig: |
- [DEFAULT]
- debug = True
-< . . . >
-----
-
-In {OpenShift} it is not recommended to store sensitive information like the
-credentials to the Block Storage service storage array in the CRs, so most {OpenStackShort} operators
-have a mechanism to use the {OpenShift} `Secrets` for sensitive configuration
-parameters of the services and then use them by reference in the
-`customServiceConfigSecrets` section which is analogous to the
-`customServiceConfig`.
-
-The contents of the `Secret` references passed in the
-`customServiceConfigSecrets` will have the same format as `customServiceConfig`:
-a snippet with the section/s and configuration options.
-
-When there are sensitive information in the service configuration then it
-becomes a matter of personal preference whether to store all the configuration
-in the `Secret` or only the sensitive parts. However, if you split the
-configuration between `Secret` and `customServiceConfig` you still need the
-section header (eg: `[DEFAULT]`) to be present in both places.
-
-Attention should be paid to each service's adoption process as they may have
-some particularities regarding their configuration.
diff --git a/docs_user/modules/con_storage-driver-certification.adoc b/docs_user/modules/con_storage-driver-certification.adoc
deleted file mode 100644
index e3ba5e5da..000000000
--- a/docs_user/modules/con_storage-driver-certification.adoc
+++ /dev/null
@@ -1,11 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="storage-driver-certification_{context}"]
-
-= Storage driver certification
-
-[role="_abstract"]
-Confirm that your deployed storage drivers are certified for {rhos_acro} {rhos_curr_ver} before adoption. See the Red Hat Ecosystem Catalog for certified software.
-
-[role="_additional-resources"]
-.Additional resources
-* link:https://catalog.redhat.com/search?searchType=software&certified_versions=Red%20Hat%20OpenStack%20Services%20on%20OpenShift%2018&p=1[Red Hat Ecosystem Catalog]
diff --git a/docs_user/modules/con_tlse-description.adoc b/docs_user/modules/con_tlse-description.adoc
deleted file mode 100644
index ff6effc8a..000000000
--- a/docs_user/modules/con_tlse-description.adoc
+++ /dev/null
@@ -1,20 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="con_tlse-description_{context}"]
-
-= TLS Everywhere
-
-[role="_abstract"]
-Note: The assumption is, that the new deployment will adopt the settings from the
-old deployment, so in case TLS Everywhere is disabled, it won't be enabled on
-the new deployment.
-
-If the Director deployment was deployed with TLS Everywhere, FreeIPA (IdM) is used
-to issue certificates for the OpenStack services. Certmonger, a client process which
-is installed on all hosts, interacts with FreeIPA (IdM) to request, install, track
-and renew these certificates.
-
-The new Operator based deployment uses the cert-manager operator to issue, track
-and renew the certificates.
-
-Because the same root CA is used to generate new certificates, the currently used chain
-of trust doesn't have to be modified.
diff --git a/docs_user/modules/con_troubleshooting-object-storage-migration.adoc b/docs_user/modules/con_troubleshooting-object-storage-migration.adoc
deleted file mode 100644
index e51169283..000000000
--- a/docs_user/modules/con_troubleshooting-object-storage-migration.adoc
+++ /dev/null
@@ -1,40 +0,0 @@
-:_mod-docs-content-type: CONCEPT
-[id="troubleshooting-object-storage-migration_{context}"]
-
-= Troubleshooting the {object_storage} migration
-
-[role="_abstract"]
-You can troubleshoot issues with the {object_storage_first_ref} migration.
-
-* If the replication is not working and the `swift-dispersion-report` is not back to 100% availability, check the replicator progress to help you debug:
-+
-----
-$ CONTROLLER1_SSH tail /var/log/containers/swift/swift.log | grep object-server
-----
-+
-The following shows an example of the output:
-+
-----
-Mar 14 06:05:30 standalone object-server[652216]: cinder_dcn_patch.yaml
-spec:
- cinder:
- enabled: true
- template:
- cinderAPI:
- customServiceConfig: |
- [DEFAULT]
- default_availability_zone = az-central
- cinderScheduler:
- replicas: 1
- cinderVolumes:
- central:
- networkAttachments:
- - storage
- replicas: 1
- customServiceConfig: |
- [DEFAULT]
- enabled_backends = central
- glance_api_servers = http://glance-central-internal.openstack.svc:9292
- [central]
- backend_host = hostgroup
- volume_backend_name = central
- volume_driver = cinder.volume.drivers.rbd.RBDDriver
- rbd_ceph_conf = /etc/ceph/central.conf
- rbd_user = openstack
- rbd_pool = volumes
- rbd_flatten_volume_from_snapshot = False
- report_discard_supported = True
- rbd_secret_uuid = **
- rbd_cluster_name = central
- backend_availability_zone = az-central
- dcn1:
- networkAttachments:
- - storage
- replicas: 1
- customServiceConfig: |
- [DEFAULT]
- enabled_backends = dcn1
- glance_api_servers = http://glance-dcn1-internal.openstack.svc:9292
- [dcn1]
- backend_host = hostgroup
- volume_backend_name = dcn1
- volume_driver = cinder.volume.drivers.rbd.RBDDriver
- rbd_ceph_conf = /etc/ceph/dcn1.conf
- rbd_user = openstack
- rbd_pool = volumes
- rbd_flatten_volume_from_snapshot = False
- report_discard_supported = True
- rbd_secret_uuid = **
- rbd_cluster_name = dcn1
- backend_availability_zone = az-dcn1
- dcn2:
- networkAttachments:
- - storage
- replicas: 1
- customServiceConfig: |
- [DEFAULT]
- enabled_backends = dcn2
- glance_api_servers = http://glance-dcn2-internal.openstack.svc:9292
- [dcn2]
- backend_host = hostgroup
- volume_backend_name = dcn2
- volume_driver = cinder.volume.drivers.rbd.RBDDriver
- rbd_ceph_conf = /etc/ceph/dcn2.conf
- rbd_user = openstack
- rbd_pool = volumes
- rbd_flatten_volume_from_snapshot = False
- report_discard_supported = True
- rbd_secret_uuid = **
- rbd_cluster_name = dcn2
- backend_availability_zone = az-dcn2
-EOF
-----
-+
-where:
-
-``::
-Specifies the `fsid` of the central {Ceph} cluster, used as the libvirt secret UUID.
-
-``::
-Specifies the `fsid` of the DCN1 edge {Ceph} cluster.
-
-``::
-Specifies the `fsid` of the DCN2 edge {Ceph} cluster.
-
-+
-[NOTE]
-====
-* You must configure each `CinderVolume` with the `backend_availability_zone` value that matches your {compute_service} availability zone for that site, because `cross_az_attach = False` is set in the {compute_service} configuration. If the names do not match, instances cannot attach volumes. Replace the examples (`az-central`, `az-dcn1`, `az-dcn2`) with the names used in your {rhos_prev_long} deployment.
-* Each `CinderVolume` points to its local {image_service} API endpoint through `glance_api_servers`. This ensures that volume creation from images uses the local {image_service} and {Ceph} cluster. The examples use `http://` for the {image_service} endpoints. If your {rhos_prev_long} deployment uses TLS for internal endpoints, use `https://` instead, and ensure that you have completed the TLS migration. For more information, see xref:migrating-tls-everywhere_configuring-network[Migrating TLS-e to the RHOSO deployment].
-* The `rbd_cluster_name` setting identifies which {Ceph} cluster configuration to use from the mounted secrets.
-* Adjust the number of edge sites and their names to match your DCN deployment.
-====
-
-. Patch the `OpenStackControlPlane` CR to deploy the {block_storage} with multiple {Ceph} back ends:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file cinder_dcn_patch.yaml
-----
-
-. Configure the {block_storage} backup service. In this example, the backup service runs at the central site and uses the central {Ceph} cluster. Add the `cinderBackups` section to your patch file and re-apply it:
-+
-[subs="+quotes"]
-----
-$ cat << EOF >> cinder_dcn_patch.yaml
- cinderBackups:
- central:
- networkAttachments:
- - storage
- replicas: 1
- customServiceConfig: |
- [DEFAULT]
- backup_driver=cinder.backup.drivers.ceph.CephBackupDriver
- backup_ceph_conf=/etc/ceph/central.conf
- backup_ceph_user=openstack
- backup_ceph_pool=backups
- storage_availability_zone=az-central
-EOF
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file cinder_dcn_patch.yaml
-----
-+
-[NOTE]
-====
-Unlike a single-site {Ceph} deployment where the backup config references `/etc/ceph/ceph.conf`, in a DCN deployment the {Ceph} configuration files in the `ceph-conf-files` secret are named by cluster. Set `backup_ceph_conf` to the path of the {Ceph} configuration file for whichever cluster hosts your `backups` pool. In this example the file is named `central.conf`, so the path is `/etc/ceph/central.conf`. Using a path that does not match a file in the secret will cause the backup service to fail with a `conf_read_file` error.
-
-Set `storage_availability_zone` to match the availability zone of the volumes you want to back up. The backup scheduler uses this to route backup requests to a service in the correct zone. If the backup service zone does not match the volume zone, backup creation fails with `Service not found for creating backup`.
-====
-
-. Verify that the {block_storage} volume services are running for each availability zone:
-+
-----
-$ openstack volume service list --service cinder-volume
-
-+------------------+---------------------+------------+---------+-------+----------------------------+
-| Binary | Host | Zone | Status | State | Updated At |
-+------------------+---------------------+------------+---------+-------+----------------------------+
-| cinder-volume | hostgroup@central | az-central | enabled | up | 2024-01-01T00:00:00.000000 |
-| cinder-volume | hostgroup@dcn1 | az-dcn1 | enabled | up | 2024-01-01T00:00:00.000000 |
-| cinder-volume | hostgroup@dcn2 | az-dcn2 | enabled | up | 2024-01-01T00:00:00.000000 |
-+------------------+---------------------+------------+---------+-------+----------------------------+
-----
-
-. Verify that the {block_storage} backup service is running and in the correct availability zone:
-+
-----
-$ openstack volume service list --service cinder-backup
-
-+---------------+-------------------------+------------+---------+-------+----------------------------+
-| Binary | Host | Zone | Status | State | Updated At |
-+---------------+-------------------------+------------+---------+-------+----------------------------+
-| cinder-backup | cinder-backup-central-0 | az-central | enabled | up | 2024-01-01T00:00:00.000000 |
-+---------------+-------------------------+------------+---------+-------+----------------------------+
-----
-
-. Test the backup service by creating a volume, backing it up, and restoring the backup:
-+
-----
-$ openstack volume create --size 1 backup-test-vol
-
-$ openstack volume backup create --name backup-test-backup backup-test-vol
-
-$ openstack volume backup show backup-test-backup
-+-----------------------+--------------------------------------+
-| Field | Value |
-+-----------------------+--------------------------------------+
-| container | backups |
-| fail_reason | None |
-| name | backup-test-backup |
-| size | 1 |
-| status | available |
-+-----------------------+--------------------------------------+
-
-$ openstack volume backup restore backup-test-backup backup-test-restore
-----
-+
-[NOTE]
-====
-Some versions of the {rhocp_long} client display a `cannot unpack non-iterable VolumeBackupsRestore object` error after the restore command. This is a known issue in the client, the restore operation might not have failed. Verify by checking the restored volume status directly.
-====
-+
-----
-$ openstack volume show backup-test-restore -c status -c availability_zone -c os-vol-host-attr:host -f value
-available
-az-central
-hostgroup@central#central
-----
diff --git a/docs_user/modules/proc_adopting-compute-services-to-the-data-plane.adoc b/docs_user/modules/proc_adopting-compute-services-to-the-data-plane.adoc
deleted file mode 100644
index 6a24c0e19..000000000
--- a/docs_user/modules/proc_adopting-compute-services-to-the-data-plane.adoc
+++ /dev/null
@@ -1,894 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-compute-services-to-the-data-plane_{context}"]
-
-= Adopting Compute services to the {rhos_acro} data plane
-
-[role="_abstract"]
-Adopt your Compute (nova) services to the {rhos_long} data plane.
-
-.Prerequisites
-
-* You have stopped the remaining control plane nodes, repositories, and packages on the {compute_service_first_ref} hosts. For more information, see xref:stopping-infrastructure-management-and-compute-services_{context}[Stopping infrastructure management and Compute services].
-* You have configured the Ceph back end for the `NovaLibvirt` service. For more information, see xref:configuring-a-ceph-backend_migrating-databases[Configuring a Ceph back end].
-* You have configured IP Address Management (IPAM):
-+
-----
-$ oc apply -f - < *["standalone.localdomain"]="192.168.122.100"*
-> # **
-> # **
-> # **
->)
-$ declare -A COMPUTES_CELL2
-$ export COMPUTES_CELL2=(
-> # **
->)
-$ declare -A COMPUTES_CELL3
-$*export COMPUTES_CELL3=(*
-> # **
-> # **
->)
-
-$ declare -A COMPUTES_API_CELL1
-$*export COMPUTES_API_CELL1=(*
-> ["standalone.localdomain"]="172.17.0.100"
-> ["standalone2.localdomain"]="172.17.0.101"
->)
-
-$ NODESETS=""
-$ for CELL in $(echo $RENAMED_CELLS); do
-> ref="COMPUTES_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')"
-> eval names=\${!${ref}[@]}
-> [ -z "$names" ] && continue
-> NODESETS="'openstack-${CELL}', $NODESETS"
->done
-$ NODESETS="[${NODESETS%,*}]"
-----
-+
-** `DEFAULT_CELL_NAME="cell3"` defines the source cloud `default` cell that acquires a new `DEFAULT_CELL_NAME` on the destination cloud after adoption.
-In a multi-cell adoption scenario, you can retain the original name, `default`, or create a new cell default name by providing the incremented index of the last cell in the source cloud. For example, if the incremented index of the last cell is `cell5`, the new cell default name is `cell6`.
-** `export COMPUTES_CELL1=` For each cell, update the `<["standalone.localdomain"]="x.x.x.x">` value and the `COMPUTES_CELL` value with the names and IP addresses of the {compute_service} nodes that are connected to the `ctlplane` and `internalapi` networks. Do not specify a real FQDN defined for each network. Always use the same hostname for each connected network of a Compute node. Provide the IP addresses and the names of the hosts on the remaining networks of the source cloud as needed, or you can manually adjust the files that you generate in step 9 of this procedure.
-** ``, ``, and `` specifies the names of your {compute_service} nodes for each cell. Assign all {compute_service} nodes from the source cloud `cell1` cell into `COMPUTES_CELL1`, and so on.
-** `export COMPUTES_CELL=(` specifies all {compute_service} nodes that you assign from the source cloud `default` cell into `COMPUTES_CELL` and `COMPUTES_API_CELL`, where `` is the `DEFAULT_CELL_NAME` environment variable value. In this example, the `DEFAULT_CELL_NAME` environment variable value equals `cell3`.
-** `export COMPUTES_API_CELL1=(` For each cell, update the `<["standalone.localdomain"]="192.168.122.100">` value and the `COMPUTES_API_CELL` value with the names and IP addresses of the {compute_service} nodes that are connected to the `ctlplane` and `internalapi` networks. `["standalone.localdomain"]="192.168.122.100"` defines the custom DNS domain in the FQDN value of the nodes. This value is used in the data plane node set `spec.nodes..hostName`. Do not specify a real FQDN defined for each network. Use the same hostname for each of its connected networks. Provide the IP addresses and the names of the hosts on the remaining networks of the source cloud as needed, or you can manually adjust the files that you generate in step 9 of this procedure.
-** `NODESETS="'openstack-${CELL}', $NODESETS"` specifies the cells that contain Compute nodes. Cells that do not contain Compute nodes are omitted from this template because no node sets are created for the cells.
-+
-[NOTE]
-====
-If you deployed the source cloud with a `default` cell, and want to rename it during adoption, define the new name that you want to use, as shown in the following example:
-----
-$ DEFAULT_CELL_NAME="cell1"
-$ RENAMED_CELLS="cell1"
-----
-====
-
-[NOTE]
-====
-Do not set a value for the `CEPH_FSID` parameter if the local storage back end is configured by the {compute_service} for libvirt. The storage back end must match the source cloud storage back end. You cannot change the storage back end during adoption.
-====
-
-.Procedure
-
-ifeval::["{build}" != "downstream"]
-. Create a https://kubernetes.io/docs/concepts/configuration/secret/#ssh-authentication-secrets[ssh authentication secret] for the data plane nodes:
-//kgilliga:I need to check if we will document this in Red Hat docs.
-endif::[]
-ifeval::["{build}" != "upstream"]
-. Create an SSH authentication secret for the data plane nodes:
-endif::[]
-+
-[subs=+quotes]
-----
-$ oc apply -f - < | base64 | sed \'s/^/ /')
-endif::[]
-EOF
-----
-+
-ifeval::["{build}" == "downstream"]
-* Replace `` with the path to your SSH key.
-+
-For more information about creating data plane secrets, see link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/deploying_red_hat_openstack_services_on_openshift/assembly_creating-the-data-plane#proc_creating-the-data-plane-secrets_dataplane[Creating the data plane secrets] in _Deploying Red Hat OpenStack Services on OpenShift_.
-endif::[]
-
-. Generate an ssh key-pair `nova-migration-ssh-key` secret:
-+
-----
-$ cd "$(mktemp -d)"
-$ ssh-keygen -f ./id -t ecdsa-sha2-nistp521 -N ''
-$ oc get secret nova-migration-ssh-key || oc create secret generic nova-migration-ssh-key \
- --from-file=ssh-privatekey=id \
- --from-file=ssh-publickey=id.pub \
- --type kubernetes.io/ssh-auth
-$ rm -f id*
-$ cd -
-----
-
-. If TLS Everywhere is enabled, set `LIBVIRT_PASSWORD` to match the existing {OpenStackShort} deployment password:
-+
-----
-declare -A TRIPLEO_PASSWORDS
-TRIPLEO_PASSWORDS[default]="$HOME/overcloud-passwords.yaml"
-LIBVIRT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' LibvirtTLSPassword:' | awk -F ': ' '{ print $2; }')
-LIBVIRT_PASSWORD_BASE64=$(echo -n "$LIBVIRT_PASSWORD" | base64)
-----
-
-.. Create libvirt-secret when TLS-e is enabled:
-+
-----
-$ oc apply -f - <` files. There is a requirement to index the `<*.conf>` files from '03' to '99', based on precedence. A `<99-*.conf>` file takes the highest precedence, while indexes below '03' are reserved for internal use.
-+
-[NOTE]
-If you adopt a live cloud, you might be required to carry over additional configurations for the default `nova` data plane services that are stored in the cell1 default `nova-extra-config` configuration map. Do not delete or overwrite the existing configuration in the `cell1` default `nova-extra-config` configuration map that is assigned to `nova`. Overwriting the configuration can break the data place services that rely on specific contents of the `nova-extra-config` configuration map.
-
-. Configure a {Ceph} back end for libvirt:
-+
-----
-$ oc apply -f - <-metadata-neutron-config` secret to enable a local metadata service for cell. You should also set
-`spec.nova.template.cellTemplates.cell.metadataServiceTemplate.enable` in the `OpenStackControlPlane/openstack` CR, as described in xref:adopting-the-compute-service_adopt-control-plane[Adopting the Compute service]. You can configure a single top-level metadata, or define the metadata per cell.
-* `nova-$CELL-compute-config` specifies the secret that auto-generates for each `cell`. You must append the `nova-cell-compute-config` for each custom `OpenStackDataPlaneService` CR that is related to the {compute_service}.
-* `nova-migration-ssh-key` specifies the secret that you must append for each custom `OpenStackDataPlaneService` CR that is related to the {compute_service}.
-+
-[NOTE]
-====
-When creating your data plane services for {compute_service} cells, review the following considerations:
-
-* In this example, the same `nova-migration-ssh-key` key is shared across cells. However, you should use different keys for different cells.
-* For simple configuration overrides, you do not need a custom data plane service. However, to reconfigure the cell, `cell1`,
-the safest option is to create a custom service and a dedicated configuration map for it.
-* The cell, `cell1`, is already managed with the default `OpenStackDataPlaneService` CR called `nova` and its `nova-extra-config` configuration map. Do not change the default data plane service `nova` definition. The changes are lost when the {rhos_acro} operator is updated with OLM.
-* When a cell spans multiple node sets, give the custom `OpenStackDataPlaneService` resources a name that relates to the node set, for example, `nova-cell1-nfv` and `nova-cell1-enterprise`. The auto-generated configuration maps are then named `nova-cell1-nfv-extra-config` and `nova-cell1-enterprise-extra-config`.
-* Different configurations for nodes in multiple node sets of the same cell are also supported, but are not covered in this guide.
-====
-
-. If TLS Everywhere is enabled, append the following content to the `OpenStackDataPlaneService` CR:
-+
-----
- tlsCerts:
- nova:
- contents:
- - dnsnames
- - ips
- networks:
- - ctlplane
- issuer: osp-rootca-issuer-internal
- edpmRoleServiceName: nova
- caCerts: combined-ca-bundle
- edpmServiceType: nova
-----
-
-ifeval::["{build}" == "downstream"]
-. Create a secret for the subscription manager:
-+
-----
-$ oc create secret generic subscription-manager \
---from-literal rhc_auth='{"login": {"username": "", "password": ""}}'
-----
-+
-* Replace `` with the applicable username.
-* Replace `` with the applicable password.
-
-. Create a secret for the Red Hat registry:
-+
-----
-$ oc create secret generic redhat-registry \
---from-literal edpm_container_registry_logins='{"registry.redhat.io": {"": ""}}'
-----
-+
-* Replace `` with the applicable username.
-* Replace `` with the applicable password.
-endif::[]
-+
-
-[NOTE]
-You do not need to reference the `subscription-manager` secret in the `dataSources` field of the `OpenStackDataPlaneService` CR.
-The secret is already passed in with a node-specific `OpenStackDataPlaneNodeSet` CR in the `ansibleVarsFrom` property in the `nodeTemplate` field.
-
-
-. Create the data plane node set definitions for each cell:
-+
-[subs="+quotes"]
-----
-$ declare -A names
-$ for CELL in $(echo $RENAMED_CELLS); do
- ref="COMPUTES_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')"
- eval names=\${!${ref}[@]}
- ref_api="COMPUTES_API_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')"
- [ -z "$names" ] && continue
- ind=0
- rm -f computes-$CELL
- for compute in $names; do
- ip="${ref}['$compute']"
- ip_api="${ref_api}['$compute']"
- cat >> computes-$CELL << EOF
- ${compute}:
- hostName: $compute
- ansible:
- ansibleHost: $compute
- networks:
- - defaultRoute: true
- fixedIP: ${!ip}
- name: ctlplane
- subnetName: subnet1
- - name: internalapi
- subnetName: subnet1
- fixedIP: ${!ip_api}
- - name: storage
- subnetName: subnet1
- - name: tenant
- subnetName: subnet1
-EOF
- ind=$(( ind + 1 ))
- done
-
- test -f computes-$CELL || continue
- cat > nodeset-${CELL}.yaml <", state: enabled}
- - {name: "", state: enabled}
- - {name: "", state: enabled}
- - {name: "", state: enabled}
- - {name: "", state: enabled}
- - {name: "", state: enabled}
-endif::[]
- edpm_bootstrap_release_version_package: []
- # edpm_network_config
- # Default nic config template for a EDPM node
- # These vars are edpm_network_config role vars
- edpm_network_config_template: |
- ---
- {% set mtu_list = [ctlplane_mtu] %}
- {% for network in nodeset_networks %}
- {% set _ = mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) %}
- {%- endfor %}
- {% set min_viable_mtu = mtu_list | max %}
- network_config:
- - type: ovs_bridge
- name: {{ neutron_physical_bridge_name }}
- mtu: {{ min_viable_mtu }}
- use_dhcp: false
- dns_servers: {{ ctlplane_dns_nameservers }}
- domain: {{ dns_search_domains }}
- addresses:
- - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
- routes: {{ ctlplane_host_routes }}
- members:
- - type: interface
- name: nic1
- mtu: {{ min_viable_mtu }}
- # force the MAC address of the bridge to this interface
- primary: true
- {% for network in nodeset_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 %}
-
- edpm_network_config_nmstate: false
- # Control resolv.conf management by NetworkManager
- # false = disable NetworkManager resolv.conf update (default)
- # true = enable NetworkManager resolv.conf update
- edpm_bootstrap_network_resolvconf_update: false
- edpm_network_config_hide_sensitive_logs: false
- #
- # These vars are for the network config templates themselves and are
- # considered EDPM network defaults.
- neutron_physical_bridge_name: br-ctlplane
- neutron_public_interface_name: eth0
-
- # edpm_nodes_validation
- edpm_nodes_validation_validate_controllers_icmp: false
- edpm_nodes_validation_validate_gateway_icmp: false
-
- # edpm ovn-controller configuration
- edpm_ovn_bridge_mappings: [<"bridge_mappings">]
- edpm_ovn_bridge: br-int
- edpm_ovn_encap_type: geneve
- ovn_monitor_all: true
- edpm_ovn_remote_probe_interval: 60000
- edpm_ovn_ofctrl_wait_before_clear: 8000
-
- timesync_ntp_servers:
-ifeval::["{build}" != "downstream"]
- - hostname: pool.ntp.org
-endif::[]
-ifeval::["{build}" == "downstream"]
- - hostname: clock.redhat.com
- - hostname: clock2.redhat.com
-endif::[]
-
-ifeval::["{build}" != "downstream"]
- edpm_bootstrap_command: |
- # This is a hack to deploy RDO Delorean repos to RHEL as if it were Centos 9 Stream
- set -euxo pipefail
- curl -sL https://github.com/openstack-k8s-operators/repo-setup/archive/refs/heads/main.tar.gz | tar -xz
- python3 -m venv ./venv
- PBR_VERSION=0.0.0 ./venv/bin/pip install ./repo-setup-main
- # This is required for FIPS enabled until trunk.rdoproject.org
- # is not being served from a centos7 host, tracked by
- # https://issues.redhat.com/browse/RHOSZUUL-1517
- sudo dnf -y install crypto-policies
- sudo update-crypto-policies --set FIPS:NO-ENFORCE-EMS
- sudo ./venv/bin/repo-setup current-podified -b antelope -d centos9 --stream
- sudo dnf -y upgrade openstack-selinux
- sudo rm -f /run/virtlogd.pid
- sudo rm -rf repo-setup-main
-endif::[]
-ifeval::["{build}" == "downstream"]
- edpm_bootstrap_command: |
- set -euxo pipefail
- sudo dnf -y upgrade openstack-selinux
- sudo rm -f /run/virtlogd.pid
-endif::[]
-
- gather_facts: false
- # edpm firewall, change the allowed CIDR if needed
- edpm_sshd_configure_firewall: true
- edpm_sshd_allowed_ranges: ['192.168.122.0/24']
-
- # Do not attempt OVS major upgrades here
- edpm_ovs_packages:
- - openvswitch3.3
- edpm_default_mounts:
- - path: /dev/hugepages
- opts: pagesize=
- fstype: hugetlbfs
- group: hugetlbfs
- nodes:
-EOF
- cat computes-$CELL >> nodeset-${CELL}.yaml
-done
-----
-+
-* `${compute}.hostName` specifies the FQDN for the node if your deployment has a custom DNS Domain.
-* `${compute}.networks` specifies the network composition. The network composition must match the source cloud configuration to avoid data plane connectivity downtime. The `ctlplane` network must come first. The commands only retain IP addresses for the hosts on the `ctlplane` and `internalapi` networks. Repeat this step for other isolated networks, or update the resulting files manually.
-* `${compute}.ansible.ansibleHost` specifies the Ansible host for the Compute node. If you are not using DNS, use the value `${!ip}`.
-* `metadata.name:` specifies the node set names for each cell, for example, `openstack-cell1`, `openstack-cell2`. Only create node sets for cells that contain Compute nodes.
-* `spec.tlsEnabled` specifies whether TLS Everywhere is enabled. If it is enabled, change `tlsEnabled` to `true`.
-* `spec.services` specifies the services to be adopted. If you are not adopting telemetry services, omit it from the services list.
-* `neutron_physical_bridge_name: br-ctlplane` specifies the bridge name. The bridge name and other OVN and {networking_service}-specific values must match the source cloud configuration to avoid data plane connectivity downtime.
-* `edpm_ovn_bridge_mappings`: Replace `[<"bridge_mappings">]` with the value of the bridge mappings in your configuration, for example, `["datacentre:br-ctlplane"]`.
-* `path: /dev/hugepages` and `opts: pagesize=` configures huge pages. Replace `` with the size of the page. To configure multi-sized huge pages, create more items in the list. Note that the mount points must match the source cloud configuration.
-* ``, ``, ``, ``, ``, `` specifies the name of the repository to enable. For more information about which repositories are required, see link:https://access.redhat.com/articles/7139612[Required repositories for Red Hat OpenStack Services on OpenShift 18.0].
-+
-[NOTE]
-====
-Ensure that you use the same `ovn-controller` settings in the `OpenStackDataPlaneNodeSet` CR that you used in the {compute_service} nodes before adoption. This configuration is stored in the `external_ids` column in the `Open_vSwitch` table in the Open vSwitch database:
-
-----
-$ ovs-vsctl list Open .
-...
-external_ids : {hostname=standalone.localdomain, ovn-bridge=br-int, ovn-bridge-mappings=, ovn-chassis-mac-mappings="datacentre:1e:0a:bb:e6:7c:ad", ovn-encap-ip="172.19.0.100", ovn-encap-tos="0", ovn-encap-type=geneve, ovn-match-northd-version=False, ovn-monitor-all=True, ovn-ofctrl-wait-before-clear="8000", ovn-openflow-probe-interval="60", ovn-remote="tcp:ovsdbserver-sb.openstack.svc:6642", ovn-remote-probe-interval="60000", rundir="/var/run/openvswitch", system-id="2eec68e6-aa21-4c95-a868-31aeafc11736"}
-...
-----
-====
-
-. Deploy the `OpenStackDataPlaneNodeSet` CRs for each Compute cell:
-+
-----
-for CELL in $(echo $RENAMED_CELLS); do
-test -f nodeset-${CELL}.yaml || continue
-oc apply -f nodeset-${CELL}.yaml
-done
-----
-
-. If you use a {Ceph} back end for {block_storage_first_ref}, prepare the adopted data plane workloads:
-+
-----
-for CELL in $(echo $RENAMED_CELLS); do
-test -f nodeset-${CELL}.yaml || continue
-oc patch osdpns/openstack-$CELL --type=merge --patch "
-spec:
- services:
-ifeval::["{build}" == "downstream"]
- - redhat
-endif::[]
- - bootstrap
- - download-cache
- - configure-network
- - validate-network
- - install-os
- - configure-os
- - ssh-known-hosts
- - run-os
- - reboot-os
- - ceph-client
- - install-certs
- - ovn
- - neutron-metadata
- - libvirt
- - nova-$CELL
- - telemetry
- nodeTemplate:
- extraMounts:
- - extraVolType: Ceph
- volumes:
- - name: ceph
- secret:
- secretName: ceph-conf-files
- mounts:
- - name: ceph
- mountPath: "/etc/ceph"
- readOnly: true
- "
-done
-----
-ifeval::["{build}" != "downstream"]
-+
-[NOTE]
-====
-Ensure that you use the same list of services from the original `OpenStackDataPlaneNodeSet` CR, except for the `ceph-client` and `ceph-hci-pre` services.
-
-For environments that are enabled with border gateway protocol (BGP), you must add the following services to the list in the order shown:
-
-* After `configure-network` and before `validate-network`: Add `frr` service for FRRouting BGP support
-* After `neutron-metadata` and before `libvirt`: Add `ovn-bgp-agent` service for OVN BGP agent
-
-You must also configure the following additional Ansible variables in the `nodeTemplate.ansible.ansibleVars` section:
-
-* `edpm_frr_image`: The FRRouting container image
-* `edpm_ovn_bgp_agent_image`: The OVN BGP agent container image
-* `edpm_frr_bgp_ipv4_src_network`: The network name for BGP IPv4 source (for example, `bgpmainnet`)
-* `edpm_frr_bgp_ipv6_src_network`: The network name for BGP IPv6 source (for example, `bgpmainnetv6`)
-* `edpm_frr_bgp_neighbor_password`: The BGP neighbor password
-* `edpm_ovn_encap_ip`: Set to the BGP main network IP (for example, `{{ lookup("vars", "bgpmainnet_ip") }}`)
-====
-endif::[]
-
-. Optional: Enable `neutron-sriov-nic-agent` in the `OpenStackDataPlaneNodeSet` CR:
-+
-----
-for CELL in $(echo $RENAMED_CELLS); do
-test -f nodeset-${CELL}.yaml || continue
-oc patch openstackdataplanenodeset openstack-$CELL --type='json' --patch='[
-{
- "op": "add",
- "path": "/spec/services/-",
- "value": "neutron-sriov"
-}, {
- "op": "add",
- "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_physical_device_mappings",
- "value": "dummy_sriov_net:dummy-dev"
-}, {
- "op": "add",
- "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_resource_provider_bandwidths",
- "value": "dummy-dev:40000000:40000000"
-}, {
- "op": "add",
- "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_resource_provider_hypervisors",
- "value": "dummy-dev:standalone.localdomain"
-}]'
-done
-----
-
-. Optional: Enable `neutron-dhcp` in the `OpenStackDataPlaneNodeSet` CR:
-+
-----
-for CELL in $(echo $RENAMED_CELLS); do
-test -f nodeset-${CELL}.yaml || continue
-oc patch openstackdataplanenodeset openstack-$CELL --type='json' --patch='[
-{
- "op": "add",
- "path": "/spec/services/-",
- "value": "neutron-dhcp"
-}]'
-done
-----
-+
-[NOTE]
-====
-To use `neutron-dhcp` with OVN for the {bare_metal_first_ref}, you must set the `disable_ovn_dhcp_for_baremetal_ports` configuration option for the {networking_first_ref} to `true`. You can set this configuration in the `NeutronAPI` spec:
-----
-..
-spec:
- serviceUser: neutron
- ...
- customServiceConfig: |
- [DEFAULT]
- dhcp_agent_notification = True
- [ovn]
- disable_ovn_dhcp_for_baremetal_ports = true
-----
-====
-. Run the pre-adoption validation:
-
-.. Create the validation service:
-+
-----
-$ oc apply -f - <"' | base64 -d | awk '/fsid/{print $3}')
-$ CEPH_FSID_DCN1=$(oc get secret ceph-conf-dcn1 -o json | jq -r '.data.""' | base64 -d | awk '/fsid/{print $3}')
-$ CEPH_FSID_DCN2=$(oc get secret ceph-conf-dcn2 -o json | jq -r '.data.""' | base64 -d | awk '/fsid/{print $3}')
-----
-+
-where:
-
-``::
-Specifies the name of the {Ceph} configuration file for the central site in the `ceph-conf-central` secret.
-
-``::
-Specifies the name of the {Ceph} configuration file for an edge site in the `ceph-conf-dcn1` secret.
-
-``::
-Specifies the name of the {Ceph} configuration file for an additional edge site in the `ceph-conf-dcn2` secret.
-
-. Create a `ConfigMap` for each site. Each `ConfigMap` contains the {Ceph} and {image_service} configuration specific to that site.
-+
-The following example creates `ConfigMap` resources for a central site and two edge sites.
-+
-.. Create the `ConfigMap` for the central site:
-+
-----
-$ oc apply -f - <*
- spec:
- type: LoadBalancer
- networkAttachments:
- - storage
-----
-+
-where:
-
-<172.17.0.80>::
-Specifies the load balancer IP. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-+
-[NOTE]
-The {block_storage} as a back end establishes a dependency with the {image_service}. Any deployed `GlanceAPI` instances do not work if the {image_service} is configured with the {block_storage} that is not available in the `OpenStackControlPlane` custom resource.
-After the {block_storage}, and in particular `CinderVolume`, is adopted, you can proceed with the `GlanceAPI` adoption. For more information, see xref:adopting-the-block-storage-service_adopt-control-plane[Adopting the Block Storage service].
-
-. Verify that `CinderVolume` is available:
-+
-----
-$ oc get pod -l component=cinder-volume | grep Running
-cinder-volume-75cb47f65-92rxq 3/3 Running 0
-----
-
-. Patch the `GlanceAPI` service that is deployed in the control plane:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file=glance_cinder.patch
-----
diff --git a/docs_user/modules/proc_adopting-image-service-with-ceph-backend.adoc b/docs_user/modules/proc_adopting-image-service-with-ceph-backend.adoc
deleted file mode 100644
index d1e3d9f41..000000000
--- a/docs_user/modules/proc_adopting-image-service-with-ceph-backend.adoc
+++ /dev/null
@@ -1,82 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-image-service-with-ceph-backend_{context}"]
-
-= Adopting the {image_service} that is deployed with a {Ceph} back end
-
-[role="_abstract"]
-Adopt the {image_service_first_ref} that you deployed with a {Ceph} back end. Use the `customServiceConfig` parameter to inject the right configuration to the `GlanceAPI` instance.
-
-.Prerequisites
-
-* You have completed the previous adoption steps.
-* Ensure that the Ceph-related secret (`ceph-conf-files`) is created in
-the `openstack` namespace and that the `extraMounts` property of the
-`OpenStackControlPlane` custom resource (CR) is configured properly. For more information, see xref:configuring-a-ceph-backend_migrating-databases[Configuring a Ceph back end].
-+
-[subs="+quotes"]
-----
-$ cat << EOF > glance_patch.yaml
-spec:
- glance:
- enabled: true
- template:
- databaseInstance: openstack
- customServiceConfig: |
- [DEFAULT]
- enabled_backends=default_backend:rbd
- [glance_store]
- default_backend=default_backend
- [default_backend]
- rbd_store_ceph_conf=/etc/ceph/ceph.conf
- rbd_store_user=openstack
- rbd_store_pool=images
- store_description=Ceph glance store backend.
- storage:
- storageRequest: 10G
- glanceAPIs:
- default:
- replicas: 3
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- *metallb.universe.tf/loadBalancerIPs: <172.17.0.80>*
- spec:
- type: LoadBalancer
- networkAttachments:
- - storage
-EOF
-----
-+
-where:
-
-<172.17.0.80>::
-Specifies the load balancer IP. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-
-[NOTE]
-====
-If you backed up your {rhos_prev_long} ({OpenStackShort}) services configuration file from the original environment, you can compare it with the confgiuration file that you adopted and ensure that the configuration is correct.
-For more information, see xref:pulling-configuration-from-tripleo-deployment_adopt-control-plane[Pulling the configuration from a {OpenStackPreviousInstaller} deployment].
-
-ifeval::["{build_variant}" == "ospdo"]
-[NOTE]
-Os-diff does not currently support director Operator.
-endif::[]
-
-----
-os-diff diff /tmp/collect_tripleo_configs/glance/etc/glance/glance-api.conf glance_patch.yaml --crd
-----
-
-This command produces the difference between both ini configuration files.
-====
-
-.Procedure
-
-* Patch the `OpenStackControlPlane` CR to deploy the {image_service} with a {Ceph} back end:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file glance_patch.yaml
-----
diff --git a/docs_user/modules/proc_adopting-image-service-with-dcn-backend.adoc b/docs_user/modules/proc_adopting-image-service-with-dcn-backend.adoc
deleted file mode 100644
index d6b94bb2f..000000000
--- a/docs_user/modules/proc_adopting-image-service-with-dcn-backend.adoc
+++ /dev/null
@@ -1,262 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-image-service-with-dcn-backend_{context}"]
-
-= Adopting the {image_service} with multiple {Ceph} back ends (DCN)
-
-[role="_abstract"]
-Adopt the {image_service_first_ref} in a Distributed Compute Node (DCN) deployment with multiple {CephCluster} clusters that provide storage at different sites.
-
-This configuration deploys multiple `GlanceAPI` instances: a central API with access to all {Ceph} clusters, and edge APIs at each DCN site with access to their local cluster and the central cluster.
-
-During adoption, the {image_service} instances that ran on edge site Compute nodes are migrated to run on {rhocp_long} at the central site. Although the control path for API requests now traverses the WAN to reach the {image_service} running on {rhocp_long}, the data path remains local. Image data continues to be stored in the {Ceph} cluster at each edge site. When you create a virtual machine or volume from an image, the operation occurs at the local {Ceph} cluster. This architecture uses {Ceph} shallow copies (copy-on-write clones) to enable fast boot times without transferring image data across the WAN.
-
-The virtual IP addresses (VIPs) used by {compute_service} nodes to reach the {image_service} change during adoption. Before adoption, edge site nodes contact a local {image_service} VIP on the `internalapi` subnet. After adoption, they contact a {rhocp_long} service endpoint on a different `internalapi` subnet. The following table shows an example of this change:
-
-[cols="1,2,2"]
-|===
-| Site | Before adoption | After adoption
-
-| Central
-| {identity_service} catalog VIP
-| {identity_service} catalog updated to `\http://glance-central-internal.openstack.svc:9292`
-
-| DCN1
-| `\http://172.17.10.111:9293`
-| `\http://glance-dcn1-internal.openstack.svc:9292`
-
-| DCN2
-| `\http://172.17.20.121:9293`
-| `\http://glance-dcn2-internal.openstack.svc:9292`
-|===
-
-In {rhos_prev_long}, the internal {image_service} endpoint at edge sites used TCP port 9293, after adoption, all {image_service} endpoints use port 9292. The new endpoints are backed by MetalLB load balancer IPs that you assign using the `metallb.universe.tf/loadBalancerIPs` annotation on each `GlanceAPI`. When you patch the `OpenStackControlPlane` custom resource (CR), {rhocp_long} creates internal Kubernetes services (for example, `glance-dcn1-internal.openstack.svc`) that resolve to those MetalLB IPs. The {compute_service} nodes are configured to use these endpoints when you adopt the data plane. For more information, see xref:adopting-compute-services-with-dcn-backend_data-plane[Adopting Compute services with multiple Ceph back ends (DCN)]. The examples in this procedure use `http://` for the {image_service} endpoints. If your {rhos_prev_long} deployment uses TLS for internal endpoints, use `https://` and ensure that you have completed the TLS migration. For more information, see xref:migrating-tls-everywhere_configuring-network[Migrating TLS-e to the RHOSO deployment].
-
-.Prerequisites
-
-* You have completed the previous adoption steps.
-* The per-site {Ceph} secrets (`ceph-conf-central`, `ceph-conf-dcn1`, `ceph-conf-dcn2`) exist and contain the configuration and keyrings for each site's {Ceph} cluster. For more information, see xref:configuring-a-ceph-backend_migrating-databases[Configuring a {Ceph} back end].
-* The `extraMounts` property of the `OpenStackControlPlane` CR is configured to mount the {Ceph} configuration to all Glance instances.
-* You have stopped the {image_service} on all DCN nodes. If your deployment includes `DistributedComputeHCIScaleOut` or `DistributedComputeScaleOut` nodes, you have also stopped HAProxy on those nodes. For more information, see xref:stopping-openstack-services_migrating-databases[Stopping {rhos_prev_long} services].
-
-.Procedure
-
-. Create a patch file for the {image_service} with multiple {Ceph} back ends. Use MetalLB loadbalancer IPs for the {image_service} endpoints:
-+
-Example DCN deployment with a central site and two edge sites:
-+
-[subs="+quotes"]
-----
-$ cat << EOF > glance_dcn_patch.yaml
-spec:
- glance:
- enabled: true
- template:
- databaseInstance: openstack
- databaseAccount: glance
- keystoneEndpoint: central
- storage:
- storageRequest: *<10G>*
- glanceAPIs:
- central:
- type: split
- replicas: 3
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- *metallb.universe.tf/loadBalancerIPs: <172.17.0.80>*
- spec:
- type: LoadBalancer
- networkAttachments:
- - storage
- customServiceConfig: |
- [DEFAULT]
- enabled_import_methods = [web-download,copy-image,glance-direct]
- enabled_backends = central:rbd,dcn1:rbd,dcn2:rbd
- [glance_store]
- default_backend = central
- [central]
- rbd_store_ceph_conf = /etc/ceph/central.conf
- store_description = "Central RBD backend"
- rbd_store_pool = images
- rbd_store_user = openstack
- rbd_thin_provisioning = True
- [dcn1]
- rbd_store_ceph_conf = /etc/ceph/dcn1.conf
- store_description = "DCN1 RBD backend"
- rbd_store_pool = images
- rbd_store_user = openstack
- rbd_thin_provisioning = True
- [dcn2]
- rbd_store_ceph_conf = /etc/ceph/dcn2.conf
- store_description = "DCN2 RBD backend"
- rbd_store_pool = images
- rbd_store_user = openstack
- rbd_thin_provisioning = True
- dcn1:
- type: edge
- replicas: 2
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- *metallb.universe.tf/loadBalancerIPs: <172.17.0.81>*
- spec:
- type: LoadBalancer
- networkAttachments:
- - storage
- customServiceConfig: |
- [DEFAULT]
- enabled_import_methods = [web-download,copy-image,glance-direct]
- enabled_backends = central:rbd,dcn1:rbd
- [glance_store]
- default_backend = dcn1
- [central]
- rbd_store_ceph_conf = /etc/ceph/central.conf
- store_description = "Central RBD backend"
- rbd_store_pool = images
- rbd_store_user = openstack
- rbd_thin_provisioning = True
- [dcn1]
- rbd_store_ceph_conf = /etc/ceph/dcn1.conf
- store_description = "DCN1 RBD backend"
- rbd_store_pool = images
- rbd_store_user = openstack
- rbd_thin_provisioning = True
- dcn2:
- type: edge
- replicas: 2
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- *metallb.universe.tf/loadBalancerIPs: <172.17.0.82>*
- spec:
- type: LoadBalancer
- networkAttachments:
- - storage
- customServiceConfig: |
- [DEFAULT]
- enabled_import_methods = [web-download,copy-image,glance-direct]
- enabled_backends = central:rbd,dcn2:rbd
- [glance_store]
- default_backend = dcn2
- [central]
- rbd_store_ceph_conf = /etc/ceph/central.conf
- store_description = "Central RBD backend"
- rbd_store_pool = images
- rbd_store_user = openstack
- rbd_thin_provisioning = True
- [dcn2]
- rbd_store_ceph_conf = /etc/ceph/dcn2.conf
- store_description = "DCN2 RBD backend"
- rbd_store_pool = images
- rbd_store_user = openstack
- rbd_thin_provisioning = True
-EOF
-----
-+
-where:
-
-`<172.17.0.80>`::
-Specifies the load balancer IP for the central {image_service} API.
-
-`<172.17.0.81>`::
-Specifies the load balancer IP for the DCN1 edge {image_service} API.
-
-`<172.17.0.82>`::
-Specifies the load balancer IP for the DCN2 edge {image_service} API.
-
-+
-You must configure the Compute nodes at each site to use their local {image_service} endpoints. For example, Compute nodes at central use 172.17.0.80, Compute nodes at dcn1 use 172.17.0.81, and Compute nodes at dcn2 use 172.17.0.82. This configuration is applied when you adopt the data plane by adding a per-site ConfigMap with the `glance_api_servers` setting to each `OpenStackDataPlaneNodeSet`. For more information, see xref:adopting-compute-services-to-the-data-plane_data-plane[Adopting Compute services to the data plane].
-
-+
-[NOTE]
-====
-* The central `GlanceAPI` uses `type: split` and has access to all {Ceph} clusters. The `keystoneEndpoint: central` setting registers this API as the public endpoint in the {identity_service}.
-* Each edge `GlanceAPI` uses `type: edge` and has access to its local {Ceph} cluster plus the central cluster. This enables image copying between sites.
-* Set the `storageRequest` PVC size based on the storage requirements of each edge site.
-* Adjust the number of edge sites and their names to match your DCN deployment.
-====
-
-. Patch the `OpenStackControlPlane` CR to deploy the {image_service} with multiple {Ceph} back ends:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file glance_dcn_patch.yaml
-----
-
-. Verify that the {image_service} stores are available for each site:
-+
-----
-$ glance stores-info
-+----------+----------------------------------------------------------------------------------+
-| Property | Value |
-+----------+----------------------------------------------------------------------------------+
-| stores | [{"id": "central", "description": "Central RBD backend", "default": "true"}, |
-| | {"id": "dcn1", "description": "dcn1 RBD backend"}, {"id": "dcn2", "description": |
-| | "dcn2 RBD backend"}] |
-+----------+----------------------------------------------------------------------------------+
-----
-+
-The output should list one store for each {Ceph} back end configured in the central `GlanceAPI`, and the central store should be marked as the default. If any stores are missing, check the `customServiceConfig` in the `glanceAPIs` section of the patch and verify that the {Ceph} configuration files are present in the `ceph-conf-central` secret.
-
-. Verify that image import methods include `copy-image`, which is required for copying images between stores:
-+
-----
-$ glance import-info
-+----------------+----------------------------------------------------------------------------------+
-| Property | Value |
-+----------------+----------------------------------------------------------------------------------+
-| import-methods | {"description": "Import methods available.", "type": "array", "value": ["web- |
-| | download", "copy-image", "glance-direct"]} |
-+----------------+----------------------------------------------------------------------------------+
-----
-
-. Upload a test image to the central store. Note the image ID:
-+
-----
-$ glance image-create --disk-format raw --container-format bare --name test-image \
- --file --store central
-----
-
-. Verify that the image ID from the previous command is shown in the central {CephCluster} cluster's `images` pool:
-+
-----
-$ sudo cephadm shell --config /etc/ceph/central.conf --keyring /etc/ceph/central.client.openstack.keyring \
- -- rbd -p images --cluster central ls -l
-NAME SIZE PARENT FMT PROT LOCK
- 20 MiB 2
-----
-
-. Copy the image to an edge site using the `copy-image` import method:
-+
-----
-$ glance image-import --stores dcn1 --import-method copy-image
-----
-
-. After the import completes, verify that the `stores` field on the image now includes both `central` and `dcn1`:
-+
-----
-$ glance image-show | grep stores
-| stores | central,dcn1 |
-----
-
-. Verify the image was copied to the DCN1 {CephCluster} cluster:
-+
-----
-$ sudo cephadm shell --config /etc/ceph/dcn1.conf --keyring /etc/ceph/dcn1.client.openstack.keyring \
- -- rbd -p images --cluster dcn1 ls -l
-NAME SIZE PARENT FMT PROT LOCK
- 20 MiB 2
-----
-+
-The image is now present on the DCN1 {CephCluster} cluster, confirming that {image_service} can copy images between sites. Repeat the `glance image-import` command for each additional edge site to distribute the image to all DCN locations.
diff --git a/docs_user/modules/proc_adopting-image-service-with-nfs-backend.adoc b/docs_user/modules/proc_adopting-image-service-with-nfs-backend.adoc
deleted file mode 100644
index 6eda37d46..000000000
--- a/docs_user/modules/proc_adopting-image-service-with-nfs-backend.adoc
+++ /dev/null
@@ -1,204 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-image-service-with-nfs-backend_{context}"]
-
-= Adopting the {image_service} that is deployed with an NFS back end
-
-[role="_abstract"]
-Adopt the {image_service_first_ref} that you deployed with an NFS back end. To complete the following procedure, ensure that your environment meets the following criteria:
-
-* The Storage network is propagated to the {rhos_prev_long} ({OpenStackShort}) control plane.
-* The {image_service} can reach the Storage network and connect to the nfs-server through the port `2049`.
-
-.Prerequisites
-
-* You have completed the previous adoption steps.
-* In the source cloud, verify the NFS parameters that the overcloud uses to configure the {image_service} back end. Specifically, in your{OpenStackPreviousInstaller} heat templates, find the following variables that override the default content that is provided by the `glance-nfs.yaml` file in the
-`/usr/share/openstack-tripleo-heat-templates/environments/storage` directory:
-+
-----
-
-GlanceBackend: file
-GlanceNfsEnabled: true
-GlanceNfsShare: 192.168.24.1:/var/nfs
-
-----
-+
-[NOTE]
-====
-In this example, the `GlanceBackend` variable shows that the {image_service} has no notion of an NFS back end. The variable is using the `File` driver and, in the background, the `filesystem_store_datadir`. The `filesystem_store_datadir` is mapped to the export value provided by the `GlanceNfsShare` variable instead of `/var/lib/glance/images/`.
-If you do not export the `GlanceNfsShare` through a network that is propagated to the adopted {rhos_long} control plane, you must stop the `nfs-server` and remap the export to the `storage` network. Before doing so, ensure that the {image_service} is stopped in the source Controller nodes.
-ifeval::["{build}" != "downstream"]
-In the control plane, as per the (https://github.com/openstack-k8s-operators/docs/blob/main/images/network_diagram.jpg)[network isolation diagram],
-the {image_service} is attached to the Storage network, propagated via the associated `NetworkAttachmentsDefinition` custom resource, and the resulting Pods have already the right permissions to handle the {image_service} traffic through this network.
-endif::[]
-
-ifeval::["{build}" != "upstream"]
-In the control plane, the {image_service} is attached to the Storage network, then propagated through the associated `NetworkAttachmentsDefinition` custom resource (CR), and the resulting pods already have the right permissions to handle the {image_service} traffic through this network.
-endif::[]
-In a deployed {OpenStackShort} control plane, you can verify that the network mapping matches with what has been deployed in the {OpenStackPreviousInstaller}-based environment by checking both the `NodeNetworkConfigPolicy` (`nncp`) and the `NetworkAttachmentDefinition` (`net-attach-def`). The following is an example of the output that you should check in the {rhocp_long} environment to make sure that there are no issues with the propagated networks:
-
-----
-$ oc get nncp
-NAME STATUS REASON
-enp6s0-crc-8cf2w-master-0 Available SuccessfullyConfigured
-
-$ oc get net-attach-def
-NAME
-ctlplane
-internalapi
-storage
-tenant
-
-$ oc get ipaddresspool -n metallb-system
-NAME AUTO ASSIGN AVOID BUGGY IPS ADDRESSES
-ctlplane true false ["192.168.122.80-192.168.122.90"]
-internalapi true false ["172.17.0.80-172.17.0.90"]
-storage true false ["172.18.0.80-172.18.0.90"]
-tenant true false ["172.19.0.80-172.19.0.90"]
-----
-====
-
-.Procedure
-
-. Adopt the {image_service} and create a new `default` `GlanceAPI` instance that is connected with the existing NFS share:
-+
-[subs="+quotes"]
-----
-$ cat << EOF > glance_nfs_patch.yaml
-
-spec:
- extraMounts:
- - extraVol:
- - extraVolType: Nfs
- mounts:
- - mountPath: /var/lib/glance/images
- name: nfs
- propagation:
- - Glance
- volumes:
- - name: nfs
- nfs:
- *path: *
- *server: *
- name: r1
- region: r1
- glance:
- enabled: true
- template:
- databaseInstance: openstack
- customServiceConfig: |
- [DEFAULT]
- enabled_backends = default_backend:file
- [glance_store]
- default_backend = default_backend
- [default_backend]
- filesystem_store_datadir = /var/lib/glance/images/
- storage:
- storageRequest: 10G
- keystoneEndpoint: nfs
- glanceAPIs:
- nfs:
- replicas: 3
- type: single
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: *<172.17.0.80>*
- spec:
- type: LoadBalancer
- networkAttachments:
- - storage
-EOF
-----
-+
-where:
-
-::
-Specifies the exported path in the `nfs-server`.
-::
-Specifies the IP address that you use to communicate with the `nfs-server`.
-<172.17.0.80>::
-Specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-
-. Patch the `OpenStackControlPlane` CR to deploy the {image_service} with an NFS back end:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file glance_nfs_patch.yaml
-----
-
-. Patch the `OpenStackControlPlane` CR to remove the default {image_service}:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=json -p="[{'op': 'remove', 'path': '/spec/glance/template/glanceAPIs/default'}]"
-----
-
-.Verification
-
-* When `GlanceAPI` is active, confirm that you can see a single API instance:
-+
-----
-$ oc get pods -l service=glance
-NAME READY STATUS RESTARTS
-glance-nfs-single-0 2/2 Running 0
-glance-nfs-single-1 2/2 Running 0
-glance-nfs-single-2 2/2 Running 0
-----
-
-* Ensure that the description of the pod reports the following output:
-+
-----
-Mounts:
-...
- nfs:
- Type: NFS (an NFS mount that lasts the lifetime of a pod)
- Server: {{ server ip address }}
- Path: {{ nfs export path }}
- ReadOnly: false
-...
-----
-
-* Check that the mountpoint that points to `/var/lib/glance/images` is mapped to the expected `nfs server ip` and `nfs path` that you defined in the new default `GlanceAPI` instance:
-+
-----
-$ oc rsh -c glance-api glance-default-single-0
-
-sh-5.1# mount
-...
-...
-{{ ip address }}:/var/nfs on /var/lib/glance/images type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.18.0.5,local_lock=none,addr=172.18.0.5)
-...
-...
-----
-
-* Confirm that the UUID is created in the exported directory on the NFS node. For example:
-+
-----
-$ oc rsh openstackclient
-$ openstack image list
-
-sh-5.1$ curl -L -o /tmp/cirros-0.6.3-x86_64-disk.img http://download.cirros-cloud.net/0.6.3/cirros-0.6.3-x86_64-disk.img
-...
-...
-
-sh-5.1$ openstack image create --container-format bare --disk-format raw --file /tmp/cirros-0.6.3-x86_64-disk.img cirros
-...
-...
-
-sh-5.1$ openstack image list
-+--------------------------------------+--------+--------+
-| ID | Name | Status |
-+--------------------------------------+--------+--------+
-| 634482ca-4002-4a6d-b1d5-64502ad02630 | cirros | active |
-+--------------------------------------+--------+--------+
-----
-
-* On the `nfs-server` node, the same `uuid` is in the exported `/var/nfs`:
-+
-----
-$ ls /var/nfs/
-634482ca-4002-4a6d-b1d5-64502ad02630
-----
diff --git a/docs_user/modules/proc_adopting-image-service-with-object-storage-backend.adoc b/docs_user/modules/proc_adopting-image-service-with-object-storage-backend.adoc
deleted file mode 100644
index 53a141d1a..000000000
--- a/docs_user/modules/proc_adopting-image-service-with-object-storage-backend.adoc
+++ /dev/null
@@ -1,97 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-image-service-with-object-storage-backend_{context}"]
-
-= Adopting the {image_service} that is deployed with a {object_storage} back end
-
-[role="_abstract"]
-Adopt the {image_service_first_ref} with an {object_storage_first_ref} back end by using the following configuration from the control plane `glanceAPI` instance. Use this configuration in the patch manifest that deploys the {image_service} with the object storage back end.
-
-----
-..
-spec
- glance:
- ...
- customServiceConfig: |
- [DEFAULT]
- enabled_backends = default_backend:swift
- [glance_store]
- default_backend = default_backend
- [default_backend]
- swift_store_create_container_on_put = True
- swift_store_auth_version = 3
- swift_store_auth_address = {{ .KeystoneInternalURL }}
- swift_store_endpoint_type = internalURL
- swift_store_user = service:glance
- swift_store_key = {{ .ServicePassword }}
-----
-
-.Prerequisites
-
-* You have completed the previous adoption steps.
-
-.Procedure
-
-. Create a new file, for example, `glance_swift.patch`, and include the following content:
-+
-[subs="+quotes"]
-----
-spec:
- glance:
- enabled: true
- apiOverride:
- route: {}
- template:
- secret: osp-secret
- databaseInstance: openstack
- storage:
- storageRequest: 10G
- customServiceConfig: |
- [DEFAULT]
- enabled_backends = default_backend:swift
- [glance_store]
- default_backend = default_backend
- [default_backend]
- swift_store_create_container_on_put = True
- swift_store_auth_version = 3
- swift_store_auth_address = {{ .KeystoneInternalURL }}
- swift_store_endpoint_type = internalURL
- swift_store_user = service:glance
- swift_store_key = {{ .ServicePassword }}
- glanceAPIs:
- default:
- replicas: 1
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: *<172.17.0.80>*
- spec:
- type: LoadBalancer
- networkAttachments:
- - storage
-----
-+
-where:
-
-<172.17.0.80>::
-Specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-+
-[NOTE]
-The {object_storage} as a back end establishes a dependency with the {image_service}. Any deployed `GlanceAPI` instances do not work if the {image_service} is configured with the {object_storage} that is not available in the `OpenStackControlPlane` custom resource.
-After the {object_storage}, and in particular `SwiftProxy`, is adopted, you can proceed with the `GlanceAPI` adoption. For more information, see xref:adopting-the-object-storage-service_adopt-control-plane[Adopting the Object Storage service].
-
-. Verify that `SwiftProxy` is available:
-+
-----
-$ oc get pod -l component=swift-proxy | grep Running
-swift-proxy-75cb47f65-92rxq 3/3 Running 0
-----
-
-. Patch the `GlanceAPI` service that is deployed in the control plane:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file=glance_swift.patch
-----
diff --git a/docs_user/modules/proc_adopting-key-manager-service-with-hsm-integration.adoc b/docs_user/modules/proc_adopting-key-manager-service-with-hsm-integration.adoc
deleted file mode 100644
index 0f803c499..000000000
--- a/docs_user/modules/proc_adopting-key-manager-service-with-hsm-integration.adoc
+++ /dev/null
@@ -1,181 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-key-manager-service-with-hsm-integration_{context}"]
-
-= Adopting the {key_manager} with HSM integration
-
-[role="_abstract"]
-When your source {OpenStackPreviousInstaller} environment includes hardware security module (HSM) integration, you must use the HSM-enabled adoption approach to preserve HSM functionality and maintain access to HSM-backed secrets.
-
-.Prerequisites
-
-* The source {OpenStackPreviousInstaller} environment with HSM integration is configured.
-* HSM client software and certificates are available from accessible URLs.
-* The target {rhos_long} environment with HSM infrastructure is accessible.
-* HSM-enabled {key_manager_first_ref} container images are built and available in your registry.
-
-.Procedure
-
-. Confirm that your source environment configuration includes HSM integration:
-+
-[source,bash]
-----
-$ ssh tripleo-admin@controller-0.ctlplane \
- "sudo cat /var/lib/config-data/puppet-generated/barbican/etc/barbican/barbican.conf | grep -A5 '\[.*plugin\]'"
-----
-+
-If you see `[p11_crypto_plugin]` or other HSM-specific sections, continue with the HSM adoption.
-
-. Extract the simple crypto key encryption keys (KEK) from your source environment:
-+
-[source,bash]
-----
-$ SIMPLE_CRYPTO_KEK=$(ssh tripleo-admin@controller-0.ctlplane \
- "sudo python3 -c \"import configparser; c = configparser.ConfigParser(); c.read('/var/lib/config-data/puppet-generated/barbican/etc/barbican/barbican.conf'); print(c['simple_crypto_plugin']['kek'])\"")
-----
-
-. Add the KEK to the target environment:
-+
-[source,bash]
-----
-$ oc set data secret/osp-secret "BarbicanSimpleCryptoKEK=${SIMPLE_CRYPTO_KEK}"
-----
-
-. Create HSM-specific secrets in the {rhos_acro} target environment:
-+
-[source,bash]
-----
-# Create HSM login credentials secret
-$ oc create secret generic hsm-login \
- --from-literal=PKCS11Pin= \
- -n openstack
-
-# Create HSM client configuration and certificates secret
-$ oc create secret generic proteccio-data \
- --from-file=client.crt= \
- --from-file=client.key= \
- --from-file=10_8_60_93.CRT= \
- --from-file=proteccio.rc= \
- -n openstack
-----
-+
-where:
-
-
-::
-Specifies the HSM password for your {rhos_acro} environment.
-::
-Specifies the path to the HSM client certificate.
-::
-Specifies the path to the client key.
-::
-Specifies the path to the server certificate.
-::
-Specifies the path to your HSM configuration in your {rhos_acro} environment.
-
-. Patch the `OpenStackControlPlane` custom resource to deploy {key_manager} with HSM support:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- barbican:
- enabled: true
- apiOverride:
- route: {}
- template:
- databaseInstance: openstack
- databaseAccount: barbican
- rabbitMqClusterName: rabbitmq
- secret: osp-secret
- simpleCryptoBackendSecret: osp-secret
- serviceAccount: barbican
- serviceUser: barbican
- passwordSelectors:
- database: BarbicanDatabasePassword
- service: BarbicanPassword
- simplecryptokek: BarbicanSimpleCryptoKEK
- customServiceConfig: |
- [p11_crypto_plugin]
- plugin_name = PKCS11
- library_path = /usr/lib64/libnethsm.so
- token_labels = VHSM1
- mkek_label = adoption_mkek_1
- hmac_label = adoption_hmac_1
- encryption_mechanism = CKM_AES_CBC
- hmac_key_type = CKK_GENERIC_SECRET
- hmac_keygen_mechanism = CKM_GENERIC_SECRET_KEY_GEN
- hmac_mechanism = CKM_SHA256_HMAC
- key_wrap_mechanism = CKM_AES_CBC_PAD
- key_wrap_generate_iv = true
- always_set_cka_sensitive = true
- os_locking_ok = false
- globalDefaultSecretStore: pkcs11
- enabledSecretStores: ["simple_crypto", "pkcs11"]
- pkcs11:
- loginSecret: hsm-login
- clientDataSecret: proteccio-data
- clientDataPath: /etc/proteccio
- barbicanAPI:
- replicas: 1
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: 172.17.0.80
- spec:
- type: LoadBalancer
- barbicanWorker:
- replicas: 1
- barbicanKeystoneListener:
- replicas: 1
-'
-----
-+
-* `library_path` specifies the path to the PKCS#11 library, for example, `/usr/lib64/libnethsm.so` for Proteccio).
-* `token_labels` specifies the HSM partition name, for example, `VHSM1`.
-* `mkek_label` and `hmac_label` specify key labels that are configured in the HSM.
-* `loginSecret` specifies the name of the Kubernetes secret that contains the HSM PIN.
-* `clientDataSecret` specifies the name of the Kubernetes secret that contains the HSM certificates and configuration.
-
-.Verification
-
-. Verify that both secret stores are available:
-+
-[source,bash]
-----
-$ openstack secret store list
-----
-
-. Test the HSM back-end functionality:
-+
-[source,bash]
-----
-$ openstack secret store --name "hsm-test-$(date +%s)" \
- --payload "test-payload" \
- --algorithm aes --mode cbc --bit-length 256
-----
-
-. Verify that the migrated secrets are accessible:
-+
-[source,bash]
-----
-$ openstack secret list
-----
-
-. Check that the {key_manager} services are operational:
-+
-[source,bash]
-----
-$ oc get pods -l service=barbican
-NAME READY STATUS RESTARTS AGE
-barbican-api-5d65949b4-xhkd7 2/2 Running 7 (10m ago) 29d
-barbican-keystone-listener-687cbdc77d-4kjnk 2/2 Running 3 (11m ago) 29d
-barbican-worker-5c4b947d5c-l9jdh 2/2 Running 3 (11m ago) 29d
-----
-
-[NOTE]
-====
-HSM adoption preserves both simple crypto and HSM-backed secrets. The migration process maintains HSM metadata and secret references, ensuring continued access to existing secrets while enabling new secrets to use either back-end.
-====
diff --git a/docs_user/modules/proc_adopting-key-manager-service-with-proteccio-hsm.adoc b/docs_user/modules/proc_adopting-key-manager-service-with-proteccio-hsm.adoc
deleted file mode 100644
index da5b3ccec..000000000
--- a/docs_user/modules/proc_adopting-key-manager-service-with-proteccio-hsm.adoc
+++ /dev/null
@@ -1,221 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-key-manager-service-with-proteccio-hsm_{context}"]
-
-= Adopting the {key_manager} with Proteccio HSM integration
-
-[role="_abstract"]
-Adopt the {key_manager_first_ref} with Proteccio HSM by patching the `OpenStackControlPlane` custom resource (CR) where {key_manager} is disabled. Configure the {key_manager} to use both the `simple_crypto` and `pkcs11` back ends.
-
-The patch starts the service with the configuration parameters from the {rhos_prev_long} ({OpenStackShort}) environment and preserves access to existing HSM-backed secrets.
-
-The {key_manager} Proteccio HSM adoption is complete if you see the following results:
-
-* The `BarbicanAPI`, `BarbicanWorker`, and `BarbicanKeystoneListener` services are up and running with HSM-enabled configuration.
-* All secrets from the source {OpenStackShort} {rhos_prev_ver} environment are available in {rhos_long} {rhos_curr_ver}.
-* The PKCS11 crypto plugin is available alongside `simple_crypto` for new secret storage.
-* HSM functionality is verified and operational.
-
-[NOTE]
-If your environment does not include Proteccio HSM, to adopt the {key_manager} by using `simple_crypto` only, see xref:adopting-the-key-manager-service_adopt-control-plane[Adopting the {key_manager}].
-
-.Prerequisites
-
-* You have a running {OpenStackPreviousInstaller} environment with Proteccio HSM integration (the source cloud).
-* You have a Single Node OpenShift or OpenShift Local running in the {rhocp_long} cluster.
-* You have SSH access to the source {OpenStackPreviousInstaller} undercloud and Controller nodes.
-* Custom {key_manager} container images with the Proteccio client libraries are built and available in your container registry. For more information, see the `rhoso_proteccio_hsm` Ansible role documentation.
-* The Proteccio client certificate, client key, server certificate, and `proteccio.rc` configuration file for the target environment are available on the host where you run the adoption commands.
-
-[IMPORTANT]
-====
-Without proper HSM configuration, your HSM-protected secrets become inaccessible after adoption. Ensure the following before you begin:
-
-* The HSM partition name, MKEK label, and HMAC label match the values configured in your source environment ({OpenStackShort}).
-* The Proteccio client certificates and configuration files are valid for the target environment ({rhos_acro}).
-====
-
-.Procedure
-
-. Confirm that your source environment configuration includes Proteccio HSM integration:
-+
-[source,bash]
-----
-$ ssh tripleo-admin@controller-0.ctlplane \
- "sudo cat /var/lib/config-data/puppet-generated/barbican/etc/barbican/barbican.conf | grep -A5 '\[p11_crypto_plugin\]'"
-----
-+
-If you see the `[p11_crypto_plugin]` section with Proteccio-specific settings, for example `library_path = /usr/lib64/libnethsm.so`, continue with the HSM adoption. If you do not see this section, your source environment does not include Proteccio HSM integration. Use the standard adoption procedure instead. For more information, see xref:adopting-the-key-manager-service_adopt-control-plane[Adopting the {key_manager}].
-
-. Add the simple crypto key encryption key (KEK) secret:
-+
-----
-$ oc set data secret/osp-secret "BarbicanSimpleCryptoKEK=$($CONTROLLER1_SSH "python3 -c \"import configparser; c = configparser.ConfigParser(); c.read('/var/lib/config-data/puppet-generated/barbican/etc/barbican/barbican.conf'); print(c['simple_crypto_plugin']['kek'])\"")"
-----
-
-. Create the HSM login credentials secret:
-+
-[source,bash]
-----
-$ oc create secret generic hsm-login \
- --from-literal=PKCS11Pin= \
- -n openstack
-----
-+
-where:
-
-``::
-Specifies the HSM PKCS#11 PIN for the Proteccio partition in your environment.
-
-. Create the Proteccio client data secret with the certificates and configuration:
-+
-[source,bash]
-----
-$ oc create secret generic proteccio-data \
- --from-file=client.crt= \
- --from-file=client.key= \
- --from-file== \
- --from-file=proteccio.rc= \
- -n openstack
-----
-+
-where:
-
-``::
-Specifies the path to the HSM client certificate file.
-``::
-Specifies the path to the HSM client key file.
-``::
-Specifies the filename of the HSM server certificate that is expected by the Proteccio client, for example, `10_8_60_93.CRT`.
-``::
-Specifies the path to the HSM server certificate file.
-``::
-Specifies the path to the `proteccio.rc` configuration file for your environment.
-
-. Patch the `OpenStackControlPlane` CR to deploy the {key_manager} with HSM support:
-+
-[subs="+quotes"]
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- barbican:
- enabled: true
- apiOverride:
- route: {}
- template:
- databaseInstance: openstack
- databaseAccount: barbican
- messagingBus:
- cluster: rabbitmq
- secret: osp-secret
- simpleCryptoBackendSecret: osp-secret
- serviceAccount: barbican
- serviceUser: barbican
- passwordSelectors:
- database: BarbicanDatabasePassword
- service: BarbicanPassword
- simplecryptokek: BarbicanSimpleCryptoKEK
- customServiceConfig: |
- [p11_crypto_plugin]
- plugin_name = PKCS11
- library_path = **
- token_labels = **
- mkek_label = **
- hmac_label = **
- encryption_mechanism = CKM_AES_CBC
- hmac_key_type = CKK_GENERIC_SECRET
- hmac_keygen_mechanism = CKM_GENERIC_SECRET_KEY_GEN
- hmac_mechanism = CKM_SHA256_HMAC
- key_wrap_mechanism = **
- key_wrap_generate_iv = true
- always_set_cka_sensitive = true
- os_locking_ok = false
- globalDefaultSecretStore: pkcs11
- enabledSecretStores: ["simple_crypto", "pkcs11"]
- pkcs11:
- loginSecret: hsm-login
- clientDataSecret: proteccio-data
- clientDataPath: /etc/proteccio
- barbicanAPI:
- replicas: 1
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: *<172.17.0.80>*
- spec:
- type: LoadBalancer
- barbicanWorker:
- replicas: 1
- barbicanKeystoneListener:
- replicas: 1
-'
-----
-+
-where:
-
-``::
-Specifies the path to the PKCS#11 library inside the container, for example, `/usr/lib64/libnethsm.so` for Proteccio.
-``::
-Specifies the HSM partition name, for example, `VHSM1`. This value must match the partition configured in your source environment.
-``::
-Specifies the label of the Master Key Encryption Key (MKEK) in the HSM. This value must match the key configured in your source environment.
-``::
-Specifies the label of the HMAC key in the HSM. This value must match the key configured in your source environment.
-``::
-Specifies the PKCS#11 key wrap mechanism, for example, `CKM_AES_CBC_PAD`. This value must match the mechanism configured in your source environment.
-`<172.17.0.80>`::
-Specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-
-`messagingBus.Cluster`::
-For more information about RHOSO RabbitMQ clusters, see link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/monitoring_high_availability_services/ref_rhoso-rabbitmq-clusters_ha-monitoring#con_understand-the-rabbitmq-interface-for-openstack-services[RHOSO RabbitMQ clusters] in _Monitoring high availability services_.
-
-.Verification
-
-. Ensure that the {identity_service_first_ref} endpoints are defined and are pointing to the control plane FQDNs:
-+
-----
-$ openstack endpoint list | grep key-manager
-----
-
-. Ensure that the Barbican API service is registered in the {identity_service}:
-+
-----
-$ openstack service list | grep key-manager
-----
-
-. Verify that all secrets from the source environment are available:
-+
-----
-$ openstack secret list
-----
-
-. Confirm that the {key_manager} services are running with HSM-enabled configuration:
-+
-----
-$ oc get pods -n openstack -l service=barbican -o wide
-----
-
-. Test secret creation to verify HSM functionality:
-+
-----
-$ openstack secret store --name adoption-verification --payload 'HSM adoption successful'
-----
-
-. Verify that the HSM back end is operational by retrieving the secret:
-+
-----
-$ openstack secret get --payload
-----
-+
-where:
-
-``::
-Specifies the ID of the secret created in the previous step.
-
-[NOTE]
-====
-HSM adoption preserves both simple crypto and HSM-backed secrets. The migration process maintains HSM metadata and secret references, ensuring continued access to existing secrets while enabling new secrets to use either back end.
-====
diff --git a/docs_user/modules/proc_adopting-key-manager-service.adoc b/docs_user/modules/proc_adopting-key-manager-service.adoc
deleted file mode 100644
index 097b78072..000000000
--- a/docs_user/modules/proc_adopting-key-manager-service.adoc
+++ /dev/null
@@ -1,100 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-key-manager-service_{context}"]
-
-= Adopting the {key_manager}
-
-[role="_abstract"]
-Adopt the {key_manager_first_ref} by patching the existing `OpenStackControlPlane` custom resource (CR) where {key_manager} is disabled. Configure the {key_manager} to use the `simple_crypto` back end.
-
-The patch starts the service with the configuration parameters that are provided by the {rhos_prev_long} ({OpenStackShort}) environment.
-
-The {key_manager} adoption is complete if you see the following results:
-
-* The `BarbicanAPI`, `BarbicanWorker`, and `BarbicanKeystoneListener` services are up and running.
-* Keystone endpoints are updated, and the same crypto plugin of the source cloud is available.
-
-[NOTE]
-To configure hardware security module (HSM) integration with Proteccio HSM, see xref:adopting-the-key-manager-service-with-proteccio-hsm_adopt-control-plane[Adopting the {key_manager} with Proteccio HSM integration].
-
-.Procedure
-
-. Add the kek secret:
-+
-----
-$ oc set data secret/osp-secret "BarbicanSimpleCryptoKEK=$($CONTROLLER1_SSH "python3 -c \"import configparser; c = configparser.ConfigParser(); c.read('/var/lib/config-data/puppet-generated/barbican/etc/barbican/barbican.conf'); print(c['simple_crypto_plugin']['kek'])\"")"
-----
-
-. Patch the `OpenStackControlPlane` CR to deploy the {key_manager}:
-+
-[subs="+quotes"]
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- barbican:
- enabled: true
- apiOverride:
- route: {}
- template:
- databaseInstance: openstack
- databaseAccount: barbican
- messagingBus:
- cluster: rabbitmq
- secret: osp-secret
- simpleCryptoBackendSecret: osp-secret
- serviceAccount: barbican
- serviceUser: barbican
- passwordSelectors:
- service: BarbicanPassword
- simplecryptokek: BarbicanSimpleCryptoKEK
- barbicanAPI:
- replicas: 1
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: *<172.17.0.80>*
- spec:
- type: LoadBalancer
- barbicanWorker:
- replicas: 1
- barbicanKeystoneListener:
- replicas: 1
-'
-----
-+
-where:
-
-`<172.17.0.80>`::
-Specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-
-`messagingBus.Cluster`::
-For more information about RHOSO RabbitMQ clusters, see link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/monitoring_high_availability_services/ref_rhoso-rabbitmq-clusters_ha-monitoring#con_understand-the-rabbitmq-interface-for-openstack-services[RHOSO RabbitMQ clusters] in _Monitoring high availability services_.
-
-.Verification
-
-* Ensure that the {identity_service_first_ref} endpoints are defined and are pointing to the control plane FQDNs:
-+
-----
-$ openstack endpoint list | grep key-manager
-----
-
-* Ensure that Barbican API service is registered in the {identity_service}:
-+
-----
-$ openstack service list | grep key-manager
-----
-+
-----
-$ openstack endpoint list | grep key-manager
-----
-
-* List the secrets:
-+
-----
-$ openstack secret list
-----
-
-//**TODO: Once different crypto plugins are supported, additional lines test those should be added.
diff --git a/docs_user/modules/proc_adopting-networker-services-to-the-data-plane.adoc b/docs_user/modules/proc_adopting-networker-services-to-the-data-plane.adoc
deleted file mode 100644
index 11d45bdeb..000000000
--- a/docs_user/modules/proc_adopting-networker-services-to-the-data-plane.adoc
+++ /dev/null
@@ -1,452 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-networker-services-to-the-data-plane_{context}"]
-
-= Adopting Networker services to the {rhos_acro} data plane
-
-[role="_abstract"]
-Adopt Networker services to the {rhos_long} data plane by creating a `OpenStackDataPlaneNodeSet` custom resource (CR) that includes the services to run on the Networker nodes. The Networker services could be running on Controller nodes or dedicated Networker nodes.
-
-[TIP]
-====
-By definition, any node that has set `enable-chassis-as-gw` is considered a _Networker node_. After the adoption process, these nodes continue to be Networker nodes.
-====
-
-You can implement the following options if they apply to your environment:
-
-* Depending on your topology, you might need to run the `neutron-metadata` service on the nodes, specifically when you want to serve metadata to SR-IOV ports that are hosted on Compute nodes.
-
-* If you want to continue running OVN gateway services on Networker nodes, keep `ovn` service in the list to deploy.
-
-* Optional: You can run the `neutron-dhcp` service on your Networker nodes instead of your Compute nodes. You might not need to use `neutron-dhcp` with OVN, unless your deployment uses DHCP relays, or advanced DHCP options that are supported by dnsmasq but not by the OVN DHCP implementation.
-
-Adopt each Controller or Networker node in your existing {rhos_prev_long} deployment to the {rhos_long} when your node is set as an OVN chassis gateway. Any node with
-parameter set to `enable-chassis-as-gw` is considered OVN gateway chassis. In this case, such nodes will become edpm networker nodes after adoption.
-
-. Check for the nodes where `OVN Controller Gateway agent` agents are running. The list of agents varies depending on the services you enabled:
-+
-----
-$ oc exec openstackclient -- openstack network agent list
-+--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
-| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
-+--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
-| e5075ee0-9dd9-4f0a-a42a-6bbdf1a6111c | OVN Controller Gateway agent | controller-0.localdomain | | XXX | UP | ovn-controller |
-| f3112349-054c-403a-b00a-e219238192b8 | OVN Controller agent | compute-0.localdomain | | XXX | UP | ovn-controller |
-| af9dae2d-1c1c-55a8-a743-f84719f6406d | OVN Metadata agent | compute-0.localdomain | | XXX | UP | neutron-ovn-metadata-agent |
-| 51a11df8-a66e-47a2-aec0-52eb8589626c | OVN Controller Gateway agent | controller-1.localdomain | | XXX | UP | ovn-controller |
-| bb817e5e-7832-410a-9e67-934dac8c602f | OVN Controller Gateway agent | controller-2.localdomain | | XXX | UP | ovn-controller |
-+--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
-----
-
-.Prerequisites
-
-* Define the shell variable. Based on above agent list output,
-controller-0, controller-1, controller-2 are our target
-hosts. If you have both `Controller` and `Networker` nodes running
-networker services then add all those hosts below.
-+
-[subs=+quotes]
-----
-declare -A networkers
-networkers+=(
- ["controller-0.localdomain"]="192.168.122.100"
- ["controller-1.localdomain"]="192.168.122.101"
- ["controller-2.localdomain"]="192.168.122.102"
- # ...
-)
-----
-+
-** Replace `[""]="192.168.122.100"` with the name and IP address of the corresponding Networker or Controller node as per your environment.
-
-.Procedure
-
-. Deploy the `OpenStackDataPlaneNodeSet` CR for your nodes:
-+
-[NOTE]
-You can reuse most of the `nodeTemplate` section from the `OpenStackDataPlaneNodeSet` CR that is designated for your Compute nodes. You can omit some of the variables because of the limited set of services that are running on the Networker nodes.
-+
-[subs="+quotes"]
-----
-$ oc apply -f - <", state: enabled}
- - {name: "", state: enabled}
- - {name: "", state: enabled}
- - {name: "", state: enabled}
- - {name: "", state: enabled}
- - {name: "", state: enabled}
-endif::[]
- edpm_bootstrap_release_version_package: []
- # edpm_network_config
- # Default nic config template for a EDPM node
- # These vars are edpm_network_config role vars
- edpm_network_config_template: |
- ---
- {% set mtu_list = [ctlplane_mtu] %}
- {% for network in nodeset_networks %}
- {% set _ = mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) %}
- {%- endfor %}
- {% set min_viable_mtu = mtu_list | max %}
- network_config:
- - type: ovs_bridge
- name: {{ neutron_physical_bridge_name }}
- mtu: {{ min_viable_mtu }}
- use_dhcp: false
- dns_servers: {{ ctlplane_dns_nameservers }}
- domain: {{ dns_search_domains }}
- addresses:
- - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
- routes: {{ ctlplane_host_routes }}
- members:
- - type: interface
- name: nic1
- mtu: {{ min_viable_mtu }}
- # force the MAC address of the bridge to this interface
- primary: true
- {% for network in nodeset_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 %}
- edpm_network_config_nmstate: false
- edpm_network_config_hide_sensitive_logs: false
- #
- # These vars are for the network config templates themselves and are
- # considered EDPM network defaults.
- neutron_physical_bridge_name: br-ctlplane
- neutron_public_interface_name: eth0
-
- # edpm_nodes_validation
- edpm_nodes_validation_validate_controllers_icmp: false
- edpm_nodes_validation_validate_gateway_icmp: false
-
- # edpm ovn-controller configuration
- edpm_ovn_bridge_mappings: [<"bridge_mappings">]
- edpm_ovn_bridge: br-int
- edpm_ovn_encap_type: geneve
- ovn_monitor_all: true
- edpm_ovn_remote_probe_interval: 60000
- edpm_ovn_ofctrl_wait_before_clear: 8000
-
- # serve as a OVN gateway
- edpm_enable_chassis_gw: true
-
- timesync_ntp_servers:
-ifeval::["{build}" != "downstream"]
- - hostname: pool.ntp.org
-endif::[]
-ifeval::["{build}" == "downstream"]
- - hostname: clock.redhat.com
- - hostname: clock2.redhat.com
-endif::[]
-
-ifeval::["{build}" != "downstream"]
- edpm_bootstrap_command: |
- # This is a hack to deploy RDO Delorean repos to RHEL as if it were Centos 9 Stream
- set -euxo pipefail
- curl -sL https://github.com/openstack-k8s-operators/repo-setup/archive/refs/heads/main.tar.gz | tar -xz
- python3 -m venv ./venv
- PBR_VERSION=0.0.0 ./venv/bin/pip install ./repo-setup-main
- # This is required for FIPS enabled until trunk.rdoproject.org
- # is not being served from a centos7 host, tracked by
- # https://issues.redhat.com/browse/RHOSZUUL-1517
- sudo dnf -y install crypto-policies
- sudo update-crypto-policies --set FIPS:NO-ENFORCE-EMS
- sudo ./venv/bin/repo-setup current-podified -b antelope -d centos9 --stream
- sudo rm -rf repo-setup-main
-endif::[]
-
- gather_facts: false
- enable_debug: false
- # edpm firewall, change the allowed CIDR if needed
- edpm_sshd_configure_firewall: true
- edpm_sshd_allowed_ranges: ['192.168.122.0/24']
- # SELinux module
- edpm_selinux_mode: enforcing
-
- # Do not attempt OVS major upgrades here
- edpm_ovs_packages:
- - openvswitch3.3
-EOF
-----
-+
-* `spec.tlsEnabled` specifies whether TLS Everywhere is enabled. If TLS is enabled, change `spec:tlsEnabled` to `true`.
-* `edpm_ovn_bridge_mappings`: Replace `[<"bridge_mappings">]` with the bridge mapping values that you used in your {rhos_prev_long} {rhos_prev_ver} deployment, for example, `["datacentre:br-ctlplane"]`.
-* `edpm_enable_chassis_gw` specifies whether to run `ovn-controller` in gateway mode.
-* ``, ``, ``, ``, ``, `` specifies the name of the repository to enable. For more information about which repositories are required, see link:https://access.redhat.com/articles/7139612[Required repositories for Red Hat OpenStack Services on OpenShift 18.0].
-ifeval::["{build}" != "downstream"]
-+
-[IMPORTANT]
-====
-For environments that are enabled with border gateway protocol (BGP), preserve the default routes on the data plane nodes.
-
-When adopting {rhos_prev_long} {rhos_prev_ver} environments with BGP, default routes can be lost when the data plane adoption procedure stops the {rhos_prev_long} services, specifically when FRRouting (FRR) is stopped. This causes connectivity issues during the {rhos_acro} data plane deployment.
-
-To prevent this, configure the required routes by using `os-net-config` on the data plane nodes (Compute nodes and Networker nodes) affected by this issue.
-
-Modify your `os-net-config` configuration file by adding the required routes, and then apply it:
-
-----
-$ sudo os-net-config -c /etc/os-net-config/modified_config_with_routes.yaml --provider ifcfg
-----
-
-This temporary default route is needed during the installation of the first services (such as `download-cache`) and is removed when the `configure-network` service applies the new network configuration.
-====
-+
-[NOTE]
-====
-For environments that are enabled with border gateway protocol (BGP), you must add the following services to the `services` list in the order shown:
-
-* After `configure-network` and before `validate-network`: Add `frr` service for FRRouting BGP support
-* After `ovn` and `neutron-metadata` services: Add `ovn-bgp-agent` service
-
-You must also configure the following additional Ansible variables in the `nodeTemplate.ansible.ansibleVars` section:
-
-* `edpm_frr_image`: The FRRouting container image
-* `edpm_ovn_bgp_agent_image`: The OVN BGP agent container image
-* `edpm_frr_bgp_ipv4_src_network`: The network name for BGP IPv4 source (for example, `bgpmainnet`)
-* `edpm_frr_bgp_ipv6_src_network`: The network name for BGP IPv6 source (for example, `bgpmainnetv6`)
-* `edpm_frr_bgp_neighbor_password`: The BGP neighbor password
-* `edpm_ovn_encap_ip`: Set to the BGP main network IP (for example, `{{ lookup("vars", "bgpmainnet_ip") }}`)
-====
-endif::[]
-
-. Ensure that you use the same `ovn-controller` settings in the `OpenStackDataPlaneNodeSet` CR that you used in the Networker nodes before adoption. This configuration is stored in the `external_ids` column in the `Open_vSwitch` table in the Open vSwitch database:
-+
-----
-ovs-vsctl list Open .
-...
-external_ids : {hostname=controller-0.localdomain, ovn-bridge=br-int, ovn-bridge-mappings=, ovn-chassis-mac-mappings="datacentre:1e:0a:bb:e6:7c:ad", ovn-cms-options=enable-chassis-as-gw, ovn-encap-ip="172.19.0.100", ovn-encap-tos="0", ovn-encap-type=geneve, ovn-match-northd-version=False, ovn-monitor-all=True, ovn-ofctrl-wait-before-clear="8000", ovn-openflow-probe-interval="60", ovn-remote="tcp:ovsdbserver-sb.openstack.svc:6642", ovn-remote-probe-interval="60000", rundir="/var/run/openvswitch", system-id="2eec68e6-aa21-4c95-a868-31aeafc11736"}
-...
-----
-+
-* Replace `` with the value of the bridge mappings in your configuration, for example, `"datacentre:br-ctlplane"`.
-
-. Optional: Enable `neutron-metadata` in the `OpenStackDataPlaneNodeSet` CR:
-+
-----
-$ oc patch openstackdataplanenodeset --type='json' --patch='[
- {
- "op": "add",
- "path": "/spec/services/-",
- "value": "neutron-metadata"
- }]'
-----
-+
-* Replace `` with the name of the CR that you deployed for your Networker nodes, for example, `openstack-networker`.
-
-. Optional: Enable `neutron-dhcp` in the `OpenStackDataPlaneNodeSet` CR:
-+
-----
-$ oc patch openstackdataplanenodeset --type='json' --patch='[
- {
- "op": "add",
- "path": "/spec/services/-",
- "value": "neutron-dhcp"
- }]'
-----
-
-. Run the `pre-adoption-validation` service for Networker nodes:
-
-.. Create a `OpenStackDataPlaneDeployment` CR that runs only the validation:
-+
-----
-$ oc apply -f - <
-----
-* Replace `` with the ID of the agent to delete, for example, `856960f0-5530-46c7-a331-6eadcba362da`.
-
-
-.Verification
-
-. Confirm that all the Ansible EE pods reach a `Completed` status:
-+
-----
-$ watch oc get pod -l app=openstackansibleee
-----
-+
-----
-$ oc logs -l app=openstackansibleee -f --max-log-requests 20
-----
-
-. Wait for the data plane node set to reach the `Ready` status:
-+
-----
-$ oc wait --for condition=Ready osdpns/ --timeout=30m
-----
-+
-* Replace `` with the name of the CR that you deployed for your Networker nodes, for example, `openstack-networker`.
-
-. Verify that the {networking_first_ref} agents are running. The list of agents varies depending on the services you enabled:
-+
-----
-$ oc exec openstackclient -- openstack network agent list
-+--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
-| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
-+--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
-| e5075ee0-9dd9-4f0a-a42a-6bbdf1a6111c | OVN Controller Gateway agent | controller-0.localdomain | | :-) | UP | ovn-controller |
-| f3112349-054c-403a-b00a-e219238192b8 | OVN Controller agent | compute-0.localdomain | | :-) | UP | ovn-controller |
-| af9dae2d-1c1c-55a8-a743-f84719f6406d | OVN Metadata agent | compute-0.localdomain | | :-) | UP | neutron-ovn-metadata-agent |
-| 51a11df8-a66e-47a2-aec0-52eb8589626c | OVN Controller Gateway agent | controller-1.localdomain | | :-) | UP | ovn-controller |
-| bb817e5e-7832-410a-9e67-934dac8c602f | OVN Controller Gateway agent | controller-2.localdomain | | :-) | UP | ovn-controller |
-+--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
-----
diff --git a/docs_user/modules/proc_adopting-telemetry-services.adoc b/docs_user/modules/proc_adopting-telemetry-services.adoc
deleted file mode 100644
index e8325232f..000000000
--- a/docs_user/modules/proc_adopting-telemetry-services.adoc
+++ /dev/null
@@ -1,147 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-telemetry-services_{context}"]
-
-= Adopting Telemetry services
-
-[role="_abstract"]
-To adopt Telemetry services, you patch an existing `OpenStackControlPlane` custom resource (CR) that has Telemetry services disabled to start the service with the configuration parameters that are provided by the {rhos_prev_long} ({OpenStackShort}) {rhos_prev_ver} environment.
-
-If you adopt Telemetry services, the observability solution that is used in the {OpenStackShort} {rhos_prev_ver} environment, Service Telemetry Framework, is removed from the cluster. The new solution is deployed in the {rhos_long} environment, allowing for metrics, and optionally logs, to be retrieved and stored in the new back ends.
-
-You cannot automatically migrate old data because different back ends are used. Metrics and logs are considered short-lived data and are not intended to be migrated to the {rhos_acro} environment. For information about adopting legacy autoscaling stack templates to the {rhos_acro} environment, see xref:adopting-autoscaling_adopt-control-plane[Adopting Autoscaling services].
-
-.Prerequisites
-
-* The {OpenStackPreviousInstaller} environment is running (the source cloud).
-* The Single Node OpenShift or OpenShift Local is running in the {rhocp_long} cluster.
-* Previous adoption steps are completed.
-
-.Procedure
-
-. Patch the `OpenStackControlPlane` CR to deploy `cluster-observability-operator`:
-+
-----
-$ oc create -f - < cinder.conf
-----
-
-.Procedure
-
-. Create a new file, for example, `cinder_api.patch`, and apply the configuration:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file=
-----
-+
-* Replace `` with the name of your patch file.
-+
-The following example shows a `cinder_api.patch` file:
-+
-[subs="+quotes"]
-----
-spec:
- extraMounts:
- - extraVol:
- - extraVolType: Ceph
- mounts:
- - mountPath: /etc/ceph
- name: ceph
- readOnly: true
- propagation:
- - CinderVolume
- - CinderBackup
- - Glance
- volumes:
- - name: ceph
- projected:
- sources:
- - secret:
- name: ceph-conf-files
- cinder:
- enabled: true
- apiOverride:
- route: {}
- template:
- databaseInstance: openstack
- databaseAccount: cinder
- secret: osp-secret
- cinderAPI:
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: *<172.17.0.80>*
- spec:
- type: LoadBalancer
- replicas: 1
- customServiceConfig: |
- [DEFAULT]
- default_volume_type=tripleo
- cinderScheduler:
- replicas: 0
- cinderBackup:
- networkAttachments:
- - storage
- replicas: 0
- cinderVolumes:
- ceph:
- networkAttachments:
- - storage
- replicas: 0
-----
-+
-where:
-
-<172.17.0.80>::
-Specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-
-. Retrieve the list of the previous scheduler and backup services:
-+
-----
-$ openstack volume service list
-
-+------------------+------------------------+------+---------+-------+----------------------------+
-| Binary | Host | Zone | Status | State | Updated At |
-+------------------+------------------------+------+---------+-------+----------------------------+
-| cinder-scheduler | standalone.localdomain | nova | enabled | down | 2024-11-04T17:47:14.000000 |
-| cinder-backup | standalone.localdomain | nova | enabled | down | 2024-11-04T17:47:14.000000 |
-| cinder-volume | hostgroup@tripleo_ceph | nova | enabled | down | 2024-11-04T17:47:14.000000 |
-+------------------+------------------------+------+---------+-------+----------------------------+
-----
-
-. Remove services for hosts that are in the `down` state:
-+
-----
-$ oc exec -t cinder-api-0 -c cinder-api -- cinder-manage service remove
-----
-+
-* Replace `` with the name of the binary, for example, `cinder-backup`.
-* Replace `` with the host name, for example, `cinder-backup-0`.
-+
-
-. Deploy the scheduler, backup, and volume services:
-+
-* Create another file, for example, `cinder_services.patch`, and apply the configuration:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file=
-----
-+
-* Replace `` with the name of your patch file.
-+
-* The following example shows a `cinder_services.patch` file for a Ceph RBD deployment:
-+
-[source,yaml]
-----
-spec:
- cinder:
- enabled: true
- template:
- cinderScheduler:
- replicas: 1
- cinderBackup:
- networkAttachments:
- - storage
- replicas: 1
- customServiceConfig: |
- [DEFAULT]
- backup_driver=cinder.backup.drivers.ceph.CephBackupDriver
- backup_ceph_conf=/etc/ceph/ceph.conf
- backup_ceph_user=openstack
- backup_ceph_pool=backups
- cinderVolumes:
- ceph:
- networkAttachments:
- - storage
- replicas: 1
- customServiceConfig: |
- [tripleo_ceph]
- backend_host=hostgroup
- volume_backend_name=tripleo_ceph
- volume_driver=cinder.volume.drivers.rbd.RBDDriver
- rbd_ceph_conf=/etc/ceph/ceph.conf
- rbd_user=openstack
- rbd_pool=volumes
- rbd_flatten_volume_from_snapshot=False
- report_discard_supported=True
-----
-+
-[NOTE]
-====
-Ensure that you use the same configuration group name for the driver that you used in the source cluster. In this example, the driver configuration group in `customServiceConfig` is called `tripleo_ceph` because it reflects the value of the configuration group name in the `cinder.conf` file of the source OpenStack cluster.
-====
-+
-. Configure the NetApp NFS Block Storage volume service:
-.. Create a secret that includes sensitive information such as hostnames, passwords, and usernames to access the third-party NetApp NFS storage. You can find the credentials in the `cinder.conf` file that was generated from the {OpenStackPreviousInstaller} deployment:
-+
-----
-$ oc apply -f - <
-----
-+
-* Replace `` with the name of the patch file for your NetApp NFS Block Storage volume back end.
-+
-The following example shows a `cinder_netappNFS.patch` file that configures a NetApp NFS Block Storage volume service:
-+
-[source,yaml]
-----
-spec:
- cinder:
- enabled: true
- template:
- cinderVolumes:
- ontap-nfs:
- networkAttachments:
- - storage
- customServiceConfig: |
- [tripleo_netapp]
- volume_backend_name=ontap-nfs
- volume_driver=cinder.volume.drivers.netapp.common.NetAppDriver
- nfs_snapshot_support=true
- nas_secure_file_operations=false
- nas_secure_file_permissions=false
- netapp_server_hostname= netapp_backendip
- netapp_server_port=80
- netapp_storage_protocol=nfs
- netapp_storage_family=ontap_cluster
- customServiceConfigSecrets:
- - cinder-volume-ontap-secrets
-----
-+
-. Configure the NetApp iSCSI Block Storage volume service:
-.. Create a secret that includes sensitive information such as hostnames, passwords, and usernames to access the third-party NetApp iSCSI storage. You can find the credentials in the `cinder.conf` file that was generated from the {OpenStackPreviousInstaller} deployment:
-+
-----
-$ oc apply -f - <
-----
-+
-* Replace `` with the name of the patch file for your NetApp iSCSI Block Storage volume back end.
-+
-The following example shows a `cinder_netappISCSI.patch` file that configures a NetApp iSCSI Block Storage volume service:
-+
-----
-spec:
- cinder:
- enabled: true
- template:
- cinderVolumes:
- ontap-iscsi:
- networkAttachments:
- - storage
- customServiceConfig: |
- [tripleo_netapp]
- volume_backend_name=ontap-iscsi
- volume_driver=cinder.volume.drivers.netapp.common.NetAppDriver
- netapp_storage_protocol=iscsi
- netapp_storage_family=ontap_cluster
- consistencygroup_support=True
- customServiceConfigSecrets:
- - cinder-volume-ontap-secrets
-----
-. Check if all the services are up and running:
-+
-----
-$ openstack volume service list
-
-+------------------+--------------------------+------+---------+-------+----------------------------+
-| Binary | Host | Zone | Status | State | Updated At |
-+------------------+--------------------------+------+---------+-------+----------------------------+
-| cinder-volume | hostgroup@tripleo_netapp | nova | enabled | up | 2023-06-28T17:00:03.000000 |
-| cinder-scheduler | cinder-scheduler-0 | nova | enabled | up | 2023-06-28T17:00:02.000000 |
-| cinder-backup | cinder-backup-0 | nova | enabled | up | 2023-06-28T17:00:01.000000 |
-+------------------+--------------------------+------+---------+-------+----------------------------+
-----
-
-. Apply the DB data migrations:
-+
-[NOTE]
-====
-You are not required to run the data migrations at this step, but you must run them before the next upgrade. However, for adoption, you can run the migrations now to ensure that there are no issues before you run production workloads on the deployment.
-====
-+
-----
-$ oc exec -it cinder-scheduler-0 -- cinder-manage db online_data_migrations
-----
-
-.Verification
-
-. Ensure that the `openstack` alias is defined:
-+
-----
-$ alias openstack="oc exec -t openstackclient -- openstack"
-----
-
-. Confirm that {block_storage} endpoints are defined and pointing to the control plane FQDNs:
-+
-----
-$ openstack endpoint list --service
-----
-+
-* Replace `` with the name of the endpoint that you want to confirm.
-
-. Confirm that the Block Storage services are running:
-+
-----
-$ openstack volume service list
-----
-+
-[NOTE]
-Cinder API services do not appear in the list. However, if you get a response from the `openstack volume service list` command, that means at least one of the cinder API services is running.
-
-. Confirm that you have your previous volume types, volumes, snapshots, and backups:
-+
-----
-$ openstack volume type list
-$ openstack volume list
-$ openstack volume snapshot list
-$ openstack volume backup list
-----
-
-. To confirm that the configuration is working, perform the following steps:
-
-.. Create a volume from an image to check that the connection to {image_service_first_ref} is working:
-+
-----
-$ openstack volume create --image cirros --bootable --size 1 disk_new
-----
-
-.. If you deployed and adopted the `cinder-backup` service, back up the previously attached volume:
-+
-----
-$ openstack volume backup create --name
-----
-+
-where:
-
-``:: Specifies the volume that you want to back up.
-Replace `` with the volume you want to back up.
-``:: Specifies the name of your new backup.
-Replace `` with the name of your new backup.
-+
-[NOTE]
-You do not boot a {compute_service_first_ref} instance by using the new `volume from` image or try to detach the previous volume because the {compute_service} and the {block_storage} are still not connected.
-
-.Additional resources
-
-* xref:adopting-block-storage-service-with-dcn-backend_{context}[Adopting the {block_storage} with multiple {Ceph} back ends (DCN)]
diff --git a/docs_user/modules/proc_adopting-the-compute-service.adoc b/docs_user/modules/proc_adopting-the-compute-service.adoc
deleted file mode 100644
index fc92c24bc..000000000
--- a/docs_user/modules/proc_adopting-the-compute-service.adoc
+++ /dev/null
@@ -1,202 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-compute-service_{context}"]
-
-= Adopting the {compute_service}
-
-[role="_abstract"]
-Adopt the {compute_service_first_ref} by patching the existing `OpenStackControlPlane` custom resource (CR) where the {compute_service} is disabled. The patch starts the service with the configuration parameters from {rhos_prev_long}. This procedure describes a single-cell setup.
-
-//[NOTE]
-//The following example scenario describes a single-cell setup. Real
-//multi-stack topology that is recommended for production use results in cells having a different database layout, and should use different naming schemes. kgilliga: We might reinstate this note after multi-cell is finished in Feature Release 1.
-
-.Prerequisites
-
-* You have completed the previous adoption steps.
-* You have defined the following shell variables. Replace the following example values with the values that are correct for your environment:
-+
-----
-alias openstack="oc exec -t openstackclient -- openstack"
-
-DEFAULT_CELL_NAME="cell3"
-RENAMED_CELLS="cell1 cell2 $DEFAULT_CELL_NAME"
-----
-+
-** The source cloud `default` cell takes a new `$DEFAULT_CELL_NAME`. In a multi-cell adoption scenario, the 'default' cell might retain its original name,`DEFAULT_CELL_NAME=default`, or become renamed as a cell that is free for use. Do not use other existing cell names for `DEFAULT_CELL_NAME`, except for `default`.
-** If you deployed the source cloud with a `default` cell, and want to rename it during adoption, define the new name that you want to use, as shown in the following example:
-+
-----
-DEFAULT_CELL_NAME="cell1"
-RENAMED_CELLS="cell1"
-----
-
-.Procedure
-
-. Patch the `OpenStackControlPlane` CR to deploy the {compute_service}:
-+
-[NOTE]
-This procedure assumes that {compute_service} metadata is deployed on the top level and not on each cell level. If the {OpenStackShort} deployment has a per-cell metadata deployment, adjust the following patch as needed. You cannot run the metadata service in `cell0`.
-To enable the metadata services of a local cell, set the `enabled` property in the `metadataServiceTemplate` field of the local cell to `true` in the `OpenStackControlPlane` CR.
-+
-[subs="+quotes"]
-----
-$ rm -f celltemplates
-$ for CELL in $(echo $RENAMED_CELLS); do
-> cat >> celltemplates << EOF
-> ${CELL}:
-> *hasAPIAccess: true*
-> cellDatabaseAccount: nova-$CELL
-> *cellDatabaseInstance: openstack-$CELL*
-> *cellMessageBusInstance: rabbitmq-$CELL*
-> metadataServiceTemplate:
-> enabled: false
-> override:
-> service:
-> metadata:
-> annotations:
-> metallb.universe.tf/address-pool: internalapi
-> metallb.universe.tf/allow-shared-ip: internalapi
-> metallb.universe.tf/loadBalancerIPs: 172.17.0.$(( 79 + ${CELL##*cell} ))
-> spec:
-> type: LoadBalancer
-> customServiceConfig: |
-> [workarounds]
-> disable_compute_service_check_for_ffu=true
-> conductorServiceTemplate:
-> customServiceConfig: |
-> [workarounds]
-> disable_compute_service_check_for_ffu=true
->EOF
->done
-
-$ cat > oscp-patch.yaml << EOF
->spec:
-> nova:
-> enabled: true
-> apiOverride:
-> route: {}
-> template:
-> secret: osp-secret
-> apiDatabaseAccount: nova-api
-> apiServiceTemplate:
-> override:
-> service:
-> internal:
-> metadata:
-> annotations:
-> metallb.universe.tf/address-pool: internalapi
-> metallb.universe.tf/allow-shared-ip: internalapi
-> metallb.universe.tf/loadBalancerIPs: <172.17.0.80>
-> spec:
-> type: LoadBalancer
-> customServiceConfig: |
-> [workarounds]
-> disable_compute_service_check_for_ffu=true
-> metadataServiceTemplate:
-> enabled: true
-> override:
-> service:
-> metadata:
-> annotations:
-> metallb.universe.tf/address-pool: internalapi
-> metallb.universe.tf/allow-shared-ip: internalapi
-> metallb.universe.tf/loadBalancerIPs: <172.17.0.80>
-> spec:
-> type: LoadBalancer
-> customServiceConfig: |
-> [workarounds]
-> disable_compute_service_check_for_ffu=true
-> schedulerServiceTemplate:
-> customServiceConfig: |
-> [workarounds]
-> disable_compute_service_check_for_ffu=true
-> cellTemplates:
-> cell0:
-> hasAPIAccess: true
-> cellDatabaseAccount: nova-cell0
-> cellDatabaseInstance: openstack
-> cellMessageBusInstance: rabbitmq
-> conductorServiceTemplate:
-> customServiceConfig: |
-> [workarounds]
-> disable_compute_service_check_for_ffu=true
->EOF
-$ cat celltemplates >> oscp-patch.yaml
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file=oscp-patch.yaml
-----
-+
-* `${CELL}.hasAPIAccess` specifies upcall access to the API. In the source cloud, cells are always configured with the main Nova API database upcall access. You can disable upcall access to the API by setting `hasAPIAccess` to `false`. However, do not make changes to the API during adoption.
-* `${CELL}.cellDatabaseInstance` specifies the database instance that is used by the cell. The database instance names must match the names that are defined in the `OpenStackControlPlane` CR that you created in when you deployed the back-end services as described in xref:deploying-backend-services__migrating-databases[Deploying back-end services].
-* `${CELL}.cellMessageBusInstance` specifies the message bus instance that is used by the cell. The message bus instance names must match the names that are defined in the `OpenStackControlPlane` CR.
-* `metallb.universe.tf/loadBalancerIPs: <172.17.0.80>` specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-
-. If you are adopting the {compute_service} with the {bare_metal_first_ref}, append the `novaComputeTemplates` field with the following content in each cell in the {compute_service} CR patch. For example:
-+
-[source,yaml]
-----
- cell1:
- novaComputeTemplates:
- standalone:
- customServiceConfig: |
- [DEFAULT]
- host =
- [workarounds]
- disable_compute_service_check_for_ffu=true
- computeDriver: ironic.IronicDriver
- ...
-----
-+
-* Replace `` with the hostname of the node that is running the `ironic` Compute driver in the source cloud.
-
-. Wait for the CRs for the Compute control plane services to be ready:
-+
-----
-$ oc wait --for condition=Ready --timeout=300s Nova/nova
-----
-+
-[NOTE]
-The local Conductor services are started for each cell, while the superconductor runs in `cell0`.
-Note that `disable_compute_service_check_for_ffu` is mandatory for all imported Compute services until the external data plane is imported, and until the Compute services are fast-forward upgraded. For more information, see xref:adopting-compute-services-to-the-data-plane_data-plane[Adopting Compute services to the {rhos_acro} data plane] and xref:performing-a-fast-forward-upgrade-on-compute-services_data-plane[Upgrading Compute services].
-
-.Verification
-
-* Check that {compute_service} endpoints are defined and pointing to the
-control plane FQDNs, and that the Nova API responds:
-+
-----
-$ openstack endpoint list | grep nova
-$ openstack server list
-----
-+
-** Compare the outputs with the topology-specific configuration in xref:proc_retrieving-topology-specific-service-configuration_migrating-databases[Retrieving topology-specific service configuration].
-
-* Query the superconductor to check that the expected cells exist, and compare it to its pre-adoption values:
-+
-----
-for CELL in $(echo $CELLS); do
-set +u
-. ~/.source_cloud_exported_variables_$CELL
-set -u
-RCELL=$CELL
-[ "$CELL" = "default" ] && RCELL=$DEFAULT_CELL_NAME
-
-echo "comparing $CELL to $RCELL"
-echo $PULL_OPENSTACK_CONFIGURATION_NOVAMANAGE_CELL_MAPPINGS | grep -F "| $CELL |"
-oc rsh nova-cell0-conductor-0 nova-manage cell_v2 list_cells | grep -F "| $RCELL |"
-done
-----
-+
-The following changes are expected for each cell:
-+
-** The `cellX` `nova` database and username become `nova_cellX`.
-** The `default` cell is renamed to `DEFAULT_CELL_NAME`. The `default` cell might retain the original name if there are multiple cells.
-** The RabbitMQ transport URL no longer uses `guest`.
-
-[NOTE]
-====
-At this point, the {compute_service} control plane services do not control the existing {compute_service} workloads. The control plane manages the data plane only after the data adoption process is completed. For more information, see xref:adopting-compute-services-to-the-data-plane_data-plane[Adopting Compute services to the {rhos_acro} data plane].
-====
-
-[IMPORTANT]
-To import external Compute services to the {rhos_acro} data plane, you must upgrade them first.
-For more information, see xref:adopting-compute-services-to-the-data-plane_data-plane[Adopting Compute services to the {rhos_acro} data plane], and xref:performing-a-fast-forward-upgrade-on-compute-services_data-plane[Performing a fast-forward upgrade on Compute services].
diff --git a/docs_user/modules/proc_adopting-the-dns-service.adoc b/docs_user/modules/proc_adopting-the-dns-service.adoc
deleted file mode 100644
index bea047bd3..000000000
--- a/docs_user/modules/proc_adopting-the-dns-service.adoc
+++ /dev/null
@@ -1,322 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-dns-service_{context}"]
-
-= Adopting the {dns_service}
-
-[role="_abstract"]
-To adopt the {dns_first_ref}, you patch an existing `OpenStackControlPlane` custom resource (CR) where the {dns_service} is disabled. The patch starts the service with the configuration parameters that are provided by the {rhos_prev_long} ({OpenStackShort}) environment.
-
-.Procedure
-
-. Create an alias for the `openstack` command:
-+
-----
-$ alias openstack="oc exec -t openstackclient -- openstack"
-----
-
-. To isolate the {dns_service} networks, add the network interfaces for the VLAN base interfaces:
-+
-[subs="+quotes"]
-----
-$ oc get --no-headers nncp --output=custom-columns='NAME:.metadata.name' | while read; do
-
-interfaces=$(oc get nncp $REPLY -o jsonpath="{.spec.desiredState.interfaces[*].name}")
-
-(echo $interfaces | grep -w -q "enp6s0.25\|enp6s0.26") || \
- oc patch nncp $REPLY --type json --patch '
-[{
- "op": "add",
- "path": "/spec/desiredState/interfaces/-",
- "value": {
- "description": "Designate vlan interface",
- "name": "enp6s0.25",
- "state": "up",
- "type": "vlan",
- "vlan": {
- "base-iface": "",
- "id": 25,
- "reorder-headers": true
- },
- "ipv4": {
- "address": [{"ip": "172.28.0.5", "prefix-length": 24}],
- "enabled": true,
- "dhcp": false
- },
- "ipv6": {
- "enabled": false
- }
- }
-},
-{
- "op": "add",
- "path": "/spec/desiredState/interfaces/-",
- "value": {
- "description": "Designate external vlan interface",
- "name": "enp6s0.26",
- "state": "up",
- "type": "vlan",
- "vlan": {
- "base-iface": "",
- "id": 26,
- "reorder-headers": true
- },
- "ipv4": {
- "address": [{"ip": "172.50.0.5", "prefix-length": 24}],
- "enabled": true,
- "dhcp": false
- },
- "ipv6": {
- "enabled": false
- }
- }
-}]'
-
-done
-----
-+
-where:
-
-``::
-Specifies the name of the network interface in your {rhocp_long} setup.
-
-. Configure the {dns_service} internal network attachment definition:
-+
-----
-$ cat >> designate-nad.yaml << EOF_CAT
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- labels:
- osp/net: designate
- name: designate
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "designate",
- "type": "macvlan",
- "master": "enp6s0.25",
- "ipam": {
- "type": "whereabouts",
- "range": "172.28.0.0/24",
- "range_start": "172.28.0.30",
- "range_end": "172.28.0.70"
- }
- }
-EOF_CAT
-----
-. Apply the configuration:
-+
-----
-$ oc apply -f designate-nad.yaml
-----
-. Configure the {dns_service} external network attachment definition:
-+
-----
-$ cat >> designateext-nad.yaml << EOF_CAT
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- labels:
- osp/net: designateext
- name: designateext
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "designateext",
- "type": "macvlan",
- "master": "enp6s0.26",
- "ipam": {
- "type": "whereabouts",
- "range": "172.50.0.0/24",
- "range_start": "172.50.0.30",
- "range_end": "172.50.0.70"
- }
- }
-EOF_CAT
-----
-
-. Apply the configuration:
-+
-----
-$ oc apply -f designateext-nad.yaml
-----
-
-. Create a MetalLB IPAddressPool for the {dns_service} external network:
-+
-----
-$ oc apply -f - < /tmp/designate_ns_records_raw.txt
-----
-
-. Parse the nameserver records into YAML format for the {dns_service} CR:
-+
-----
-$ raw=/tmp/designate_ns_records_raw.txt
-$ out=/tmp/designate_ns_records.yaml
-$ if [ ! -s "$raw" ]; then
- echo "[]" > "$out"
-else
- awk '{ gsub(/\.$/, "", $1); if (NF >= 2) printf "- hostname: %s.\n priority: %s\n", $1, $2 }' "$raw" > "$out"
-fi
-----
-
-. Enable the {dns_service} Redis instance in {rhocp_short}:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- redis:
- enabled: true
- templates:
- designate-redis:
- replicas: 1
-'
-----
-
-. Wait for the {dns_service} Redis instance to become ready:
-+
-----
-$ oc wait --for condition=Ready --timeout=60s redises.redis.openstack.org/designate-redis
-----
-
-. Create the {dns_service} CR patch file:
-+
-[subs="+quotes"]
-----
-$ cat > /tmp/designate_osp_patch.yaml << 'MAINCR'
-spec:
- designate:
- enabled: true
- template:
- designateAPI:
- networkAttachments:
- - internalapi
- designateWorker:
- networkAttachments:
- - designate
- replicas: 3
- designateCentral:
- replicas: 3
- designateProducer:
- replicas: 3
- designateBackendbind9:
- networkAttachments:
- - designate
- override:
- services:
- - metadata:
- annotations:
- metallb.universe.tf/address-pool: designateext
- metallb.universe.tf/allow-shared-ip: designateext
- metallb.universe.tf/loadBalancerIPs: 172.50.0.80
- spec:
- type: LoadBalancer
- - metadata:
- annotations:
- metallb.universe.tf/address-pool: designateext
- metallb.universe.tf/allow-shared-ip: designateext
- metallb.universe.tf/loadBalancerIPs: 172.50.0.81
- spec:
- type: LoadBalancer
- - metadata:
- annotations:
- metallb.universe.tf/address-pool: designateext
- metallb.universe.tf/allow-shared-ip: designateext
- metallb.universe.tf/loadBalancerIPs: 172.50.0.82
- spec:
- type: LoadBalancer
- replicas: 3
- storageClass:
- storageRequest: 10G
- designateMdns:
- networkAttachments:
- - designate
- replicas: 3
- designateUnbound:
- networkAttachments:
- - designate
- replicas: 2
- override:
- services:
- - metadata:
- annotations:
- metallb.universe.tf/address-pool: designateext
- metallb.universe.tf/allow-shared-ip: designateext
- metallb.universe.tf/loadBalancerIPs: 172.50.0.85
- spec:
- type: LoadBalancer
- - metadata:
- annotations:
- metallb.universe.tf/address-pool: designateext
- metallb.universe.tf/allow-shared-ip: designateext
- metallb.universe.tf/loadBalancerIPs: 172.50.0.86
- spec:
- type: LoadBalancer
-MAINCR
-----
-+
-where:
-
-``::
-Specifies the storage class name for persistent volumes (for example, `local-storage`).
-
-. Append the nameserver records to the patch file:
-+
-----
-$ ns_yaml=/tmp/designate_ns_records.yaml
-$ patch_file=/tmp/designate_osp_patch.yaml
-$ echo ' nsRecords:' >> "$patch_file"
-$ if [ -s "$ns_yaml" ] && [ "$(cat "$ns_yaml")" != "[]" ]; then
- sed 's/^/ /' "$ns_yaml" >> "$patch_file"
-else
- echo ' []' >> "$patch_file"
-fi
-----
-
-. Enable the {dns_service} in {rhocp_short}:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file /tmp/designate_osp_patch.yaml
-----
-
-. Wait for the {dns_service} to become ready:
-+
-----
-$ oc wait --for condition=Ready --timeout=600s designate.designate.openstack.org/designate
-----
diff --git a/docs_user/modules/proc_adopting-the-identity-service.adoc b/docs_user/modules/proc_adopting-the-identity-service.adoc
deleted file mode 100644
index 4749e8e9e..000000000
--- a/docs_user/modules/proc_adopting-the-identity-service.adoc
+++ /dev/null
@@ -1,91 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-identity-service_{context}"]
-
-= Adopting the {identity_service}
-
-[role="_abstract"]
-To adopt the {identity_service_first_ref}, you patch an existing `OpenStackControlPlane` custom resource (CR) where the {identity_service} is disabled. The patch starts the service with the configuration parameters that are provided by the {rhos_prev_long} ({OpenStackShort}) environment.
-
-.Prerequisites
-
-* Create the keystone secret that includes the Fernet keys that were copied from the {OpenStackShort} environment:
-+
-----
-$ oc apply -f - <*
- spec:
- type: LoadBalancer
- databaseInstance: openstack
- secret: osp-secret
-'
-----
-+
-where:
-
-<172.17.0.80>::
-Specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-
-. Create an alias to use the `openstack` command in the {rhos_long} deployment:
-+
-----
-$ alias openstack="oc exec -t openstackclient -- openstack"
-----
-
-. Remove services and endpoints that still point to the {OpenStackShort}
-control plane, excluding the {identity_service} and its endpoints:
-+
-----
-$ openstack endpoint list | grep keystone | awk '/admin/{ print $2; }' | xargs ${BASH_ALIASES[openstack]} endpoint delete || true
-> for service in aodh heat heat-cfn barbican cinderv3 glance designate gnocchi manila manilav2 neutron nova placement swift ironic-inspector ironic octavia; do
-> openstack service list | awk "/ $service /{ print \$2; }" | xargs -r ${BASH_ALIASES[openstack]} service delete || true
-> done
-----
-
-.Verification
-
-. Verify that you can access the `OpenStackClient` pod. For more information, see link:{defaultURL}/maintaining_the_red_hat_openstack_services_on_openshift_deployment/assembly_accessing-the-rhoso-cloud#proc_accessing-the-OpenStackClient-pod_cloud-access-admin[Accessing the OpenStackClient pod] in _Maintaining the {rhos_long_noacro} deployment_.
-
-. Confirm that the {identity_service} endpoints are defined and are pointing to the control plane FQDNs:
-+
-----
-$ openstack endpoint list | grep keystone
-----
-
-. Wait for the `OpenStackControlPlane` resource to become `Ready`:
-+
-----
-$ oc wait --for=condition=Ready --timeout=1m OpenStackControlPlane openstack
-----
diff --git a/docs_user/modules/proc_adopting-the-loadbalancer-service.adoc b/docs_user/modules/proc_adopting-the-loadbalancer-service.adoc
deleted file mode 100644
index 5be427b8b..000000000
--- a/docs_user/modules/proc_adopting-the-loadbalancer-service.adoc
+++ /dev/null
@@ -1,168 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-loadbalancer-service_{context}"]
-
-= Adopting the {loadbalancer_service}
-
-[role="_abstract"]
-Adopt the {loadbalancer_first_ref} by patching the existing `OpenStackControlPlane` custom resource (CR) where the {loadbalancer_service} is disabled. The patch starts the service with the configuration parameters from {rhos_prev_long}.
-
-After data plane adoption, trigger a failover of existing load balancers to upgrade amphora virtual machines to use the new image and to establish connectivity with the new control plane.
-
-.Procedure
-
-. Migrate the server certificate authority (CA) passphrase from the previous deployment:
-+
-----
-SERVER_CA_PASSPHRASE=$($CONTROLLER1_SSH grep ^ca_private_key_passphrase /var/lib/config-data/puppet-generated/octavia/etc/octavia/octavia.conf)
-
-oc apply -f - <",
- "id": 24
- }
- }
-},
-{
- "op": "add",
- "path": "/spec/desiredState/interfaces/-",
- "value": {
- "description": "Octavia Bridge",
- "mtu": ,
- "state": "up",
- "type": "linux-bridge",
- "name": "octbr",
- "bridge": {
- "options": { "stp": { "enabled": "false" } },
- "port": [ { "name": "enp6s0.24" } ]
- }
- }
-}]'
-
-done
-----
-+
-where:
-
-::
-Specifies the name of the network interface in your {OpenShiftShort} setup.
-::
-Specifies the `mtu` value in your environment.
-
-. To connect pods that manage load balancer virtual machines (amphorae) and the OpenvSwitch pods the OVN operator manages, configure the {loadbalancer_service} network attachment definition:
-+
-----
-$ cat octavia-nad.yaml << EOF_CAT
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- labels:
- osp/net: octavia
- name: octavia
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "octavia",
- "type": "bridge",
- "bridge": "octbr",
- "ipam": {
- "type": "whereabouts",
- "range": "172.23.0.0/24",
- "range_start": "172.23.0.30",
- "range_end": "172.23.0.70",
- "routes": [
- {
- "dst": "172.24.0.0/16",
- "gw" : "172.23.0.150"
- }
- ]
- }
- }
-EOF_CAT
-----
-
-. Create the `NetworkAttachmentDefinition` CR:
-+
-----
-$ oc apply -f octavia-nad.yaml
-----
-
-. Enable the {loadbalancer_service} in {OpenShiftShort}:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- ovn:
- template:
- ovnController:
- networkAttachment: tenant
- nicMappings:
- octavia: octbr
- octavia:
- enabled: true
- template:
- amphoraImageContainerImage: quay.io/gthiemonge/octavia-amphora-image
- octaviaHousekeeping:
- networkAttachments:
- - octavia
- octaviaHealthManager:
- networkAttachments:
- - octavia
- octaviaWorker:
- networkAttachments:
- - octavia
-'
-----
-
-. Wait for the {loadbalancer_service} control plane services CRs to be ready:
-+
-----
-$ oc wait --for condition=Ready --timeout=600s octavia.octavia.openstack.org/octavia
-----
-
-. Ensure that the {loadbalancer_service} is registered in the {identity_service}:
-+
-----
-$ alias openstack="oc exec -t openstackclient -- openstack"
-$ openstack service list | grep load-balancer
-| bd078ca6f90c4b86a48801f45eb6f0d7 | octavia | load-balancer |
-$ openstack endpoint list --service load-balancer
-+----------------------------------+-----------+--------------+---------------+---------+-----------+---------------------------------------------------+
-| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
-+----------------------------------+-----------+--------------+---------------+---------+-----------+---------------------------------------------------+
-| f1ae7756b6164baf9cb82a1a670067a2 | regionOne | octavia | load-balancer | True | public | https://octavia-public-openstack.apps-crc.testing |
-| ff3222b4621843669e89843395213049 | regionOne | octavia | load-balancer | True | internal | http://octavia-internal.openstack.svc:9876 |
-+----------------------------------+-----------+--------------+---------------+---------+-----------+---------------------------------------------------+
-----
-
-.Next steps
-
-After you complete the data plane adoption, you must upgrade existing load balancers and remove old resources. For more information, see xref:performing-post-adoption-cleanup-of-load-balancers_data-plane[Post-adoption tasks for the {loadbalancer_service}].
diff --git a/docs_user/modules/proc_adopting-the-networking-service.adoc b/docs_user/modules/proc_adopting-the-networking-service.adoc
deleted file mode 100644
index 714f1dc62..000000000
--- a/docs_user/modules/proc_adopting-the-networking-service.adoc
+++ /dev/null
@@ -1,124 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-networking-service_{context}"]
-
-= Adopting the {networking_service}
-
-[role="_abstract"]
-To adopt the {networking_first_ref}, you patch an existing `OpenStackControlPlane` custom resource (CR) that has the {networking_service} disabled. The patch starts the service with the
-configuration parameters that are provided by the {rhos_prev_long} ({OpenStackShort}) environment.
-
-The {networking_service} adoption is complete if you see the following results:
-
-* The `NeutronAPI` service is running.
-* The {identity_service_first_ref} endpoints are updated, and the same back end of the source cloud is available.
-
-ifeval::["{build}" != "downstream"]
-The {networking_service} adoption follows a similar pattern to https://github.com/openstack-k8s-operators/data-plane-adoption/blob/main/keystone_adoption.md[Keystone].
-endif::[]
-
-.Prerequisites
-
-* Ensure that Single Node OpenShift or OpenShift Local is running in the {rhocp_long} cluster.
-* Adopt the {identity_service}. For more information, see xref:adopting-the-identity-service_adopt-control-plane[Adopting the {identity_service}].
-* Migrate your OVN databases to `ovsdb-server` instances that run in the {rhocp_long} cluster. For more information, see xref:migrating-ovn-data_migrating-databases[Migrating OVN data].
-
-
-.Procedure
-
-* Patch the `OpenStackControlPlane` CR to deploy the {networking_service}:
-+
-[subs="+quotes"]
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- neutron:
- enabled: true
- apiOverride:
- route: {}
- template:
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: *<172.17.0.80>*
- spec:
- type: LoadBalancer
- databaseInstance: openstack
- databaseAccount: neutron
- secret: osp-secret
- networkAttachments:
- - internalapi
-'
-----
-+
-where:
-
-<172.17.0.80>::
-Specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-+
-[NOTE]
-====
-If you used the `neutron-dhcp-agent` in your {OpenStackShort} {rhos_prev_ver} deployment and you still need to use it after adoption, you must enable the `dhcp_agent_notification` for the `neutron-api` service:
-
-[source,shell]
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
- spec:
- neutron:
- template:
- customServiceConfig: |
- [DEFAULT]
- dhcp_agent_notification = True
-'
-----
-+
-====
-[NOTE]
-====
-If you are adopting the {bare_metal_first_ref}, you must configure the ML2 mechanism drivers to include both `ovn` and `baremetal`:
-
-[source,shell]
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- neutron:
- template:
- ml2MechanismDrivers:
- - ovn
- - baremetal
-'
-----
-====
-
-.Verification
-
-* Inspect the resulting {networking_service} pods:
-+
-----
-$ oc get pods -l service=neutron
-----
-
-* Ensure that the `Neutron API` service is registered in the {identity_service}:
-+
-----
-$ openstack service list | grep network
-----
-+
-[source,shell]
-----
-$ openstack endpoint list | grep network
-
-| 6a805bd6c9f54658ad2f24e5a0ae0ab6 | regionOne | neutron | network | True | public | http://neutron-public-openstack.apps-crc.testing |
-| b943243e596847a9a317c8ce1800fa98 | regionOne | neutron | network | True | internal | http://neutron-internal.openstack.svc:9696 |
-----
-
-* Create sample resources so that you can test whether the user can create networks, subnets, ports, or routers:
-+
-----
-$ openstack network create net
-$ openstack subnet create --network net --subnet-range 10.0.0.0/24 subnet
-$ openstack router create router
-----
diff --git a/docs_user/modules/proc_adopting-the-object-storage-service.adoc b/docs_user/modules/proc_adopting-the-object-storage-service.adoc
deleted file mode 100644
index 6c6ddf767..000000000
--- a/docs_user/modules/proc_adopting-the-object-storage-service.adoc
+++ /dev/null
@@ -1,148 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-object-storage-service_{context}"]
-
-= Adopting the {object_storage}
-
-[role="_abstract"]
-If you are using Object Storage as a service, adopt the {object_storage_first_ref} to the {rhos_long} environment. If you are using the Object Storage API of the Ceph Object Gateway (RGW), skip the following procedure.
-
-.Prerequisites
-
-* The {object_storage} storage back-end services are running in the {rhos_prev_long} ({OpenStackShort}) deployment.
-* The storage network is properly configured on the {rhocp_long} cluster. For more information, see link:{deploying-rhoso}/assembly_preparing-rhocp-for-rhoso#proc_configuring-the-data-plane-network_preparing[Preparing Red Hat OpenShift Container Platform for Red Hat OpenStack Services on OpenShift] in _{deploying-rhoso-t}_.
-
-.Procedure
-
-. Create the `swift-conf` secret that includes the {object_storage} hash path suffix and prefix:
-+
-----
-$ oc apply -f - <*
- spec:
- type: LoadBalancer
- *networkAttachments:*
- - storage
-'
-----
-+
-* `spec.swift.swiftStorage.storageClass` must match the {rhos_acro} deployment storage class.
-* `metallb.universe.tf/loadBalancerIPs: <172.17.0.80>` specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-* `spec.swift.swiftProxy.networkAttachments` must match the network attachment for the previous {object_storage} configuration from the {OpenStackShort} deployment.
-+
-[NOTE]
-If `SwiftEncryptionEnabled: true` was set in {rhos_prev_long}, ensure that `spec.swift.swiftProxy.encryptionEnabled` is set to `true` and that the {key_manager_first_ref} adoption is complete before proceeding.
-
-.Verification
-
-* Inspect the resulting {object_storage} pods:
-+
-----
-$ oc get pods -l component=swift-proxy
-----
-
-* Verify that the Object Storage proxy service is registered in the {identity_service_first_ref}:
-+
-----
-$ openstack service list | grep swift
-| b5b9b1d3c79241aa867fa2d05f2bbd52 | swift | object-store |
-----
-+
-----
-$ openstack endpoint list | grep swift
-| 32ee4bd555414ab48f2dc90a19e1bcd5 | regionOne | swift | object-store | True | public | https://swift-public-openstack.apps-crc.testing/v1/AUTH_%(tenant_id)s |
-| db4b8547d3ae4e7999154b203c6a5bed | regionOne | swift | object-store | True | internal | http://swift-internal.openstack.svc:8080/v1/AUTH_%(tenant_id)s |
-----
-
-* Verify that you are able to upload and download objects:
-+
-----
-$ openstack container create test
-+---------------------------------------+-----------+------------------------------------+
-| account | container | x-trans-id |
-+---------------------------------------+-----------+------------------------------------+
-| AUTH_4d9be0a9193e4577820d187acdd2714a | test | txe5f9a10ce21e4cddad473-0065ce41b9 |
-+---------------------------------------+-----------+------------------------------------+
-
-$ openstack object create test --name obj <(echo "Hello World!")
-+--------+-----------+----------------------------------+
-| object | container | etag |
-+--------+-----------+----------------------------------+
-| obj | test | d41d8cd98f00b204e9800998ecf8427e |
-+--------+-----------+----------------------------------+
-
-$ openstack object save test obj --file -
-Hello World!
-----
-
-.Next steps
-
-After the initial adoption, the {object_storage} data is still stored on the existing {OpenStackShort} nodes. You have two options for handling these storage nodes:
-
-* *Migrate data to new {rhos_acro} nodes*: Provision new storage nodes on {rhocp_long} and gradually move data by using the `swift-ring-tool`. For more information, see xref:migrating-object-storage-data-to-rhoso-nodes_migrate-object-storage-service[Migrating the {object_storage_first_ref} data from {OpenStackShort} to {rhos_long} nodes].
-
-* *Convert existing nodes to dataplane nodes*: Keep the data on the same nodes and convert them to data plane nodes that are managed by the `openstack-operators`. For more information, see xref:converting-object-storage-nodes[Converting {object_storage} storage nodes].
diff --git a/docs_user/modules/proc_adopting-the-openstack-dashboard.adoc b/docs_user/modules/proc_adopting-the-openstack-dashboard.adoc
deleted file mode 100644
index fd554fa40..000000000
--- a/docs_user/modules/proc_adopting-the-openstack-dashboard.adoc
+++ /dev/null
@@ -1,44 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-openstack-dashboard_{context}"]
-
-= Adopting the {dashboard_service}
-
-[role="_abstract"]
-To adopt the {dashboard_first_ref}, you patch an existing `OpenStackControlPlane` custom resource (CR) that has the {dashboard_service} disabled. The patch starts the service with the configuration parameters that are provided by the {rhos_prev_long} environment.
-
-.Prerequisites
-
-* You adopted Memcached. For more information, see xref:deploying-backend-services_migrating-databases[Deploying back-end services].
-* You adopted the {identity_service_first_ref}. For more information, see xref:adopting-the-identity-service_adopt-control-plane[Adopting the {identity_service}].
-
-.Procedure
-
-* Patch the `OpenStackControlPlane` CR to deploy the {dashboard_service}:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- horizon:
- enabled: true
- apiOverride:
- route: {}
- template:
- memcachedInstance: memcached
- secret: osp-secret
-'
-----
-
-.Verification
-
-. Verify that the {dashboard_service} instance is successfully deployed and ready:
-+
-----
-$ oc get horizon
-----
-
-. Confirm that the {dashboard_service} is reachable and returns a `200` status code:
-+
-----
-PUBLIC_URL=$(oc get horizon horizon -o jsonpath='{.status.endpoint}')
-curl --silent --output /dev/stderr --head --write-out "%{http_code}" "$PUBLIC_URL/dashboard/auth/login/?next=/dashboard/" -k | grep 200
-----
diff --git a/docs_user/modules/proc_adopting-the-orchestration-service.adoc b/docs_user/modules/proc_adopting-the-orchestration-service.adoc
deleted file mode 100644
index d17127583..000000000
--- a/docs_user/modules/proc_adopting-the-orchestration-service.adoc
+++ /dev/null
@@ -1,186 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-orchestration-service_{context}"]
-
-= Adopting the {orchestration}
-
-[role="_abstract"]
-To adopt the {orchestration_first_ref}, you patch an existing `OpenStackControlPlane` custom resource (CR), where the {orchestration}
-is disabled. The patch starts the service with the configuration parameters that are provided by the {rhos_prev_long} ({OpenStackShort}) environment.
-
-After you complete the adoption process, you have CRs for `Heat`, `HeatAPI`, `HeatEngine`, and `HeatCFNAPI`, and endpoints within the {identity_service_first_ref} to facilitate these services.
-
-ifeval::["{build}" != "downstream"]
-The Heat Adoption follows a similar workflow to https://github.com/openstack-k8s-operators/data-plane-adoption/blob/main/keystone_adoption.md[Keystone].
-endif::[]
-
-.Prerequisites
-
-* The source {OpenStackPreviousInstaller} environment is running.
-* The target {rhocp_long} environment is running.
-* You adopted MariaDB and the {identity_service}.
-* If your existing {orchestration} stacks contain resources from other services such as {networking_first_ref}, {compute_service_first_ref}, {object_storage_first_ref}, and so on, adopt those sevices before adopting the {orchestration}.
-
-.Procedure
-
-. Retrieve the existing `auth_encryption_key` and `service` passwords. You use these passwords to patch the `osp-secret`. In the following example, the `auth_encryption_key` is used as `HeatAuthEncryptionKey` and the `service` password is used as `HeatPassword`:
-+
-----
-[stack@rhosp17 ~]$ grep -E 'HeatPassword|HeatAuth|HeatStackDomainAdmin' ~/overcloud-deploy/overcloud/overcloud-passwords.yaml
- HeatAuthEncryptionKey: Q60Hj8PqbrDNu2dDCbyIQE2dibpQUPg2
- HeatPassword: dU2N0Vr2bdelYH7eQonAwPfI3
- HeatStackDomainAdminPassword: dU2N0Vr2bdelYH7eQonAwPfI3
-----
-
-. Log in to a Controller node and verify the `auth_encryption_key` value in use:
-+
-----
-[stack@rhosp17 ~]$ ansible -i overcloud-deploy/overcloud/config-download/overcloud/tripleo-ansible-inventory.yaml overcloud-controller-0 -m shell -a "grep auth_encryption_key /var/lib/config-data/puppet-generated/heat/etc/heat/heat.conf | grep -Ev '^#|^$'" -b
-overcloud-controller-0 | CHANGED | rc=0 >>
-auth_encryption_key=Q60Hj8PqbrDNu2dDCbyIQE2dibpQUPg2
-----
-
-. Encode the password to Base64 format:
-+
-----
-$ echo -n Q60Hj8PqbrDNu2dDCbyIQE2dibpQUPg2 | base64
-UTYwSGo4UHFickROdTJkRENieUlRRTJkaWJwUVVQZzI=
-----
-
-. Patch the `osp-secret` to update the `HeatAuthEncryptionKey` and `HeatPassword` parameters. These values must match the values in the {OpenStackPreviousInstaller} {orchestration} configuration:
-+
-----
-$ oc patch secret osp-secret --type='json' -p='[{"op" : "replace" ,"path" : "/data/HeatAuthEncryptionKey" ,"value" : "UTYwSGo4UHFickROdTJkRENieUlRRTJkaWJwUVVQZzI="}]'
-secret/osp-secret patched
-----
-
-. Patch the `OpenStackControlPlane` CR to deploy the {orchestration}:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- heat:
- enabled: true
- apiOverride:
- route: {}
- template:
- databaseInstance: openstack
- databaseAccount: heat
- secret: osp-secret
- memcachedInstance: memcached
- passwordSelectors:
- authEncryptionKey: HeatAuthEncryptionKey
- service: HeatPassword
- stackDomainAdminPassword: HeatStackDomainAdminPassword
-'
-----
-
-. Remove old `heat-engine` services from the `heat-api` pods or the `heat-engine` pods. For example:
-+
-----
-$ oc exec -it -n openstack "$(oc get pods -n openstack -l service=heat -o jsonpath='{.items[0].metadata.name}')" -c heat-api -- heat-manage service clean
-----
-+
-[NOTE]
-You cannot run this command from the `openstackclient` pod. The `openstackclient` pod does not include the {orchestration} configuration or the `heat-manage` binary.
-
-.Verification
-
-. Ensure that the statuses of all the CRs are `Setup complete`:
-+
-----
-$ oc get Heat,HeatAPI,HeatEngine,HeatCFNAPI
-NAME STATUS MESSAGE
-heat.heat.openstack.org/heat True Setup complete
-
-NAME STATUS MESSAGE
-heatapi.heat.openstack.org/heat-api True Setup complete
-
-NAME STATUS MESSAGE
-heatengine.heat.openstack.org/heat-engine True Setup complete
-
-NAME STATUS MESSAGE
-heatcfnapi.heat.openstack.org/heat-cfnapi True Setup complete
-----
-
-. Check that the {orchestration} is registered in the {identity_service}:
-+
-----
-$ oc exec -it openstackclient -- openstack service list -c Name -c Type
-+------------+----------------+
-| Name | Type |
-+------------+----------------+
-| heat | orchestration |
-| glance | image |
-| heat-cfn | cloudformation |
-| ceilometer | Ceilometer |
-| keystone | identity |
-| placement | placement |
-| cinderv3 | volumev3 |
-| nova | compute |
-| neutron | network |
-+------------+----------------+
-----
-+
-----
-$ oc exec -it openstackclient -- openstack endpoint list --service=heat -f yaml
-- Enabled: true
- ID: 1da7df5b25b94d1cae85e3ad736b25a5
- Interface: public
- Region: regionOne
- Service Name: heat
- Service Type: orchestration
- URL: http://heat-api-public-openstack-operators.apps.okd.bne-shift.net/v1/%(tenant_id)s
-- Enabled: true
- ID: 414dd03d8e9d462988113ea0e3a330b0
- Interface: internal
- Region: regionOne
- Service Name: heat
- Service Type: orchestration
- URL: http://heat-api-internal.openstack-operators.svc:8004/v1/%(tenant_id)s
-----
-
-. Check that the {orchestration} engine services are running:
-+
-----
-$ oc exec -it openstackclient -- openstack orchestration service list -f yaml
-- Binary: heat-engine
- Engine ID: b16ad899-815a-4b0c-9f2e-e6d9c74aa200
- Host: heat-engine-6d47856868-p7pzz
- Hostname: heat-engine-6d47856868-p7pzz
- Status: up
- Topic: engine
- Updated At: '2023-10-11T21:48:01.000000'
-- Binary: heat-engine
- Engine ID: 887ed392-0799-4310-b95c-ac2d3e6f965f
- Host: heat-engine-6d47856868-p7pzz
- Hostname: heat-engine-6d47856868-p7pzz
- Status: up
- Topic: engine
- Updated At: '2023-10-11T21:48:00.000000'
-- Binary: heat-engine
- Engine ID: 26ed9668-b3f2-48aa-92e8-2862252485ea
- Host: heat-engine-6d47856868-p7pzz
- Hostname: heat-engine-6d47856868-p7pzz
- Status: up
- Topic: engine
- Updated At: '2023-10-11T21:48:00.000000'
-- Binary: heat-engine
- Engine ID: 1011943b-9fea-4f53-b543-d841297245fd
- Host: heat-engine-6d47856868-p7pzz
- Hostname: heat-engine-6d47856868-p7pzz
- Status: up
- Topic: engine
- Updated At: '2023-10-11T21:48:01.000000'
-----
-
-. Verify that you can see your {orchestration} stacks:
-+
-----
-$ openstack stack list -f yaml
-- Creation Time: '2023-10-11T22:03:20Z'
- ID: 20f95925-7443-49cb-9561-a1ab736749ba
- Project: 4eacd0d1cab04427bc315805c28e66c9
- Stack Name: test-networks
- Stack Status: CREATE_COMPLETE
- Updated Time: null
-----
diff --git a/docs_user/modules/proc_adopting-the-placement-service.adoc b/docs_user/modules/proc_adopting-the-placement-service.adoc
deleted file mode 100644
index ca69a6443..000000000
--- a/docs_user/modules/proc_adopting-the-placement-service.adoc
+++ /dev/null
@@ -1,65 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="adopting-the-placement-service_{context}"]
-
-= Adopting the Placement service
-
-[role="_abstract"]
-To adopt the Placement service, you patch an existing `OpenStackControlPlane` custom resource (CR) that has the Placement service disabled. The patch starts the service with the configuration parameters that are provided by the {rhos_prev_long} ({OpenStackShort}) environment.
-
-.Prerequisites
-
-* You import your databases to MariaDB instances on the control plane. For more information, see xref:migrating-databases-to-mariadb-instances_migrating-databases[Migrating databases to MariaDB instances].
-* You adopt the {identity_service_first_ref}. For more information, see xref:adopting-the-identity-service_adopt-control-plane[Adopting the Identity service].
-
-.Procedure
-
-* Patch the `OpenStackControlPlane` CR to deploy the Placement service:
-+
-[subs="+quotes"]
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- placement:
- enabled: true
- apiOverride:
- route: {}
- template:
- databaseInstance: openstack
- databaseAccount: placement
- secret: osp-secret
- override:
- service:
- internal:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/allow-shared-ip: internalapi
- metallb.universe.tf/loadBalancerIPs: *<172.17.0.80>*
- spec:
- type: LoadBalancer
-'
-----
-+
-where:
-
-<172.17.0.80>::
-Specifies the load balancer IP in your environment. If you use IPv6, change the load balancer IP to the load balancer IP in your environment, for example, `metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80`.
-
-.Verification
-
-* Check that the Placement service endpoints are defined and pointing to the
-control plane FQDNs, and that the Placement API responds:
-+
-----
-$ alias openstack="oc exec -t openstackclient -- openstack"
-
-$ openstack endpoint list | grep placement
-
-
-# Without OpenStack CLI placement plugin installed:
-$ PLACEMENT_PUBLIC_URL=$(openstack endpoint list -c 'Service Name' -c 'Service Type' -c URL | grep placement | grep public | awk '{ print $6; }')
-$ oc exec -t openstackclient -- curl "$PLACEMENT_PUBLIC_URL"
-
-# With OpenStack CLI placement plugin installed:
-$ openstack resource class list
-----
diff --git a/docs_user/modules/proc_comparing-configuration-files-between-deployments.adoc b/docs_user/modules/proc_comparing-configuration-files-between-deployments.adoc
deleted file mode 100644
index ed2c284b0..000000000
--- a/docs_user/modules/proc_comparing-configuration-files-between-deployments.adoc
+++ /dev/null
@@ -1,101 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="comparing-configuration-files-between-deployments_{context}"]
-
-= Comparing configuration files between deployments
-
-[role="_abstract"]
-To help you manage the configuration for your {OpenStackPreviousInstaller} and {rhos_prev_long} ({OpenStackShort}) services, you can compare the configuration files between your {OpenStackPreviousInstaller} deployment and the {rhos_long} cloud by using the os-diff tool.
-ifeval::["{build_variant}" == "ospdo"]
-[NOTE]
- Os-diff does not currently support director Operator.
-endif::[]
-
-.Prerequisites
-
-* Golang is installed and configured on your environment:
-+
-----
-dnf install -y golang-github-openstack-k8s-operators-os-diff
-----
-
-.Procedure
-
-. Configure the `/etc/os-diff/os-diff.cfg` file and the `/etc/os-diff/ssh.config` file according to your environment. To allow os-diff to connect to your clouds and pull files from the services that you describe in the `config.yaml` file, you must set the following options in the `os-diff.cfg` file:
-+
-[subs=+quotes]
-----
-[Default]
-
-local_config_dir=/tmp/
-service_config_file=config.yaml
-
-[Tripleo]
-
-*ssh_cmd=ssh -F ssh.config*
-*director_host=standalone*
-container_engine=podman
-connection=ssh
-remote_config_path=/tmp/tripleo
-local_config_path=/tmp/
-
-[Openshift]
-
-ocp_local_config_path=/tmp/ocp
-connection=local
-ssh_cmd=""
-----
-+
-* `ssh_cmd=ssh -F ssh.config` instructs os-diff to access your {OpenStackPreviousInstaller} host through SSH. The default value is `ssh -F ssh.config`. However, you can set the value without an ssh.config file, for example, `ssh -i /home/user/.ssh/id_rsa stack@my.undercloud.local`.
-* `director_host=standalone` specifies the host to use to access your cloud, and the podman/docker binary is installed and allowed to interact with the running containers. You can leave this key blank.
-
-. If you use a host file to connect to your cloud, configure the `ssh.config` file to allow os-diff to access your {OpenStackShort} environment, for example:
-+
-[source,yaml]
-[subs=+quotes]
-----
-Host *
- IdentitiesOnly yes
-
-Host virthost
- Hostname virthost
- IdentityFile ~/.ssh/id_rsa
- User root
- StrictHostKeyChecking no
- UserKnownHostsFile=/dev/null
-
-
-Host standalone
- Hostname standalone
-ifeval::["{build}" != "downstream"]
- IdentityFile ~/install_yamls/out/edpm/ansibleee-ssh-key-id_rsa
-endif::[]
-ifeval::["{build}" == "downstream"]
- IdentityFile
-endif::[]
- User root
- StrictHostKeyChecking no
- UserKnownHostsFile=/dev/null
-
-Host crc
- Hostname crc
- IdentityFile ~/.ssh/id_rsa
- User stack
- StrictHostKeyChecking no
- UserKnownHostsFile=/dev/null
-----
-+
-* Replace `` with the path to your SSH key. You must provide a value for `IdentityFile` to get full working access to your {OpenStackShort} environment.
-
-. If you use an inventory file to connect to your cloud, generate the `ssh.config` file from your Ansible inventory, for example, `tripleo-ansible-inventory.yaml` file:
-+
-----
-$ os-diff configure -i tripleo-ansible-inventory.yaml -o ssh.config --yaml
-----
-
-.Verification
-
-* Test your connection:
-+
-----
-$ ssh -F ssh.config standalone
-----
diff --git a/docs_user/modules/proc_completing-prerequisites-for-migrating-ceph-monitoring-stack.adoc b/docs_user/modules/proc_completing-prerequisites-for-migrating-ceph-monitoring-stack.adoc
deleted file mode 100644
index 8f4ebb986..000000000
--- a/docs_user/modules/proc_completing-prerequisites-for-migrating-ceph-monitoring-stack.adoc
+++ /dev/null
@@ -1,75 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="completing-prerequisites-for-migrating-ceph-monitoring-stack_{context}"]
-
-= Completing prerequisites for a {Ceph} cluster with monitoring stack components
-
-[role="_abstract"]
-Before you migrate a {Ceph} cluster with monitoring stack components, you must gather monitoring stack information, review and update the container image registry, and remove the undercloud container images.
-
-[NOTE]
-In addition to updating the container images related to the monitoring stack, you must update the configuration entry related to the `container_image_base`. This has an impact on all the {Ceph} daemons that rely on the undercloud images.
-New daemons are deployed by using the new image registry location that is configured in the {Ceph} cluster.
-
-.Procedure
-
-. Gather the current status of the monitoring stack. Verify that
-the hosts have no `monitoring` label, or `grafana`, `prometheus`, or `alertmanager`, in cases of a per daemons placement evaluation:
-[NOTE]
-The entire relocation process is driven by `cephadm` and relies on labels to be
-assigned to the target nodes, where the daemons are scheduled.
-ifeval::["{build}" != "upstream"]
-For more information about assigning labels to nodes, review the Red Hat Knowledgebase article https://access.redhat.com/articles/1548993[Red Hat Ceph Storage: Supported configurations].
-endif::[]
-+
-----
-[tripleo-admin@controller-0 ~]$ sudo cephadm shell -- ceph orch host ls
-
-HOST ADDR LABELS STATUS
-cephstorage-0.redhat.local 192.168.24.11 osd mds
-cephstorage-1.redhat.local 192.168.24.12 osd mds
-cephstorage-2.redhat.local 192.168.24.47 osd mds
-controller-0.redhat.local 192.168.24.35 _admin mon mgr
-controller-1.redhat.local 192.168.24.53 mon _admin mgr
-controller-2.redhat.local 192.168.24.10 mon _admin mgr
-6 hosts in cluster
-----
-+
-Confirm that the cluster is healthy and that both `ceph orch ls` and
-`ceph orch ps` return the expected number of deployed daemons.
-
-. Review and update the container image registry:
-[NOTE]
-If you run the {Ceph} externalization procedure after you migrate the {rhos_prev_long} control plane, update the container images in the {CephCluster} cluster configuration. The current container images point to the undercloud registry, which might not be available anymore. Because the undercloud is not available after adoption is complete, replace the undercloud-provided images with an alternative registry.
-ifeval::["{build}" != "downstream"]
-In case the desired option is to rely on the https://github.com/ceph/ceph/blob/reef/src/cephadm/cephadm.py#L48[default images]
-shipped by cephadm, remove the following config options from the {CephCluster} cluster.
-endif::[]
-+
-----
-$ ceph config dump
-...
-...
-ifeval::["{build}" != "downstream"]
-mgr advanced mgr/cephadm/container_image_alertmanager undercloud-0.ctlplane.redhat.local:8787/ceph/alertmanager:v0.25.0
-mgr advanced mgr/cephadm/container_image_base undercloud-0.ctlplane.redhat.local:8787/ceph/ceph:v18
-mgr advanced mgr/cephadm/container_image_grafana undercloud-0.ctlplane.redhat.local:8787/ceph/ceph-grafana:9.4.7
-mgr advanced mgr/cephadm/container_image_node_exporter undercloud-0.ctlplane.redhat.local:8787/ceph/node-exporter:v1.5.0
-mgr advanced mgr/cephadm/container_image_prometheus undercloud-0.ctlplane.redhat.local:8787/ceph/prometheus:v2.43.0
-endif::[]
-ifeval::["{build}" == "downstream"]
-mgr advanced mgr/cephadm/container_image_alertmanager undercloud-0.ctlplane.redhat.local:8787/rh-osbs/openshift-ose-prometheus-alertmanager:v4.10
-mgr advanced mgr/cephadm/container_image_base undercloud-0.ctlplane.redhat.local:8787/rh-osbs/rhceph
-mgr advanced mgr/cephadm/container_image_grafana undercloud-0.ctlplane.redhat.local:8787/rh-osbs/grafana:latest
-mgr advanced mgr/cephadm/container_image_node_exporter undercloud-0.ctlplane.redhat.local:8787/rh-osbs/openshift-ose-prometheus-node-exporter:v4.10
-mgr advanced mgr/cephadm/container_image_prometheus undercloud-0.ctlplane.redhat.local:8787/rh-osbs/openshift-ose-prometheus:v4.10
-endif::[]
-----
-
-. Remove the undercloud container images:
-+
-----
-$ cephadm shell -- ceph config rm mgr mgr/cephadm/container_image_base \
-for i in prometheus grafana alertmanager node_exporter; do \
- cephadm shell -- ceph config rm mgr mgr/cephadm/container_image_$i \
-done
-----
diff --git a/docs_user/modules/proc_completing-prerequisites-for-migrating-ceph-rgw.adoc b/docs_user/modules/proc_completing-prerequisites-for-migrating-ceph-rgw.adoc
deleted file mode 100644
index ce967ab10..000000000
--- a/docs_user/modules/proc_completing-prerequisites-for-migrating-ceph-rgw.adoc
+++ /dev/null
@@ -1,200 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="completing-prerequisites-for-migrating-ceph-rgw_{context}"]
-
-= Completing prerequisites for {Ceph} RGW migration
-
-[role="_abstract"]
-Complete the following prerequisites before you begin the Ceph Object Gateway (RGW) migration.
-
-.Procedure
-
-. Check the current status of the {Ceph} nodes:
-+
-----
-(undercloud) [stack@undercloud-0 ~]$ metalsmith list
-
-
- +------------------------+ +----------------+
- | IP Addresses | | Hostname |
- +------------------------+ +----------------+
- | ctlplane=192.168.24.25 | | cephstorage-0 |
- | ctlplane=192.168.24.10 | | cephstorage-1 |
- | ctlplane=192.168.24.32 | | cephstorage-2 |
- | ctlplane=192.168.24.28 | | compute-0 |
- | ctlplane=192.168.24.26 | | compute-1 |
- | ctlplane=192.168.24.43 | | controller-0 |
- | ctlplane=192.168.24.7 | | controller-1 |
- | ctlplane=192.168.24.41 | | controller-2 |
- +------------------------+ +----------------+
-----
-
-. Log in to `controller-0` and check the Pacemaker status to identify important information for the RGW migration:
-+
-----
-Full List of Resources:
- * ip-192.168.24.46 (ocf:heartbeat:IPaddr2): Started controller-0
- * ip-10.0.0.103 (ocf:heartbeat:IPaddr2): Started controller-1
- * ip-172.17.1.129 (ocf:heartbeat:IPaddr2): Started controller-2
- * ip-172.17.3.68 (ocf:heartbeat:IPaddr2): Started controller-0
- * ip-172.17.4.37 (ocf:heartbeat:IPaddr2): Started controller-1
- * Container bundle set: haproxy-bundle
-
-[undercloud-0.ctlplane.redhat.local:8787/rh-osbs/rhosp17-openstack-haproxy:pcmklatest]:
- * haproxy-bundle-podman-0 (ocf:heartbeat:podman): Started controller-2
- * haproxy-bundle-podman-1 (ocf:heartbeat:podman): Started controller-0
- * haproxy-bundle-podman-2 (ocf:heartbeat:podman): Started controller-1
-----
-
-. Identify the ranges of the storage networks. The following is an example and the values might differ in your environment:
-+
-[subs="+quotes"]
-----
-[heat-admin@controller-0 ~]$ ip -o -4 a
-
-1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
-2: enp1s0 inet 192.168.24.45/24 brd 192.168.24.255 scope global enp1s0\ valid_lft forever preferred_lft forever
-2: enp1s0 inet 192.168.24.46/32 brd 192.168.24.255 scope global enp1s0\ valid_lft forever preferred_lft forever
-7: *br-ex* inet 10.0.0.122/24 brd 10.0.0.255 scope global br-ex\ valid_lft forever preferred_lft forever
-8: vlan70 inet 172.17.5.22/24 brd 172.17.5.255 scope global vlan70\ valid_lft forever preferred_lft forever
-8: vlan70 inet 172.17.5.94/32 brd 172.17.5.255 scope global vlan70\ valid_lft forever preferred_lft forever
-9: vlan50 inet 172.17.2.140/24 brd 172.17.2.255 scope global vlan50\ valid_lft forever preferred_lft forever
-10: *vlan30* inet 172.17.3.73/24 brd 172.17.3.255 scope global vlan30\ valid_lft forever preferred_lft forever
-10: vlan30 inet 172.17.3.68/32 brd 172.17.3.255 scope global vlan30\ valid_lft forever preferred_lft forever
-11: vlan20 inet 172.17.1.88/24 brd 172.17.1.255 scope global vlan20\ valid_lft forever preferred_lft forever
-12: vlan40 inet 172.17.4.24/24 brd 172.17.4.255 scope global vlan40\ valid_lft forever preferred_lft forever
-----
-+
-* `br-ex` represents the External Network, where in the current environment, HAProxy has the front-end Virtual IP (VIP) assigned.
-* `vlan30` represents the Storage Network, where the new RGW instances should be started on the {CephCluster} nodes.
-
-. Identify the network that you previously had in HAProxy and propagate it through {OpenStackPreviousInstaller} to the {CephCluster} nodes. Use this network to reserve a new VIP that is owned by {Ceph} as the entry point for the RGW service.
-
-.. Log in to `controller-0` and find the `ceph_rgw` section in the current HAProxy configuration:
-+
-----
-$ less /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg
-...
-...
-listen ceph_rgw
- bind 10.0.0.103:8080 transparent
- bind 172.17.3.68:8080 transparent
- mode http
- balance leastconn
- http-request set-header X-Forwarded-Proto https if { ssl_fc }
- http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
- http-request set-header X-Forwarded-Port %[dst_port]
- option httpchk GET /swift/healthcheck
- option httplog
- option forwardfor
- server controller-0.storage.redhat.local 172.17.3.73:8080 check fall 5 inter 2000 rise 2
- server controller-1.storage.redhat.local 172.17.3.146:8080 check fall 5 inter 2000 rise 2
- server controller-2.storage.redhat.local 172.17.3.156:8080 check fall 5 inter 2000 rise 2
-----
-
-.. Confirm that the network is used as an HAProxy front end. The following example shows that `controller-0` exposes the services by using the external network, which is absent from the {Ceph} nodes. You must propagate the external network through {OpenStackPreviousInstaller}:
-+
-----
-[controller-0]$ ip -o -4 a
-
-...
-7: br-ex inet 10.0.0.106/24 brd 10.0.0.255 scope global br-ex\ valid_lft forever preferred_lft forever
-...
-----
-+
-[NOTE]
-If the target nodes are not managed by director, you cannot use this procedure to configure the network. An administrator must manually configure all the required networks.
-
-. Propagate the HAProxy front-end network to {CephCluster} nodes.
-
-.. In the NIC template that you use to define the `ceph-storage` network interfaces, add the new config section in the {Ceph} network configuration template file, for example, `/home/stack/composable_roles/network/nic-configs/ceph-storage.j2`:
-+
-----
----
-network_config:
-- type: interface
- name: nic1
- use_dhcp: false
- dns_servers: {{ ctlplane_dns_nameservers }}
- addresses:
- - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
- routes: {{ ctlplane_host_routes }}
-- type: vlan
- vlan_id: {{ storage_mgmt_vlan_id }}
- device: nic1
- addresses:
- - ip_netmask: {{ storage_mgmt_ip }}/{{ storage_mgmt_cidr }}
- routes: {{ storage_mgmt_host_routes }}
-- type: interface
- name: nic2
- use_dhcp: false
- defroute: false
-- type: vlan
- vlan_id: {{ storage_vlan_id }}
- device: nic2
- addresses:
- - ip_netmask: {{ storage_ip }}/{{ storage_cidr }}
- routes: {{ storage_host_routes }}
-- type: ovs_bridge
- name: {{ neutron_physical_bridge_name }}
- dns_servers: {{ ctlplane_dns_nameservers }}
- domain: {{ dns_search_domains }}
- use_dhcp: false
- addresses:
- - ip_netmask: {{ external_ip }}/{{ external_cidr }}
- routes: {{ external_host_routes }}
- members: []
- - type: interface
- name: nic3
- primary: true
-----
-
-.. Add the External Network to the bare metal file, for example, `/home/stack/composable_roles/network/baremetal_deployment.yaml` that is used by `metalsmith`:
-+
-[NOTE]
-Ensure that 'network_config_update' is enabled for network propagation to the target nodes when `os-net-config` is triggered.
-+
-----
-- name: CephStorage
- count: 3
- hostname_format: cephstorage-%index%
- instances:
- - hostname: cephstorage-0
- name: ceph-0
- - hostname: cephstorage-1
- name: ceph-1
- - hostname: cephstorage-2
- name: ceph-2
- defaults:
- profile: ceph-storage
- network_config:
- template: /home/stack/composable_roles/network/nic-configs/ceph-storage.j2
- network_config_update: true
- networks:
- - network: ctlplane
- vif: true
- - network: storage
- - network: storage_mgmt
- - network: external
-----
-
-.. Configure the new network on the bare metal nodes:
-+
-----
-(undercloud) [stack@undercloud-0]$ openstack overcloud node provision \
- -o overcloud-baremetal-deployed-0.yaml \
- --stack overcloud \
- --network-config -y \
- $PWD/composable_roles/network/baremetal_deployment.yaml
-----
-
-.. Verify that the new network is configured on the {CephCluster} nodes:
-+
-----
-[root@cephstorage-0 ~]# ip -o -4 a
-
-1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
-2: enp1s0 inet 192.168.24.54/24 brd 192.168.24.255 scope global enp1s0\ valid_lft forever preferred_lft forever
-11: vlan40 inet 172.17.4.43/24 brd 172.17.4.255 scope global vlan40\ valid_lft forever preferred_lft forever
-12: vlan30 inet 172.17.3.23/24 brd 172.17.3.255 scope global vlan30\ valid_lft forever preferred_lft forever
-14: br-ex inet 10.0.0.133/24 brd 10.0.0.255 scope global br-ex\ valid_lft forever preferred_lft forever
-----
diff --git a/docs_user/modules/proc_configuring-a-ceph-backend.adoc b/docs_user/modules/proc_configuring-a-ceph-backend.adoc
deleted file mode 100644
index d33917e27..000000000
--- a/docs_user/modules/proc_configuring-a-ceph-backend.adoc
+++ /dev/null
@@ -1,214 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="configuring-a-ceph-backend_{context}"]
-
-= Configuring a {Ceph} back end
-
-[role="_abstract"]
-If your {rhos_prev_long} ({OpenStackShort}) {rhos_prev_ver} deployment uses a {Ceph} back end for any service, such as {image_service_first_ref}, {block_storage_first_ref}, {compute_service_first_ref}, or {rhos_component_storage_file_first_ref}, you must configure the custom resources (CRs) to use the same back end in the {rhos_long} {rhos_curr_ver} deployment.
-
-[NOTE]
-To run `ceph` commands, you must use SSH to connect to a {Ceph} node and run `sudo cephadm shell`. This generates a Ceph orchestrator container that enables you to run administrative commands against the {CephCluster} cluster. If you deployed the {CephCluster} cluster by using {OpenStackPreviousInstaller}, you can launch the `cephadm` shell from an {OpenStackShort} Controller node.
-
-.Prerequisites
-
-* The `OpenStackControlPlane` CR is created.
-* If your {OpenStackShort} {rhos_prev_ver} deployment uses the {rhos_component_storage_file}, the openstack keyring is updated. Modify the `openstack` user so that you can use it across all {OpenStackShort} services:
-+
-----
-ceph auth caps client.openstack \
- mgr 'allow *' \
- mon 'allow r, profile rbd' \
- osd 'profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images, allow rw pool manila_data'
-----
-+
-Using the same user across all services makes it simpler to create a common {Ceph} secret that includes the keyring and `ceph.conf` file and propagate the secret to all the services that need it.
-* The following shell variables are defined. Replace the following example values with values that are correct for your environment:
-+
-[subs=+quotes]
-----
-ifeval::["{build}" != "downstream"]
-CEPH_SSH="ssh -i ~/install_yamls/out/edpm/ansibleee-ssh-key-id_rsa root@192.168.122.100"
-endif::[]
-ifeval::["{build}" == "downstream"]
-CEPH_SSH="ssh -i ** tripleo-admin@**"
-endif::[]
-CEPH_KEY=$($CEPH_SSH "cat /etc/ceph/ceph.client.openstack.keyring | base64 -w 0")
-CEPH_CONF=$($CEPH_SSH "cat /etc/ceph/ceph.conf | base64 -w 0")
-----
-
-.Procedure
-
-. Create the `ceph-conf-files` secret that includes the {Ceph} configuration:
-+
-----
-$ oc apply -f - <
- caps mgr = "allow *"
- caps mon = "allow r, profile rbd"
- caps osd = "pool=vms, profile rbd pool=volumes, profile rbd pool=images, allow rw pool manila_data'
- ceph.conf: |
- [global]
- fsid = 7a1719e8-9c59-49e2-ae2b-d7eb08c695d4
- mon_host = 10.1.1.2,10.1.1.3,10.1.1.4
-----
-+
-where:
-+
-`mon_host`:: specifies the addresses of the cluster's monitors. If you use IPv6, use brackets for the `mon_host`. For example: `mon_host = [v2:[fd00:cccc::100]:3300/0,v1:[fd00:cccc::100]:6789/0]`
-+
-[NOTE]
-====
-For Distributed Compute Node (DCN) deployments with multiple {Ceph} clusters, create one secret per site. Each secret contains only the keys that the respective site requires. For more information on the rationale and key distribution pattern, see xref:ceph-migration-dcn_{context}[{Ceph} migration for Distributed Compute Node deployments].
-
-The {Ceph} configuration files for all clusters are available on the {OpenStackShort} controller at either `/var/lib/tripleo-config/ceph/`, or `/etc/ceph`. Copy them locally and create the per-site secrets:
-
-----
-$ CEPH_SSH="ssh tripleo-admin@"
-$ CEPH_DIR="/var/lib/tripleo-config/ceph"
-$ TMPDIR=$(mktemp -d)
-
-$ $CEPH_SSH "cat ${CEPH_DIR}/central.conf" > ${TMPDIR}/central.conf
-$ $CEPH_SSH "sudo cat ${CEPH_DIR}/central.client.openstack.keyring" > ${TMPDIR}/central.client.openstack.keyring
-$ $CEPH_SSH "cat ${CEPH_DIR}/dcn1.conf" > ${TMPDIR}/dcn1.conf
-$ $CEPH_SSH "sudo cat ${CEPH_DIR}/dcn1.client.openstack.keyring" > ${TMPDIR}/dcn1.client.openstack.keyring
-$ $CEPH_SSH "cat ${CEPH_DIR}/dcn2.conf" > ${TMPDIR}/dcn2.conf
-$ $CEPH_SSH "sudo cat ${CEPH_DIR}/dcn2.client.openstack.keyring" > ${TMPDIR}/dcn2.client.openstack.keyring
-
-# Central site secret: contains all clusters
-$ oc create secret generic ceph-conf-central \
- --from-file=${TMPDIR}/central.conf \
- --from-file=${TMPDIR}/central.client.openstack.keyring \
- --from-file=${TMPDIR}/dcn1.conf \
- --from-file=${TMPDIR}/dcn1.client.openstack.keyring \
- --from-file=${TMPDIR}/dcn2.conf \
- --from-file=${TMPDIR}/dcn2.client.openstack.keyring \
- -n openstack
-
-# DCN1 edge site secret: central + local only
-$ oc create secret generic ceph-conf-dcn1 \
- --from-file=${TMPDIR}/central.conf \
- --from-file=${TMPDIR}/central.client.openstack.keyring \
- --from-file=${TMPDIR}/dcn1.conf \
- --from-file=${TMPDIR}/dcn1.client.openstack.keyring \
- -n openstack
-
-# DCN2 edge site secret: central + local only
-$ oc create secret generic ceph-conf-dcn2 \
- --from-file=${TMPDIR}/central.conf \
- --from-file=${TMPDIR}/central.client.openstack.keyring \
- --from-file=${TMPDIR}/dcn2.conf \
- --from-file=${TMPDIR}/dcn2.client.openstack.keyring \
- -n openstack
-
-$ rm -rf ${TMPDIR}
-----
-
-Repeat for each additional edge site. Each edge site secret must include the central cluster files and only the files for that edge site's local cluster.
-
-When configuring `extraMounts` on the `OpenStackControlPlane`, use propagation labels matching the service instance names (for example, `central`, `dcn1`, `dcn2`) so that each pod mounts only its site-specific secret.
-====
-
-. In your `OpenStackControlPlane` CR, inject the {Ceph} configuration into the {OpenStackShort} service pods using `extraMounts`. For a single-cluster deployment, propagate one secret to all services:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- extraMounts:
- - name: v1
- region: r1
- extraVol:
- - propagation:
- - CinderVolume
- - CinderBackup
- - GlanceAPI
- - ManilaShare
- extraVolType: Ceph
- volumes:
- - name: ceph
- projected:
- sources:
- - secret:
- name: ceph-conf-files
- mounts:
- - name: ceph
- mountPath: "/etc/ceph"
- readOnly: true
-'
-----
-+
-For a DCN deployment with per-site secrets, use propagation labels matching each service instance name so that each pod receives only the keys for its site:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch '
-spec:
- extraMounts:
- - name: v1
- region: r1
- extraVol:
- - extraVolType: Ceph
- propagation:
- - central
- - CinderBackup
- - ManilaShare
- volumes:
- - name: ceph-central
- projected:
- sources:
- - secret:
- name: ceph-conf-central
- mounts:
- - name: ceph-central
- mountPath: "/etc/ceph"
- readOnly: true
- - extraVolType: Ceph
- propagation:
- - dcn1
- volumes:
- - name: ceph-dcn1
- projected:
- sources:
- - secret:
- name: ceph-conf-dcn1
- mounts:
- - name: ceph-dcn1
- mountPath: "/etc/ceph"
- readOnly: true
- - extraVolType: Ceph
- propagation:
- - dcn2
- volumes:
- - name: ceph-dcn2
- projected:
- sources:
- - secret:
- name: ceph-conf-dcn2
- mounts:
- - name: ceph-dcn2
- mountPath: "/etc/ceph"
- readOnly: true
-'
-----
-+
-The propagation label `central` matches the {image_service} and {block_storage} pod instances named `central`. The `CinderBackup` and `ManilaShare` labels are service-type propagation and apply to all {block_storage} backup and {rhos_component_storage_file} pods, which run only at the central site. Replace `central`, `dcn1`, and `dcn2` with the instance names used in your deployment.
diff --git a/docs_user/modules/proc_configuring-control-plane-networking-for-spine-leaf.adoc b/docs_user/modules/proc_configuring-control-plane-networking-for-spine-leaf.adoc
deleted file mode 100644
index 2e2c270ea..000000000
--- a/docs_user/modules/proc_configuring-control-plane-networking-for-spine-leaf.adoc
+++ /dev/null
@@ -1,313 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="configuring-control-plane-networking-for-spine-leaf_{context}"]
-
-= Configuring control plane networking for spine-leaf topologies
-
-[role="_abstract"]
-Adopt a spine-leaf or Distributed Compute Node (DCN) deployment by updating the control plane networking for communication across sites. Add subnets for remote sites to `NetConfig` custom resources (CR) and add routes to `NetworkAttachmentDefinition` CRs to enable inter-site connectivity.
-
-.Prerequisites
-
-* You have deployed the {rhos_long} control plane.
-* You have configured a `NetConfig` CR for the central site. For more information, see xref:configuring-isolated-networks_configuring-network[Configuring isolated networks].
-* You have the network topology information for all remote sites, including:
-** IP address ranges for each service network at each site
-** VLAN IDs for each service network at each site
-** Gateway addresses for inter-site routing
-
-.Procedure
-
-. Update your existing `NetConfig` CR to add subnets for each remote site. Each service network must include a subnet for the central site and each remote site. Use unique VLAN IDs for each site. For example:
-+
-* Central site: VLANs 20-23
-* Edge site 1: VLANs 30-33
-* Edge site 2: VLANs 40-43
-+
-[source,yaml]
-----
-apiVersion: network.openstack.org/v1beta1
-kind: NetConfig
-metadata:
- name: netconfig
-spec:
- networks:
- - name: ctlplane
- dnsDomain: ctlplane.example.com
- subnets:
- - name:
- allocationRanges:
- - end: 192.168.122.120
- start: 192.168.122.100
- cidr: 192.168.122.0/24
- gateway: 192.168.122.1
- - name:
- allocationRanges:
- - end: 192.168.133.120
- start: 192.168.133.100
- cidr: 192.168.133.0/24
- gateway: 192.168.133.1
- - name:
- allocationRanges:
- - end: 192.168.144.120
- start: 192.168.144.100
- cidr: 192.168.144.0/24
- gateway: 192.168.144.1
- - name: internalapi
- dnsDomain: internalapi.example.com
- subnets:
- - name: subnet1
- allocationRanges:
- - end: 172.17.0.250
- start: 172.17.0.100
- cidr: 172.17.0.0/24
- vlan: 20
- - name: internalapisite1
- allocationRanges:
- - end: 172.17.10.250
- start: 172.17.10.100
- cidr: 172.17.10.0/24
- vlan: 30
- - name: internalapisite2
- allocationRanges:
- - end: 172.17.20.250
- start: 172.17.20.100
- cidr: 172.17.20.0/24
- vlan: 40
- - name: storage
- dnsDomain: storage.example.com
- subnets:
- - name: subnet1
- allocationRanges:
- - end: 172.18.0.250
- start: 172.18.0.100
- cidr: 172.18.0.0/24
- vlan: 21
- - name: storagesite1
- allocationRanges:
- - end: 172.18.10.250
- start: 172.18.10.100
- cidr: 172.18.10.0/24
- vlan: 31
- - name: storagesite2
- allocationRanges:
- - end: 172.18.20.250
- start: 172.18.20.100
- cidr: 172.18.20.0/24
- vlan: 41
- - name: tenant
- dnsDomain: tenant.example.com
- subnets:
- - name: subnet1
- allocationRanges:
- - end: 172.19.0.250
- start: 172.19.0.100
- cidr: 172.19.0.0/24
- vlan: 22
- - name: tenantsite1
- allocationRanges:
- - end: 172.19.10.250
- start: 172.19.10.100
- cidr: 172.19.10.0/24
- vlan: 32
- - name: tenantsite2
- allocationRanges:
- - end: 172.19.20.250
- start: 172.19.20.100
- cidr: 172.19.20.0/24
- vlan: 42
-----
-+
-where:
-
-``:: Specifies a user-defined subnet name for the central site subnet.
-``:: Specifies a user-defined subnet for the first DCN edge site.
-``:: Specifies a user-defined subnet for the second DCN edge site.
-+
-[NOTE]
-====
-You must have the `storagemgmt` network on OpenShift nodes when using DCN with Swift storage. It is not necessary when using Red Hat Ceph Storage.
-====
-
-. Update the `NetworkAttachmentDefinition` CR for the `internalapi` network to include routes to remote site subnets. These `routes` fields enable control plane pods attached to the `internalapi` network, such as OVN Southbound database, to communicate with Compute nodes at remote sites through the central site gateway, and are required for DCN:
-+
-[source,yaml]
-----
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- name: internalapi
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "internalapi",
- "type": "macvlan",
- "master": "internalapi",
- "ipam": {
- "type": "whereabouts",
- "range": "172.17.0.0/24",
- "range_start": "172.17.0.30",
- "range_end": "172.17.0.70",
- "routes": [
- { "dst": "172.17.10.0/24", "gw": "172.17.0.1" },
- { "dst": "172.17.20.0/24", "gw": "172.17.0.1" }
- ]
- }
- }
-----
-
-. Update the `NetworkAttachmentDefinition` CR for the `ctlplane` network to include routes to remote site subnets:
-+
-[source,yaml]
-----
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- name: ctlplane
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "ctlplane",
- "type": "macvlan",
- "master": "ospbr",
- "ipam": {
- "type": "whereabouts",
- "range": "192.168.122.0/24",
- "range_start": "192.168.122.30",
- "range_end": "192.168.122.70",
- "routes": [
- { "dst": "192.168.133.0/24", "gw": "192.168.122.1" },
- { "dst": "192.168.144.0/24", "gw": "192.168.122.1" }
- ]
- }
- }
-----
-
-. Update the `NetworkAttachmentDefinition` CR for the `storage` network to include routes to remote site subnets:
-+
-[source,yaml]
-----
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- name: storage
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "storage",
- "type": "macvlan",
- "master": "storage",
- "ipam": {
- "type": "whereabouts",
- "range": "172.18.0.0/24",
- "range_start": "172.18.0.30",
- "range_end": "172.18.0.70",
- "routes": [
- { "dst": "172.18.10.0/24", "gw": "172.18.0.1" },
- { "dst": "172.18.20.0/24", "gw": "172.18.0.1" }
- ]
- }
- }
-----
-
-. Update the `NetworkAttachmentDefinition` CR for the `tenant` network to include routes to remote site subnets:
-+
-[source,yaml]
-----
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- name: tenant
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "tenant",
- "type": "macvlan",
- "master": "tenant",
- "ipam": {
- "type": "whereabouts",
- "range": "172.19.0.0/24",
- "range_start": "172.19.0.30",
- "range_end": "172.19.0.70",
- "routes": [
- { "dst": "172.19.10.0/24", "gw": "172.19.0.1" },
- { "dst": "172.19.20.0/24", "gw": "172.19.0.1" }
- ]
- }
- }
-----
-+
-[NOTE]
-====
-Adjust the IP ranges, subnets, and gateway addresses in all NAD configurations to match your network topology. The `master` interface name must match the interface on the OpenShift nodes where the VLAN is configured.
-====
-
-. If you have already deployed OVN services, restart the OVN Southbound database pods to pick up the new routes:
-+
-----
-$ oc delete pod -l service=ovsdbserver-sb
-----
-+
-The pods are automatically recreated with the updated network configuration.
-
-. Configure the {networking_first_ref} to recognize all site physnets. In the `OpenStackControlPlane` CR, ensure the Networking service configuration includes all physnets:
-+
-[source,yaml]
-----
-apiVersion: core.openstack.org/v1beta1
-kind: OpenStackControlPlane
-metadata:
- name: openstack
-spec:
- neutron:
- template:
- customServiceConfig: |
- [ml2_type_vlan]
- network_vlan_ranges = leaf0:1:1000,leaf1:1:1000,leaf2:1:1000
- [ovn]
- ovn_emit_need_to_frag = false
-----
-+
-where:
-
-leaf0:: Represents the physnet for the central site.
-leaf1:: Represents the physnet for the first remote site.
-leaf2:: Represents the physnet for the second remote site.
-+
-[NOTE]
-====
-Adjust the physnet names to match your {rhos_prev_long} deployment. Common conventions include `leaf0/leaf1/leaf2` or `datacentre/dcn1/dcn2`.
-====
-
-.Verification
-
-. Verify that the `NetConfig` CR is created with all subnets:
-+
-----
-$ oc get netconfig netconfig -o yaml | grep -A2 "name: subnet1\|name: .*site"
-----
-
-. Verify that each `NetworkAttachmentDefinition` includes routes to remote site subnets:
-+
-----
-for nad in ctlplane internalapi storage tenant; do
- echo "=== $nad ==="
- oc get net-attach-def $nad -o jsonpath='{.spec.config}' | jq '.ipam.routes
-done
-----
-
-. After restarting OVN SB pods, verify they have routes to remote site subnets:
-+
-----
-$ oc exec $(oc get pod -l service=ovsdbserver-sb -o name | head -1) -- ip route show | grep 172.17
-----
-+
-Sample output:
-+
-----
-172.17.10.0/24 via 172.17.0.1 dev internalapi
-172.17.20.0/24 via 172.17.0.1 dev internalapi
-----
diff --git a/docs_user/modules/proc_configuring-data-plane-nodes.adoc b/docs_user/modules/proc_configuring-data-plane-nodes.adoc
deleted file mode 100644
index 36788fead..000000000
--- a/docs_user/modules/proc_configuring-data-plane-nodes.adoc
+++ /dev/null
@@ -1,78 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="configuring-data-plane-nodes_{context}"]
-
-= Configuring isolated networks on data plane nodes
-
-[role="_abstract"]
-Data plane nodes are configured by the OpenStack Operator and your `OpenStackDataPlaneNodeSet` custom resources (CRs). The `OpenStackDataPlaneNodeSet` CRs define your desired network configuration for the nodes.
-
-Your {rhos_long} network configuration should reflect the existing {rhos_prev_long} ({OpenStackShort}) network setup. You must pull the `network_data.yaml` files from each {OpenStackShort} node and reuse them when you define the `OpenStackDataPlaneNodeSet` CRs. The format of the configuration does not change, so you can put network templates under `edpm_network_config_template` variables, either for all nodes or for each node.
-
-.Procedure
-
-. Configure a `NetConfig` CR with your desired VLAN tags and IPAM configuration. For example:
-+
-[subs="+quotes"]
-----
-apiVersion: network.openstack.org/v1beta1
-kind: NetConfig
-metadata:
- name: netconfig
-spec:
- networks:
- - name: internalapi
- dnsDomain: internalapi.example.com
- subnets:
- - name: subnet1
- allocationRanges:
- - end: 172.17.0.250
- start: 172.17.0.100
- cidr: 172.17.0.0/24
- vlan: 20
- - name: storage
- dnsDomain: storage.example.com
- subnets:
- - name: subnet1
- allocationRanges:
- - end: 172.18.0.250
- start: 172.18.0.100
- cidr: 172.18.0.0/24
- vlan: 21
- - name: tenant
- dnsDomain: tenant.example.com
- subnets:
- - name: subnet1
- allocationRanges:
- - end: 172.19.0.250
- start: 172.19.0.100
- cidr: 172.19.0.0/24
- vlan: 22
-----
-+
-where:
-
-spec.networks:: Specifies the `networks` composition. The `networks` composition must match the source cloud configuration to avoid data plane connectivity downtime.
-
-. Optional: In the `NetConfig` CR, list multiple ranges for the `allocationRanges` field to exclude some of the IP addresses, for example, to accommodate IP addresses that are already consumed by the adopted environment:
-+
-----
-apiVersion: network.openstack.org/v1beta1
-kind: NetConfig
-metadata:
- name: netconfig
-spec:
- networks:
- - name: internalapi
- dnsDomain: internalapi.example.com
- subnets:
- - name: subnet1
- allocationRanges:
- - end: 172.17.0.199
- start: 172.17.0.100
- - end: 172.17.0.250
- start: 172.17.0.201
- cidr: 172.17.0.0/24
- vlan: 20
-----
-+
-This example excludes the `172.17.0.200` address from the pool.
diff --git a/docs_user/modules/proc_configuring-dcn-data-plane-nodesets.adoc b/docs_user/modules/proc_configuring-dcn-data-plane-nodesets.adoc
deleted file mode 100644
index 50271a2d4..000000000
--- a/docs_user/modules/proc_configuring-dcn-data-plane-nodesets.adoc
+++ /dev/null
@@ -1,286 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="configuring-dcn-data-plane-nodesets_{context}"]
-
-= Configuring data plane node sets for DCN sites
-
-[role="_abstract"]
-If you are adopting a Distributed Compute Node (DCN) deployment, you must create separate `OpenStackDataPlaneNodeSet` custom resources (CRs) for each site. Each node set requires site-specific configuration for network subnets, OVN bridge mappings, and inter-site routes.
-
-.Prerequisites
-
-* You have adopted the {rhos_prev_long} ({OpenStackShort}) control plane to {rhos_long}.
-* You have configured control plane networking for your spine-leaf topology, including multi-subnet `NetConfig` and `NetworkAttachmentDefinition` CRs with routes to remote sites. For more information, see xref:configuring-control-plane-networking-for-spine-leaf_adopt-control-plane[Configuring control plane networking for spine-leaf topologies].
-* You have the network configuration information for each DCN site:
-** IP addresses and hostnames for all Compute nodes
-** VLAN IDs for each service network
-** Gateway addresses for inter-site routing
-* You have identified the OVN bridge mappings (physnets) for each site.
-
-.Procedure
-
-. Define the OVN bridge mappings for each site. Each site requires a unique physnet that maps to the local provider network bridge:
-+
-.Example OVN bridge mappings
-[options="header"]
-|===
-| Site | OVN bridge mapping
-| Central | `leaf0:br-ex`
-| DCN1 | `leaf1:br-ex`
-| DCN2 | `leaf2:br-ex`
-|===
-
-. Create an `OpenStackDataPlaneNodeSet` CR for the central site Compute nodes:
-+
-[source,yaml,subs="+quotes"]
-----
-apiVersion: dataplane.openstack.org/v1beta1
-kind: OpenStackDataPlaneNodeSet
-metadata:
- name: openstack-edpm
-spec:
- tlsEnabled: false
- networkAttachments:
- - ctlplane
- preProvisioned: true
- services:
-ifeval::["{build}" == "downstream"]
- - redhat
-endif::[]
- - bootstrap
- - download-cache
- - configure-network
- - validate-network
- - install-os
- - configure-os
- - ssh-known-hosts
- - run-os
- - reboot-os
- - install-certs
- - ovn
- - neutron-metadata
- - libvirt
- - nova-cell1
- - telemetry
- nodeTemplate:
- ansibleSSHPrivateKeySecret: dataplane-adoption-secret
- ansible:
- ansibleUser: tripleo-admin
- ansibleVars:
- *edpm_ovn_bridge_mappings: ["leaf0:br-ex"]*
- edpm_ovn_bridge: br-int
- edpm_ovn_encap_type: geneve
- # Network configuration template for central site
- edpm_network_config_template: |
- ---
- network_config:
- - type: ovs_bridge
- name: {{ neutron_physical_bridge_name }}
- use_dhcp: false
- dns_servers: {{ ctlplane_dns_nameservers }}
- addresses:
- - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
- routes: {{ ctlplane_host_routes }}
- members:
- - type: interface
- name: nic1
- primary: true
- {% for network in nodeset_networks %}
- - type: vlan
- 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 %}
- nodes:
- compute-0:
- hostName: compute-0.example.com
- ansible:
- ansibleHost: compute-0.example.com
- networks:
- - defaultRoute: true
- fixedIP: 192.168.122.100
- name: ctlplane
- *subnetName: subnet1*
- - name: internalapi
- *subnetName: subnet1*
- - name: storage
- subnetName: subnet1
- - name: tenant
- subnetName: subnet1
-----
-* The OVN bridge mapping uses the central site physnet `leaf0`.
-* Central site nodes reference `subnet1` for all networks.
-
-. Create an `OpenStackDataPlaneNodeSet` CR for DCN1 edge site Compute nodes. You must add inter-site routes to the network configuration template:
-+
-[source,yaml,subs="+quotes"]
-----
-apiVersion: dataplane.openstack.org/v1beta1
-kind: OpenStackDataPlaneNodeSet
-metadata:
- name: openstack-edpm-dcn1
-spec:
- tlsEnabled: false
- networkAttachments:
- - ctlplane
- preProvisioned: true
- services:
- - redhat
- - bootstrap
- - download-cache
- - configure-network
- - validate-network
- - install-os
- - configure-os
- - ssh-known-hosts
- - run-os
- - reboot-os
- - install-certs
- - ovn
- - neutron-metadata
- - libvirt
- - nova-cell1
- - telemetry
- nodeTemplate:
- ansibleSSHPrivateKeySecret: dataplane-adoption-secret
- ansible:
- ansibleUser: tripleo-admin
- ansibleVars:
- *edpm_ovn_bridge_mappings: ["leaf1:br-ex"]*
- edpm_ovn_bridge: br-int
- edpm_ovn_encap_type: geneve
- # Network configuration template for DCN1 site with inter-site routes
- edpm_network_config_template: |
- ---
- network_config:
- - type: ovs_bridge
- name: {{ neutron_physical_bridge_name }}
- use_dhcp: false
- dns_servers: {{ ctlplane_dns_nameservers }}
- addresses:
- - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
- routes: # <3>
- {{ ctlplane_host_routes }}
- *- ip_netmask: 192.168.122.0/24*
- *next_hop: 192.168.133.1*
- - ip_netmask: 192.168.144.0/24
- next_hop: 192.168.133.1
- members:
- - type: interface
- name: nic1
- primary: true
- {% for network in nodeset_networks %}
- - type: vlan
- 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') }}
- {% if network == 'internalapi' %}
- *- ip_netmask: 172.17.0.0/24*
- *next_hop: 172.17.10.1*
- - ip_netmask: 172.17.20.0/24
- next_hop: 172.17.10.1
- {% endif %}
- {% if network == 'storage' %}
- - ip_netmask: 172.18.0.0/24
- next_hop: 172.18.10.1
- - ip_netmask: 172.18.20.0/24
- next_hop: 172.18.10.1
- {% endif %}
- {% if network == 'tenant' %}
- - ip_netmask: 172.19.0.0/24
- next_hop: 172.19.10.1
- - ip_netmask: 172.19.20.0/24
- next_hop: 172.19.10.1
- {% endif %}
- {% endfor %}
- nodes:
- dcn1-compute-0:
- hostName: dcn1-compute-0.example.com
- ansible:
- ansibleHost: dcn1-compute-0.example.com
- networks:
- - defaultRoute: true
- fixedIP: 192.168.133.100
- name: ctlplane
- *subnetName: ctlplanedcn1*
- - name: internalapi
- *subnetName: internalapidcn1*
- - name: storage
- *subnetName: storagedcn1*
- - name: tenant
- *subnetName: tenantdcn1*
-----
-* DCN1 uses the `leaf1` physnet for its OVN bridge mapping under `spec:nodeTemplate:ansible:ansibleVars:edpm_ovn_bridge_mappings`.
-* Inter-site routes must be added to the network configuration template. These routes enable DCN1 compute nodes to reach the central site (192.168.122.0/24) and other DCN sites (192.168.144.0/24 for DCN2). Similar routes are added for each service network (internalapi, storage, tenant).
-* DCN1 nodes reference site-specific subnet names like `ctlplanedcn1` and `internalapidcn1`. These subnet names must match those defined in the `NetConfig` CR.
-
-. Repeat step 3 for all other DCN sites. Adjust site specific parameters:
-+
-* The nodeset name, for example: `openstack-edpm-dcn2`
-* The OVN bridge mapping, for example: `leaf2:br-ex`
-* The subnet names, for example: `ctlplanedcn2`, and `internalapidcn2`
-* The inter-site routes. The routes from DCN2 should point to the central site subnets and the DCN1 site subnets.
-* The compute node definitions with site-appropriate IP addresses.
-
-. Deploy all nodesets by creating an `OpenStackDataPlaneDeployment` CR:
-+
-[source,yaml]
-----
-apiVersion: dataplane.openstack.org/v1beta1
-kind: OpenStackDataPlaneDeployment
-metadata:
- name: openstack-edpm-deployment
-spec:
- nodeSets:
- - openstack-edpm
- - openstack-edpm-dcn1
- - openstack-edpm-dcn2
-----
-+
-[NOTE]
-====
-All nodesets can be deployed in parallel once the control plane adoption is complete.
-====
-
-. Wait for the deployment to complete:
-+
-----
-$ oc wait --for condition=Ready openstackdataplanedeployment/openstack-edpm-deployment --timeout=40m
-----
-
-.Verification
-
-. Verify that all node sets reach the `Ready` status:
-+
-----
-$ oc get openstackdataplanenodeset
-NAME STATUS MESSAGE
-openstack-edpm True Ready
-openstack-edpm-dcn1 True Ready
-openstack-edpm-dcn2 True Ready
-----
-
-. Verify that Compute services are running across all sites. Ensure that all `nova-compute` services show `State=up` for nodes in all availability zones:
-+
-----
-$ oc exec openstackclient -- openstack compute service list
-----
-
-. Verify inter-site connectivity by checking routes on a DCN Compute node:
-+
-----
-$ ssh dcn1-compute-0 ip route show | grep 172.17.0
-172.17.0.0/24 via 172.17.10.1 dev internalapi
-----
-
-. Test that DCN Compute nodes can reach the control plane:
-+
-----
-$ ssh dcn1-compute-0 ping -c 3 172.17.0.30
-----
-+
-Replace `172.17.0.30` with an IP address of a control plane service on the internalapi network.
diff --git a/docs_user/modules/proc_configuring-federation-for-keystone.adoc b/docs_user/modules/proc_configuring-federation-for-keystone.adoc
deleted file mode 100644
index d8ad965b4..000000000
--- a/docs_user/modules/proc_configuring-federation-for-keystone.adoc
+++ /dev/null
@@ -1,127 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="configuring-federation-for-keystone_{context}"]
-
-= Configuring OIDC federation for the Identity service
-
-[role="_abstract"]
-To allow the {identity_service_first_ref} to trust an external OpenID Connect (OIDC) identity provider, apply the federation configuration and verify that federated users can authenticate.
-
-.Prerequisites
-
-* Keycloak is reachable from your {rhos_long} cluster.
-* You have access to the Keycloak `keycloak-ca.crt` file that corresponds to its certificate chain.
-
-.Procedure
-
-. Create the `keycloakca` secret so that the {identity_service} pods trust the Keycloak certificate authority (CA):
-+
-----
-$ oc create secret generic keycloakca \
- --from-file=KeyCloakCA= -n openstack
-----
-+
-where:
-
-``:: Specifies the path to the CA file that you want to use.
-
-. Create the `keystone-httpd-override` secret that provides the Apache HTTPD overrides that are required for OIDC:
-+
-[source,yaml]
-----
-apiVersion: v1
-kind: Secret
-metadata:
- name: keystone-httpd-override
- namespace: openstack
-type: Opaque
-stringData:
- federation.conf: |
- OIDCClaimPrefix "OIDC-"
- OIDCResponseType "code"
- OIDCScope "openid profile email"
- OIDCClaimDelimiter ","
- OIDCPassUserInfoAs "payload"
- OIDCPassClaimsAs "both"
- OIDCProviderMetadataURL "https://keycloak-openstack.apps-crc.testing/auth/realms/openstack/.well-known/openid-configuration"
- OIDCClientID "rhoso"
- OIDCClientSecret ""
- OIDCCryptoPassphrase ""
- OIDCOAuthClientID "rhoso"
- OIDCOAuthClientSecret ""
- OIDCOAuthIntrospectionEndpoint "https://keycloak-openstack.apps-crc.testing/auth/realms/openstack/protocol/openid-connect/token/introspect"
- OIDCRedirectURI "https://keystone-public-openstack.apps-crc.testing/v3/auth/OS-FEDERATION/identity_providers/kcIDP/protocols/openid/websso/"
- LogLevel debug
-
-
- AuthType "openid-connect"
- Require valid-user
-
-
-
- AuthType oauth20
- Require valid-user
-
-
-
- AuthType "openid-connect"
- Require valid-user
-
-----
-+
-where:
-
-``:: Specifies the client ID to use for the OIDC provider handshake. You must get the client ID from your SSO administrator.
-``:: Specifies the client secret to use for the OIDC provider handshake. You must get the client secret from your SSO administrator after providing your redirect URLs.
-`` and ``:: Specifies the chosen string that creates your unique redirect URL.
-
-. Patch the `OpenStackControlPlane` custom resource (CR) to enable OIDC federation for Keystone. Ensure that you merge the patch with any existing custom configuration for the {identity_service}:
-+
-[source,yaml]
-----
-spec:
- tls:
- caBundleSecretName: keycloakca
- keystone:
- template:
- customServiceConfig: |
- [token]
- expiration = 360000
- [federation]
- trusted_dashboard=https://horizon-openstack.apps-crc.testing/dashboard/auth/websso/
- sso_callback_template=/etc/keystone/sso_callback_template.html
- [openid]
- remote_id_attribute=HTTP_OIDC_ISS
- [auth]
- methods = password,token,oauth1,mapped,application_credential,openid
- [trusted_ip]
- trusted_forwarded_for_header=True
- httpdCustomization:
- customConfigSecret: keystone-httpd-override
-----
-+
-
-.Verification
-
-. Request a federated token before adoption:
-+
-----
-$ openstack token issue
-----
-+
-This command should return an access token that is issued for the federated user.
-
-. Verify the token against the newly adopted {identity_service} instance:
-+
-----
-$ oc exec -t openstackclient -- env -u OS_CLOUD - \
- OS_AUTH_URL=https://keystone-public-openstack.apps-crc.testing/v3 \
- OS_AUTH_TYPE=v3oidcaccesstoken \
- OS_ACCESS_TOKEN=$(openstack token issue -f value -c id) \
- openstack project show
-----
-+
-where:
-
-``:: Replace with the ID of your OpenStack project.
-+
-A successful response confirms that the federated OIDC configuration is active on the podified Keystone deployment.
diff --git a/docs_user/modules/proc_configuring-ldap-with-domain-specific-drivers.adoc b/docs_user/modules/proc_configuring-ldap-with-domain-specific-drivers.adoc
deleted file mode 100644
index edddd9097..000000000
--- a/docs_user/modules/proc_configuring-ldap-with-domain-specific-drivers.adoc
+++ /dev/null
@@ -1,135 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id='configuring-ldap-with-domain-specific-drivers_{context}']
-
-= Configuring LDAP with domain-specific drivers
-
-[role="_abstract"]
-If you need to integrate the {identity_service_first_ref} with one or more LDAP servers using domain-specific configurations, you can enable domain-specific drivers and provide the necessary LDAP settings.
-
-This involves two main steps:
-
-. Create the secret that holds the domain-specific LDAP configuration files that the {identity_service} uses. Each file within the secret corresponds to an LDAP domain.
-. Patch the `OpenStackControlPlane` custom resource (CR) to enable domain-specific drivers for the {identity_service} and mount a secret that contains the LDAP configurations.
-
-
-.Procedure
-
-. To create the `keystone-domains` secret that stores the actual LDAP configuration files that {identity_service} uses, create a local file that includes your LDAP configuration, for example, `keystone.myldapdomain.conf`:
-+
-The following example file includes the configuration for a single LDAP domain. If you have multiple LDAP domains, create a configuration file for each, for example, `keystone.DOMAIN_ONE.conf`, `keystone.DOMAIN_TWO.conf`.
-+
-[source,ini]
-----
-[identity]
-driver = ldap
-[ldap]
-url = ldap://:
-user =
-password =
-suffix =
-query_scope = sub
-# User configuration
-user_tree_dn =
-user_objectclass =
-user_id_attribute =
-user_name_attribute =
-user_mail_attribute =
-user_enabled_attribute =
-user_enabled_default = true
-# Group configuration
-group_tree_dn =
-group_objectclass =
-group_id_attribute =
-group_name_attribute =
-group_member_attribute =
-group_members_are_ids = true
-----
-+
-* Replace the values, such as ``, ``, ``, and so on, with your LDAP server details.
-
-. Create the secret from this file:
-+
-----
-$ oc create secret generic keystone-domains --from-file=
-----
-+
-* Replace `` with the name of your local configuration file. If applicable, include additional configuration files by using the `--from-file` option. After creating the secret, you can remove the local configuration file if it is no longer needed, or store it securely.
-+
-[IMPORTANT]
-The name of the file that you provide to `--from-file`, for example `keystone.DOMAIN_NAME.conf`, is critical. The {identity_service} uses this filename to map incoming authentication requests for a domain to the correct LDAP configuration. Ensure that `DOMAIN_NAME` matches the name of the domain you are configuring in the {identity_service}.
-
-. Patch the `OpenStackControlPlane` CR:
-+
-----
-$ oc patch openstackcontrolplane --type=merge -p '
-spec:
- keystone:
- template:
- customServiceConfig: |
- [identity]
- domain_specific_drivers_enabled = true
- extraMounts:
- - name: v1
- region: r1
- extraVol:
- - propagation:
- - Keystone
- extraVolType: Conf
- volumes:
- - name: keystone-domains
- secret:
- secretName: keystone-domains
- mounts:
- - name: keystone-domains
- mountPath: "/etc/keystone/domains"
- readOnly: true
-----
-+
-* Replace `` with the name of your `OpenStackControlPlane` CR (for example, `openstack`).
-* This patch does the following:
-** Sets `spec.keystone.template.customServiceConfig`. Ensure that you do not overwrite any previously defined value.
-** Defines `spec.keystone.template.extraMounts` to mount a secret named `keystone-domains` into the {identity_service} pods at `/etc/keystone/domains`. This secret contains your LDAP configuration files.
-+
-[NOTE]
-You might need to wait a few minutes for the changes to propagate and for the {identity_service} pods to be updated.
-
-.Verification
-
-. Verify that users from the LDAP domain are accessible:
-+
-----
-$ oc exec -t openstackclient -- openstack user list --domain
-----
-+
-* Replace `` with your LDAP domain name.
-+
-This command returns a list of users from your LDAP server.
-
-. Verify that groups from the LDAP domain are accessible:
-+
-----
-$ oc exec -t openstackclient -- openstack group list --domain
-----
-+
-This command returns a list of groups from your LDAP server.
-
-. Test authentication with an LDAP user:
-+
-----
-$ oc exec -t openstackclient -- openstack --os-auth-url --os-identity-api-version 3 --os-user-domain-name --os-username --os-password token issue
-----
-+
-* Replace `` with the {identity_service} authentication URL.
-* Replace `` and `` with valid LDAP user credentials.
-+
-If successful, this command returns a token, confirming that LDAP authentication is working correctly.
-
-. Verify group membership for an LDAP user:
-+
-----
-$ oc exec -t openstackclient -- openstack group contains user --group-domain --user-domain
-----
-+
-* Replace ``, ``, and `` with the appropriate values from your LDAP server.
-+
-This command verifies that the user is properly associated with the group through LDAP.
diff --git a/docs_user/modules/proc_configuring-networking-for-control-plane-services.adoc b/docs_user/modules/proc_configuring-networking-for-control-plane-services.adoc
deleted file mode 100644
index 34a3bb692..000000000
--- a/docs_user/modules/proc_configuring-networking-for-control-plane-services.adoc
+++ /dev/null
@@ -1,136 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="configuring-networking-for-control-plane-services_{context}"]
-
-= Configuring isolated networks on control plane services
-
-[role="_abstract"]
-After the NMState operator creates the required hypervisor network configuration for isolated networks, configure {rhos_prev_long} services to use isolated network interfaces by defining `NetworkAttachmentDefinition` CRs for each network.
-
-In clusters managed by Cluster Network Operator, use `Network` CRs instead.
-
-For more information, see
-link:{defaultOCPURL}/networking/cluster-network-operator#nw-cluster-network-operator_cluster-network-operator[Cluster Network Operator] in _Networking_.
-
-.Procedure
-
-. Define a `NetworkAttachmentDefinition` CR for each isolated network.
-For example:
-+
-----
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- name: internalapi
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "internalapi",
- "type": "macvlan",
- "master": "enp6s0.20",
- "ipam": {
- "type": "whereabouts",
- "range": "172.17.0.0/24",
- "range_start": "172.17.0.20",
- "range_end": "172.17.0.50"
- }
- }
-----
-+
-[IMPORTANT]
-Ensure that the interface name and IPAM range match the configuration that you used in the `NodeNetworkConfigurationPolicy` CRs.
-
-. Optional: When reusing existing IP ranges, you can exclude part of the range that is used in the existing deployment by using the `exclude` parameter in the `NetworkAttachmentDefinition` pool. For example:
-+
-----
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- name: internalapi
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "internalapi",
- "type": "macvlan",
- "master": "enp6s0.20",
- "ipam": {
- "type": "whereabouts",
- "range": "172.17.0.0/24",
- "range_start": "172.17.0.20",
- "range_end": "172.17.0.50",
- "exclude": [
- "172.17.0.24/32",
- "172.17.0.44/31"
- ]
- }
- }
-----
-+
-* `spec.config.ipam.range_start` defines the start of the IP range.
-* `spec.config.ipam.range_end` defines the end of the IP range.
-* `spec.config.ipam.exclude` excludes part of the IP range. This example excludes IP addresses `172.17.0.24/32` and `172.17.0.44/31` from the allocation pool.
-
-. If your {OpenStackShort} services require load balancer IP addresses, define the pools for these services in an `IPAddressPool` CR. For example:
-+
-[NOTE]
-The load balancer IP addresses belong to the same IP range as the control plane services, and are managed by MetalLB. This pool should also be aligned with the {OpenStackShort} configuration.
-+
-----
-- apiVersion: metallb.io/v1beta1
- kind: IPAddressPool
- spec:
- addresses:
- - 172.17.0.60-172.17.0.70
-----
-+
-Define `IPAddressPool` CRs for each isolated network that requires load
-balancer IP addresses.
-
-. Optional: When reusing existing IP ranges, you can exclude part of the range by listing multiple entries in the `addresses` section of the `IPAddressPool`. For example:
-+
-----
-- apiVersion: metallb.io/v1beta1
- kind: IPAddressPool
- spec:
- addresses:
- - 172.17.0.60-172.17.0.64
- - 172.17.0.66-172.17.0.70
-----
-+
-The example above would exclude the `172.17.0.65` address from the allocation
-pool.
-
-. For environments that are enabled with border gateway protocol (BGP), add routes to the `NetworkAttachmentDefinition` CRs so that the pods can communicate with the {rhos_prev_long} Controller nodes and Compute nodes over the isolated networks. This is similar to the routes that should be added to the `NodeNetworkConfigurationPolicy` CRs in BGP environments. For more information about isolated networks, see xref:configuring-openshift-worker-nodes_{context}[Configuring isolated networks on RHOCP worker nodes]. The following example shows a `NetworkAttachmentDefinition` CR for the storage network with routes:
-+
-----
-apiVersion: k8s.cni.cncf.io/v1
-kind: NetworkAttachmentDefinition
-metadata:
- name: storage
- namespace: openstack
-spec:
- config: |
- {
- "cniVersion": "0.3.1",
- "name": "storage",
- "type": "bridge",
- "isDefaultGateway": false,
- "isGateway": true,
- "forceAddress": false,
- "hairpinMode": true,
- "ipMasq": false,
- "bridge": "storage",
- "ipam": {
- "type": "whereabouts",
- "range": "172.18.0.0/24",
- "range_start": "172.18.0.30",
- "range_end": "172.18.0.70",
- "routes": [
- {"dst": "172.31.0.0/24", "gw": "172.18.0.1"},
- {"dst": "192.168.188.0/24", "gw": "172.18.0.1"},
- {"dst": "99.99.0.0/16", "gw": "172.18.0.1"}
- ]
- }
- }
-----
diff --git a/docs_user/modules/proc_configuring-openshift-worker-nodes.adoc b/docs_user/modules/proc_configuring-openshift-worker-nodes.adoc
deleted file mode 100644
index acab62d75..000000000
--- a/docs_user/modules/proc_configuring-openshift-worker-nodes.adoc
+++ /dev/null
@@ -1,131 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="configuring-openshift-worker-nodes_{context}"]
-
-= Configuring isolated networks on {OpenShiftShort} worker nodes
-
-[role="_abstract"]
-To connect service pods to isolated networks on {rhocp_long} worker nodes that run {rhos_prev_long} services, physical network configuration on the hypervisor is required.
-
-This configuration is managed by the NMState operator, which uses `NodeNetworkConfigurationPolicy` custom resources (CRs) to define the desired network configuration for the nodes.
-
-// TODO: Move this to the IPv6 section once it is fully documented, both upstream and downstream.
-ifeval::["{build}" != "downstream"]
-[WARNING]
-In IPv6, {rhocp_long} worker nodes need a `/64` prefix allocation due to OVN
-limitations (RFC 4291). For dynamic IPv6 configuration, you need to change the
-prefix allocation on the Router Advertisement settings. If you want to use
-manual configuration for IPv6, define a similar CR to the
-`NodeNetworkConfigurationPolicy` CR example in this procedure, and define an
-IPv6 address and disable IPv4. Because the constraint for the `/64` prefix did
-not exist in {OpenstackPreviousInstaller}, your {OpenStackShort}
-control plane network might not have enough capacity to allocate these
-networks. If that is the case, allocate a prefix that fits a large enough number
-of addresses, for example, `/60`. The prefix depends on the number of worker nodes you have.
-endif::[]
-
-.Procedure
-
-* For each {OpenShiftShort} worker node, define a `NodeNetworkConfigurationPolicy` CR that describes the desired network configuration. For example:
-+
-----
-apiVersion: v1
-items:
-- apiVersion: nmstate.io/v1
- kind: NodeNetworkConfigurationPolicy
- spec:
- desiredState:
- interfaces:
- - description: internalapi vlan interface
- ipv4:
- address:
- - ip: 172.17.0.10
- prefix-length: 24
- dhcp: false
- enabled: true
- ipv6:
- enabled: false
- name: enp6s0.20
- state: up
- type: vlan
- vlan:
- base-iface: enp6s0
- id: 20
- reorder-headers: true
- - description: storage vlan interface
- ipv4:
- address:
- - ip: 172.18.0.10
- prefix-length: 24
- dhcp: false
- enabled: true
- ipv6:
- enabled: false
- name: enp6s0.21
- state: up
- type: vlan
- vlan:
- base-iface: enp6s0
- id: 21
- reorder-headers: true
- - description: tenant vlan interface
- ipv4:
- address:
- - ip: 172.19.0.10
- prefix-length: 24
- dhcp: false
- enabled: true
- ipv6:
- enabled: false
- name: enp6s0.22
- state: up
- type: vlan
- vlan:
- base-iface: enp6s0
- id: 22
- reorder-headers: true
- nodeSelector:
- kubernetes.io/hostname: ocp-worker-0
- node-role.kubernetes.io/worker: ""
-----
-+
-[NOTE]
-====
-For environments that are enabled with border gateway protocol (BGP), you might need to add additional routes in the `NodeNetworkConfigurationPolicy` CR so that {OpenShiftShort} worker nodes can reach the {rhos_prev_long} Controller nodes and Compute nodes over the control plane and internal API networks.
-
-When you configure the {OpenShiftShort} worker nodes network in the `NodeNetworkConfigurationPolicy` CR, add routes for each of the following networks:
-
-* External network (for example, `172.31.0.0/24`)
-* Control plane network (for example, `192.168.188.0/24`)
-* BGP main network (for example, `99.99.0.0/16`)
-
-The following example shows the `routes.config` section from a `NodeNetworkConfigurationPolicy` CR for a worker node with BGP configured. In this example, `100.64.0.17` and `100.65.0.17` are the IP addresses of the leaf switches that are connected to the specific {OpenShiftShort} node:
-
-----
- routes:
- config:
- - destination: 99.99.0.0/16
- next-hop-address: 100.64.0.17
- next-hop-interface: enp7s0
- weight: 200
- - destination: 99.99.0.0/16
- next-hop-address: 100.65.0.17
- next-hop-interface: enp8s0
- weight: 200
- - destination: 172.31.0.0/24
- next-hop-address: 100.64.0.17
- next-hop-interface: enp7s0
- weight: 200
- - destination: 172.31.0.0/24
- next-hop-address: 100.65.0.17
- next-hop-interface: enp8s0
- weight: 200
- - destination: 192.168.188.0/24
- next-hop-address: 100.64.0.17
- next-hop-interface: enp7s0
- weight: 200
- - destination: 192.168.188.0/24
- next-hop-address: 100.65.0.17
- next-hop-interface: enp8s0
- weight: 200
-----
-====
diff --git a/docs_user/modules/proc_converting-object-storage-nodes.adoc b/docs_user/modules/proc_converting-object-storage-nodes.adoc
deleted file mode 100644
index 2ce64cfc3..000000000
--- a/docs_user/modules/proc_converting-object-storage-nodes.adoc
+++ /dev/null
@@ -1,303 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="converting-object-storage-nodes"]
-
-= Converting {object_storage} storage nodes
-
-[role="_abstract"]
-If you used external {object_storage} storage nodes, you can convert these
-nodes after the initial {object_storage_first_ref} adoption is complete. This
-step reconfigures the nodes in-place while keeping the {object_storage}
-available throughout the process.
-
-Before you begin, review the following key concepts:
-
-Pre-provisioned nodes:: Setting `preProvisioned: true` in the
- `OpenStackDataPlaneNodeSet` custom resource (CR) skips provisioning the node from scratch and does not reinstall the operating system.
-{object_storage} disk and mount preservation:: `edpm_swift_disks: []` must be
- set in both the `nodeTemplate` and in the individual node definition under
- `nodes` to ensure that no disks are formatted or mounted differently.
- Existing disk mounts are untouched. The `SwiftRawDisks` parameter from
- {OpenStackPreviousInstaller} is not migrated or converted. Disks on
- converted nodes must be managed manually.
-Rolling conversion:: The `swift-conversion` service uses `serial: 1` by
- default, which converts one node at a time to keep the {object_storage}
- available.
-
-.Prerequisites
-
-* The initial {object_storage} adoption is complete. For more information, see
- xref:adopting-the-object-storage-service_hsm-integration[Adopting the
- {object_storage}].
-* Nodes cannot be members of more than one `OpenStackDataPlaneNodeSet` CR at
- the same time. If the nodes you want to convert were part of the node set
- that you created during the control plane adoption, delete that node set
- before proceeding:
-+
-----
-$ oc delete openstackdataplanenodeset
-----
-+
-where:
-
-``::
-Specifies the node set that you want to delete.
-
-.Procedure
-
-. Create a patch file to configure the {object_storage} data plane storage
- ports:
-+
-[NOTE]
-The {OpenStackPreviousInstaller} deployment used different default
-ports: 6002 for the account server, 6001 for the container server, 6000 for
-the object server. The converted nodes must continue to use these same
-ports to ensure connectivity between all {object_storage} storage nodes by using
-the unmodified rings.
-+
-----
-cat > swift-config-patch.yaml << EOF
-spec:
- swift:
- template:
- swiftStorage:
- defaultConfigOverwrite:
- 01-account-server.conf: |
- [DEFAULT]
- bind_port = 6002
- 01-container-server.conf: |
- [DEFAULT]
- bind_port = 6001
- 01-object-server.conf: |
- [DEFAULT]
- bind_port = 6000
-EOF
-----
-+
-[NOTE]
-If you customized any {object_storage} service settings in the
-{OpenStackPreviousInstaller} deployment, include those settings as well. For
-example, if you changed the workers count or added additional configuration options
-for the account, container, or object services, add them to the
-corresponding section in the patch file.
-
-. Apply the patch to the `OpenStackControlPlane` CR:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file=swift-config-patch.yaml
-----
-
-. Create a `OpenStackDataPlaneService` CR to remove remaining
- {OpenStackPreviousInstaller} artifacts and deploy the {object_storage} services
- on the node:
-+
-----
-$ oc apply -f - < nfs
-----
-+
-* Replace `` with the name of the host that you identified.
-
-. Create the NFS cluster:
-+
-----
-$ ceph nfs cluster create cephfs \
- "label:nfs" \
- --ingress \
- --virtual-ip= \
- --ingress-mode=haproxy-protocol
-----
-+
-* Replace `` with the VIP for the Ceph NFS service.
-+
-ifeval::["{build}" != "downstream"]
-[NOTE]
-====
-You must set the `ingress-mode` argument to `haproxy-protocol`. No other
-ingress-mode is supported. This ingress mode allows you to enforce client
-restrictions through the {rhos_component_storage_file}.
-
-* For more information on deploying the clustered Ceph NFS service, see the
-link:https://docs.ceph.com/en/latest/cephadm/services/nfs/[ceph orchestrator
-documentation].
-====
-endif::[]
-ifeval::["{build}" != "upstream"]
-[NOTE]
-====
-You must set the `ingress-mode` argument to `haproxy-protocol`. No other
-ingress-mode is supported. This ingress mode allows you to enforce client
-restrictions through the {rhos_component_storage_file}.
-For more information about deploying the clustered Ceph NFS service, see 'Management of NFS-Ganesha gateway using the Ceph Orchestrator' in the _Operations Guide_ for your Red Hat Ceph Storage version:
-
-* link:https://docs.redhat.com/documentation/en-us/red_hat_ceph_storage/7/html/operations_guide/index#management-of-nfs-ganesha-gateway-using-the-ceph-orchestrator[Red Hat Ceph Storage 7 _Operations Guide_]
-* link:https://docs.redhat.com/documentation/en-us/red_hat_ceph_storage/8/html/operations_guide/index#management-of-nfs-ganesha-gateway-using-the-ceph-orchestrator[Red Hat Ceph Storage 8 _Operations Guide_]
-* link:https://www.ibm.com/docs/en/{ceph9_pdf_path}/Red_Hat_Ceph_Storage_NFS_cluster_and_share_management_(OpenStack_Manila_users_only).pdf[Red Hat Ceph Storage 9 NFS cluster and share management (OpenStack Manila users only)] > Creating an NFS cluster
-====
-endif::[]
-
-. Check the status of the NFS cluster:
-+
-----
-$ ceph nfs cluster ls
-$ ceph nfs cluster info cephfs
-----
diff --git a/docs_user/modules/proc_decommissioning-rhosp-standalone-ceph-NFS-service.adoc b/docs_user/modules/proc_decommissioning-rhosp-standalone-ceph-NFS-service.adoc
deleted file mode 100644
index 8d4bec8d3..000000000
--- a/docs_user/modules/proc_decommissioning-rhosp-standalone-ceph-NFS-service.adoc
+++ /dev/null
@@ -1,74 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="decommissioning-RHOSP-standalone-Ceph-NFS-service_{context}"]
-
-= Decommissioning the {rhos_prev_long} standalone Ceph NFS service
-
-[role="_abstract"]
-If your deployment uses CephFS through NFS, you must decommission the {rhos_prev_long}({OpenStackShort}) standalone NFS service. Since future software upgrades do not support the previous NFS service, ensure that the decommissioning period is short.
-
-.Prerequisites
-
-* You identified the new export locations for your existing shares by querying the Shared File Systems API.
-* You unmounted and remounted the shared file systems on each client to stop using the previous NFS server.
-* If you are consuming the {rhos_component_storage_file} shares with the {rhos_component_storage_file} CSI plugin for {rhocp_long}, you migrated the shares by scaling down the application pods and scaling them back up.
-
-[NOTE]
-Clients that are creating new workloads cannot use share exports through the previous NFS service. The {rhos_component_storage_file} no longer communicates with the previous NFS service, and cannot apply or alter export rules on the previous NFS service.
-
-.Procedure
-
-. Remove the `cephfs_ganesha_server_ip` option from the `manila-share` service configuration:
-+
-[NOTE]
-This restarts the `manila-share` process and removes the export locations that applied to the previous NFS service from all the shares.
-+
-----
-$ cat << __EOF__ > ~/manila.patch
-spec:
- manila:
- enabled: true
- apiOverride:
- route: {}
- template:
- manilaShares:
- cephfs:
- replicas: 1
- customServiceConfig: |
- [DEFAULT]
- enabled_share_backends = cephfs
- host = hostgroup
- [cephfs]
- driver_handles_share_servers=False
- share_backend_name=cephfs
- share_driver=manila.share.drivers.cephfs.driver.CephFSDriver
- cephfs_conf_path=/etc/ceph/ceph.conf
- cephfs_auth_id=openstack
- cephfs_cluster_name=ceph
- cephfs_protocol_helper_type=NFS
- cephfs_nfs_cluster_id=cephfs
- networkAttachments:
- - storage
-__EOF__
-
-----
-
-. Patch the `OpenStackControlPlane` custom resource:
-+
-----
-$ oc patch openstackcontrolplane openstack --type=merge --patch-file=~/
-----
-* Replace `` with the name of your patch file.
-
-. Clean up the standalone `ceph-nfs` service from the {OpenStackShort} control plane nodes by disabling and deleting the Pacemaker resources associated with the service:
-+
-[IMPORTANT]
-You can defer this step until after {rhos_acro} {rhos_curr_ver} is operational. During this time, you cannot decommission the Controller nodes.
-+
-----
-$ sudo pcs resource disable ceph-nfs
-$ sudo pcs resource disable ip-
-$ sudo pcs resource unmanage ceph-nfs
-$ sudo pcs resource unmanage ip-
-----
-+
-* Replace `` with the IP address assigned to the `ceph-nfs` service in your environment.
diff --git a/docs_user/modules/proc_deploying-a-ceph-ingress-daemon.adoc b/docs_user/modules/proc_deploying-a-ceph-ingress-daemon.adoc
deleted file mode 100644
index 8178d12fc..000000000
--- a/docs_user/modules/proc_deploying-a-ceph-ingress-daemon.adoc
+++ /dev/null
@@ -1,142 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="deploying-a-ceph-ingress-daemon_{context}"]
-
-= Deploying a {Ceph} ingress daemon
-
-[role="_abstract"]
-To deploy the Ceph ingress daemon, you perform the following actions:
-
-. Remove the existing `ceph_rgw` configuration.
-. Clean up the configuration created by {OpenStackPreviousInstaller}.
-. Redeploy the {object_storage_first_ref}.
-
-When you deploy the ingress daemon, two new containers are created:
-
-* HAProxy, which you use to reach the back ends.
-* Keepalived, which you use to own the virtual IP address.
-
-You use the `rgw` label to distribute the ingress daemon to only the number of nodes that host Ceph Object Gateway (RGW) daemons. For more information about distributing daemons among your nodes, see xref:ceph-daemon-cardinality_migrating-ceph[{Ceph} daemon cardinality].
-
-After you complete this procedure, you can reach the RGW back end from the ingress daemon and use RGW through the {object_storage} CLI.
-
-.Procedure
-
-. Log in to each Controller node and remove the following configuration from the `/var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg` file:
-+
-----
-listen ceph_rgw
- bind 10.0.0.103:8080 transparent
- mode http
- balance leastconn
- http-request set-header X-Forwarded-Proto https if { ssl_fc }
- http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
- http-request set-header X-Forwarded-Port %[dst_port]
- option httpchk GET /swift/healthcheck
- option httplog
- option forwardfor
- server controller-0.storage.redhat.local 172.17.3.73:8080 check fall 5 inter 2000 rise 2
- server controller-1.storage.redhat.local 172.17.3.146:8080 check fall 5 inter 2000 rise 2
- server controller-2.storage.redhat.local 172.17.3.156:8080 check fall 5 inter 2000 rise 2
-----
-
-. Restart `haproxy-bundle` and confirm that it is started:
-+
-----
-[root@controller-0 ~]# sudo pcs resource restart haproxy-bundle
-haproxy-bundle successfully restarted
-
-
-[root@controller-0 ~]# sudo pcs status | grep haproxy
-
- * Container bundle set: haproxy-bundle [undercloud-0.ctlplane.redhat.local:8787/rh-osbs/rhosp17-openstack-haproxy:pcmklatest]:
- * haproxy-bundle-podman-0 (ocf:heartbeat:podman): Started controller-0
- * haproxy-bundle-podman-1 (ocf:heartbeat:podman): Started controller-1
- * haproxy-bundle-podman-2 (ocf:heartbeat:podman): Started controller-2
-----
-
-. Confirm that no process is connected to port 8080:
-+
-----
-[root@controller-0 ~]# ss -antop | grep 8080
-[root@controller-0 ~]#
-----
-+
-You can expect the {object_storage_first_ref} CLI to fail to establish the connection:
-+
-----
-(overcloud) [root@cephstorage-0 ~]# swift list
-
-HTTPConnectionPool(host='10.0.0.103', port=8080): Max retries exceeded with url: /swift/v1/AUTH_852f24425bb54fa896476af48cbe35d3?format=json (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))
-----
-
-. Set the required images for both HAProxy and Keepalived:
-+
-----
-ifeval::["{build}" != "downstream"]
-[ceph: root@controller-0 /]# ceph config set mgr mgr/cephadm/container_image_haproxy quay.io/ceph/haproxy:2.3
-[ceph: root@controller-0 /]# ceph config set mgr mgr/cephadm/container_image_keepalived quay.io/ceph/keepalived:2.1.5
-endif::[]
-ifeval::["{build}" == "downstream"]
-[ceph: root@controller-0 /]# ceph config set mgr mgr/cephadm/container_image_haproxy registry.redhat.io/rhceph/rhceph-haproxy-rhel9:latest
-[ceph: root@controller-0 /]# ceph config set mgr mgr/cephadm/container_image_keepalived registry.redhat.io/rhceph/keepalived-rhel9:latest
-endif::[]
-----
-
-. Create a file called `rgw_ingress` in `controller-0`:
-+
-----
-$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
-$ vim ${SPEC_DIR}/rgw_ingress
-----
-
-. Paste the following content into the `rgw_ingress` file:
-+
-[source,yaml]
-----
----
-service_type: ingress
-service_id: rgw.rgw
-placement:
- label: rgw
-spec:
- backend_service: rgw.rgw
- virtual_ip: 10.0.0.89/24
- frontend_port: 8080
- monitor_port: 8898
- virtual_interface_networks:
- -
- ssl_cert: ...
-----
-+
-* Replace `` with your external network, for example, `10.0.0.0/24`. For more information, see xref:completing-prerequisites-for-migrating-ceph-rgw_ceph-prerequisites[Completing prerequisites for migrating {Ceph} RGW].
-* If TLS is enabled, add the SSL certificate and key concatenation as described in link:{configuring-storage}/assembly_configuring-red-hat-ceph-storage-as-the-backend-for-rhosp-storage#proc_ceph-configure-rgw-with-tls_ceph-back-end[Configuring RGW with TLS for an external Red Hat Ceph Storage cluster] in _{configuring-storage-t}_.
-
-. Apply the `rgw_ingress` spec by using the Ceph orchestrator CLI:
-+
-----
-$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
-$ cephadm shell -m ${SPEC_DIR}/rgw_ingress -- ceph orch apply -i /mnt/rgw_ingress
-----
-
-. Wait until the ingress is deployed and query the resulting endpoint:
-+
-----
-$ sudo cephadm shell -- ceph orch ls
-
-NAME PORTS RUNNING REFRESHED AGE PLACEMENT
-crash 6/6 6m ago 3d *
-ingress.rgw.rgw 10.0.0.89:8080,8898 6/6 37s ago 60s label:rgw
-mds.mds 3/3 6m ago 3d controller-0;controller-1;controller-2
-mgr 3/3 6m ago 3d controller-0;controller-1;controller-2
-mon 3/3 6m ago 3d controller-0;controller-1;controller-2
-osd.default_drive_group 15 37s ago 3d cephstorage-0;cephstorage-1;cephstorage-2
-rgw.rgw ?:8090 3/3 37s ago 4m label:rgw
-----
-+
-----
-$ curl 10.0.0.89:8080
-
----
-anonymous[ceph: root@controller-0 /]#
-—
-----
diff --git a/docs_user/modules/proc_deploying-backend-services.adoc b/docs_user/modules/proc_deploying-backend-services.adoc
deleted file mode 100644
index a1b97daf0..000000000
--- a/docs_user/modules/proc_deploying-backend-services.adoc
+++ /dev/null
@@ -1,660 +0,0 @@
-:_mod-docs-content-type: PROCEDURE
-[id="deploying-backend-services_{context}"]
-
-= Deploying back-end services
-
-[role="_abstract"]
-Create the `OpenStackControlPlane` custom resource (CR) with the basic back-end services deployed, and disable all the {rhos_prev_long} ({OpenStackShort}) services. This CR is the foundation of the control plane.
-
-.Prerequisites
-
-* The cloud that you want to adopt is running, and it is on {OpenStackShort} 17.1.4 or later.
-* All control plane and data plane hosts of the source cloud are running, and continue to run throughout the adoption procedure.
-* The `openstack-operator` is deployed, but `OpenStackControlPlane` is
-not deployed.
-ifeval::["{build}" != "downstream"]
-+
-For developer/CI environments, the {OpenStackShort} operator can be deployed
-by running `make openstack` inside
-https://github.com/openstack-k8s-operators/install_yamls[install_yamls]
-repo.
-+
-For production environments, the deployment method will likely be
-different.
-endif::[]
-ifeval::["{build}" == "downstream"]
-* Install the OpenStack Operators. For more information, see link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html-single/deploying_red_hat_openstack_services_on_openshift/index#assembly_installing-and-preparing-the-OpenStack-Operator[Installing and preparing the OpenStack Operator] in _{deploying-rhoso-t}_.
-endif::[]
-
-* If you enabled TLS everywhere (TLS-e) on the {OpenStackShort} environment, you must copy the `tls` root CA from the {OpenStackShort} environment to the `rootca-internal` issuer.
-
-* There are free PVs available for Galera and RabbitMQ.
-ifeval::["{build}" != "downstream"]
-+
-For developer/CI environments driven by install_yamls, make sure
-you've run `make crc_storage`.
-endif::[]
-* Set the desired admin password for the control plane deployment. This can
-be the admin password from your original deployment or a different password:
-+
-----
-ADMIN_PASSWORD=SomePassword
-----
-+
-To use the existing {OpenStackShort} deployment password:
-+
-----
-declare -A TRIPLEO_PASSWORDS
-TRIPLEO_PASSWORDS[default]="$HOME/overcloud-passwords.yaml"
-ADMIN_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' AdminPassword:' | awk -F ': ' '{ print $2; }')
-----
-* Set the service password variables to match the original deployment.
-Database passwords can differ in the control plane environment, but
-you must synchronize the service account passwords.
-+
-For example, in developer environments with {OpenStackPreviousInstaller} Standalone, the passwords can be extracted:
-+
-----
-AODH_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' AodhPassword:' | awk -F ': ' '{ print $2; }')
-BARBICAN_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' BarbicanPassword:' | awk -F ': ' '{ print $2; }')
-CEILOMETER_METERING_SECRET=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' CeilometerMeteringSecret:' | awk -F ': ' '{ print $2; }')
-CEILOMETER_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' CeilometerPassword:' | awk -F ': ' '{ print $2; }')
-CINDER_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' CinderPassword:' | awk -F ': ' '{ print $2; }')
-DESIGNATE_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' DesignatePassword:' | awk -F ': ' '{ print $2; }')
-GLANCE_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' GlancePassword:' | awk -F ': ' '{ print $2; }')
-HEAT_AUTH_ENCRYPTION_KEY=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' HeatAuthEncryptionKey:' | awk -F ': ' '{ print $2; }')
-HEAT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' HeatPassword:' | awk -F ': ' '{ print $2; }')
-HEAT_STACK_DOMAIN_ADMIN_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' HeatStackDomainAdminPassword:' | awk -F ': ' '{ print $2; }')
-IRONIC_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' IronicPassword:' | awk -F ': ' '{ print $2; }')
-MANILA_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' ManilaPassword:' | awk -F ': ' '{ print $2; }')
-NEUTRON_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' NeutronPassword:' | awk -F ': ' '{ print $2; }')
-NOVA_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' NovaPassword:' | awk -F ': ' '{ print $2; }')
-OCTAVIA_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' OctaviaPassword:' | awk -F ': ' '{ print $2; }')
-PLACEMENT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' PlacementPassword:' | awk -F ': ' '{ print $2; }')
-SWIFT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' SwiftPassword:' | awk -F ': ' '{ print $2; }')
-----
-
-.Procedure
-
-. Ensure that you are using the {rhocp_long} namespace where you want the
-control plane to be deployed:
-+
-----
-$ oc project openstack
-----
-
-ifeval::["{build}" != "downstream"]
-. Create the {OpenStackShort} secret.
-+
-The procedure for this will vary, but in developer/CI environments
-you use `install_yamls`:
-+
-[source,yaml]
-----
-# in install_yamls
-make input
-----
-endif::[]
-
-ifeval::["{build}" == "downstream"]
-. Create the {OpenStackShort} secret. For more information, see link:https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/{rhos_curr_ver}/html-single/deploying_red_hat_openstack_services_on_openshift/index#proc_providing-secure-access-to-the-RHOSO-services_preparing[Providing secure access to the Red Hat OpenStack Services on OpenShift services] in _Deploying Red Hat OpenStack Services on OpenShift_.
-endif::[]
-
-. If the `$ADMIN_PASSWORD` is different than the password you set
-in `osp-secret`, amend the `AdminPassword` key in the `osp-secret`:
-+
-----
-$ oc set data secret/osp-secret "AdminPassword=$ADMIN_PASSWORD"
-----
-
-. Set service account passwords in `osp-secret` to match the service
-account passwords from the original deployment:
-+
-----
-$ oc set data secret/osp-secret "AodhPassword=$AODH_PASSWORD"
-$ oc set data secret/osp-secret "BarbicanPassword=$BARBICAN_PASSWORD"
-$ oc set data secret/osp-secret "CeilometerPassword=$CEILOMETER_PASSWORD"
-$ oc set data secret/osp-secret "CinderPassword=$CINDER_PASSWORD"
-$ oc set data secret/osp-secret "DesignatePassword=$DESIGNATE_PASSWORD"
-$ oc set data secret/osp-secret "GlancePassword=$GLANCE_PASSWORD"
-$ oc set data secret/osp-secret "HeatAuthEncryptionKey=$HEAT_AUTH_ENCRYPTION_KEY"
-$ oc set data secret/osp-secret "HeatPassword=$HEAT_PASSWORD"
-$ oc set data secret/osp-secret "HeatStackDomainAdminPassword=$HEAT_STACK_DOMAIN_ADMIN_PASSWORD"
-$ oc set data secret/osp-secret "IronicPassword=$IRONIC_PASSWORD"
-$ oc set data secret/osp-secret "IronicInspectorPassword=$IRONIC_PASSWORD"
-$ oc set data secret/osp-secret "ManilaPassword=$MANILA_PASSWORD"
-$ oc set data secret/osp-secret "MetadataSecret=$METADATA_SECRET"
-$ oc set data secret/osp-secret "NeutronPassword=$NEUTRON_PASSWORD"
-$ oc set data secret/osp-secret "NovaPassword=$NOVA_PASSWORD"
-$ oc set data secret/osp-secret "OctaviaPassword=$OCTAVIA_PASSWORD"
-$ oc set data secret/osp-secret "PlacementPassword=$PLACEMENT_PASSWORD"
-$ oc set data secret/osp-secret "SwiftPassword=$SWIFT_PASSWORD"
-----
-
-ifeval::["{build_variant}" != "ospdo"]
-. Deploy the `OpenStackControlPlane` CR. Ensure that you only enable the DNS, Galera, Memcached, and RabbitMQ services. All other services must
-be disabled:
-+
-[source,shell]
-----
-$ oc apply -f - <
-
- barbican:
- enabled: false
- template:
- barbicanAPI: {}
- barbicanWorker: {}
- barbicanKeystoneListener: {}
-
- cinder:
- enabled: false
- template:
- cinderAPI: {}
- cinderScheduler: {}
- cinderBackup: {}
- cinderVolumes: {}
-
- dns:
- template:
- override:
- service:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: ctlplane
- metallb.universe.tf/allow-shared-ip: ctlplane
- metallb.universe.tf/loadBalancerIPs:
-
- spec:
- type: LoadBalancer
- options:
- - key: server
- values:
- - 192.168.122.1
- replicas: 1
-
- glance:
- enabled: false
- template:
- glanceAPIs: {}
-
- heat:
- enabled: false
- template: {}
-
- horizon:
- enabled: false
- template: {}
-
- ironic:
- enabled: false
- template:
- ironicConductors: []
-
- keystone:
- enabled: false
- template: {}
-
- manila:
- enabled: false
- template:
- manilaAPI: {}
- manilaScheduler: {}
- manilaShares: {}
-
- galera:
- enabled: true
- templates:
- openstack:
- secret: osp-secret
- replicas: 3
- storageRequest: 5G
- openstack-cell1:
- secret: osp-secret
- replicas: 3
- storageRequest: 5G
- openstack-cell2:
- secret: osp-secret
- replicas: 1
- storageRequest: 5G
- openstack-cell3:
- secret: osp-secret
- replicas: 1
- storageRequest: 5G
- memcached:
- enabled: true
- templates:
- memcached:
- replicas: 3
-
- neutron:
- enabled: false
- template: {}
-
- nova:
- enabled: false
- template: {}
-
- ovn:
- enabled: false
- template:
- ovnController:
- networkAttachment: tenant
- ovnNorthd:
- replicas: 0
- ovnDBCluster:
- ovndbcluster-nb:
- replicas: 3
- dbType: NB
- networkAttachment: internalapi
- ovndbcluster-sb:
- replicas: 3
- dbType: SB
- networkAttachment: internalapi
-
- placement:
- enabled: false
- template: {}
-
- rabbitmq:
- templates:
- rabbitmq:
- override:
- service:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/loadBalancerIPs:
- spec:
- type: LoadBalancer
- rabbitmq-cell1:
- persistence:
- storage: 10Gi
- override:
- service:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/loadBalancerIPs:
-
- spec:
- type: LoadBalancer
- rabbitmq-cell2:
- persistence:
- storage: 10Gi
- override:
- service:
- metadata:
- annotations:
- metallb.universe.tf/address-pool: internalapi
- metallb.universe.tf/loadBalancerIPs: