diff --git a/.gitignore b/.gitignore
index 4d4232cea0..039565c86f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -173,6 +173,7 @@ sshuttle.pid
 
 # Book
 docs/book/book/
+!docs/book/gen-crd-api-reference-docs/config.json
 
 # venv
 .venv
diff --git a/Makefile b/Makefile
index b66e60a5c6..d2a8b2c2d5 100644
--- a/Makefile
+++ b/Makefile
@@ -52,6 +52,7 @@ KUSTOMIZE := $(TOOLS_BIN_DIR)/kustomize
 MOCKGEN := $(TOOLS_BIN_DIR)/mockgen
 RELEASE_NOTES := $(TOOLS_BIN_DIR)/release-notes
 SETUP_ENVTEST := $(TOOLS_BIN_DIR)/setup-envtest
+GEN_CRD_API_REFERENCE_DOCS := $(TOOLS_BIN_DIR)/gen-crd-api-reference-docs
 
 # Kubebuilder
 export KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.28.0
@@ -248,6 +249,7 @@ modules: ## Runs go mod to ensure proper vendoring.
 generate: ## Generate code
 	$(MAKE) generate-go
 	$(MAKE) generate-manifests
+	$(MAKE) generate-api-docs
 
 .PHONY: generate-go
 generate-go: $(MOCKGEN)
@@ -279,6 +281,24 @@ generate-manifests: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc.
 		output:rbac:dir=$(RBAC_ROOT) \
 		rbac:roleName=manager-role
 
+.PHONY: generate-api-docs
+generate-api-docs: $(GEN_CRD_API_REFERENCE_DOCS) ## Generate api documentation
+	$(GEN_CRD_API_REFERENCE_DOCS) \
+		-api-dir=./api/v1alpha8 \
+		-config=./docs/book/gen-crd-api-reference-docs/config.json \
+		-template-dir=./docs/book/gen-crd-api-reference-docs/template \
+		-out-file=./docs/book/src/api/v1alpha8/api.md
+	$(GEN_CRD_API_REFERENCE_DOCS) \
+		-api-dir=./api/v1alpha7 \
+		-config=./docs/book/gen-crd-api-reference-docs/config.json \
+		-template-dir=./docs/book/gen-crd-api-reference-docs/template \
+		-out-file=./docs/book/src/api/v1alpha7/api.md
+	$(GEN_CRD_API_REFERENCE_DOCS) \
+		-api-dir=./api/v1alpha6 \
+		-config=./docs/book/gen-crd-api-reference-docs/config.json \
+		-template-dir=./docs/book/gen-crd-api-reference-docs/template \
+		-out-file=./docs/book/src/api/v1alpha6/api.md
+
 ## --------------------------------------
 ##@ Docker
 ## --------------------------------------
diff --git a/api/v1alpha6/doc.go b/api/v1alpha6/doc.go
index e0fde58a62..e178b0355b 100644
--- a/api/v1alpha6/doc.go
+++ b/api/v1alpha6/doc.go
@@ -14,5 +14,8 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
+// Package v1alpha6 contains API Schema definitions for the infrastructure v1alpha6 API group
+// +kubebuilder:object:generate=true
+// +groupName=infrastructure.cluster.x-k8s.io
 // +k8s:conversion-gen=sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha8
 package v1alpha6
diff --git a/api/v1alpha6/groupversion_info.go b/api/v1alpha6/groupversion_info.go
index ffc696467f..1b2ae50550 100644
--- a/api/v1alpha6/groupversion_info.go
+++ b/api/v1alpha6/groupversion_info.go
@@ -14,9 +14,6 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-// package v1alpha6 contains API Schema definitions for the infrastructure v1alpha6 API group
-// +kubebuilder:object:generate=true
-// +groupName=infrastructure.cluster.x-k8s.io
 package v1alpha6
 
 import (
diff --git a/api/v1alpha6/openstackcluster_types.go b/api/v1alpha6/openstackcluster_types.go
index 3d7ba3d13c..e3a0d82a42 100644
--- a/api/v1alpha6/openstackcluster_types.go
+++ b/api/v1alpha6/openstackcluster_types.go
@@ -212,6 +212,8 @@ type OpenStackClusterStatus struct {
 	FailureMessage *string `json:"failureMessage,omitempty"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:deprecatedversion:warning="The v1alpha6 version of OpenStackCluster has been deprecated and will be removed in a future release of the API. Please upgrade."
 // +kubebuilder:resource:path=openstackclusters,scope=Namespaced,categories=cluster-api,shortName=osc
diff --git a/api/v1alpha6/openstackclustertemplate_types.go b/api/v1alpha6/openstackclustertemplate_types.go
index c76170dd52..8fc597cfff 100644
--- a/api/v1alpha6/openstackclustertemplate_types.go
+++ b/api/v1alpha6/openstackclustertemplate_types.go
@@ -44,6 +44,8 @@ type OpenStackClusterTemplate struct {
 	Spec OpenStackClusterTemplateSpec `json:"spec,omitempty"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 
 // OpenStackClusterTemplateList contains a list of OpenStackClusterTemplate.
diff --git a/api/v1alpha6/openstackmachine_types.go b/api/v1alpha6/openstackmachine_types.go
index 7dc263f099..9048c181ca 100644
--- a/api/v1alpha6/openstackmachine_types.go
+++ b/api/v1alpha6/openstackmachine_types.go
@@ -136,6 +136,8 @@ type OpenStackMachineStatus struct {
 	Conditions clusterv1.Conditions `json:"conditions,omitempty"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:deprecatedversion:warning="The v1alpha6 version of OpenStackMachine has been deprecated and will be removed in a future release of the API. Please upgrade."
 // +kubebuilder:resource:path=openstackmachines,scope=Namespaced,categories=cluster-api,shortName=osm
diff --git a/api/v1alpha6/openstackmachinetemplate_types.go b/api/v1alpha6/openstackmachinetemplate_types.go
index 6dbddaa85e..d1fd2f0895 100644
--- a/api/v1alpha6/openstackmachinetemplate_types.go
+++ b/api/v1alpha6/openstackmachinetemplate_types.go
@@ -25,6 +25,8 @@ type OpenStackMachineTemplateSpec struct {
 	Template OpenStackMachineTemplateResource `json:"template"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:deprecatedversion:warning="The v1alpha6 version of OpenStackMachineTemplate has been deprecated and will be removed in a future release of the API. Please upgrade."
 // +kubebuilder:resource:path=openstackmachinetemplates,scope=Namespaced,categories=cluster-api,shortName=osmt
diff --git a/api/v1alpha7/doc.go b/api/v1alpha7/doc.go
index 91f912911d..9179ac0280 100644
--- a/api/v1alpha7/doc.go
+++ b/api/v1alpha7/doc.go
@@ -14,5 +14,8 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
+// Package v1alpha7 contains API Schema definitions for the infrastructure v1alpha7 API group
+// +kubebuilder:object:generate=true
+// +groupName=infrastructure.cluster.x-k8s.io
 // +k8s:conversion-gen=sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha8
 package v1alpha7
diff --git a/api/v1alpha7/groupversion_info.go b/api/v1alpha7/groupversion_info.go
index bc23eee49e..e3aadf9ff5 100644
--- a/api/v1alpha7/groupversion_info.go
+++ b/api/v1alpha7/groupversion_info.go
@@ -14,9 +14,6 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-// package v1alpha7 contains API Schema definitions for the infrastructure v1alpha7 API group
-// +kubebuilder:object:generate=true
-// +groupName=infrastructure.cluster.x-k8s.io
 package v1alpha7
 
 import (
diff --git a/api/v1alpha7/openstackcluster_types.go b/api/v1alpha7/openstackcluster_types.go
index e822e02872..ef0ea51702 100644
--- a/api/v1alpha7/openstackcluster_types.go
+++ b/api/v1alpha7/openstackcluster_types.go
@@ -229,6 +229,8 @@ type OpenStackClusterStatus struct {
 	FailureMessage *string `json:"failureMessage,omitempty"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:resource:path=openstackclusters,scope=Namespaced,categories=cluster-api,shortName=osc
 // +kubebuilder:subresource:status
diff --git a/api/v1alpha7/openstackclustertemplate_types.go b/api/v1alpha7/openstackclustertemplate_types.go
index 0c02a154b3..4ee42ef579 100644
--- a/api/v1alpha7/openstackclustertemplate_types.go
+++ b/api/v1alpha7/openstackclustertemplate_types.go
@@ -30,8 +30,11 @@ type OpenStackClusterTemplateSpec struct {
 	Template OpenStackClusterTemplateResource `json:"template"`
 }
 
-//+kubebuilder:object:root=true
-//+kubebuilder:resource:path=openstackclustertemplates,scope=Namespaced,categories=cluster-api,shortName=osct
+// +genclient
+// +genclient:Namespaced
+// +kubebuilder:object:root=true
+// +kubebuilder:storageversion
+// +kubebuilder:resource:path=openstackclustertemplates,scope=Namespaced,categories=cluster-api,shortName=osct
 
 // OpenStackClusterTemplate is the Schema for the openstackclustertemplates API.
 type OpenStackClusterTemplate struct {
diff --git a/api/v1alpha7/openstackmachine_types.go b/api/v1alpha7/openstackmachine_types.go
index e70075ecff..1cc5378573 100644
--- a/api/v1alpha7/openstackmachine_types.go
+++ b/api/v1alpha7/openstackmachine_types.go
@@ -136,6 +136,8 @@ type OpenStackMachineStatus struct {
 	Conditions clusterv1.Conditions `json:"conditions,omitempty"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:resource:path=openstackmachines,scope=Namespaced,categories=cluster-api,shortName=osm
 // +kubebuilder:subresource:status
diff --git a/api/v1alpha7/openstackmachinetemplate_types.go b/api/v1alpha7/openstackmachinetemplate_types.go
index 3eeda6ad7a..a81154c085 100644
--- a/api/v1alpha7/openstackmachinetemplate_types.go
+++ b/api/v1alpha7/openstackmachinetemplate_types.go
@@ -36,6 +36,8 @@ type OpenStackMachineTemplate struct {
 	Spec OpenStackMachineTemplateSpec `json:"spec,omitempty"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 
 // OpenStackMachineTemplateList contains a list of OpenStackMachineTemplate.
diff --git a/api/v1alpha8/doc.go b/api/v1alpha8/doc.go
index 6e9bd36d84..e9ac580581 100644
--- a/api/v1alpha8/doc.go
+++ b/api/v1alpha8/doc.go
@@ -14,4 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
+// package v1alpha8 contains API Schema definitions for the infrastructure v1alpha8 API group
+// +kubebuilder:object:generate=true
+// +groupName=infrastructure.cluster.x-k8s.io
 package v1alpha8
diff --git a/api/v1alpha8/groupversion_info.go b/api/v1alpha8/groupversion_info.go
index b0ab35273c..01f2266886 100644
--- a/api/v1alpha8/groupversion_info.go
+++ b/api/v1alpha8/groupversion_info.go
@@ -13,10 +13,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */
-
-// package v1alpha8 contains API Schema definitions for the infrastructure v1alpha8 API group
-// +kubebuilder:object:generate=true
-// +groupName=infrastructure.cluster.x-k8s.io
 package v1alpha8
 
 import (
diff --git a/api/v1alpha8/openstackcluster_types.go b/api/v1alpha8/openstackcluster_types.go
index a6f9c0b15f..bed3fc5553 100644
--- a/api/v1alpha8/openstackcluster_types.go
+++ b/api/v1alpha8/openstackcluster_types.go
@@ -235,6 +235,8 @@ type OpenStackClusterStatus struct {
 	FailureMessage *string `json:"failureMessage,omitempty"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:resource:path=openstackclusters,scope=Namespaced,categories=cluster-api,shortName=osc
 // +kubebuilder:storageversion
diff --git a/api/v1alpha8/openstackclustertemplate_types.go b/api/v1alpha8/openstackclustertemplate_types.go
index 65ea6aeff6..a20ca4a991 100644
--- a/api/v1alpha8/openstackclustertemplate_types.go
+++ b/api/v1alpha8/openstackclustertemplate_types.go
@@ -30,9 +30,11 @@ type OpenStackClusterTemplateSpec struct {
 	Template OpenStackClusterTemplateResource `json:"template"`
 }
 
-//+kubebuilder:object:root=true
+// +genclient
+// +genclient:Namespaced
+// +kubebuilder:object:root=true
 // +kubebuilder:storageversion
-//+kubebuilder:resource:path=openstackclustertemplates,scope=Namespaced,categories=cluster-api,shortName=osct
+// +kubebuilder:resource:path=openstackclustertemplates,scope=Namespaced,categories=cluster-api,shortName=osct
 
 // OpenStackClusterTemplate is the Schema for the openstackclustertemplates API.
 type OpenStackClusterTemplate struct {
diff --git a/api/v1alpha8/openstackmachine_types.go b/api/v1alpha8/openstackmachine_types.go
index bc98e02a98..e8971c3019 100644
--- a/api/v1alpha8/openstackmachine_types.go
+++ b/api/v1alpha8/openstackmachine_types.go
@@ -143,6 +143,8 @@ type OpenStackMachineStatus struct {
 	Conditions clusterv1.Conditions `json:"conditions,omitempty"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:storageversion
 // +kubebuilder:resource:path=openstackmachines,scope=Namespaced,categories=cluster-api,shortName=osm
diff --git a/api/v1alpha8/openstackmachinetemplate_types.go b/api/v1alpha8/openstackmachinetemplate_types.go
index fa80dc371d..52771dfb6b 100644
--- a/api/v1alpha8/openstackmachinetemplate_types.go
+++ b/api/v1alpha8/openstackmachinetemplate_types.go
@@ -25,6 +25,8 @@ type OpenStackMachineTemplateSpec struct {
 	Template OpenStackMachineTemplateResource `json:"template"`
 }
 
+// +genclient
+// +genclient:Namespaced
 // +kubebuilder:object:root=true
 // +kubebuilder:storageversion
 // +kubebuilder:resource:path=openstackmachinetemplates,scope=Namespaced,categories=cluster-api,shortName=osmt
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
index cb48bc42f4..c1609818a9 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_openstackclustertemplates.yaml
@@ -2233,7 +2233,7 @@ spec:
             type: object
         type: object
     served: true
-    storage: false
+    storage: true
   - name: v1alpha8
     schema:
       openAPIV3Schema:
diff --git a/docs/book/gen-crd-api-reference-docs/config.json b/docs/book/gen-crd-api-reference-docs/config.json
new file mode 100644
index 0000000000..5c4e964917
--- /dev/null
+++ b/docs/book/gen-crd-api-reference-docs/config.json
@@ -0,0 +1,36 @@
+{
+    "hideMemberFields": [
+      "TypeMeta"
+    ],
+    "hideTypePatterns": [
+      "ParseError$",
+      "List$"
+    ],
+    "externalPackages": [
+      {
+        "typeMatchPrefix": "^k8s\\.io/apimachinery/pkg/apis/meta/v1\\.Duration$",
+        "docsURLTemplate": "https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Duration"
+      },
+      {
+        "typeMatchPrefix": "^k8s\\.io/apimachinery/pkg/apis/meta/v1\\.Condition$",
+        "docsURLTemplate": "https://pkg.go.dev/k8s.io/apimachinery/pkg/apis/meta/v1#Condition"
+      },
+      {
+        "typeMatchPrefix": "^sigs\\.k8s\\.io/cluster-api/api/v1beta1",
+        "docsURLTemplate": "https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1"
+      },
+      {
+        "typeMatchPrefix": "^sigs\\.k8s\\.io/cluster-api/api/v1beta1",
+        "docsURLTemplate": "https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1"
+      },
+      {
+        "typeMatchPrefix": "^sigs\\.k8s\\.io/cluster-api/errors",
+        "docsURLTemplate": "https://pkg.go.dev/sigs.k8s.io/cluster-api@v1.5.1/errors#{{.TypeIdentifier}}"
+      }
+    ],
+    "typeDisplayNamePrefixOverrides": {
+      "k8s.io/api/": "Kubernetes ",
+      "k8s.io/apimachinery/pkg/apis/": "Kubernetes "
+    },
+    "markdownDisabled": false
+  }
\ No newline at end of file
diff --git a/docs/book/gen-crd-api-reference-docs/template/members.tpl b/docs/book/gen-crd-api-reference-docs/template/members.tpl
new file mode 100644
index 0000000000..448ce2fb04
--- /dev/null
+++ b/docs/book/gen-crd-api-reference-docs/template/members.tpl
@@ -0,0 +1,48 @@
+{{ define "members" }}
+
+{{ range .Members }}
+{{ if not (hiddenMember .)}}
+<tr>
+    <td>
+        <code>{{ fieldName . }}</code><br/>
+        <em>
+            {{ if linkForType .Type }}
+                <a href="{{ linkForType .Type}}">
+                    {{ typeDisplayName .Type }}
+                </a>
+            {{ else }}
+                {{ typeDisplayName .Type }}
+            {{ end }}
+        </em>
+    </td>
+    <td>
+        {{ if fieldEmbedded . }}
+            <p>
+                (Members of <code>{{ fieldName . }}</code> are embedded into this type.)
+            </p>
+        {{ end}}
+
+        {{ if isOptionalMember .}}
+            <em>(Optional)</em>
+        {{ end }}
+
+        {{ safe (renderComments .CommentLines) }}
+
+    {{ if and (eq (.Type.Name.Name) "ObjectMeta") }}
+        Refer to the Kubernetes API documentation for the fields of the
+        <code>metadata</code> field.
+    {{ end }}
+
+    {{ if or (eq (fieldName .) "spec") }}
+        <br/>
+        <br/>
+        <table>
+            {{ template "members" .Type }}
+        </table>
+    {{ end }}
+    </td>
+</tr>
+{{ end }}
+{{ end }}
+
+{{ end }}
\ No newline at end of file
diff --git a/docs/book/gen-crd-api-reference-docs/template/pkg.tpl b/docs/book/gen-crd-api-reference-docs/template/pkg.tpl
new file mode 100644
index 0000000000..e9a0697911
--- /dev/null
+++ b/docs/book/gen-crd-api-reference-docs/template/pkg.tpl
@@ -0,0 +1,37 @@
+{{ define "packages" }}
+
+{{ range .packages }}
+    <h2 id="{{- packageAnchorID . -}}">
+        {{- packageDisplayName . -}}
+    </h2>
+
+    {{ with (index .GoPackages 0 )}}
+        {{ with .DocComments }}
+        <p>
+            {{ safe (renderComments .) }}
+        </p>
+        {{ end }}
+    {{ end }}
+
+    Resource Types:
+    <ul>
+    {{- range (visibleTypes (sortedTypes .Types)) -}}
+        {{ if isExportedType . -}}
+        <li>
+            <a href="{{ linkForType . }}">{{ typeDisplayName . }}</a>
+        </li>
+        {{- end }}
+    {{- end -}}
+    </ul>
+
+    {{ range (visibleTypes (sortedTypes .Types))}}
+        {{ template "type" .  }}
+    {{ end }}
+    <hr/>
+{{ end }}
+
+<p><em>
+    Generated with <code>gen-crd-api-reference-docs</code>.
+</em></p>
+
+{{ end }}
\ No newline at end of file
diff --git a/docs/book/gen-crd-api-reference-docs/template/type.tpl b/docs/book/gen-crd-api-reference-docs/template/type.tpl
new file mode 100644
index 0000000000..7ee5af5ab1
--- /dev/null
+++ b/docs/book/gen-crd-api-reference-docs/template/type.tpl
@@ -0,0 +1,81 @@
+{{ define "type" }}
+
+<h3 id="{{ anchorIDForType . }}">
+    {{- .Name.Name }}
+    {{ if eq .Kind "Alias" }}(<code>{{.Underlying}}</code> alias)</p>{{ end -}}
+</h3>
+{{ with (typeReferences .) }}
+    <p>
+        (<em>Appears on:</em>
+        {{- $prev := "" -}}
+        {{- range . -}}
+            {{- if $prev -}}, {{ end -}}
+            {{ $prev = . }}
+            <a href="{{ linkForType . }}">{{ typeDisplayName . }}</a>
+        {{- end -}}
+        )
+    </p>
+{{ end }}
+
+<p>
+    {{ safe (renderComments .CommentLines) }}
+</p>
+
+{{ with (constantsOfType .) }}
+<table>
+    <thead>
+        <tr>
+            <th>Value</th>
+            <th>Description</th>
+        </tr>
+    </thead>
+    <tbody>
+      {{- range . -}}
+      <tr>
+        {{- /*
+            renderComments implicitly creates a <p> element, so we
+            add one to the display name as well to make the contents
+            of the two cells align evenly.
+        */ -}}
+        <td><p>{{ typeDisplayName . }}</p></td>
+        <td>{{ safe (renderComments .CommentLines) }}</td>
+      </tr>
+      {{- end -}}
+    </tbody>
+</table>
+{{ end }}
+
+{{ if .Members }}
+<table>
+    <thead>
+        <tr>
+            <th>Field</th>
+            <th>Description</th>
+        </tr>
+    </thead>
+    <tbody>
+        {{ if isExportedType . }}
+        <tr>
+            <td>
+                <code>apiVersion</code><br/>
+                string</td>
+            <td>
+                <code>
+                    {{apiGroup .}}
+                </code>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <code>kind</code><br/>
+                string
+            </td>
+            <td><code>{{.Name.Name}}</code></td>
+        </tr>
+        {{ end }}
+        {{ template "members" .}}
+    </tbody>
+</table>
+{{ end }}
+
+{{ end }}
\ No newline at end of file
diff --git a/docs/book/src/SUMMARY.md b/docs/book/src/SUMMARY.md
index a03f4c5fc7..b33a06f6fe 100644
--- a/docs/book/src/SUMMARY.md
+++ b/docs/book/src/SUMMARY.md
@@ -12,5 +12,9 @@
         - [v1alpha5 to v1alpha6](./topics/crd-changes/v1alpha5-to-v1alpha6.md)
         - [v1alpha6 to v1alpha7](./topics/crd-changes/v1alpha6-to-v1alpha7.md)
         - [v1alpha7 to v1alpha8](./topics/crd-changes/v1alpha7-to-v1alpha8.md)
+- [API reference](./api/index.md)
+    - [v1alpha6](./api/v1alpha6/api.md)
+    - [v1alpha7](./api/v1alpha7/api.md)
+    - [v1alpha8](./api/v1alpha8/api.md)
 - [Development](./development/development.md)
 - [Hacking CI](./development/ci.md)
diff --git a/docs/book/src/api/index.md b/docs/book/src/api/index.md
new file mode 100644
index 0000000000..4ef12691eb
--- /dev/null
+++ b/docs/book/src/api/index.md
@@ -0,0 +1 @@
+# API reference
\ No newline at end of file
diff --git a/docs/book/src/api/v1alpha6/api.md b/docs/book/src/api/v1alpha6/api.md
new file mode 100644
index 0000000000..bc8cfe5239
--- /dev/null
+++ b/docs/book/src/api/v1alpha6/api.md
@@ -0,0 +1,4199 @@
+<h2 id="infrastructure.cluster.x-k8s.io/v1alpha6">infrastructure.cluster.x-k8s.io/v1alpha6</h2>
+<p>
+<p>Package v1alpha6 contains API Schema definitions for the infrastructure v1alpha6 API group</p>
+</p>
+Resource Types:
+<ul><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackCluster">OpenStackCluster</a>
+</li><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachine">OpenStackMachine</a>
+</li><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplate">OpenStackMachineTemplate</a>
+</li></ul>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackCluster">OpenStackCluster
+</h3>
+<p>
+<p>OpenStackCluster is the Schema for the openstackclusters API.</p>
+<p>Deprecated: This type will be removed in one of the next releases.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha6
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackCluster</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">
+OpenStackClusterSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nodeCidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>NodeCIDR is the OpenStack Subnet to be created. Cluster actuator will create a
+network, a subnet with NodeCIDR, and a router connected to this subnet.
+If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>dnsNameservers</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>DNSNameservers is the list of nameservers for OpenStack Subnet being created.
+Set this value when you need create a new network/subnet while the access
+through DNS is required.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetworkId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetworkID is the ID of an external OpenStack Network. This is necessary
+to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, the
+Kubernetes API server and the Calico CNI plugin to function correctly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowAllInClusterTraffic</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AllowAllInClusterTraffic is only used when managed security groups are in use.
+If set to true, the rules for the managed security groups are configured so that all
+ingress and egress between cluster nodes is permitted, allowing CNIs other than
+Calico to be used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. Set <code>enabled: false</code> to
+make changes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td>
+<code>status</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterStatus">
+OpenStackClusterStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachine">OpenStackMachine
+</h3>
+<p>
+<p>OpenStackMachine is the Schema for the openstackmachines API.</p>
+<p>Deprecated: This type will be removed in one of the next releases.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha6
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackMachine</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The name of the image to use for your server instance.
+If the RootVolume is specified, this will be ignored and use rootVolume directly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageUUID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The uuid of the image to use for your server instance.
+if it&rsquo;s empty, Image name will be used</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networks</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkParam">
+[]NetworkParam
+</a>
+</em>
+</td>
+<td>
+<p>A networks object. Required parameter when there are multiple networks defined for the tenant.
+When you do not specify both networks and ports parameters, the server attaches to the only network created for the current tenant.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+When you do not specify both networks and ports parameters, the server attaches to the only network created for the current tenant.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>UUID, IP address of a port from this subnet will be marked as AccessIPv4 on the created compute instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The floatingIP which will be associated to the machine, only used for master.
+The floatingIP should have been created and haven&rsquo;t been associated.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupParam">
+[]SecurityGroupParam
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The server group to assign the machine to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td>
+<code>status</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineStatus">
+OpenStackMachineStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplate">OpenStackMachineTemplate
+</h3>
+<p>
+<p>OpenStackMachineTemplate is the Schema for the openstackmachinetemplates API.</p>
+<p>Deprecated: This type will be removed in one of the next releases.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha6
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackMachineTemplate</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplateSpec">
+OpenStackMachineTemplateSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplateResource">
+OpenStackMachineTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.APIServerLoadBalancer">APIServerLoadBalancer
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>enabled</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Enabled defines whether a load balancer should be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalPorts</code><br/>
+<em>
+[]int
+</em>
+</td>
+<td>
+<p>AdditionalPorts adds additional tcp ports to the load balancer.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedCidrs</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>AllowedCIDRs restrict access to all API-Server listeners to the given address CIDRs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>provider</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Octavia Provider Used to create load balancer</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.AddressPair">AddressPair
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ipAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>macAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.Bastion">Bastion
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+<p>Bastion represents basic information about the bastion node.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>enabled</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>instance</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<p>Instance for the bastion itself</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>availabilityZone</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.ExternalRouterIPParam">ExternalRouterIPParam
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>fixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The FixedIP in the corresponding subnet</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SubnetParam">
+SubnetParam
+</a>
+</em>
+</td>
+<td>
+<p>The subnet in which the FixedIP is used for the Gateway of this router</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.FixedIP">FixedIP
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>Subnet is an openstack subnet query that will return the id of a subnet to create
+the fixed IP of a port in. This query must not return more than one subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.Instance">Instance
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureDomain</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>securigyGroups</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>networks</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Network">
+[]Network
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageUUID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>userData</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>state</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.InstanceState">
+InstanceState
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.InstanceState">InstanceState
+(<code>string</code> alias)</p></h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Instance">Instance</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineStatus">OpenStackMachineStatus</a>)
+</p>
+<p>
+<p>InstanceState describes the state of an OpenStack instance.</p>
+</p>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.LoadBalancer">LoadBalancer
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Network">Network</a>)
+</p>
+<p>
+<p>LoadBalancer represents basic information about the associated OpenStack LoadBalancer.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>internalIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedCIDRs</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.Network">Network
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Instance">Instance</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>Network represents basic information about an OpenStack Neutron Network associated with an instance&rsquo;s port.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Subnet">
+Subnet
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>port</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">
+PortOpts
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Router">
+Router
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.LoadBalancer">
+LoadBalancer
+</a>
+</em>
+</td>
+<td>
+<p>Be careful when using APIServerLoadBalancer, because this field is optional and therefore not
+set in all cases</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.NetworkFilter">NetworkFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkParam">NetworkParam</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">OpenStackClusterSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.NetworkParam">NetworkParam
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>uuid</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Optional UUID of the network.
+If specified this will not be validated prior to server creation.
+Required if <code>Subnets</code> specifies a subnet by UUID.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>fixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>A fixed IPv4 address for the NIC.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>filter</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>Filters for optional network query</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SubnetParam">
+[]SubnetParam
+</a>
+</em>
+</td>
+<td>
+<p>Subnet within a network to use</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">OpenStackClusterSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackCluster">OpenStackCluster</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplateResource">OpenStackClusterTemplateResource</a>)
+</p>
+<p>
+<p>OpenStackClusterSpec defines the desired state of OpenStackCluster.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nodeCidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>NodeCIDR is the OpenStack Subnet to be created. Cluster actuator will create a
+network, a subnet with NodeCIDR, and a router connected to this subnet.
+If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>dnsNameservers</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>DNSNameservers is the list of nameservers for OpenStack Subnet being created.
+Set this value when you need create a new network/subnet while the access
+through DNS is required.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetworkId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetworkID is the ID of an external OpenStack Network. This is necessary
+to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, the
+Kubernetes API server and the Calico CNI plugin to function correctly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowAllInClusterTraffic</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AllowAllInClusterTraffic is only used when managed security groups are in use.
+If set to true, the rules for the managed security groups are configured so that all
+ingress and egress between cluster nodes is permitted, allowing CNIs other than
+Calico to be used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. Set <code>enabled: false</code> to
+make changes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterStatus">OpenStackClusterStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackCluster">OpenStackCluster</a>)
+</p>
+<p>
+<p>OpenStackClusterStatus defines the observed state of OpenStackCluster.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ready</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Network">
+Network
+</a>
+</em>
+</td>
+<td>
+<p>Network contains all information about the created OpenStack Network.
+It includes Subnets and Router.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetwork</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Network">
+Network
+</a>
+</em>
+</td>
+<td>
+<p>External Network contains information about the created OpenStack external network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureDomains</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.FailureDomains
+</a>
+</em>
+</td>
+<td>
+<p>FailureDomains represent OpenStack availability zones</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroup">
+SecurityGroup
+</a>
+</em>
+</td>
+<td>
+<p>ControlPlaneSecurityGroups contains all the information about the OpenStack
+Security Group that needs to be applied to control plane nodes.
+TODO: Maybe instead of two properties, we add a property to the group?</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>workerSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroup">
+SecurityGroup
+</a>
+</em>
+</td>
+<td>
+<p>WorkerSecurityGroup contains all the information about the OpenStack Security
+Group that needs to be applied to worker nodes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastionSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroup">
+SecurityGroup
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Instance">
+Instance
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureReason</code><br/>
+<em>
+<a href="https://pkg.go.dev/sigs.k8s.io/cluster-api@v1.5.1/errors#ClusterStatusError">
+sigs.k8s.io/cluster-api/errors.ClusterStatusError
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureReason will be set in the event that there is a terminal problem
+reconciling the OpenStackCluster and will contain a succinct value suitable
+for machine interpretation.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the OpenStackCluster&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of
+OpenStackClusters can be added as events to the OpenStackCluster object
+and/or logged in the controller&rsquo;s output.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureMessage</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureMessage will be set in the event that there is a terminal problem
+reconciling the OpenStackCluster and will contain a more verbose string suitable
+for logging and human consumption.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the OpenStackCluster&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of
+OpenStackClusters can be added as events to the OpenStackCluster object
+and/or logged in the controller&rsquo;s output.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplate">OpenStackClusterTemplate
+</h3>
+<p>
+<p>OpenStackClusterTemplate is the Schema for the openstackclustertemplates API.</p>
+<p>Deprecated: This type will be removed in one of the next releases.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplateSpec">
+OpenStackClusterTemplateSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplateResource">
+OpenStackClusterTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplateResource">OpenStackClusterTemplateResource
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplateSpec">OpenStackClusterTemplateSpec</a>)
+</p>
+<p>
+<p>OpenStackClusterTemplateResource describes the data needed to create a OpenStackCluster from a template.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">
+OpenStackClusterSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nodeCidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>NodeCIDR is the OpenStack Subnet to be created. Cluster actuator will create a
+network, a subnet with NodeCIDR, and a router connected to this subnet.
+If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>dnsNameservers</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>DNSNameservers is the list of nameservers for OpenStack Subnet being created.
+Set this value when you need create a new network/subnet while the access
+through DNS is required.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetworkId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetworkID is the ID of an external OpenStack Network. This is necessary
+to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, the
+Kubernetes API server and the Calico CNI plugin to function correctly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowAllInClusterTraffic</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AllowAllInClusterTraffic is only used when managed security groups are in use.
+If set to true, the rules for the managed security groups are configured so that all
+ingress and egress between cluster nodes is permitted, allowing CNIs other than
+Calico to be used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. Set <code>enabled: false</code> to
+make changes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplateSpec">OpenStackClusterTemplateSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplate">OpenStackClusterTemplate</a>)
+</p>
+<p>
+<p>OpenStackClusterTemplateSpec defines the desired state of OpenStackClusterTemplate.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterTemplateResource">
+OpenStackClusterTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackIdentityReference">OpenStackIdentityReference
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">OpenStackClusterSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+<p>OpenStackIdentityReference is a reference to an infrastructure
+provider identity to be used to provision cluster resources.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>kind</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Kind of the identity. Must be supported by the infrastructure
+provider and may be either cluster or namespace-scoped.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name of the infrastructure identity to be used.
+Must be either a cluster-scoped resource, or namespaced-scoped
+resource the same namespace as the resource(s) being provisioned.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">OpenStackMachineSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachine">OpenStackMachine</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Bastion">Bastion</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplateResource">OpenStackMachineTemplateResource</a>)
+</p>
+<p>
+<p>OpenStackMachineSpec defines the desired state of OpenStackMachine.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The name of the image to use for your server instance.
+If the RootVolume is specified, this will be ignored and use rootVolume directly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageUUID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The uuid of the image to use for your server instance.
+if it&rsquo;s empty, Image name will be used</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networks</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkParam">
+[]NetworkParam
+</a>
+</em>
+</td>
+<td>
+<p>A networks object. Required parameter when there are multiple networks defined for the tenant.
+When you do not specify both networks and ports parameters, the server attaches to the only network created for the current tenant.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+When you do not specify both networks and ports parameters, the server attaches to the only network created for the current tenant.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>UUID, IP address of a port from this subnet will be marked as AccessIPv4 on the created compute instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The floatingIP which will be associated to the machine, only used for master.
+The floatingIP should have been created and haven&rsquo;t been associated.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupParam">
+[]SecurityGroupParam
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The server group to assign the machine to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineStatus">OpenStackMachineStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachine">OpenStackMachine</a>)
+</p>
+<p>
+<p>OpenStackMachineStatus defines the observed state of OpenStackMachine.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ready</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Ready is true when the provider resource is ready.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>addresses</code><br/>
+<em>
+[]Kubernetes core/v1.NodeAddress
+</em>
+</td>
+<td>
+<p>Addresses contains the OpenStack instance associated addresses.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceState</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.InstanceState">
+InstanceState
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>InstanceState is the state of the OpenStack instance for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureReason</code><br/>
+<em>
+<a href="https://pkg.go.dev/sigs.k8s.io/cluster-api@v1.5.1/errors#MachineStatusError">
+sigs.k8s.io/cluster-api/errors.MachineStatusError
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureMessage</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureMessage will be set in the event that there is a terminal problem
+reconciling the Machine and will contain a more verbose string suitable
+for logging and human consumption.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the Machine&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of Machines
+can be added as events to the Machine object and/or logged in the
+controller&rsquo;s output.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>conditions</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.Conditions
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplateResource">OpenStackMachineTemplateResource
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplateSpec">OpenStackMachineTemplateSpec</a>)
+</p>
+<p>
+<p>OpenStackMachineTemplateResource describes the data needed to create a OpenStackMachine from a template.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<p>Spec is the specification of the desired behavior of the machine.</p>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The name of the image to use for your server instance.
+If the RootVolume is specified, this will be ignored and use rootVolume directly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageUUID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The uuid of the image to use for your server instance.
+if it&rsquo;s empty, Image name will be used</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networks</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkParam">
+[]NetworkParam
+</a>
+</em>
+</td>
+<td>
+<p>A networks object. Required parameter when there are multiple networks defined for the tenant.
+When you do not specify both networks and ports parameters, the server attaches to the only network created for the current tenant.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+When you do not specify both networks and ports parameters, the server attaches to the only network created for the current tenant.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>UUID, IP address of a port from this subnet will be marked as AccessIPv4 on the created compute instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The floatingIP which will be associated to the machine, only used for master.
+The floatingIP should have been created and haven&rsquo;t been associated.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupParam">
+[]SecurityGroupParam
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The server group to assign the machine to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplateSpec">OpenStackMachineTemplateSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplate">OpenStackMachineTemplate</a>)
+</p>
+<p>
+<p>OpenStackMachineTemplateSpec defines the desired state of OpenStackMachineTemplate.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineTemplateResource">
+OpenStackMachineTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">PortOpts
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Network">Network</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>Network is a query for an openstack network that the port will be created or discovered on.
+This will fail if the query returns more than one network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nameSuffix</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Used to make the name of the port unique. If unspecified, instead the 0-based index of the port in the list is used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>adminStateUp</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>macAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>fixedIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.FixedIP">
+[]FixedIP
+</a>
+</em>
+</td>
+<td>
+<p>Specify pairs of subnet and/or IP address. These should be subnets of the network with the given NetworkID.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tenantId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>The uuids of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroupFilters</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupParam">
+[]SecurityGroupParam
+</a>
+</em>
+</td>
+<td>
+<p>The names, uuids, filters or any combination these of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedAddressPairs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.AddressPair">
+[]AddressPair
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Enables and disables trunk at port level. If not provided, openStackMachine.Spec.Trunk is inherited.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>hostId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ID of the host where the port is allocated</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>vnicType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The virtual network interface card (vNIC) type that is bound to the neutron port.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>profile</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<p>A dictionary that enables the application running on the specified
+host to pass and receive virtual network interface (VIF) port-specific
+information to the plug-in.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity enables or disables the port security when set.
+When not set, it takes the value of the corresponding field at the network level.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags applied to the port (and corresponding trunk, if a trunk is configured.)
+These tags are applied in addition to the instance&rsquo;s tags, which will also be applied to the port.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>valueSpecs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.ValueSpec">
+[]ValueSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Value specs are extra parameters to include in the API request with OpenStack.
+This is an extension point for the API, so what they do and if they are supported,
+depends on the specific OpenStack implementation.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.RootVolume">RootVolume
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Instance">Instance</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>diskSize</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>volumeType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>availabilityZone</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.Router">Router
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Network">Network</a>)
+</p>
+<p>
+<p>Router represents basic information about the associated OpenStack Neutron Router.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>ips</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroup">SecurityGroup
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>SecurityGroup represents the basic information of the associated
+OpenStack Neutron Security Group.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>rules</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupRule">
+[]SecurityGroupRule
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupFilter">SecurityGroupFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupParam">SecurityGroupParam</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tenantId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>limit</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>marker</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>sortKey</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>sortDir</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupParam">SecurityGroupParam
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackMachineSpec">OpenStackMachineSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>uuid</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Security Group UID</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Security Group name</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>filter</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupFilter">
+SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>Filters used to query security groups in openstack</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroupRule">SecurityGroupRule
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SecurityGroup">SecurityGroup</a>)
+</p>
+<p>
+<p>SecurityGroupRule represent the basic information of the associated OpenStack
+Security Group Role.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>direction</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>etherType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>portRangeMin</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>portRangeMax</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>protocol</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteIPPrefix</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.Subnet">Subnet
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.Network">Network</a>)
+</p>
+<p>
+<p>Subnet represents basic information about the associated OpenStack Neutron Subnet.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>cidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.SubnetFilter">SubnetFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.FixedIP">FixedIP</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.OpenStackClusterSpec">OpenStackClusterSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SubnetParam">SubnetParam</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipVersion</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>gateway_ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>cidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipv6AddressMode</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipv6RaMode</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.SubnetParam">SubnetParam
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.ExternalRouterIPParam">ExternalRouterIPParam</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.NetworkParam">NetworkParam</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>uuid</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Optional UUID of the subnet.
+If specified this will not be validated prior to server creation.
+If specified, the enclosing <code>NetworkParam</code> must also be specified by UUID.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>filter</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>Filters for optional subnet query</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha6.ValueSpec">ValueSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha6.PortOpts">PortOpts</a>)
+</p>
+<p>
+<p>ValueSpec represents a single value_spec key-value pair.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name is the name of the key-value pair.
+This is just for identifying the pair and will not be sent to the OpenStack API.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>key</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Key is the key in the key-value pair.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>value</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Value is the value in the key-value pair.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<hr/>
+<p><em>
+Generated with <code>gen-crd-api-reference-docs</code>.
+</em></p>
diff --git a/docs/book/src/api/v1alpha7/api.md b/docs/book/src/api/v1alpha7/api.md
new file mode 100644
index 0000000000..1d9e0484c1
--- /dev/null
+++ b/docs/book/src/api/v1alpha7/api.md
@@ -0,0 +1,4216 @@
+<h2 id="infrastructure.cluster.x-k8s.io/v1alpha7">infrastructure.cluster.x-k8s.io/v1alpha7</h2>
+<p>
+<p>Package v1alpha7 contains API Schema definitions for the infrastructure v1alpha7 API group</p>
+</p>
+Resource Types:
+<ul><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackCluster">OpenStackCluster</a>
+</li><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplate">OpenStackClusterTemplate</a>
+</li><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachine">OpenStackMachine</a>
+</li></ul>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackCluster">OpenStackCluster
+</h3>
+<p>
+<p>OpenStackCluster is the Schema for the openstackclusters API.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha7
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackCluster</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">
+OpenStackClusterSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nodeCidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>NodeCIDR is the OpenStack Subnet to be created. Cluster actuator will create a
+network, a subnet with NodeCIDR, and a router connected to this subnet.
+If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.RouterFilter">
+RouterFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>If NodeCIDR is set this option can be used to detect an existing router.
+If specified, no new router will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMtu</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>NetworkMTU sets the maximum transmission unit (MTU) value to address fragmentation for the private network ID.
+This value will be used only if the Cluster actuator creates the network.
+If leaved empty, the network will have the default MTU defined in Openstack network service.
+To use this field, the Openstack installation requires the net-mtu neutron API extension.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>dnsNameservers</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>DNSNameservers is the list of nameservers for OpenStack Subnet being created.
+Set this value when you need create a new network/subnet while the access
+through DNS is required.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetworkId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetworkID is the ID of an external OpenStack Network. This is necessary
+to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, the
+Kubernetes API server and the Calico CNI plugin to function correctly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowAllInClusterTraffic</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AllowAllInClusterTraffic is only used when managed security groups are in use.
+If set to true, the rules for the managed security groups are configured so that all
+ingress and egress between cluster nodes is permitted, allowing CNIs other than
+Calico to be used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. Set <code>enabled: false</code> to
+make changes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td>
+<code>status</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterStatus">
+OpenStackClusterStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplate">OpenStackClusterTemplate
+</h3>
+<p>
+<p>OpenStackClusterTemplate is the Schema for the openstackclustertemplates API.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha7
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackClusterTemplate</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplateSpec">
+OpenStackClusterTemplateSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplateResource">
+OpenStackClusterTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachine">OpenStackMachine
+</h3>
+<p>
+<p>OpenStackMachine is the Schema for the openstackmachines API.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha7
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackMachine</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The name of the image to use for your server instance.
+If the RootVolume is specified, this will be ignored and use rootVolume directly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageUUID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The uuid of the image to use for your server instance.
+if it&rsquo;s empty, Image name will be used</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+If not specified a default port will be added for the default cluster network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The floatingIP which will be associated to the machine, only used for master.
+The floatingIP should have been created and haven&rsquo;t been associated.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroupFilter">
+[]SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalBlockDevices</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.AdditionalBlockDevice">
+[]AdditionalBlockDevice
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AdditionalBlockDevices is a list of specifications for additional block devices to attach to the server instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The server group to assign the machine to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster.
+If not specified, the identity ref of the cluster will be used instead.</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td>
+<code>status</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineStatus">
+OpenStackMachineStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.APIServerLoadBalancer">APIServerLoadBalancer
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>enabled</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Enabled defines whether a load balancer should be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalPorts</code><br/>
+<em>
+[]int
+</em>
+</td>
+<td>
+<p>AdditionalPorts adds additional tcp ports to the load balancer.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedCidrs</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>AllowedCIDRs restrict access to all API-Server listeners to the given address CIDRs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>provider</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Octavia Provider Used to create load balancer</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.AdditionalBlockDevice">AdditionalBlockDevice
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+<p>AdditionalBlockDevice is a block device to attach to the server.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name of the block device in the context of a machine.
+If the block device is a volume, the Cinder volume will be named
+as a combination of the machine name and this name.
+Also, this name will be used for tagging the block device.
+Information about the block device tag can be obtained from the OpenStack
+metadata API or the config drive.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sizeGiB</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>SizeGiB is the size of the block device in gibibytes (GiB).</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>storage</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.BlockDeviceStorage">
+BlockDeviceStorage
+</a>
+</em>
+</td>
+<td>
+<p>Storage specifies the storage type of the block device and
+additional storage options.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.AddressPair">AddressPair
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ipAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>macAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.Bastion">Bastion
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+<p>Bastion represents basic information about the bastion node.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>enabled</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>instance</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<p>Instance for the bastion itself</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>availabilityZone</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.BastionStatus">BastionStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>state</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.InstanceState">
+InstanceState
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.BindingProfile">BindingProfile
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ovsHWOffload</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>OVSHWOffload enables or disables the OVS hardware offload feature.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trustedVF</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>TrustedVF enables or disables the “trusted mode” for the VF.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.BlockDeviceStorage">BlockDeviceStorage
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.AdditionalBlockDevice">AdditionalBlockDevice</a>)
+</p>
+<p>
+<p>BlockDeviceStorage is the storage type of a block device to create and
+contains additional storage options.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>type</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.BlockDeviceType">
+BlockDeviceType
+</a>
+</em>
+</td>
+<td>
+<p>Type is the type of block device to create.
+This can be either &ldquo;Volume&rdquo; or &ldquo;Local&rdquo;.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>volume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.BlockDeviceVolume">
+BlockDeviceVolume
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Volume contains additional storage options for a volume block device.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.BlockDeviceType">BlockDeviceType
+(<code>string</code> alias)</p></h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.BlockDeviceStorage">BlockDeviceStorage</a>)
+</p>
+<p>
+<p>BlockDeviceType defines the type of block device to create.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Value</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody><tr><td><p>&#34;Local&#34;</p></td>
+<td><p>LocalBlockDevice is an ephemeral block device attached to the server.</p>
+</td>
+</tr><tr><td><p>&#34;Volume&#34;</p></td>
+<td><p>VolumeBlockDevice is a volume block device attached to the server.</p>
+</td>
+</tr></tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.BlockDeviceVolume">BlockDeviceVolume
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.BlockDeviceStorage">BlockDeviceStorage</a>)
+</p>
+<p>
+<p>BlockDeviceVolume contains additional storage options for a volume block device.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>type</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Type is the Cinder volume type of the volume.
+If omitted, the default Cinder volume type that is configured in the OpenStack cloud
+will be used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>availabilityZone</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AvailabilityZone is the volume availability zone to create the volume in.
+If omitted, the availability zone of the server will be used.
+The availability zone must NOT contain spaces otherwise it will lead to volume that belongs
+to this availability zone register failure, see kubernetes/cloud-provider-openstack#1379 for
+further information.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.ExternalRouterIPParam">ExternalRouterIPParam
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>fixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The FixedIP in the corresponding subnet</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>The subnet in which the FixedIP is used for the Gateway of this router</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.FixedIP">FixedIP
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>Subnet is an openstack subnet query that will return the id of a subnet to create
+the fixed IP of a port in. This query must not return more than one subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.InstanceState">InstanceState
+(<code>string</code> alias)</p></h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.BastionStatus">BastionStatus</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineStatus">OpenStackMachineStatus</a>)
+</p>
+<p>
+<p>InstanceState describes the state of an OpenStack instance.</p>
+</p>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.LoadBalancer">LoadBalancer
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>LoadBalancer represents basic information about the associated OpenStack LoadBalancer.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>internalIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedCIDRs</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.NetworkFilter">NetworkFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">OpenStackClusterSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.NetworkStatus">NetworkStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkStatusWithSubnets">NetworkStatusWithSubnets</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>NetworkStatus contains basic information about an existing neutron network.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.NetworkStatusWithSubnets">NetworkStatusWithSubnets
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>NetworkStatusWithSubnets represents basic information about an existing neutron network and an associated set of subnets.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>NetworkStatus</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkStatus">
+NetworkStatus
+</a>
+</em>
+</td>
+<td>
+<p>
+(Members of <code>NetworkStatus</code> are embedded into this type.)
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.Subnet">
+[]Subnet
+</a>
+</em>
+</td>
+<td>
+<p>Subnets is a list of subnets associated with the default cluster network. Machines which use the default cluster network will get an address from all of these subnets.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">OpenStackClusterSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackCluster">OpenStackCluster</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplateResource">OpenStackClusterTemplateResource</a>)
+</p>
+<p>
+<p>OpenStackClusterSpec defines the desired state of OpenStackCluster.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nodeCidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>NodeCIDR is the OpenStack Subnet to be created. Cluster actuator will create a
+network, a subnet with NodeCIDR, and a router connected to this subnet.
+If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.RouterFilter">
+RouterFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>If NodeCIDR is set this option can be used to detect an existing router.
+If specified, no new router will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMtu</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>NetworkMTU sets the maximum transmission unit (MTU) value to address fragmentation for the private network ID.
+This value will be used only if the Cluster actuator creates the network.
+If leaved empty, the network will have the default MTU defined in Openstack network service.
+To use this field, the Openstack installation requires the net-mtu neutron API extension.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>dnsNameservers</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>DNSNameservers is the list of nameservers for OpenStack Subnet being created.
+Set this value when you need create a new network/subnet while the access
+through DNS is required.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetworkId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetworkID is the ID of an external OpenStack Network. This is necessary
+to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, the
+Kubernetes API server and the Calico CNI plugin to function correctly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowAllInClusterTraffic</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AllowAllInClusterTraffic is only used when managed security groups are in use.
+If set to true, the rules for the managed security groups are configured so that all
+ingress and egress between cluster nodes is permitted, allowing CNIs other than
+Calico to be used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. Set <code>enabled: false</code> to
+make changes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterStatus">OpenStackClusterStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackCluster">OpenStackCluster</a>)
+</p>
+<p>
+<p>OpenStackClusterStatus defines the observed state of OpenStackCluster.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ready</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkStatusWithSubnets">
+NetworkStatusWithSubnets
+</a>
+</em>
+</td>
+<td>
+<p>Network contains information about the created OpenStack Network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetwork</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkStatus">
+NetworkStatus
+</a>
+</em>
+</td>
+<td>
+<p>externalNetwork contains information about the external network used for default ingress and egress traffic.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.Router">
+Router
+</a>
+</em>
+</td>
+<td>
+<p>Router describes the default cluster router</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.LoadBalancer">
+LoadBalancer
+</a>
+</em>
+</td>
+<td>
+<p>APIServerLoadBalancer describes the api server load balancer if one exists</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureDomains</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.FailureDomains
+</a>
+</em>
+</td>
+<td>
+<p>FailureDomains represent OpenStack availability zones</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroup">
+SecurityGroup
+</a>
+</em>
+</td>
+<td>
+<p>ControlPlaneSecurityGroups contains all the information about the OpenStack
+Security Group that needs to be applied to control plane nodes.
+TODO: Maybe instead of two properties, we add a property to the group?</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>workerSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroup">
+SecurityGroup
+</a>
+</em>
+</td>
+<td>
+<p>WorkerSecurityGroup contains all the information about the OpenStack Security
+Group that needs to be applied to worker nodes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastionSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroup">
+SecurityGroup
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.BastionStatus">
+BastionStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureReason</code><br/>
+<em>
+<a href="https://pkg.go.dev/sigs.k8s.io/cluster-api@v1.5.1/errors#ClusterStatusError">
+sigs.k8s.io/cluster-api/errors.ClusterStatusError
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureReason will be set in the event that there is a terminal problem
+reconciling the OpenStackCluster and will contain a succinct value suitable
+for machine interpretation.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the OpenStackCluster&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of
+OpenStackClusters can be added as events to the OpenStackCluster object
+and/or logged in the controller&rsquo;s output.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureMessage</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureMessage will be set in the event that there is a terminal problem
+reconciling the OpenStackCluster and will contain a more verbose string suitable
+for logging and human consumption.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the OpenStackCluster&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of
+OpenStackClusters can be added as events to the OpenStackCluster object
+and/or logged in the controller&rsquo;s output.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplateResource">OpenStackClusterTemplateResource
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplateSpec">OpenStackClusterTemplateSpec</a>)
+</p>
+<p>
+<p>OpenStackClusterTemplateResource describes the data needed to create a OpenStackCluster from a template.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">
+OpenStackClusterSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nodeCidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>NodeCIDR is the OpenStack Subnet to be created. Cluster actuator will create a
+network, a subnet with NodeCIDR, and a router connected to this subnet.
+If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.RouterFilter">
+RouterFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>If NodeCIDR is set this option can be used to detect an existing router.
+If specified, no new router will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>If NodeCIDR cannot be set this can be used to detect an existing subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMtu</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>NetworkMTU sets the maximum transmission unit (MTU) value to address fragmentation for the private network ID.
+This value will be used only if the Cluster actuator creates the network.
+If leaved empty, the network will have the default MTU defined in Openstack network service.
+To use this field, the Openstack installation requires the net-mtu neutron API extension.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>dnsNameservers</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>DNSNameservers is the list of nameservers for OpenStack Subnet being created.
+Set this value when you need create a new network/subnet while the access
+through DNS is required.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetworkId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetworkID is the ID of an external OpenStack Network. This is necessary
+to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, the
+Kubernetes API server and the Calico CNI plugin to function correctly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowAllInClusterTraffic</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AllowAllInClusterTraffic is only used when managed security groups are in use.
+If set to true, the rules for the managed security groups are configured so that all
+ingress and egress between cluster nodes is permitted, allowing CNIs other than
+Calico to be used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. Set <code>enabled: false</code> to
+make changes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplateSpec">OpenStackClusterTemplateSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplate">OpenStackClusterTemplate</a>)
+</p>
+<p>
+<p>OpenStackClusterTemplateSpec defines the desired state of OpenStackClusterTemplate.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterTemplateResource">
+OpenStackClusterTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackIdentityReference">OpenStackIdentityReference
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">OpenStackClusterSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+<p>OpenStackIdentityReference is a reference to an infrastructure
+provider identity to be used to provision cluster resources.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>kind</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Kind of the identity. Must be supported by the infrastructure
+provider and may be either cluster or namespace-scoped.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name of the infrastructure identity to be used.
+Must be either a cluster-scoped resource, or namespaced-scoped
+resource the same namespace as the resource(s) being provisioned.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">OpenStackMachineSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachine">OpenStackMachine</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.Bastion">Bastion</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplateResource">OpenStackMachineTemplateResource</a>)
+</p>
+<p>
+<p>OpenStackMachineSpec defines the desired state of OpenStackMachine.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The name of the image to use for your server instance.
+If the RootVolume is specified, this will be ignored and use rootVolume directly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageUUID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The uuid of the image to use for your server instance.
+if it&rsquo;s empty, Image name will be used</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+If not specified a default port will be added for the default cluster network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The floatingIP which will be associated to the machine, only used for master.
+The floatingIP should have been created and haven&rsquo;t been associated.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroupFilter">
+[]SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalBlockDevices</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.AdditionalBlockDevice">
+[]AdditionalBlockDevice
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AdditionalBlockDevices is a list of specifications for additional block devices to attach to the server instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The server group to assign the machine to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster.
+If not specified, the identity ref of the cluster will be used instead.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineStatus">OpenStackMachineStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachine">OpenStackMachine</a>)
+</p>
+<p>
+<p>OpenStackMachineStatus defines the observed state of OpenStackMachine.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ready</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Ready is true when the provider resource is ready.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>addresses</code><br/>
+<em>
+[]Kubernetes core/v1.NodeAddress
+</em>
+</td>
+<td>
+<p>Addresses contains the OpenStack instance associated addresses.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceState</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.InstanceState">
+InstanceState
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>InstanceState is the state of the OpenStack instance for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureReason</code><br/>
+<em>
+<a href="https://pkg.go.dev/sigs.k8s.io/cluster-api@v1.5.1/errors#MachineStatusError">
+sigs.k8s.io/cluster-api/errors.MachineStatusError
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureMessage</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureMessage will be set in the event that there is a terminal problem
+reconciling the Machine and will contain a more verbose string suitable
+for logging and human consumption.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the Machine&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of Machines
+can be added as events to the Machine object and/or logged in the
+controller&rsquo;s output.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>conditions</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.Conditions
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplate">OpenStackMachineTemplate
+</h3>
+<p>
+<p>OpenStackMachineTemplate is the Schema for the openstackmachinetemplates API.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplateSpec">
+OpenStackMachineTemplateSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplateResource">
+OpenStackMachineTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplateResource">OpenStackMachineTemplateResource
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplateSpec">OpenStackMachineTemplateSpec</a>)
+</p>
+<p>
+<p>OpenStackMachineTemplateResource describes the data needed to create a OpenStackMachine from a template.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<p>Spec is the specification of the desired behavior of the machine.</p>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The name of the image to use for your server instance.
+If the RootVolume is specified, this will be ignored and use rootVolume directly.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageUUID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The uuid of the image to use for your server instance.
+if it&rsquo;s empty, Image name will be used</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+If not specified a default port will be added for the default cluster network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The floatingIP which will be associated to the machine, only used for master.
+The floatingIP should have been created and haven&rsquo;t been associated.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroupFilter">
+[]SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+map[string]string
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalBlockDevices</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.AdditionalBlockDevice">
+[]AdditionalBlockDevice
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AdditionalBlockDevices is a list of specifications for additional block devices to attach to the server instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The server group to assign the machine to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster.
+If not specified, the identity ref of the cluster will be used instead.</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplateSpec">OpenStackMachineTemplateSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplate">OpenStackMachineTemplate</a>)
+</p>
+<p>
+<p>OpenStackMachineTemplateSpec defines the desired state of OpenStackMachineTemplate.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineTemplateResource">
+OpenStackMachineTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">PortOpts
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>Network is a query for an openstack network that the port will be created or discovered on.
+This will fail if the query returns more than one network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nameSuffix</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Used to make the name of the port unique. If unspecified, instead the 0-based index of the port in the list is used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>adminStateUp</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>macAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>fixedIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.FixedIP">
+[]FixedIP
+</a>
+</em>
+</td>
+<td>
+<p>Specify pairs of subnet and/or IP address. These should be subnets of the network with the given NetworkID.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroupFilters</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroupFilter">
+[]SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>The names, uuids, filters or any combination these of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedAddressPairs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.AddressPair">
+[]AddressPair
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Enables and disables trunk at port level. If not provided, openStackMachine.Spec.Trunk is inherited.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>hostId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ID of the host where the port is allocated</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>vnicType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The virtual network interface card (vNIC) type that is bound to the neutron port.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>profile</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.BindingProfile">
+BindingProfile
+</a>
+</em>
+</td>
+<td>
+<p>Profile is a set of key-value pairs that are used for binding details.
+We intentionally don&rsquo;t expose this as a map[string]string because we only want to enable
+the users to set the values of the keys that are known to work in OpenStack Networking API.
+See <a href="https://docs.openstack.org/api-ref/network/v2/index.html?expanded=create-port-detail#create-port">https://docs.openstack.org/api-ref/network/v2/index.html?expanded=create-port-detail#create-port</a></p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity enables or disables the port security when set.
+When not set, it takes the value of the corresponding field at the network level.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>propagateUplinkStatus</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>PropageteUplinkStatus enables or disables the propagate uplink status on the port.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags applied to the port (and corresponding trunk, if a trunk is configured.)
+These tags are applied in addition to the instance&rsquo;s tags, which will also be applied to the port.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>valueSpecs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.ValueSpec">
+[]ValueSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Value specs are extra parameters to include in the API request with OpenStack.
+This is an extension point for the API, so what they do and if they are supported,
+depends on the specific OpenStack implementation.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.RootVolume">RootVolume
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>diskSize</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>volumeType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>availabilityZone</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.Router">Router
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>Router represents basic information about the associated OpenStack Neutron Router.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>ips</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.RouterFilter">RouterFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroup">SecurityGroup
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>SecurityGroup represents the basic information of the associated
+OpenStack Neutron Security Group.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>rules</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroupRule">
+[]SecurityGroupRule
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroupFilter">SecurityGroupFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackMachineSpec">OpenStackMachineSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroupRule">SecurityGroupRule
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.SecurityGroup">SecurityGroup</a>)
+</p>
+<p>
+<p>SecurityGroupRule represent the basic information of the associated OpenStack
+Security Group Role.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>direction</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>etherType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>portRangeMin</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>portRangeMax</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>protocol</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteIPPrefix</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.Subnet">Subnet
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.NetworkStatusWithSubnets">NetworkStatusWithSubnets</a>)
+</p>
+<p>
+<p>Subnet represents basic information about the associated OpenStack Neutron Subnet.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>cidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.SubnetFilter">SubnetFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.ExternalRouterIPParam">ExternalRouterIPParam</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.FixedIP">FixedIP</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipVersion</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>gateway_ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>cidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipv6AddressMode</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipv6RaMode</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha7.ValueSpec">ValueSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha7.PortOpts">PortOpts</a>)
+</p>
+<p>
+<p>ValueSpec represents a single value_spec key-value pair.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name is the name of the key-value pair.
+This is just for identifying the pair and will not be sent to the OpenStack API.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>key</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Key is the key in the key-value pair.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>value</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Value is the value in the key-value pair.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<hr/>
+<p><em>
+Generated with <code>gen-crd-api-reference-docs</code>.
+</em></p>
diff --git a/docs/book/src/api/v1alpha8/api.md b/docs/book/src/api/v1alpha8/api.md
new file mode 100644
index 0000000000..b6ef68b3fb
--- /dev/null
+++ b/docs/book/src/api/v1alpha8/api.md
@@ -0,0 +1,4661 @@
+<h2 id="infrastructure.cluster.x-k8s.io/v1alpha8">infrastructure.cluster.x-k8s.io/v1alpha8</h2>
+<p>
+<p>package v1alpha8 contains API Schema definitions for the infrastructure v1alpha8 API group</p>
+</p>
+Resource Types:
+<ul><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackCluster">OpenStackCluster</a>
+</li><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplate">OpenStackClusterTemplate</a>
+</li><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachine">OpenStackMachine</a>
+</li><li>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplate">OpenStackMachineTemplate</a>
+</li></ul>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackCluster">OpenStackCluster
+</h3>
+<p>
+<p>OpenStackCluster is the Schema for the openstackclusters API.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha8
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackCluster</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">
+OpenStackClusterSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSubnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SubnetSpec">
+[]SubnetSpec
+</a>
+</em>
+</td>
+<td>
+<p>ManagedSubnets describe OpenStack Subnets to be created. Cluster actuator will create a network,
+subnets with the defined CIDR, and a router connected to these subnets. Currently only one IPv4
+subnet is supported. If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.RouterFilter">
+RouterFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Router specifies an existing router to be used if ManagedSubnets are
+specified. If specified, no new router will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>Network specifies an existing network to use if no ManagedSubnets
+are specified.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SubnetFilter">
+[]SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Subnets specifies existing subnets to use if not ManagedSubnets are
+specified. All subnets must be in the network specified by Network.
+There can be zero, one, or two subnets. If no subnets are specified,
+all subnets in Network will be used. If 2 subnets are specified, one
+must be IPv4 and the other IPv6.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMtu</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>NetworkMTU sets the maximum transmission unit (MTU) value to address fragmentation for the private network ID.
+This value will be used only if the Cluster actuator creates the network.
+If left empty, the network will have the default MTU defined in Openstack network service.
+To use this field, the Openstack installation requires the net-mtu neutron API extension.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetwork</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetwork is the OpenStack Network to be used to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableExternalNetwork</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableExternalNetwork determines whether or not to attempt to connect the cluster
+to an external network. This allows for the creation of clusters when connecting
+to an external network is not possible or desirable, e.g. if using a provider network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ManagedSecurityGroups">
+ManagedSecurityGroups
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, and the
+Kubernetes API server to function correctly.
+It&rsquo;s possible to add additional rules to the managed security groups.
+When defined to an empty struct, the managed security groups will be created with the default rules.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. To make changes, it&rsquo;s required
+to first set <code>enabled: false</code> which will remove the bastion and then changes can be made.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td>
+<code>status</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterStatus">
+OpenStackClusterStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplate">OpenStackClusterTemplate
+</h3>
+<p>
+<p>OpenStackClusterTemplate is the Schema for the openstackclustertemplates API.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha8
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackClusterTemplate</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplateSpec">
+OpenStackClusterTemplateSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplateResource">
+OpenStackClusterTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachine">OpenStackMachine
+</h3>
+<p>
+<p>OpenStackMachine is the Schema for the openstackmachines API.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha8
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackMachine</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ImageFilter">
+ImageFilter
+</a>
+</em>
+</td>
+<td>
+<p>The image to use for your server instance.
+If the rootVolume is specified, this will be used when creating the root volume.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+If not specified a default port will be added for the default cluster network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupFilter">
+[]SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ServerMetadata">
+[]ServerMetadata
+</a>
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalBlockDevices</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.AdditionalBlockDevice">
+[]AdditionalBlockDevice
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AdditionalBlockDevices is a list of specifications for additional block devices to attach to the server instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ServerGroupFilter">
+ServerGroupFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The server group to assign the machine to.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td>
+<code>status</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineStatus">
+OpenStackMachineStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplate">OpenStackMachineTemplate
+</h3>
+<p>
+<p>OpenStackMachineTemplate is the Schema for the openstackmachinetemplates API.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>apiVersion</code><br/>
+string</td>
+<td>
+<code>
+infrastructure.cluster.x-k8s.io/v1alpha8
+</code>
+</td>
+</tr>
+<tr>
+<td>
+<code>kind</code><br/>
+string
+</td>
+<td><code>OpenStackMachineTemplate</code></td>
+</tr>
+<tr>
+<td>
+<code>metadata</code><br/>
+<em>
+Kubernetes meta/v1.ObjectMeta
+</em>
+</td>
+<td>
+Refer to the Kubernetes API documentation for the fields of the
+<code>metadata</code> field.
+</td>
+</tr>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplateSpec">
+OpenStackMachineTemplateSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplateResource">
+OpenStackMachineTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.APIServerLoadBalancer">APIServerLoadBalancer
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>enabled</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Enabled defines whether a load balancer should be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalPorts</code><br/>
+<em>
+[]int
+</em>
+</td>
+<td>
+<p>AdditionalPorts adds additional tcp ports to the load balancer.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedCidrs</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>AllowedCIDRs restrict access to all API-Server listeners to the given address CIDRs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>provider</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Octavia Provider Used to create load balancer</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.AdditionalBlockDevice">AdditionalBlockDevice
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+<p>AdditionalBlockDevice is a block device to attach to the server.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name of the block device in the context of a machine.
+If the block device is a volume, the Cinder volume will be named
+as a combination of the machine name and this name.
+Also, this name will be used for tagging the block device.
+Information about the block device tag can be obtained from the OpenStack
+metadata API or the config drive.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sizeGiB</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>SizeGiB is the size of the block device in gibibytes (GiB).</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>storage</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BlockDeviceStorage">
+BlockDeviceStorage
+</a>
+</em>
+</td>
+<td>
+<p>Storage specifies the storage type of the block device and
+additional storage options.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.AddressPair">AddressPair
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ipAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>macAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.Bastion">Bastion
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+<p>Bastion represents basic information about the bastion node.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>enabled</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>instance</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<p>Instance for the bastion itself</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>availabilityZone</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FloatingIP which will be associated to the bastion machine.
+The floating IP should already exist and should not be associated with a port.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.BastionStatus">BastionStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>state</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.InstanceState">
+InstanceState
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>floatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>referencedResources</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ReferencedMachineResources">
+ReferencedMachineResources
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.BindingProfile">BindingProfile
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ovsHWOffload</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>OVSHWOffload enables or disables the OVS hardware offload feature.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trustedVF</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>TrustedVF enables or disables the “trusted mode” for the VF.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.BlockDeviceStorage">BlockDeviceStorage
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.AdditionalBlockDevice">AdditionalBlockDevice</a>)
+</p>
+<p>
+<p>BlockDeviceStorage is the storage type of a block device to create and
+contains additional storage options.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>type</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BlockDeviceType">
+BlockDeviceType
+</a>
+</em>
+</td>
+<td>
+<p>Type is the type of block device to create.
+This can be either &ldquo;Volume&rdquo; or &ldquo;Local&rdquo;.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>volume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BlockDeviceVolume">
+BlockDeviceVolume
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Volume contains additional storage options for a volume block device.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.BlockDeviceType">BlockDeviceType
+(<code>string</code> alias)</p></h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BlockDeviceStorage">BlockDeviceStorage</a>)
+</p>
+<p>
+<p>BlockDeviceType defines the type of block device to create.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Value</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody><tr><td><p>&#34;Local&#34;</p></td>
+<td><p>LocalBlockDevice is an ephemeral block device attached to the server.</p>
+</td>
+</tr><tr><td><p>&#34;Volume&#34;</p></td>
+<td><p>VolumeBlockDevice is a volume block device attached to the server.</p>
+</td>
+</tr></tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.BlockDeviceVolume">BlockDeviceVolume
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BlockDeviceStorage">BlockDeviceStorage</a>)
+</p>
+<p>
+<p>BlockDeviceVolume contains additional storage options for a volume block device.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>type</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Type is the Cinder volume type of the volume.
+If omitted, the default Cinder volume type that is configured in the OpenStack cloud
+will be used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>availabilityZone</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AvailabilityZone is the volume availability zone to create the volume in.
+If omitted, the availability zone of the server will be used.
+The availability zone must NOT contain spaces otherwise it will lead to volume that belongs
+to this availability zone register failure, see kubernetes/cloud-provider-openstack#1379 for
+further information.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.ExternalRouterIPParam">ExternalRouterIPParam
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>fixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The FixedIP in the corresponding subnet</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>The subnet in which the FixedIP is used for the Gateway of this router</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.FixedIP">FixedIP
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>subnet</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SubnetFilter">
+SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<p>Subnet is an openstack subnet query that will return the id of a subnet to create
+the fixed IP of a port in. This query must not return more than one subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.ImageFilter">ImageFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ID of the desired image. If this is provided, the other filters will be ignored.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The name of the desired image. If specified, the combination of name and tags must return a single matching image or an error will be raised.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>The tags associated with the desired image. If specified, the combination of name and tags must return a single matching image or an error will be raised.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.InstanceState">InstanceState
+(<code>string</code> alias)</p></h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BastionStatus">BastionStatus</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineStatus">OpenStackMachineStatus</a>)
+</p>
+<p>
+<p>InstanceState describes the state of an OpenStack instance.</p>
+</p>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.LoadBalancer">LoadBalancer
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>LoadBalancer represents basic information about the associated OpenStack LoadBalancer.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>internalIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedCIDRs</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.ManagedSecurityGroupName">ManagedSecurityGroupName
+(<code>string</code> alias)</p></h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupRuleSpec">SecurityGroupRuleSpec</a>)
+</p>
+<p>
+</p>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.ManagedSecurityGroups">ManagedSecurityGroups
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+<p>ManagedSecurityGroups defines the desired state of security groups and rules for the cluster.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>allNodesSecurityGroupRules</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupRuleSpec">
+[]SecurityGroupRuleSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>allNodesSecurityGroupRules defines the rules that should be applied to all nodes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowAllInClusterTraffic</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>AllowAllInClusterTraffic allows all ingress and egress traffic between cluster nodes when set to true.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.NetworkFilter">NetworkFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.NetworkStatus">NetworkStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkStatusWithSubnets">NetworkStatusWithSubnets</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>NetworkStatus contains basic information about an existing neutron network.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.NetworkStatusWithSubnets">NetworkStatusWithSubnets
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>NetworkStatusWithSubnets represents basic information about an existing neutron network and an associated set of subnets.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>NetworkStatus</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkStatus">
+NetworkStatus
+</a>
+</em>
+</td>
+<td>
+<p>
+(Members of <code>NetworkStatus</code> are embedded into this type.)
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.Subnet">
+[]Subnet
+</a>
+</em>
+</td>
+<td>
+<p>Subnets is a list of subnets associated with the default cluster network. Machines which use the default cluster network will get an address from all of these subnets.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackCluster">OpenStackCluster</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplateResource">OpenStackClusterTemplateResource</a>)
+</p>
+<p>
+<p>OpenStackClusterSpec defines the desired state of OpenStackCluster.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSubnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SubnetSpec">
+[]SubnetSpec
+</a>
+</em>
+</td>
+<td>
+<p>ManagedSubnets describe OpenStack Subnets to be created. Cluster actuator will create a network,
+subnets with the defined CIDR, and a router connected to these subnets. Currently only one IPv4
+subnet is supported. If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.RouterFilter">
+RouterFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Router specifies an existing router to be used if ManagedSubnets are
+specified. If specified, no new router will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>Network specifies an existing network to use if no ManagedSubnets
+are specified.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SubnetFilter">
+[]SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Subnets specifies existing subnets to use if not ManagedSubnets are
+specified. All subnets must be in the network specified by Network.
+There can be zero, one, or two subnets. If no subnets are specified,
+all subnets in Network will be used. If 2 subnets are specified, one
+must be IPv4 and the other IPv6.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMtu</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>NetworkMTU sets the maximum transmission unit (MTU) value to address fragmentation for the private network ID.
+This value will be used only if the Cluster actuator creates the network.
+If left empty, the network will have the default MTU defined in Openstack network service.
+To use this field, the Openstack installation requires the net-mtu neutron API extension.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetwork</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetwork is the OpenStack Network to be used to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableExternalNetwork</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableExternalNetwork determines whether or not to attempt to connect the cluster
+to an external network. This allows for the creation of clusters when connecting
+to an external network is not possible or desirable, e.g. if using a provider network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ManagedSecurityGroups">
+ManagedSecurityGroups
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, and the
+Kubernetes API server to function correctly.
+It&rsquo;s possible to add additional rules to the managed security groups.
+When defined to an empty struct, the managed security groups will be created with the default rules.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. To make changes, it&rsquo;s required
+to first set <code>enabled: false</code> which will remove the bastion and then changes can be made.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterStatus">OpenStackClusterStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackCluster">OpenStackCluster</a>)
+</p>
+<p>
+<p>OpenStackClusterStatus defines the observed state of OpenStackCluster.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ready</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Ready is true when the cluster infrastructure is ready.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkStatusWithSubnets">
+NetworkStatusWithSubnets
+</a>
+</em>
+</td>
+<td>
+<p>Network contains information about the created OpenStack Network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetwork</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkStatus">
+NetworkStatus
+</a>
+</em>
+</td>
+<td>
+<p>externalNetwork contains information about the external network used for default ingress and egress traffic.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.Router">
+Router
+</a>
+</em>
+</td>
+<td>
+<p>Router describes the default cluster router</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.LoadBalancer">
+LoadBalancer
+</a>
+</em>
+</td>
+<td>
+<p>APIServerLoadBalancer describes the api server load balancer if one exists</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureDomains</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.FailureDomains
+</a>
+</em>
+</td>
+<td>
+<p>FailureDomains represent OpenStack availability zones</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupStatus">
+SecurityGroupStatus
+</a>
+</em>
+</td>
+<td>
+<p>ControlPlaneSecurityGroups contains all the information about the OpenStack
+Security Group that needs to be applied to control plane nodes.
+TODO: Maybe instead of two properties, we add a property to the group?</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>workerSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupStatus">
+SecurityGroupStatus
+</a>
+</em>
+</td>
+<td>
+<p>WorkerSecurityGroup contains all the information about the OpenStack Security
+Group that needs to be applied to worker nodes.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastionSecurityGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupStatus">
+SecurityGroupStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BastionStatus">
+BastionStatus
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureReason</code><br/>
+<em>
+<a href="https://pkg.go.dev/sigs.k8s.io/cluster-api@v1.5.1/errors#ClusterStatusError">
+sigs.k8s.io/cluster-api/errors.ClusterStatusError
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureReason will be set in the event that there is a terminal problem
+reconciling the OpenStackCluster and will contain a succinct value suitable
+for machine interpretation.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the OpenStackCluster&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of
+OpenStackClusters can be added as events to the OpenStackCluster object
+and/or logged in the controller&rsquo;s output.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureMessage</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureMessage will be set in the event that there is a terminal problem
+reconciling the OpenStackCluster and will contain a more verbose string suitable
+for logging and human consumption.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the OpenStackCluster&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of
+OpenStackClusters can be added as events to the OpenStackCluster object
+and/or logged in the controller&rsquo;s output.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplateResource">OpenStackClusterTemplateResource
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplateSpec">OpenStackClusterTemplateSpec</a>)
+</p>
+<p>
+<p>OpenStackClusterTemplateResource describes the data needed to create a OpenStackCluster from a template.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">
+OpenStackClusterSpec
+</a>
+</em>
+</td>
+<td>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSubnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SubnetSpec">
+[]SubnetSpec
+</a>
+</em>
+</td>
+<td>
+<p>ManagedSubnets describe OpenStack Subnets to be created. Cluster actuator will create a network,
+subnets with the defined CIDR, and a router connected to these subnets. Currently only one IPv4
+subnet is supported. If you leave this empty, no network will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>router</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.RouterFilter">
+RouterFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Router specifies an existing router to be used if ManagedSubnets are
+specified. If specified, no new router will be created.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>Network specifies an existing network to use if no ManagedSubnets
+are specified.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>subnets</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SubnetFilter">
+[]SubnetFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Subnets specifies existing subnets to use if not ManagedSubnets are
+specified. All subnets must be in the network specified by Network.
+There can be zero, one, or two subnets. If no subnets are specified,
+all subnets in Network will be used. If 2 subnets are specified, one
+must be IPv4 and the other IPv6.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>networkMtu</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>NetworkMTU sets the maximum transmission unit (MTU) value to address fragmentation for the private network ID.
+This value will be used only if the Cluster actuator creates the network.
+If left empty, the network will have the default MTU defined in Openstack network service.
+To use this field, the Openstack installation requires the net-mtu neutron API extension.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalRouterIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ExternalRouterIPParam">
+[]ExternalRouterIPParam
+</a>
+</em>
+</td>
+<td>
+<p>ExternalRouterIPs is an array of externalIPs on the respective subnets.
+This is necessary if the router needs a fixed ip in a specific subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>externalNetwork</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ExternalNetwork is the OpenStack Network to be used to get public internet to the VMs.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableExternalNetwork</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableExternalNetwork determines whether or not to attempt to connect the cluster
+to an external network. This allows for the creation of clusters when connecting
+to an external network is not possible or desirable, e.g. if using a provider network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerLoadBalancer</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.APIServerLoadBalancer">
+APIServerLoadBalancer
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>APIServerLoadBalancer configures the optional LoadBalancer for the APIServer.
+It must be activated by setting <code>enabled: true</code>.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disableAPIServerFloatingIP</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>DisableAPIServerFloatingIP determines whether or not to attempt to attach a floating
+IP to the API server. This allows for the creation of clusters when attaching a floating
+IP to the API server (and hence, in many cases, exposing the API server to the internet)
+is not possible or desirable, e.g. if using a shared VLAN for communication between
+management and workload clusters or when the management cluster is inside the
+project network.
+This option requires that the API server use a VIP on the cluster network so that the
+underlying machines can change without changing ControlPlaneEndpoint.Host.
+When using a managed load balancer, this VIP will be managed automatically.
+If not using a managed load balancer, cluster configuration will fail without additional
+configuration to manage the VIP on the control plane machines, which falls outside of
+the scope of this controller.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFloatingIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFloatingIP is the floatingIP which will be associated with the API server.
+The floatingIP will be created if it does not already exist.
+If not specified, a new floatingIP is allocated.
+This field is not used if DisableAPIServerFloatingIP is set to true.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerFixedIP</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>APIServerFixedIP is the fixed IP which will be associated with the API server.
+In the case where the API server has a floating IP but not a managed load balancer,
+this field is not used.
+If a managed load balancer is used and this field is not specified, a fixed IP will
+be dynamically allocated for the load balancer.
+If a managed load balancer is not used AND the API server floating IP is disabled,
+this field MUST be specified and should correspond to a pre-allocated port that
+holds the fixed IP to be used as a VIP.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>apiServerPort</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<p>APIServerPort is the port on which the listener on the APIServer
+will be created</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>managedSecurityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ManagedSecurityGroups">
+ManagedSecurityGroups
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ManagedSecurityGroups determines whether OpenStack security groups for the cluster
+will be managed by the OpenStack provider or whether pre-existing security groups will
+be specified as part of the configuration.
+By default, the managed security groups have rules that allow the Kubelet, etcd, and the
+Kubernetes API server to function correctly.
+It&rsquo;s possible to add additional rules to the managed security groups.
+When defined to an empty struct, the managed security groups will be created with the default rules.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity disables the port security of the network created for the
+Kubernetes cluster, which also disables SecurityGroups</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags for all resources in cluster</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneEndpoint</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.APIEndpoint
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ControlPlaneEndpoint represents the endpoint used to communicate with the control plane.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneAvailabilityZones</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>ControlPlaneAvailabilityZones is the az to deploy control plane to</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>controlPlaneOmitAvailabilityZone</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Indicates whether to omit the az for control plane nodes, allowing the Nova scheduler
+to make a decision on which az to use based on other scheduling constraints</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>bastion</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.Bastion">
+Bastion
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Bastion is the OpenStack instance to login the nodes</p>
+<p>As a rolling update is not ideal during a bastion host session, we
+prevent changes to a running bastion configuration. To make changes, it&rsquo;s required
+to first set <code>enabled: false</code> which will remove the bastion and then changes can be made.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplateSpec">OpenStackClusterTemplateSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplate">OpenStackClusterTemplate</a>)
+</p>
+<p>
+<p>OpenStackClusterTemplateSpec defines the desired state of OpenStackClusterTemplate.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterTemplateResource">
+OpenStackClusterTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackIdentityReference">OpenStackIdentityReference
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+<p>OpenStackIdentityReference is a reference to an infrastructure
+provider identity to be used to provision cluster resources.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>kind</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Kind of the identity. Must be supported by the infrastructure
+provider and may be either cluster or namespace-scoped.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name of the infrastructure identity to be used.
+Must be either a cluster-scoped resource, or namespaced-scoped
+resource the same namespace as the resource(s) being provisioned.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachine">OpenStackMachine</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.Bastion">Bastion</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplateResource">OpenStackMachineTemplateResource</a>)
+</p>
+<p>
+<p>OpenStackMachineSpec defines the desired state of OpenStackMachine.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ImageFilter">
+ImageFilter
+</a>
+</em>
+</td>
+<td>
+<p>The image to use for your server instance.
+If the rootVolume is specified, this will be used when creating the root volume.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+If not specified a default port will be added for the default cluster network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupFilter">
+[]SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ServerMetadata">
+[]ServerMetadata
+</a>
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalBlockDevices</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.AdditionalBlockDevice">
+[]AdditionalBlockDevice
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AdditionalBlockDevices is a list of specifications for additional block devices to attach to the server instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ServerGroupFilter">
+ServerGroupFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The server group to assign the machine to.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineStatus">OpenStackMachineStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachine">OpenStackMachine</a>)
+</p>
+<p>
+<p>OpenStackMachineStatus defines the observed state of OpenStackMachine.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>ready</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Ready is true when the provider resource is ready.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>addresses</code><br/>
+<em>
+[]Kubernetes core/v1.NodeAddress
+</em>
+</td>
+<td>
+<p>Addresses contains the OpenStack instance associated addresses.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceState</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.InstanceState">
+InstanceState
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>InstanceState is the state of the OpenStack instance for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>referencedResources</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ReferencedMachineResources">
+ReferencedMachineResources
+</a>
+</em>
+</td>
+<td>
+<p>ReferencedResources contains resolved references to resources that the machine depends on.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureReason</code><br/>
+<em>
+<a href="https://pkg.go.dev/sigs.k8s.io/cluster-api@v1.5.1/errors#MachineStatusError">
+sigs.k8s.io/cluster-api/errors.MachineStatusError
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>failureMessage</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>FailureMessage will be set in the event that there is a terminal problem
+reconciling the Machine and will contain a more verbose string suitable
+for logging and human consumption.</p>
+<p>This field should not be set for transitive errors that a controller
+faces that are expected to be fixed automatically over
+time (like service outages), but instead indicate that something is
+fundamentally wrong with the Machine&rsquo;s spec or the configuration of
+the controller, and that manual intervention is required. Examples
+of terminal errors would be invalid combinations of settings in the
+spec, values that are unsupported by the controller, or the
+responsible controller itself being critically misconfigured.</p>
+<p>Any transient errors that occur during the reconciliation of Machines
+can be added as events to the Machine object and/or logged in the
+controller&rsquo;s output.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>conditions</code><br/>
+<em>
+<a href="https://doc.crds.dev/github.com/kubernetes-sigs/cluster-api@v1.5.1">
+sigs.k8s.io/cluster-api/api/v1beta1.Conditions
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplateResource">OpenStackMachineTemplateResource
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplateSpec">OpenStackMachineTemplateSpec</a>)
+</p>
+<p>
+<p>OpenStackMachineTemplateResource describes the data needed to create a OpenStackMachine from a template.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>spec</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">
+OpenStackMachineSpec
+</a>
+</em>
+</td>
+<td>
+<p>Spec is the specification of the desired behavior of the machine.</p>
+<br/>
+<br/>
+<table>
+<tr>
+<td>
+<code>providerID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>ProviderID is the unique identifier as specified by the cloud provider.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>instanceID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>InstanceID is the OpenStack instance ID for this machine.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>cloudName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The name of the cloud to use from the clouds secret</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>flavor</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The flavor reference for the flavor for your server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>image</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ImageFilter">
+ImageFilter
+</a>
+</em>
+</td>
+<td>
+<p>The image to use for your server instance.
+If the rootVolume is specified, this will be used when creating the root volume.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>sshKeyName</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ssh key to inject in the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>ports</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">
+[]PortOpts
+</a>
+</em>
+</td>
+<td>
+<p>Ports to be attached to the server instance. They are created if a port with the given name does not already exist.
+If not specified a default port will be added for the default cluster network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupFilter">
+[]SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>The names of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Whether the server instance is created on a trunk port or not.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Machine tags
+Requires Nova api 2.52 minimum!</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverMetadata</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ServerMetadata">
+[]ServerMetadata
+</a>
+</em>
+</td>
+<td>
+<p>Metadata mapping. Allows you to create a map of key value pairs to add to the server instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>configDrive</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Config Drive support</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rootVolume</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.RootVolume">
+RootVolume
+</a>
+</em>
+</td>
+<td>
+<p>The volume metadata to boot from</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>additionalBlockDevices</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.AdditionalBlockDevice">
+[]AdditionalBlockDevice
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>AdditionalBlockDevices is a list of specifications for additional block devices to attach to the server instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>serverGroup</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ServerGroupFilter">
+ServerGroupFilter
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>The server group to assign the machine to.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>identityRef</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackIdentityReference">
+OpenStackIdentityReference
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>IdentityRef is a reference to a identity to be used when reconciling this cluster</p>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplateSpec">OpenStackMachineTemplateSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplate">OpenStackMachineTemplate</a>)
+</p>
+<p>
+<p>OpenStackMachineTemplateSpec defines the desired state of OpenStackMachineTemplate.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>template</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplateResource">
+OpenStackMachineTemplateResource
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineTemplateWebhook">OpenStackMachineTemplateWebhook
+</h3>
+<p>
+</p>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">PortOpts
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>network</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkFilter">
+NetworkFilter
+</a>
+</em>
+</td>
+<td>
+<p>Network is a query for an openstack network that the port will be created or discovered on.
+This will fail if the query returns more than one network.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>nameSuffix</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Used to make the name of the port unique. If unspecified, instead the 0-based index of the port in the list is used.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>adminStateUp</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>macAddress</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>fixedIPs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.FixedIP">
+[]FixedIP
+</a>
+</em>
+</td>
+<td>
+<p>Specify pairs of subnet and/or IP address. These should be subnets of the network with the given NetworkID.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>securityGroupFilters</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupFilter">
+[]SecurityGroupFilter
+</a>
+</em>
+</td>
+<td>
+<p>The names, uuids, filters or any combination these of the security groups to assign to the instance</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>allowedAddressPairs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.AddressPair">
+[]AddressPair
+</a>
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>trunk</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>Enables and disables trunk at port level. If not provided, openStackMachine.Spec.Trunk is inherited.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>hostId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The ID of the host where the port is allocated</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>vnicType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>The virtual network interface card (vNIC) type that is bound to the neutron port.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>profile</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BindingProfile">
+BindingProfile
+</a>
+</em>
+</td>
+<td>
+<p>Profile is a set of key-value pairs that are used for binding details.
+We intentionally don&rsquo;t expose this as a map[string]string because we only want to enable
+the users to set the values of the keys that are known to work in OpenStack Networking API.
+See <a href="https://docs.openstack.org/api-ref/network/v2/index.html?expanded=create-port-detail#create-port">https://docs.openstack.org/api-ref/network/v2/index.html?expanded=create-port-detail#create-port</a></p>
+</td>
+</tr>
+<tr>
+<td>
+<code>disablePortSecurity</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>DisablePortSecurity enables or disables the port security when set.
+When not set, it takes the value of the corresponding field at the network level.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>propagateUplinkStatus</code><br/>
+<em>
+bool
+</em>
+</td>
+<td>
+<p>PropageteUplinkStatus enables or disables the propagate uplink status on the port.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>Tags applied to the port (and corresponding trunk, if a trunk is configured.)
+These tags are applied in addition to the instance&rsquo;s tags, which will also be applied to the port.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>valueSpecs</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ValueSpec">
+[]ValueSpec
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>Value specs are extra parameters to include in the API request with OpenStack.
+This is an extension point for the API, so what they do and if they are supported,
+depends on the specific OpenStack implementation.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.ReferencedMachineResources">ReferencedMachineResources
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.BastionStatus">BastionStatus</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineStatus">OpenStackMachineStatus</a>)
+</p>
+<p>
+<p>ReferencedMachineResources contains resolved references to resources required by the machine.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>serverGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ServerGroupID is the ID of the server group the machine should be added to and is calculated based on ServerGroupFilter.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>imageID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>ImageID is the ID of the image to use for the machine and is calculated based on ImageFilter.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.RootVolume">RootVolume
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>diskSize</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>volumeType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>availabilityZone</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.Router">Router
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>Router represents basic information about the associated OpenStack Neutron Router.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+<tr>
+<td>
+<code>ips</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.RouterFilter">RouterFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupFilter">SecurityGroupFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">PortOpts</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupRuleSpec">SecurityGroupRuleSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ManagedSecurityGroups">ManagedSecurityGroups</a>)
+</p>
+<p>
+<p>SecurityGroupRuleSpec represent the basic information of the associated OpenStack
+Security Group Role.
+For now this is only used for the allNodesSecurityGroupRules but when we add
+other security groups, we&rsquo;ll need to add a validation because
+Remote* fields are mutually exclusive.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>name of the security group rule.
+It&rsquo;s used to identify the rule so it can be patched and will not be sent to the OpenStack API.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>description of the security group rule.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>direction</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>direction in which the security group rule is applied. The only values
+allowed are &ldquo;ingress&rdquo; or &ldquo;egress&rdquo;. For a compute instance, an ingress
+security group rule is applied to incoming (ingress) traffic for that
+instance. An egress rule is applied to traffic leaving the instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>etherType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>etherType must be IPv4 or IPv6, and addresses represented in CIDR must match the
+ingress or egress rules.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>portRangeMin</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>portRangeMin is a number in the range that is matched by the security group
+rule. If the protocol is TCP or UDP, this value must be less than or equal
+to the value of the portRangeMax attribute.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>portRangeMax</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>portRangeMax is a number in the range that is matched by the security group
+rule. The portRangeMin attribute constrains the portRangeMax attribute.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>protocol</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>protocol is the protocol that is matched by the security group rule.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>remoteGroupID is the remote group ID to be associated with this security group rule.
+You can specify either remoteGroupID or remoteIPPrefix or remoteManagedGroups.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteIPPrefix</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>remoteIPPrefix is the remote IP prefix to be associated with this security group rule.
+You can specify either remoteGroupID or remoteIPPrefix or remoteManagedGroups.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteManagedGroups</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ManagedSecurityGroupName">
+[]ManagedSecurityGroupName
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>remoteManagedGroups is the remote managed groups to be associated with this security group rule.
+You can specify either remoteGroupID or remoteIPPrefix or remoteManagedGroups.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupRuleStatus">SecurityGroupRuleStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupStatus">SecurityGroupStatus</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>id of the security group rule</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>description of the security group rule.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>direction</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>direction in which the security group rule is applied. The only values
+allowed are &ldquo;ingress&rdquo; or &ldquo;egress&rdquo;. For a compute instance, an ingress
+security group rule is applied to incoming (ingress) traffic for that
+instance. An egress rule is applied to traffic leaving the instance.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>etherType</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>etherType must be IPv4 or IPv6, and addresses represented in CIDR must match the
+ingress or egress rules.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>portRangeMin</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>portRangeMin is a number in the range that is matched by the security group
+rule. If the protocol is TCP or UDP, this value must be less than or equal
+to the value of the portRangeMax attribute.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>portRangeMax</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>portRangeMax is a number in the range that is matched by the security group
+rule. The portRangeMin attribute constrains the portRangeMax attribute.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>protocol</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>protocol is the protocol that is matched by the security group rule.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteGroupID</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>remoteGroupID is the remote group ID to be associated with this security group rule.
+You can specify either remoteGroupID or remoteIPPrefix or remoteManagedGroups.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>remoteIPPrefix</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>remoteIPPrefix is the remote IP prefix to be associated with this security group rule.
+You can specify either remoteGroupID or remoteIPPrefix or remoteManagedGroups.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupStatus">SecurityGroupStatus
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterStatus">OpenStackClusterStatus</a>)
+</p>
+<p>
+<p>SecurityGroupStatus represents the basic information of the associated
+OpenStack Neutron Security Group.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>name of the security group</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>id of the security group</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>rules</code><br/>
+<em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.SecurityGroupRuleStatus">
+[]SecurityGroupRuleStatus
+</a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>list of security group rules</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.ServerGroupFilter">ServerGroupFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.ServerMetadata">ServerMetadata
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackMachineSpec">OpenStackMachineSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>key</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Key is the server metadata key
+kubebuilder:validation:MaxLength:=255</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>value</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Value is the server metadata value
+kubebuilder:validation:MaxLength:=255</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.Subnet">Subnet
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.NetworkStatusWithSubnets">NetworkStatusWithSubnets</a>)
+</p>
+<p>
+<p>Subnet represents basic information about the associated OpenStack Neutron Subnet.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>cidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.SubnetFilter">SubnetFilter
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.ExternalRouterIPParam">ExternalRouterIPParam</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.FixedIP">FixedIP</a>, 
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>description</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>projectId</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipVersion</code><br/>
+<em>
+int
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>gateway_ip</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>cidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipv6AddressMode</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>ipv6RaMode</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>id</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>tagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTags</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>
+<code>notTagsAny</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.SubnetSpec">SubnetSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.OpenStackClusterSpec">OpenStackClusterSpec</a>)
+</p>
+<p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>cidr</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>CIDR is representing the IP address range used to create the subnet, e.g. 10.0.0.0/24.
+This field is required when defining a subnet.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>dnsNameservers</code><br/>
+<em>
+[]string
+</em>
+</td>
+<td>
+<p>DNSNameservers holds a list of DNS server addresses that will be provided when creating
+the subnet. These addresses need to have the same IP version as CIDR.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<h3 id="infrastructure.cluster.x-k8s.io/v1alpha8.ValueSpec">ValueSpec
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#infrastructure.cluster.x-k8s.io/v1alpha8.PortOpts">PortOpts</a>)
+</p>
+<p>
+<p>ValueSpec represents a single value_spec key-value pair.</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>Field</th>
+<th>Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>name</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Name is the name of the key-value pair.
+This is just for identifying the pair and will not be sent to the OpenStack API.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>key</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Key is the key in the key-value pair.</p>
+</td>
+</tr>
+<tr>
+<td>
+<code>value</code><br/>
+<em>
+string
+</em>
+</td>
+<td>
+<p>Value is the value in the key-value pair.</p>
+</td>
+</tr>
+</tbody>
+</table>
+<hr/>
+<p><em>
+Generated with <code>gen-crd-api-reference-docs</code>.
+</em></p>
diff --git a/hack/tools/Makefile b/hack/tools/Makefile
index 60f45a9955..f39cfadfd6 100644
--- a/hack/tools/Makefile
+++ b/hack/tools/Makefile
@@ -142,6 +142,10 @@ $(PLANTUML): plantuml.Dockerfile ../../versions.mk | $(BIN_DIR)
 	docker build --build-arg PLANTUML_VERSION=$(PLANTUML_VERSION)  . -f plantuml.Dockerfile -t "plantuml-builder"
 	touch $@
 
+GEN_CRD_API_REFERENCE_DOCS := $(BIN_DIR)/gen-crd-api-reference-docs
+$(GEN_CRD_API_REFERENCE_DOCS): 
+	go build -tags tools -o $@ github.com/ahmetb/gen-crd-api-reference-docs
+
 .PHONY: clean
 clean: ## Remove all tools
 	rm -rf $(BIN_DIR)
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index 79cbbebe17..5d0c742794 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -4,6 +4,7 @@ go 1.22
 
 require (
 	github.com/a8m/envsubst v1.2.0
+	github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20220420215017-3f29e6853552
 	github.com/golang/mock v1.6.0
 	github.com/itchyny/gojq v0.12.2
 	github.com/onsi/ginkgo/v2 v2.13.0
@@ -47,6 +48,7 @@ require (
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
+	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 	github.com/spf13/afero v1.9.2 // indirect
 	github.com/spf13/cobra v1.8.0 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
@@ -70,6 +72,7 @@ require (
 	k8s.io/apiextensions-apiserver v0.29.0 // indirect
 	k8s.io/apimachinery v0.29.0 // indirect
 	k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect
+	k8s.io/klog v0.2.0 // indirect
 	k8s.io/klog/v2 v2.110.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
 	k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index 8d2cb148c6..54f95cff3e 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -40,6 +40,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/a8m/envsubst v1.2.0 h1:yvzAhJD2QKdo35Ut03wIfXQmg+ta3wC/1bskfZynz+Q=
 github.com/a8m/envsubst v1.2.0/go.mod h1:PpvLvNWa+Rvu/10qXmFbFiGICIU5hZvFJNPCCkUaObg=
+github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20220420215017-3f29e6853552 h1:ppHFRuYry83Rkj933CxFXAV4F2ciIdVz/uLuELSG1DI=
+github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20220420215017-3f29e6853552/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
@@ -232,9 +234,12 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
 github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
 github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
 github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
@@ -625,8 +630,11 @@ k8s.io/apimachinery v0.29.0 h1:+ACVktwyicPz0oc6MTMLwa2Pw3ouLAfAon1wPLtG48o=
 k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis=
 k8s.io/code-generator v0.29.0 h1:2LQfayGDhaIlaamXjIjEQlCMy4JNCH9lrzas4DNW1GQ=
 k8s.io/code-generator v0.29.0/go.mod h1:5bqIZoCxs2zTRKMWNYqyQWW/bajc+ah4rh0tMY8zdGA=
+k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks=
 k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
+k8s.io/klog v0.2.0 h1:0ElL0OHzF3N+OhoJTL0uca20SxtYt4X4+bzHeqrB83c=
+k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
 k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
 k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
diff --git a/hack/tools/tools.go b/hack/tools/tools.go
index a6cbdbe0c5..b43864a9a4 100644
--- a/hack/tools/tools.go
+++ b/hack/tools/tools.go
@@ -22,6 +22,7 @@ package tools
 
 import (
 	_ "github.com/a8m/envsubst"
+	_ "github.com/ahmetb/gen-crd-api-reference-docs"
 	_ "github.com/golang/mock/mockgen"
 	_ "github.com/itchyny/gojq/cmd/gojq"
 	_ "github.com/onsi/ginkgo/v2/ginkgo"