<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mohammad.issa</id>
		<title>OpenStack - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mohammad.issa"/>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/wiki/Special:Contributions/Mohammad.issa"/>
		<updated>2026-07-10T12:40:29Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-metallb&amp;diff=187079</id>
		<title>StarlingX/Containers/Applications/app-metallb</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-metallb&amp;diff=187079"/>
				<updated>2025-12-30T18:39:10Z</updated>
		
		<summary type="html">&lt;p&gt;Mohammad.issa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= StarlingX MetalLB App installation guide =&lt;br /&gt;
app-metallb is a StarlingX containerized application that deploys MetalLB to provide Kubernetes LoadBalancer services for clusters running on bare metal or non-cloud environments.&lt;br /&gt;
&lt;br /&gt;
MetalLB integrates with the StarlingX networking model to advertise service IP addresses using either BGP or Layer 2 (ARP/NDP) mechanisms, enabling external connectivity to Kubernetes services without relying on a cloud provider load balancer.&lt;br /&gt;
&lt;br /&gt;
NOTE: This app will be available starting '''stx.13.0'''&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
* [https://opendev.org/starlingx/app-metallb Code Repository]&lt;br /&gt;
* [https://review.opendev.org/q/project:starlingx/app-metallb Gerrit Reviews]&lt;br /&gt;
* [https://metallb.io/ Official Documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tarball Package ==&lt;br /&gt;
* Get the .tgz file located at&lt;br /&gt;
    /usr/local/share/applications/helm/&lt;br /&gt;
* Or build it yourself using the Debian Build environment&lt;br /&gt;
    build-pkgs -c -p metallb-helm,python3-k8sapp-metallb,stx-metallb-helm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Deployment Architecture ==&lt;br /&gt;
MetalLB is deployed into the metallb-system namespace and consists of:&lt;br /&gt;
&lt;br /&gt;
* metallb-controller Deployment&lt;br /&gt;
* metallb-speaker DaemonSet&lt;br /&gt;
* Optional FRR containers when BGP mode is enabled&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In BGP mode, the speaker establishes BGP sessions with configured peers and advertises service IPs as host routes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Apply the app&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# system application-apply metallb&lt;br /&gt;
&lt;br /&gt;
* Verify MetalLB controller and speaker pods are running&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl get pods -n metallb-system&lt;br /&gt;
    NAME                                 READY   STATUS    RESTARTS   AGE&lt;br /&gt;
    metallb-controller-bbfd4845b-gknmx   1/1     Running   0          75s&lt;br /&gt;
    metallb-speaker-tfwmz                1/1     Running   0          75s&lt;br /&gt;
&lt;br /&gt;
=== Simple L2 mode example ===&lt;br /&gt;
* Apply the configuration for the ''IPAddressPool'' and &amp;quot;L2Advertisement&amp;quot;.&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# cat metallb-l2.yaml&lt;br /&gt;
    apiVersion: metallb.io/v1beta1&lt;br /&gt;
    kind: IPAddressPool&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: l2-pool&lt;br /&gt;
      namespace: metallb-system&lt;br /&gt;
    spec:&lt;br /&gt;
      addresses: [&amp;quot;192.168.206.200-192.168.206.210&amp;quot;]&lt;br /&gt;
      avoidBuggyIPs: true&lt;br /&gt;
    ---&lt;br /&gt;
    apiVersion: metallb.io/v1beta1&lt;br /&gt;
    kind: L2Advertisement&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: metallb-adv&lt;br /&gt;
      namespace: metallb-system&lt;br /&gt;
    spec:&lt;br /&gt;
      ipAddressPools:&lt;br /&gt;
        - l2-pool&lt;br /&gt;
&lt;br /&gt;
* Apply a simple nginx service that a host outside the cluster can access&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# cat nginx.yaml&lt;br /&gt;
    apiVersion: apps/v1&lt;br /&gt;
    kind: Deployment&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: nginx-test&lt;br /&gt;
    spec:&lt;br /&gt;
      replicas: 1&lt;br /&gt;
      selector:&lt;br /&gt;
        matchLabels:&lt;br /&gt;
          app: nginx-test&lt;br /&gt;
      template:&lt;br /&gt;
        metadata:&lt;br /&gt;
          labels:&lt;br /&gt;
            app: nginx-test&lt;br /&gt;
        spec:&lt;br /&gt;
          containers:&lt;br /&gt;
          - name: nginx&lt;br /&gt;
            image: nginx:latest&lt;br /&gt;
            ports:&lt;br /&gt;
            - containerPort: 80&lt;br /&gt;
    ---&lt;br /&gt;
    apiVersion: v1&lt;br /&gt;
    kind: Service&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: nginx-service&lt;br /&gt;
    spec:&lt;br /&gt;
      type: LoadBalancer&lt;br /&gt;
      selector:&lt;br /&gt;
        app: nginx-test&lt;br /&gt;
      ports:&lt;br /&gt;
      - port: 80&lt;br /&gt;
        targetPort: 80&lt;br /&gt;
&lt;br /&gt;
* Notice that the MetalLB controller assigns the nginx service an external IP while the speaker is announcing that IP.&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl get svc nginx-service&lt;br /&gt;
    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)        AGE&lt;br /&gt;
    nginx-service   LoadBalancer   10.111.148.132   192.168.206.200   80:30966/TCP   6s&lt;br /&gt;
&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl describe svc nginx-service&lt;br /&gt;
    ...&lt;br /&gt;
    Events:&lt;br /&gt;
      Type    Reason        Age   From                Message&lt;br /&gt;
      ----    ------        ----  ----                -------&lt;br /&gt;
      Normal  IPAllocated   23s   metallb-controller  Assigned IP [&amp;quot;192.168.206.200&amp;quot;]&lt;br /&gt;
      Normal  nodeAssigned  12s   metallb-speaker     announcing from node &amp;quot;controller-0&amp;quot; with protocol &amp;quot;layer2&amp;quot;&lt;/div&gt;</summary>
		<author><name>Mohammad.issa</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-metallb&amp;diff=187078</id>
		<title>StarlingX/Containers/Applications/app-metallb</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-metallb&amp;diff=187078"/>
				<updated>2025-12-30T18:37:14Z</updated>
		
		<summary type="html">&lt;p&gt;Mohammad.issa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= StarlingX MetalLB App installation guide =&lt;br /&gt;
app-metallb is a StarlingX containerized application that deploys MetalLB to provide Kubernetes LoadBalancer services for clusters running on bare metal or non-cloud environments.&lt;br /&gt;
&lt;br /&gt;
MetalLB integrates with the StarlingX networking model to advertise service IP addresses using either BGP or Layer 2 (ARP/NDP) mechanisms, enabling external connectivity to Kubernetes services without relying on a cloud provider load balancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
* [https://opendev.org/starlingx/app-metallb Code Repository]&lt;br /&gt;
* [https://review.opendev.org/q/project:starlingx/app-metallb Gerrit Reviews]&lt;br /&gt;
* [https://metallb.io/ Official Documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tarball Package ==&lt;br /&gt;
* Get the .tgz file located at&lt;br /&gt;
    /usr/local/share/applications/helm/&lt;br /&gt;
* Or build it yourself using the Debian Build environment&lt;br /&gt;
    build-pkgs -c -p metallb-helm,python3-k8sapp-metallb,stx-metallb-helm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Deployment Architecture ==&lt;br /&gt;
MetalLB is deployed into the metallb-system namespace and consists of:&lt;br /&gt;
&lt;br /&gt;
* metallb-controller Deployment&lt;br /&gt;
* metallb-speaker DaemonSet&lt;br /&gt;
* Optional FRR containers when BGP mode is enabled&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In BGP mode, the speaker establishes BGP sessions with configured peers and advertises service IPs as host routes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Apply the app&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# system application-apply metallb&lt;br /&gt;
&lt;br /&gt;
* Verify MetalLB controller and speaker pods are running&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl get pods -n metallb-system&lt;br /&gt;
    NAME                                 READY   STATUS    RESTARTS   AGE&lt;br /&gt;
    metallb-controller-bbfd4845b-gknmx   1/1     Running   0          75s&lt;br /&gt;
    metallb-speaker-tfwmz                1/1     Running   0          75s&lt;br /&gt;
&lt;br /&gt;
=== Simple L2 mode example ===&lt;br /&gt;
* Apply the configuration for the ''IPAddressPool'' and &amp;quot;L2Advertisement&amp;quot;.&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# cat metallb-l2.yaml&lt;br /&gt;
    apiVersion: metallb.io/v1beta1&lt;br /&gt;
    kind: IPAddressPool&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: l2-pool&lt;br /&gt;
      namespace: metallb-system&lt;br /&gt;
    spec:&lt;br /&gt;
      addresses: [&amp;quot;192.168.206.200-192.168.206.210&amp;quot;]&lt;br /&gt;
      avoidBuggyIPs: true&lt;br /&gt;
    ---&lt;br /&gt;
    apiVersion: metallb.io/v1beta1&lt;br /&gt;
    kind: L2Advertisement&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: metallb-adv&lt;br /&gt;
      namespace: metallb-system&lt;br /&gt;
    spec:&lt;br /&gt;
      ipAddressPools:&lt;br /&gt;
        - l2-pool&lt;br /&gt;
&lt;br /&gt;
* Apply a simple nginx service that a host outside the cluster can access&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# cat nginx.yaml&lt;br /&gt;
    apiVersion: apps/v1&lt;br /&gt;
    kind: Deployment&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: nginx-test&lt;br /&gt;
    spec:&lt;br /&gt;
      replicas: 1&lt;br /&gt;
      selector:&lt;br /&gt;
        matchLabels:&lt;br /&gt;
          app: nginx-test&lt;br /&gt;
      template:&lt;br /&gt;
        metadata:&lt;br /&gt;
          labels:&lt;br /&gt;
            app: nginx-test&lt;br /&gt;
        spec:&lt;br /&gt;
          containers:&lt;br /&gt;
          - name: nginx&lt;br /&gt;
            image: nginx:latest&lt;br /&gt;
            ports:&lt;br /&gt;
            - containerPort: 80&lt;br /&gt;
    ---&lt;br /&gt;
    apiVersion: v1&lt;br /&gt;
    kind: Service&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: nginx-service&lt;br /&gt;
    spec:&lt;br /&gt;
      type: LoadBalancer&lt;br /&gt;
      selector:&lt;br /&gt;
        app: nginx-test&lt;br /&gt;
      ports:&lt;br /&gt;
      - port: 80&lt;br /&gt;
        targetPort: 80&lt;br /&gt;
&lt;br /&gt;
* Notice that the MetalLB controller assigns the nginx service an external IP while the speaker is announcing that IP.&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl get svc nginx-service&lt;br /&gt;
    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)        AGE&lt;br /&gt;
    nginx-service   LoadBalancer   10.111.148.132   192.168.206.200   80:30966/TCP   6s&lt;br /&gt;
&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl describe svc nginx-service&lt;br /&gt;
    ...&lt;br /&gt;
    Events:&lt;br /&gt;
      Type    Reason        Age   From                Message&lt;br /&gt;
      ----    ------        ----  ----                -------&lt;br /&gt;
      Normal  IPAllocated   23s   metallb-controller  Assigned IP [&amp;quot;192.168.206.200&amp;quot;]&lt;br /&gt;
      Normal  nodeAssigned  12s   metallb-speaker     announcing from node &amp;quot;controller-0&amp;quot; with protocol &amp;quot;layer2&amp;quot;&lt;/div&gt;</summary>
		<author><name>Mohammad.issa</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-metallb&amp;diff=187077</id>
		<title>StarlingX/Containers/Applications/app-metallb</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-metallb&amp;diff=187077"/>
				<updated>2025-12-30T18:36:39Z</updated>
		
		<summary type="html">&lt;p&gt;Mohammad.issa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= StarlingX MetalLB App installation guide =&lt;br /&gt;
app-metallb is a StarlingX containerized application that deploys MetalLB to provide Kubernetes LoadBalancer services for clusters running on bare metal or non-cloud environments.&lt;br /&gt;
&lt;br /&gt;
MetalLB integrates with the StarlingX networking model to advertise service IP addresses using either BGP or Layer 2 (ARP/NDP) mechanisms, enabling external connectivity to Kubernetes services without relying on a cloud provider load balancer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
* [https://opendev.org/starlingx/app-metallb Code Repository]&lt;br /&gt;
* [https://review.opendev.org/q/project:starlingx/app-metallb Gerrit Reviews]&lt;br /&gt;
* [https://metallb.io/ Official Documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tarball Package ==&lt;br /&gt;
* Get the .tgz file located at&lt;br /&gt;
    /usr/local/share/applications/helm/&lt;br /&gt;
* Or build it yourself using the Debian Build environment&lt;br /&gt;
    build-pkgs -c -p metallb-helm,python3-k8sapp-metallb,stx-metallb-helm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Deployment Architecture ==&lt;br /&gt;
MetalLB is deployed into the metallb-system namespace and consists of:&lt;br /&gt;
&lt;br /&gt;
* metallb-controller Deployment&lt;br /&gt;
* metallb-speaker DaemonSet&lt;br /&gt;
* Optional FRR containers when BGP mode is enabled&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In BGP mode, the speaker establishes BGP sessions with configured peers and advertises service IPs as host routes.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
* Apply the app&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# system application-apply metallb&lt;br /&gt;
&lt;br /&gt;
* Verify MetalLB controller and speaker pods are running&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl get pods -n metallb-system&lt;br /&gt;
    NAME                                 READY   STATUS    RESTARTS   AGE&lt;br /&gt;
    metallb-controller-bbfd4845b-gknmx   1/1     Running   0          75s&lt;br /&gt;
    metallb-speaker-tfwmz                1/1     Running   0          75s&lt;br /&gt;
&lt;br /&gt;
=== Simple L2 mode example ===&lt;br /&gt;
* Apply the configuration for the ''IPAddressPool'' and &amp;quot;L2Advertisement&amp;quot;.&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# cat metallb-l2.yaml&lt;br /&gt;
    apiVersion: metallb.io/v1beta1&lt;br /&gt;
    kind: IPAddressPool&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: l2-pool&lt;br /&gt;
      namespace: metallb-system&lt;br /&gt;
    spec:&lt;br /&gt;
      addresses: [&amp;quot;192.168.206.200-192.168.206.210&amp;quot;]&lt;br /&gt;
      avoidBuggyIPs: true&lt;br /&gt;
    ---&lt;br /&gt;
    apiVersion: metallb.io/v1beta1&lt;br /&gt;
    kind: L2Advertisement&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: metallb-adv&lt;br /&gt;
      namespace: metallb-system&lt;br /&gt;
    spec:&lt;br /&gt;
      ipAddressPools:&lt;br /&gt;
        - l2-pool&lt;br /&gt;
&lt;br /&gt;
* Apply a simple nginx service that a host outside the cluster can access&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# cat nginx.yaml&lt;br /&gt;
    apiVersion: apps/v1&lt;br /&gt;
    kind: Deployment&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: nginx-test&lt;br /&gt;
    spec:&lt;br /&gt;
      replicas: 1&lt;br /&gt;
      selector:&lt;br /&gt;
        matchLabels:&lt;br /&gt;
          app: nginx-test&lt;br /&gt;
      template:&lt;br /&gt;
        metadata:&lt;br /&gt;
          labels:&lt;br /&gt;
            app: nginx-test&lt;br /&gt;
        spec:&lt;br /&gt;
          containers:&lt;br /&gt;
          - name: nginx&lt;br /&gt;
            image: nginx:latest&lt;br /&gt;
            ports:&lt;br /&gt;
            - containerPort: 80&lt;br /&gt;
    ---&lt;br /&gt;
    apiVersion: v1&lt;br /&gt;
    kind: Service&lt;br /&gt;
    metadata:&lt;br /&gt;
      name: nginx-service&lt;br /&gt;
    spec:&lt;br /&gt;
      type: LoadBalancer&lt;br /&gt;
      selector:&lt;br /&gt;
        app: nginx-test&lt;br /&gt;
      ports:&lt;br /&gt;
      - port: 80&lt;br /&gt;
        targetPort: 80&lt;br /&gt;
&lt;br /&gt;
* Notice that the MetalLB controller assigns the nginx service an external IP while the speaker is announcing that IP.&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl get svc nginx-service&lt;br /&gt;
    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)        AGE&lt;br /&gt;
    nginx-service   LoadBalancer   10.111.148.132   192.168.206.200   80:30966/TCP   6s&lt;br /&gt;
&lt;br /&gt;
    [root@controller-0 sysadmin(keystone_admin)]# kubectl describe svc nginx-service&lt;br /&gt;
    ...&lt;br /&gt;
    Events:&lt;br /&gt;
      Type    Reason        Age   From                Message&lt;br /&gt;
      ----    ------        ----  ----                -------&lt;br /&gt;
      Normal  IPAllocated   23s   metallb-controller  Assigned IP [&amp;quot;192.168.206.200&amp;quot;]&lt;br /&gt;
      Normal  nodeAssigned  12s   metallb-speaker     announcing from node &amp;quot;controller-0&amp;quot; with protocol &amp;quot;layer2&amp;quot;&lt;/div&gt;</summary>
		<author><name>Mohammad.issa</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-rook-ceph&amp;diff=187076</id>
		<title>StarlingX/Containers/Applications/app-rook-ceph</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-rook-ceph&amp;diff=187076"/>
				<updated>2025-12-30T17:54:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mohammad.issa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= StarlingX Rook Ceph App installation guide =&lt;br /&gt;
Rook Ceph a orchestrator providing a containerized solution for Ceph Storage with a specialized Kubernetes Operator to automate the management of the cluster. It is an alternative solution to the bare metal Ceph Storage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
* [https://opendev.org/starlingx/app-rook-ceph Code Repository]&lt;br /&gt;
* [https://review.opendev.org/q/project:starlingx/app-rook-ceph Gerrit Reviews]&lt;br /&gt;
* [https://rook.io/docs/rook/latest-release/Getting-Started/intro/ Official Documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tarball Package ==&lt;br /&gt;
* Get the .tgz file located at&lt;br /&gt;
    /usr/local/share/applications/helm/&lt;br /&gt;
* Or build it yourself using the Debian Build environment&lt;br /&gt;
    build-pkgs -c -p rook-ceph-helm,rook-ceph-provisioner-helm,python3-k8sapp-rook-ceph,rook-ceph-floating-monitor-helm,stx-rook-ceph-helm&lt;br /&gt;
&lt;br /&gt;
== Deployment Models ==&lt;br /&gt;
The deployment model is the topology strategy that defines the storage backend capabilities of the deployment. The deployment model dictates how the storage solution will look like, defining rules for the placement of the storage cluster elements.&lt;br /&gt;
&lt;br /&gt;
=== Available deployment models ===&lt;br /&gt;
Each deployment model works with different deployment strategies and rules to fit different needs. Choose one of the following models according to the demands of your cluster:&lt;br /&gt;
&lt;br /&gt;
==== Controller Model (default) ====&lt;br /&gt;
* The OSDs must be added only on hosts with controller personality.&lt;br /&gt;
* The replication factor can be configured up to a size of 3.&lt;br /&gt;
            &lt;br /&gt;
==== Dedicated Model ====&lt;br /&gt;
* The OSDs must be added only on hosts with worker personality;&lt;br /&gt;
* The replication factor can be configured up to a size of 3.&lt;br /&gt;
&lt;br /&gt;
==== Open Model ====&lt;br /&gt;
* The OSD placement does not have any limitation;&lt;br /&gt;
* The replication factor does not have any limitation.&lt;br /&gt;
&lt;br /&gt;
  '''IMPORTANT:''' The Open deployment model allows more flexible configurations. Users should ensure they understand the implications of their settings, as responsibility for correct configuration rests with them.&lt;br /&gt;
&lt;br /&gt;
=== Changing the deployment model ===&lt;br /&gt;
The deployment models can be changed as long as the system follows the previously estabilished rules&lt;br /&gt;
&lt;br /&gt;
* To change to another deployment model, execute the following command&lt;br /&gt;
    ~(keystone_admin)$ system storage-backend-modify ceph-rook-store -d &amp;lt;desired_deployment_model&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replication factor ===&lt;br /&gt;
&lt;br /&gt;
The replication factor is the number of copies that each piece of data has, spread across the cluster to provide redundancy.&lt;br /&gt;
&lt;br /&gt;
* You can change the replication of an existing Rook Ceph storage backend with the following command&lt;br /&gt;
&lt;br /&gt;
    ~(keystone_admin)$ system storage-backend-modify ceph-rook-store replication=&amp;lt;size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Possible Replication Factors on Deployment Models for platforms.&lt;br /&gt;
&lt;br /&gt;
==== AIO-Simplex Controller Model ====&lt;br /&gt;
* Default: 1&lt;br /&gt;
* Max: 3&lt;br /&gt;
&lt;br /&gt;
==== AIO-Simplex Open Model ====&lt;br /&gt;
* Default: 1&lt;br /&gt;
* Max: ANY&lt;br /&gt;
&lt;br /&gt;
==== AIO-Duplex Controller Model ====&lt;br /&gt;
* Default: 2&lt;br /&gt;
* Max: 2&lt;br /&gt;
&lt;br /&gt;
==== AIO-Duplex Open Model ====&lt;br /&gt;
* Default: 2&lt;br /&gt;
* Max: ANY&lt;br /&gt;
&lt;br /&gt;
==== AIO-Duplex+ or Standard Controller Model ====&lt;br /&gt;
* Default: 2&lt;br /&gt;
* Max: 3&lt;br /&gt;
&lt;br /&gt;
==== AIO-Duplex+ or Standard Dedicated Mode: ====&lt;br /&gt;
* Default: 2&lt;br /&gt;
* Max: 3&lt;br /&gt;
&lt;br /&gt;
==== AIO-Duplex+ or Standard Open Model ====&lt;br /&gt;
* Default: 2&lt;br /&gt;
* Max: ANY&lt;br /&gt;
&lt;br /&gt;
=== Minimum Replication Factor ===&lt;br /&gt;
&lt;br /&gt;
The minimum replication factor is the least number of copies that each piece of data has, spread across the cluster to provide redundancy.&lt;br /&gt;
&lt;br /&gt;
You can assign any number smaller than the replication factor to this parameter. The default value is (replication - 1).&lt;br /&gt;
&lt;br /&gt;
    '''Note''': When the replication factor changes, the minimum replication will be readjusted automatically.&lt;br /&gt;
&lt;br /&gt;
* You can change the minimum replication of an existing Rook Ceph storage backend with the command&lt;br /&gt;
    ~(keystone_admin)$ system storage-backend-modify ceph-rook-store min_replication=&amp;lt;size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Monitor, host-fs and controllerfs ===&lt;br /&gt;
Ceph monitors are the central nervous system of the Ceph cluster, ensuring that all components are aware of each other and that data is stored and accessed reliably. To properly set the environment for Rook Ceph monitors, some filesystems are needed: host-fs for fixed monitor and controllerfs for the floating monitor.&lt;br /&gt;
&lt;br /&gt;
    '''NOTE:''' All changes in &amp;quot;host-fs&amp;quot; and &amp;quot;controllerfs&amp;quot; need a reapply on the application to properly propagate &lt;br /&gt;
    the modifications in the Rook ceph cluster.&lt;br /&gt;
&lt;br /&gt;
==== Functions ====&lt;br /&gt;
&lt;br /&gt;
The functions parameter contains the Ceph cluster function of a given host. A&lt;br /&gt;
&amp;quot;host-fs&amp;quot; can have monitor and OSD functions, a &amp;quot;controllerfs&amp;quot; can only&lt;br /&gt;
have the monitor function.&lt;br /&gt;
&lt;br /&gt;
To modify the function of a &amp;quot;host-fs&amp;quot; the complete list of functions desired&lt;br /&gt;
must be informed.&lt;br /&gt;
&lt;br /&gt;
'''Examples'''&lt;br /&gt;
*host-fs&lt;br /&gt;
    #(only monitor)&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-modify &amp;lt;hostname&amp;gt; ceph --functions=monitor&lt;br /&gt;
&lt;br /&gt;
    #(only osd)&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-modify &amp;lt;hostname&amp;gt; ceph --functions=osd&lt;br /&gt;
&lt;br /&gt;
    #(no function)&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-modify &amp;lt;hostname&amp;gt; ceph --functions=&lt;br /&gt;
&lt;br /&gt;
    #(both functions)&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-modify &amp;lt;hostname&amp;gt; ceph --functions=osd,monitor&lt;br /&gt;
*controllerfs&lt;br /&gt;
    #(only monitor)&lt;br /&gt;
    ~(keystone_admin)$ system controllerfs-modify ceph-float --functions=monitor&lt;br /&gt;
&lt;br /&gt;
    #(no function)&lt;br /&gt;
    ~(keystone_admin)$ system controllerfs-modify ceph-float --functions=&lt;br /&gt;
&lt;br /&gt;
==== Monitor Count ====&lt;br /&gt;
&lt;br /&gt;
Monitors (mons) are allocated on all the hosts that have a &amp;quot;host-fs ceph&amp;quot;&lt;br /&gt;
with the monitor capability on it.&lt;br /&gt;
&lt;br /&gt;
===== Possible Monitor Count on Deployment Models for Platforms =====&lt;br /&gt;
&lt;br /&gt;
======AIO-Simplex======&lt;br /&gt;
* Min: 1&lt;br /&gt;
* Max: 1&lt;br /&gt;
&lt;br /&gt;
======AIO-Duplex======&lt;br /&gt;
* Min: 1&lt;br /&gt;
* Recommended: 3 (using floating monitor)&lt;br /&gt;
* Max: 3 (using floating monitor)&lt;br /&gt;
&lt;br /&gt;
======AIO-Duplex+ or Standard======&lt;br /&gt;
* Min: 1&lt;br /&gt;
* Recommended: 3&lt;br /&gt;
* Max: 5&lt;br /&gt;
&lt;br /&gt;
==== Fixed Monitors ====&lt;br /&gt;
Fixed monitor is the normal monitor that is associated with a given host. Each fixed monitor requires a &amp;quot;host-fs ceph&amp;quot; properly set and configured on the host.&lt;br /&gt;
&lt;br /&gt;
===== Adding a monitor =====&lt;br /&gt;
&lt;br /&gt;
To add a monitor to a Rook Ceph cluster, the host-fs ceph must be created or have the function 'monitor' added to its capabilities&lt;br /&gt;
&lt;br /&gt;
*When the host has no OSD registered on the platform, you should add a &amp;quot;host-fs ceph&amp;quot; in every node intended to house a monitor. Creating a host-fs this way automatically sets the monitor function. To create a &amp;quot;host-fs ceph&amp;quot;, run the following command&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-add &amp;lt;hostname&amp;gt; ceph=&amp;lt;size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* When there are OSDs registered on a host you should add the monitor function to the existing &amp;quot;host-fs&amp;quot;&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-modify &amp;lt;hostname&amp;gt; ceph --functions=osd,monitor&lt;br /&gt;
&lt;br /&gt;
*After the adding the 'monitor' function, the application must be reapplied&lt;br /&gt;
     ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
===== Removing a monitor =====&lt;br /&gt;
To remove a monitor, the function 'monitor' must be removed from the capabilities list of the &amp;quot;host-fs ceph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* When the host has no OSD registered on the platform, remove the 'monitor' function of the &amp;quot;host-fs ceph&amp;quot; with the following command&lt;br /&gt;
&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-modify &amp;lt;hostname&amp;gt; ceph --functions=&lt;br /&gt;
&lt;br /&gt;
*When there are OSDs registered on the same host, only the 'monitor' function should be removed from &amp;quot;host-fs ceph&amp;quot; capabilities list. Use the following command&lt;br /&gt;
&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-modify &amp;lt;hostname&amp;gt; ceph --functions=osd&lt;br /&gt;
&lt;br /&gt;
*After the removal of the 'monitor' function, the application must be reapplied&lt;br /&gt;
&lt;br /&gt;
     ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Floating Monitor (only in AIO-Duplex) ====&lt;br /&gt;
A Floating monitor is possible and recommended on AIO-Duplex platforms. The monitor&lt;br /&gt;
roams and is always allocated on the active controller, providing redundancy and improving stability.&lt;br /&gt;
&lt;br /&gt;
===== Adding the floating monitor =====&lt;br /&gt;
&lt;br /&gt;
    '''Note:''' You should lock the inactive controller before add &amp;quot;controllerfs ceph-float&amp;quot; to the platform.&lt;br /&gt;
&lt;br /&gt;
To add the floating monitor follow the procedure&lt;br /&gt;
&lt;br /&gt;
*Lock the inactive controller&lt;br /&gt;
    ~(keystone_admin)$ system host-lock controller-1 (with controller-0 as the active controller)&lt;br /&gt;
&lt;br /&gt;
*With the inactive controller locked, add the controllerfs&lt;br /&gt;
    ~(keystone_admin)$ system controllerfs-add ceph-float=&amp;lt;size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Unlock the inactive controller&lt;br /&gt;
    ~(keystone_admin)$ system host-unlock controller-1 (with controller-0 as the active controller)&lt;br /&gt;
&lt;br /&gt;
*With inactive controller unlocked and available, reapply the Rook Ceph Application&lt;br /&gt;
     ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
===== Removing the floating monitor =====&lt;br /&gt;
&lt;br /&gt;
*To remove the floating monitor, the function 'monitor' must be removed from the capabilities list of the &amp;quot;controllerfs ceph-float&amp;quot;. Use the following command&lt;br /&gt;
&lt;br /&gt;
     ~(keystone_admin)$ system controllerfs-modify ceph-float --functions=&lt;br /&gt;
&lt;br /&gt;
* After the removal of the 'monitor' function, the application must be reapplied&lt;br /&gt;
&lt;br /&gt;
     ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
===== Migrating between AIO-Duplex and AIO-Duplex+ =====&lt;br /&gt;
&lt;br /&gt;
====== Migrating to AIO-Duplex+ ======&lt;br /&gt;
To migrate from AIO-Duplex to AIO-Duplex+ the floating monitor must be removed before the migration and new fixed monitor should be added in a worker after the migration is done.&lt;br /&gt;
&lt;br /&gt;
====== Migrating to AIO-Duplex ======&lt;br /&gt;
To migrate from AIO-Duplex+ to AIO-Duplex, the fixed monitor should be removed from the cluster before the migration and a floating monitor should be added after the migration is done.&lt;br /&gt;
&lt;br /&gt;
=== Services ===&lt;br /&gt;
Services are the storage types (or classes) that provides storage to each pod&lt;br /&gt;
with some mount or storage space allocation.&lt;br /&gt;
&lt;br /&gt;
==== Available Services ====&lt;br /&gt;
&lt;br /&gt;
There are four possible services compatible with Rook Ceph. You can combine&lt;br /&gt;
them following the rules&lt;br /&gt;
&lt;br /&gt;
* '''block (default)'''&lt;br /&gt;
** Not possible to be deployed together with ecblock.&lt;br /&gt;
** Will enable the block service in rook, will use cephRBD.&lt;br /&gt;
&lt;br /&gt;
*'''ecblock'''&lt;br /&gt;
** Not possible to be deployed together with block.&lt;br /&gt;
** Will enable the ecblock service in rook, will use cephRBD.&lt;br /&gt;
&lt;br /&gt;
* '''filesystem (default)'''&lt;br /&gt;
** Will enable the ceph filesystem and use cephFS.&lt;br /&gt;
&lt;br /&gt;
* '''object'''&lt;br /&gt;
** Will enable the ceph object store (RGW).&lt;br /&gt;
&lt;br /&gt;
    '''IMPORTANT:''' A Service cannot be removed or replaced. Services only can be added&lt;br /&gt;
&lt;br /&gt;
==== Adding New Services ====&lt;br /&gt;
To add a new service to the storage-backend, first choose a possible service compatible with the aforementioned rules.&lt;br /&gt;
&lt;br /&gt;
* Get the list of the current services of the storage-backend with the following command&lt;br /&gt;
     ~(keystone_admin)$ system storage-backend-show ceph-rook-store&lt;br /&gt;
&lt;br /&gt;
* Then, add the desired service to the list via the command&lt;br /&gt;
    ~(keystone_admin)$  system storage-backend-modify ceph-rook-store --services=&amp;lt;previous_list&amp;gt;,&amp;lt;new_service&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Reapply Rook Ceph application&lt;br /&gt;
     ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
*Example: For a storage-backend with the service list &amp;quot;block,filesystem&amp;quot;, only 'object' can be added as service&lt;br /&gt;
    ~(keystone_admin)$ system storage-backend-modify ceph-rook-store --services=block,filesystem,object&lt;br /&gt;
&lt;br /&gt;
==== Services Parameterization for the Open Model ====&lt;br /&gt;
In the 'open' deployment model, no specific configurations are enforced. Users are responsible&lt;br /&gt;
for customizing settings based on their specific needs. To update configurations, a Helm override is required.&lt;br /&gt;
&lt;br /&gt;
When applying a helm-override update, list-type values are completely replaced, not incrementally updated.&lt;br /&gt;
For example, modifying cephFileSystems (or cephBlockPools, cephECBlockPools, cephObjectStores) via&lt;br /&gt;
Helm override will overwrite the entire entry.&lt;br /&gt;
&lt;br /&gt;
Here is two examples of how to change a parameter, using failureDomain as&lt;br /&gt;
an example, for '''Cephfs''' and '''RBD'''&lt;br /&gt;
&lt;br /&gt;
*'''Cephfs'''&lt;br /&gt;
  # Get the current crush rule information&lt;br /&gt;
  ceph osd pool get kube-cephfs-data crush_rule&lt;br /&gt;
  &lt;br /&gt;
  # Get the current default values&lt;br /&gt;
  helm get values -n rook-ceph rook-ceph-cluster -o yaml | sed -n  '/^cephFileSystems:/,/^[[:alnum:]_-]*:/p;' | sed '$d' &amp;gt; cephfs_overrides.yaml&lt;br /&gt;
  &lt;br /&gt;
  # Update the failure domain&lt;br /&gt;
  sed -i 's/failureDomain: osd/failureDomain: host/g' cephfs_overrides.yaml&lt;br /&gt;
  &lt;br /&gt;
  # Get the current user override values (&amp;quot;combined overrides&amp;quot; is what will be deployed)&lt;br /&gt;
  system helm-override-show rook-ceph rook-ceph-cluster rook-ceph&lt;br /&gt;
  &lt;br /&gt;
  # Set the new overrides&lt;br /&gt;
  system helm-override-update rook-ceph rook-ceph-cluster rook-ceph --reuse-values --values cephfs_overrides.yaml&lt;br /&gt;
  &lt;br /&gt;
  # Get the updated user override values&lt;br /&gt;
  system helm-override-show rook-ceph rook-ceph-cluster rook-ceph&lt;br /&gt;
  &lt;br /&gt;
  # Apply the application&lt;br /&gt;
  system application-apply rook-ceph&lt;br /&gt;
  &lt;br /&gt;
  # Confirm the current crush rule information&lt;br /&gt;
  ceph osd pool get kube-cephfs-data crush_rule&lt;br /&gt;
&lt;br /&gt;
* '''RBD'''&lt;br /&gt;
  # Get the current crush rule information&lt;br /&gt;
  ceph osd pool get kube-cephfs-data crush_rule&lt;br /&gt;
  &lt;br /&gt;
  # Retrieve the current values and extract the cephBlockPools section&lt;br /&gt;
  helm get values -n rook-ceph rook-ceph-cluster -o yaml | sed -n '/^cephBlockPools:/,/^[[:alnum:]_-]*:/p;' | sed '$d' &amp;gt; rbd_overrides.yaml&lt;br /&gt;
  &lt;br /&gt;
  # Modify the failureDomain parameter from osd to host in the rbd_overrides.yaml file&lt;br /&gt;
  sed -i 's/failureDomain: osd/failureDomain: host/g' rbd_overrides.yaml&lt;br /&gt;
  &lt;br /&gt;
  # Set the update configuration&lt;br /&gt;
  system helm-override-update rook-ceph rook-ceph-cluster rook-ceph --reuse-values --values rbd_overrides.yaml&lt;br /&gt;
  &lt;br /&gt;
  # Apply the application&lt;br /&gt;
  system application-apply rook-ceph&lt;br /&gt;
  &lt;br /&gt;
  # Confirm the current crush rule information&lt;br /&gt;
  ceph osd pool get kube-cephfs-data crush_rule&lt;br /&gt;
==== Disable Helm Chart ====&lt;br /&gt;
    '''IMPORTANT:''' Do not disable any of the Rook Ceph Helm charts using &amp;quot;system helm-chart-attribute-modify&amp;quot;&lt;br /&gt;
    as this may result in a broken installation.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
===Preparing the Environment===&lt;br /&gt;
&lt;br /&gt;
====Configuring deployment model and services====&lt;br /&gt;
To configure the deployment model, first certify that there is no no ceph-store storage backend configured on the system&lt;br /&gt;
    ~(keystone_admin)$ system storage-backend-list&lt;br /&gt;
&lt;br /&gt;
Create a storage backend for Rook Ceph, choosing your deployment model (controller, dedicated, open), and, optionally, the desired services (block or ecblock, filesystem, object)&lt;br /&gt;
    ~(keystone_admin)$ system storage-backend-add ceph-rook --deployment controller --confirmed&lt;br /&gt;
&lt;br /&gt;
Create a host-fs ceph for each host that will house a Rook Ceph monitor (preferably an '''ODD''' number of hosts)&lt;br /&gt;
    ~(keystone_admin)$ system host-fs-add &amp;lt;hostname&amp;gt; ceph=&amp;lt;size&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configuring OSDs&lt;br /&gt;
        &lt;br /&gt;
*Check the uuid of the disks of the desired host that will house the OSDs&lt;br /&gt;
    ~(keystone_admin)$ system host-disk-list &amp;lt;hostname&amp;gt;&lt;br /&gt;
Note: The OSD placement should follow the chosen deployment model placement rules.&lt;br /&gt;
*Add the desired disks to the system as OSDs (Preferably an EVEN number of OSDs)&lt;br /&gt;
    ~(keystone_admin)$ system host-stor-add &amp;lt;hostname&amp;gt; osd &amp;lt;disk_uuid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Installing the application===&lt;br /&gt;
After configuring environment acordingly to the chosen deployment model correctly, Rook Ceph should install automatically.&lt;br /&gt;
&lt;br /&gt;
== Verifying the Installation ==&lt;br /&gt;
* Verify that rook is running&lt;br /&gt;
    [sysadmin@controller-0 ~(keystone_admin)]$ NS=rook-ceph&lt;br /&gt;
    [sysadmin@controller-0 ~(keystone_admin)]$ kubectl get pods -n ${NS} -o wide -w &lt;br /&gt;
    &lt;br /&gt;
    NAME                                            READY   STATUS      RESTARTS   AGE     IP              NODE         &lt;br /&gt;
    csi-cephfsplugin-provisioner-86d7d5d9b7-98gn2   6/6     Running     0          11m     172.16.192.101   controller-0&lt;br /&gt;
    csi-rbdplugin-nd8xk                             3/3     Running     0          11m     192.168.206.2    controller-0&lt;br /&gt;
    csi-rbdplugin-provisioner-c9cd4ffd7-mmfp9       6/6     Running     0          11m     172.16.192.100   controller-0&lt;br /&gt;
    rook-ceph-mds-kube-cephfs-a-7b544db87d-4ctrf    1/1     Running     0          11m     192.168.206.2    controller-0&lt;br /&gt;
    rook-ceph-mds-kube-cephfs-b-5fcbb478fd-qjw4g    1/1     Running     0          11m     192.168.206.2    controller-0&lt;br /&gt;
    rook-ceph-mgr-a-69fbb9d7b4-tcbt4                1/1     Running     0          11m     192.168.206.2    controller-0&lt;br /&gt;
    rook-ceph-mon-a-55bbd66678-9cvt6                1/1     Running     0          12m     192.168.206.2    controller-0&lt;br /&gt;
    rook-ceph-operator-5ddc68f467-kqbwt             1/1     Running     0          12m     172.16.192.95    controller-0&lt;br /&gt;
    rook-ceph-osd-0-bfbf89745-679kp                 1/1     Running     0          11m     192.168.206.2    controller-0&lt;br /&gt;
    rook-ceph-osd-1-69799854f5-qvgvg                1/1     Running     0          11m     192.168.206.2    controller-0&lt;br /&gt;
    rook-ceph-osd-prepare-controller-0-jmxmz        0/1     Completed   0          11m     192.168.206.2    controller-0&lt;br /&gt;
    rook-ceph-provision-g8qfg                       0/1     Completed   0          5m20s   172.16.192.104   controller-0&lt;br /&gt;
    rook-ceph-tools-644f4dbc4b-8qc2m                1/1     Running     0          12m     192.168.206.2    controller-0&lt;br /&gt;
    stx-ceph-manager-66764cb49d-hxt4d               1/1     Running     0          11m     172.16.192.98    controller-0&lt;br /&gt;
    stx-ceph-osd-audit-28484346-r5nfq               0/1     Completed   0          8s      192.168.206.2    controller-0&lt;br /&gt;
&lt;br /&gt;
* Verify that the cluster is operational&lt;br /&gt;
    [sysadmin@controller-0 ~(keystone_admin)]$ ceph -s&lt;br /&gt;
&lt;br /&gt;
* Verify the ceph version&lt;br /&gt;
    [sysadmin@controller-0 ~(keystone_admin)]$ceph version&lt;br /&gt;
    ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)&lt;br /&gt;
&lt;br /&gt;
* Make sure that the disk is reported used&lt;br /&gt;
    [sysadmin@controller-0 ~(keystone_admin)]$ system host-disk-list controller-0&lt;br /&gt;
    +-----------+---------+---------+-------+------------+-----+--------------------------------------------+&lt;br /&gt;
    | device_no | device_ | device_ | size_ | available_ | rpm | device_path                                |&lt;br /&gt;
    | de        | num     | type    | gib   | gib        |     |                                            |&lt;br /&gt;
    +-----------+---------+---------+-------+------------+-----+--------------------------------------------+&lt;br /&gt;
    | /dev/sda  | 2048    | SSD     | 520.0 | 0.0        | N/A | /dev/disk/by-path/pci-0000:00:0d.0-ata-1.0 |&lt;br /&gt;
    | /dev/sdb  | 2064    | SSD     | 520.0 | 0.0        | N/A | /dev/disk/by-path/pci-0000:00:0d.0-ata-2.0 |&lt;br /&gt;
    | /dev/sdc  | 2080    | SSD     | 520.0 | 519.996    | N/A | /dev/disk/by-path/pci-0000:00:0d.0-ata-3.0 |&lt;br /&gt;
    +-----------+---------+---------+-------+------------+-----+--------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
* Make sure that the volume group is reported&lt;br /&gt;
    [sysadmin@controller-0 ~(keystone_admin)]$ system host-lvg-list controller-0&lt;br /&gt;
    +-------------------+-------------+--------+------------------+------------------+-------------+-------------+&lt;br /&gt;
    | LVG Name          | State       | Access | Total Size (GiB) | Avail Size (GiB) | Current PVs | Current LVs |&lt;br /&gt;
    +-------------------+-------------+--------+------------------+------------------+-------------+-------------+&lt;br /&gt;
    | cgts-vg           | provisioned | wz--n- | 488.406          | 261.593          | 1           | 15          |&lt;br /&gt;
    | ceph-2e5d9569-... | provisioned | wz--n- | 519.996          | 0.0              | 1           | 1           |&lt;br /&gt;
    +-------------------+-------------+--------+------------------+------------------+-------------+-------------+&lt;br /&gt;
&lt;br /&gt;
* Make sure that the physical volume is reported&lt;br /&gt;
    [sysadmin@controller-0 ~(keystone_admin)]$ system host-pv-list controller-0 --nowrap&lt;br /&gt;
   +-------------+--------------+--------------------------------------------------+----------+-----------+--------------+&lt;br /&gt;
   | lvm_pv_name | disk_or_part | disk_or_part_device_path                         | pv_state | pv_type   | lvm_vg_name  |&lt;br /&gt;
   |             | _device_node |                                                  |          |           |              |&lt;br /&gt;
   +-------------+--------------+--------------------------------------------------+----------+-----------+--------------+&lt;br /&gt;
   | /dev/sdb    | /dev/sdb     | /dev/disk/by-path/pci-0000:00:0d.0-ata-2.0       | provisnd | disk      | ceph-2e5d... |&lt;br /&gt;
   | /dev/sda5   | /dev/sda5    | /dev/disk/by-path/pci-0000:00:0d.0-ata-1.0-part5 | provisnd | partition | cgts-vg      |&lt;br /&gt;
   +-------------+--------------+--------------------------------------------------+----------+-----------+--------------+&lt;br /&gt;
&lt;br /&gt;
== OSD Management ==&lt;br /&gt;
&lt;br /&gt;
===Add OSDs===&lt;br /&gt;
* Obtain the UUIDs of the target disk(s).&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system host-disk-list compute-0&lt;br /&gt;
&lt;br /&gt;
*Add the target disk(s) as OSDs.&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-add compute-0 ed4c51a7-372f-4460-915d-43049cf23dd5&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-add compute-0 ab35233a-9952-4437-87ed-80cc4d6817d7&lt;br /&gt;
&lt;br /&gt;
* At this point, the OSDs will be in the configuring-with-app state.&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-list compute-0&lt;br /&gt;
&lt;br /&gt;
*Apply rook-ceph application and wait for the application to become applied.&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
The rook-ceph application may take several minutes to apply the changes and provision the OSDs before reaching the applied state.&lt;br /&gt;
&lt;br /&gt;
Use the system application-show rook-ceph command to monitor progress.&lt;br /&gt;
&lt;br /&gt;
* List the OSDs and verify that they are now in the configured state.&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-list compute-0&lt;br /&gt;
&lt;br /&gt;
===Remove OSDs===&lt;br /&gt;
*Obtain the UUIDs of the OSDs to be removed.&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-list compute-0&lt;br /&gt;
&lt;br /&gt;
*Mark the OSDs for removal.&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-delete 4c612b3b-93f1-42b1-9f65-7ebd0cb3d397&lt;br /&gt;
&lt;br /&gt;
*At this point, the OSDs will be in the deleting-with-app state.&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-list compute-0&lt;br /&gt;
&lt;br /&gt;
* Apply rook-ceph application and wait for the application to become applied.&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
The rook-ceph application may take several minutes to apply the changes and provision the OSDs before reaching the applied state.&lt;br /&gt;
&lt;br /&gt;
Use the system application-show rook-ceph command to monitor progress.&lt;br /&gt;
&lt;br /&gt;
Wait until the OSDs are removed.&lt;br /&gt;
&lt;br /&gt;
*The OSDs will be removed asynchronously after rook-ceph reaches the applied state. Then, once the OSDs entry disappears from system host-stor-list, the OSDs are successfully removed.&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-list 3&lt;br /&gt;
&lt;br /&gt;
===Replace OSDs===&lt;br /&gt;
&lt;br /&gt;
Repeat the following steps for each target host, one at a time so that it does not impact Ceph availability.&lt;br /&gt;
&lt;br /&gt;
Follow the steps in the Remove OSDs section to remove the target OSDs from the host.&lt;br /&gt;
&lt;br /&gt;
 '''Note:''' If after several minutes the OSD entry is reverted to the configured state, then the OSD removal is considered unsafe and is aborted to avoid data loss.&lt;br /&gt;
&lt;br /&gt;
You can proceed using system host-stor-delete --force &amp;lt;uuid&amp;gt;. This will skip data integrity checks and will forcefully remove the OSD. However, this may cause loss of data. Thus, use his only when you are sure that there is enough replicas of data. Otherwise, before using the –force option, always attempt the standard deletion first.&lt;br /&gt;
&lt;br /&gt;
* Lock the host&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system host-lock &amp;lt;host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* After the host is locked, power off the host&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system host-power-off &amp;lt;host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace the disk(s) while the host is powered off&lt;br /&gt;
&lt;br /&gt;
Power on the host and wait for the host to become online.&lt;br /&gt;
&lt;br /&gt;
*Unlock the host&lt;br /&gt;
&lt;br /&gt;
 ~(keystone_admin)$ system host-unlock &amp;lt;host&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the host to become unlocked/available.&lt;br /&gt;
&lt;br /&gt;
Follow the steps in Add OSDs to add the new replaced disk(s) as OSDs.&lt;br /&gt;
&lt;br /&gt;
==Additional Features and Procedures==&lt;br /&gt;
&lt;br /&gt;
===Add new OSDs on a running cluster===&lt;br /&gt;
To add new OSDs to the cluster, just add the new OSD to the platform and reapply the application&lt;br /&gt;
        ~(keystone_admin)$ system host-stor-add &amp;lt;host&amp;gt; &amp;lt;disk_uuid&amp;gt;&lt;br /&gt;
        ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
===Add new monitor on a running cluster===&lt;br /&gt;
To add a new monitor to the cluster, just add the host-fs to the desired host and reapply the application&lt;br /&gt;
        ~(keystone_admin)$ system host-fs-add &amp;lt;host&amp;gt; ceph=&amp;lt;size&amp;gt;&lt;br /&gt;
        ~(keystone_admin)$ system application-apply rook-ceph&lt;br /&gt;
&lt;br /&gt;
===Enabling Ceph Dashboard===&lt;br /&gt;
To enable Ceph Dashboard a helm override must be provided before the application apply. You should provide a password coded in base64.&lt;br /&gt;
&lt;br /&gt;
*Create the override file&lt;br /&gt;
        $ openssl base64 -e &amp;lt;&amp;lt;&amp;lt; &amp;quot;my_dashboard_passwd&amp;quot;&lt;br /&gt;
        bXlfZGFzaGJvYXJkX3Bhc3N3ZAo=&lt;br /&gt;
&lt;br /&gt;
        $ cat &amp;lt;&amp;lt; EOF &amp;gt;&amp;gt; dashboard-override.yaml&lt;br /&gt;
        cephClusterSpec:&lt;br /&gt;
          dashboard:&lt;br /&gt;
            enabled: true&lt;br /&gt;
            password: &amp;quot;bXlfZGFzaGJvYXJkX3Bhc3N3ZAo=&amp;quot;&lt;br /&gt;
        EOF&lt;br /&gt;
*Apply the override file&lt;br /&gt;
    ~(keystone_admin)$ system helm-override-update rook-ceph rook-ceph-cluster rook-ceph --values dashboard-override.yaml&lt;br /&gt;
&lt;br /&gt;
===Check Rook Ceph pods===&lt;br /&gt;
You can check the pods of the storage cluster running the following command&lt;br /&gt;
    kubectl get pod -n rook-ceph&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ceph Health Status Filter===&lt;br /&gt;
Some Ceph health statuses can be filtered to avoid generating alarms. The detection of a particular Health error or warning can be disabled.&lt;br /&gt;
    '''IMPORTANT:''' Disabling the detection of any health error or warning can prevent the system from generating alarms, detecting issues and log generating. This feature must be used at user's discretion. The recommended is to use this feature temporarily during some analysis or procedure and then revert back to the default empty values. &lt;br /&gt;
There is two filters: '''health_filters_for_ignore''' for filtering at any time (always active) and '''health_filters_for_upgrade''' that applies the filter only during an upgrade of the Rook Ceph.&lt;br /&gt;
*To apply the always-on filter (health_filters_for_ignore), use the following procedure:&lt;br /&gt;
Check for the name of any Ceph health issues that might wanted to be filtered out&lt;br /&gt;
    ~(keystone_admin)$ ceph health detail&lt;br /&gt;
Consult the list of the Ceph health issues currently ignored:&lt;br /&gt;
    ~(keystone_admin)$ kubectl get configmap ceph-manager-config -n rook-ceph -o yaml | sed -n '/ceph-manager-config.yaml:/,/^[^ ]/p' | sed -n 's/^[ ]*health_filters_for_ignore:[ ]*//p'&lt;br /&gt;
Edit the config map adding the name of the all Ceph health issues comma separated and delimited by [] to the list &amp;quot;health_filters_for_ignore&amp;quot;&lt;br /&gt;
    #Examples of useful Health Status to ignore: OSD_DOWN,PG_AVAILABILITY,BLUESTORE_SLOW_OP_ALERT,DB_DEVICE_STALLED_READ_ALERT&lt;br /&gt;
    ~(keystone_admin)$ health_filters='[&amp;lt;ceph_health_status_1&amp;gt;,&amp;lt;ceph_health_status_2&amp;gt;]' &lt;br /&gt;
    ~(keystone_admin)$ kubectl get configmap ceph-manager-config -n rook-ceph -o yaml | sed &amp;quot;s/^\(\s*health_filters_for_ignore:\s*\).*/\1$health_filters/&amp;quot; | kubectl apply -f -&lt;br /&gt;
Restart the stx-ceph-manager pod&lt;br /&gt;
    ~(keystone_admin)$ kubectl rollout restart -n rook-ceph deployment stx-ceph-manager&lt;br /&gt;
&lt;br /&gt;
*To use the upgrade only filter (health_filters_for_upgrade), follow the same procedure but change commands for consult and edit for the following versions:&lt;br /&gt;
Consult command for only upgrade&lt;br /&gt;
  ~(keystone_admin)$ kubectl get configmap ceph-manager-config -n rook-ceph -o yaml | sed -n '/ceph-manager-config.yaml:/,/^[^ ]/p' | sed -n 's/^[ ]*health_filters_for_upgrade:[ ]*//p'&lt;br /&gt;
  &lt;br /&gt;
Edit command for only upgrade&lt;br /&gt;
  ~(keystone_admin)$ kubectl get configmap ceph-manager-config -n rook-ceph -o yaml | sed &amp;quot;s/^\(\s*health_filters_for_upgrade:\s*\).*/\1$health_filters/&amp;quot; | kubectl apply -f -&lt;br /&gt;
&lt;br /&gt;
==Uninstall Rook Ceph==&lt;br /&gt;
To completely remove Rook Ceph, you must remove the application and clear all the environment configurations to prevent an automatic reinstall.&lt;br /&gt;
&lt;br /&gt;
 '''Note:''' Before removing the Rook Ceph application(s), unmount all the persistent volumes associated with the Rook Ceph cluster. This is achieved by removing all the applications dependent on StorageClasses provided by the Rook Ceph application. After removing the application(s), delete all PVCs and PVs that were previously provided to the application(s).&lt;br /&gt;
&lt;br /&gt;
If dependent application removal is not desired, then minimal cleanup is needed. All pods with PVCs must be deleted, scaled down to zero, or edited removing the PVC volume mounts. Otherwise, Rook Ceph application removal will fail, volumes may hang, and nodes may require a restart. In this case, a --force option is needed to remove the Rook Ceph application and tear down the Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
===Uninstalling===&lt;br /&gt;
To completely remove Rook Ceph, you must remove the application and clear all the&lt;br /&gt;
environment configurations to prevent an automatic reinstall.&lt;br /&gt;
&lt;br /&gt;
    '''NOTE:''' Before removing the Rook Ceph application(s), unmount all the persistent&lt;br /&gt;
    volumes associated with the Rook Ceph cluster. This is achieved by removing&lt;br /&gt;
    all the applications dependent on StorageClasses provided by the Rook Ceph&lt;br /&gt;
    application. After removing the application(s), delete all |PVCs| and |PVs|&lt;br /&gt;
    that were previously provided to the application(s).&lt;br /&gt;
    &lt;br /&gt;
    If dependent application removal is not desired, then minimal cleanup is&lt;br /&gt;
    needed. All pods with |PVCs| must be deleted, scaled down to zero, or&lt;br /&gt;
    edited removing the |PVC| volume mounts. Otherwise, Rook Ceph application&lt;br /&gt;
    removal will fail, volumes may hang, and nodes may require a restart. In&lt;br /&gt;
    this case, a ``--force`` option is needed to remove the Rook Ceph&lt;br /&gt;
    application and tear down the Ceph cluster.&lt;br /&gt;
&lt;br /&gt;
1) Remove the application by running the script&lt;br /&gt;
&lt;br /&gt;
 source /etc/platform/openrc&lt;br /&gt;
 system application-remove rook-ceph --force&lt;br /&gt;
 retry_count=1&lt;br /&gt;
 retries=200&lt;br /&gt;
 while [ $retry_count -le $retries ]; do&lt;br /&gt;
     rookstatus=$(system application-list | grep rook-ceph | awk '{print $10}')&lt;br /&gt;
     echo $rookstatus&lt;br /&gt;
     &amp;lt;nowiki&amp;gt;if [[ &amp;quot;$rookstatus&amp;quot; == &amp;quot;uploaded&amp;quot; ]]&amp;lt;/nowiki&amp;gt;; then&lt;br /&gt;
         system application-delete rook-ceph&lt;br /&gt;
         break&lt;br /&gt;
     fi&lt;br /&gt;
     echo &amp;quot;Retry #&amp;quot; $retry_count&lt;br /&gt;
     let retry_count++&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
2) Remove OSDs&lt;br /&gt;
*2.1) List all OSDs to get the uuid of each OSD&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-list &amp;lt;hostname&amp;gt;&lt;br /&gt;
*2.2) Remove each OSD using the uuid of all OSDs&lt;br /&gt;
 ~(keystone_admin)$ system host-stor-delete &amp;lt;uuid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) (AIO-Duplex Only) Remove controllerfs&lt;br /&gt;
*3.1) To remove a controllerfs, the standby controller must be locked and the controllerfs needs to be in Ready state.&lt;br /&gt;
 ~(keystone_admin)$ system host-lock &amp;lt;hostname&amp;gt;&lt;br /&gt;
*3.2) Remove the controllerfs&lt;br /&gt;
 ~(keystone_admin)$ system controllerfs-delete ceph-float&lt;br /&gt;
*3.3) Unlock the standby controller&lt;br /&gt;
 ~(keystone_admin)$ system host-unlock &amp;lt;hostname&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) Remove the host-fs&lt;br /&gt;
 ~(keystone_admin)$ system host-fs-delete &amp;lt;hostname&amp;gt; ceph&lt;br /&gt;
5) Remove the storage backend ceph-rook&lt;br /&gt;
 ~(keystone_admin)$ system storage-backend-delete ceph-rook-store --force&lt;/div&gt;</summary>
		<author><name>Mohammad.issa</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-metallb&amp;diff=187075</id>
		<title>StarlingX/Containers/Applications/app-metallb</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications/app-metallb&amp;diff=187075"/>
				<updated>2025-12-30T17:51:05Z</updated>
		
		<summary type="html">&lt;p&gt;Mohammad.issa: Created page with &amp;quot;= StarlingX MetalLB App installation guide =&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= StarlingX MetalLB App installation guide =&lt;/div&gt;</summary>
		<author><name>Mohammad.issa</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications&amp;diff=187074</id>
		<title>StarlingX/Containers/Applications</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=StarlingX/Containers/Applications&amp;diff=187074"/>
				<updated>2025-12-30T17:49:58Z</updated>
		
		<summary type="html">&lt;p&gt;Mohammad.issa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Containerized Applications =&lt;br /&gt;
This page serves a launch pad for all StarlingX Containerized application bundles&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* '''''STX.APP.01''''' - StarlingX shall provide application compatibility for all k8s releases supported in the planned StarlingX Release&lt;br /&gt;
** Currently supported versions can be seen here: https://opendev.org/starlingx/integ/src/branch/master/kubernetes&lt;br /&gt;
* '''''STX.APP.02''''' - StarlingX shall use the latest helm chart(s) and container image release(s) in an effort to stay current from a feature perspective and to include the latest CVE fixes available upstream.&lt;br /&gt;
* '''''STX.APP.03''''' - StarlingX applications shall support all application framework lifecycle operations exercised with the '''system application-xxx''' API/CLI.&lt;br /&gt;
* '''''STX.APP.04''''' - StarlingX applications shall support all application framework lifecycle operations exercised with the '''system system helm-override-xxx''' API/CLI.&lt;br /&gt;
* '''''STX.APP.05''''' - StarlingX applications shall support all application framework lifecycle operations exercised with the '''system helm-chart-attribute-modify''' API/CLI.&lt;br /&gt;
* '''''STX.APP.06''''' - StarlingX applications shall be updatable without operator intervention from one application version to another.&lt;br /&gt;
* '''''STX.APP.07''''' - StarlingX applications shall support automatic updates when a new version is delivered to the platform via a platform patch.&lt;br /&gt;
** This is controlled via the [https://opendev.org/starlingx/config/src/branch/master/sysinv/sysinv/sysinv/sysinv/common/app_metadata.py#L40 application metatdata] packaged with each version of the application&lt;br /&gt;
* '''''STX.APP.08''''' - StarlingX applications shall support orchestrated updates over a platform release upgrade, if a new version of the application is provided in the new release.&lt;br /&gt;
** Currently this is automated via a platform [https://opendev.org/starlingx/config/src/branch/master/controllerconfig/controllerconfig/upgrade-scripts/65-k8s-app-upgrade.sh upgrade-activation script] ([https://opendev.org/starlingx/docs/src/branch/master/doc/source/sample_apps corresponding repo])&lt;br /&gt;
* '''''STX.APP.09''''' - StarlingX applications shall support orchestrated downgrades (i.e., updates to a previous version) over a platform release rollback of an upgrade, if the platform upgrade had resulted in an application upversion.&lt;br /&gt;
** This will be automated via a platform upgrade-activate-rollback script.&lt;br /&gt;
* '''''STX.APP.10''''' - StarlingX applications shall support orchestrated updates over a k8s upgrade if a new version of the application is available on the platform and when a specific version k8s is enabled.&lt;br /&gt;
** This is controlled via the [https://opendev.org/starlingx/config/src/branch/master/sysinv/sysinv/sysinv/sysinv/common/app_metadata.py#L46 application metatdata] packaged with each version of the application&lt;br /&gt;
* '''''STX.APP.11''''' - StarlingX applications should be documented in the StarlingX Documentation explaining the basic purpose, functionality, limitations, and tested use cases for each version of the application available.&lt;br /&gt;
** Based on the current limited documentation, application documentation should be added [https://docs.starlingx.io/sample_apps/index-sample-apps-15fce86ad4bf.html here] ([https://opendev.org/starlingx/docs/src/branch/master/doc/source/sample_apps code repo])&lt;br /&gt;
* '''''STX.APP.12''''' - StarlingX applications should maintain a [[StarlingX/Containers/Applications#Active_Applications|StarlingX Wiki page]] documenting source code location, build instructions, basic functionality, limitations, and testing instructions. The content of the Wiki page should track to the latest content delivered to the master branch.&lt;br /&gt;
* '''''STX.APP.13''''' - StarlingX applications should strive to use unmodified upstream helm charts and integrate into StarlingX with only static/dynamic helm overrides.&lt;br /&gt;
* '''''STX.APP.14''''' - StarlingX applications that need helm chart modifications to properly integrate into StarlingX should upstream those helm chart modifications so that in the future these customizations can be dropped from the product.&lt;br /&gt;
* '''''STX.APP.15''''' - StarlingX applications should be tested in simplex and multi-node environments to ensure the pods/replicas are deployed as desired&lt;br /&gt;
* '''''STX.APP.16''''' - StarlingX applications should be tested in multi-personality environments to ensure the pods/replicas are deployed as as desired on k8s master+worker(AIO) and  master(STD controller) + worker(worker) nodes&lt;br /&gt;
* '''''STX.APP.17''''' - StarlingX applications should be tested over all MTC operations ensure the pods/replicas are operational/scaled/recovered as as desired on all nodes. MTC operations include: install/reinstall/lock/unlock/swact/power-off/reboot&lt;br /&gt;
* '''''STX.APP.18''''' - To support proper CPU affining StarlingX application pods/namespaces should be labeled with '''app.starlingx.io/component=platform''' or '''app.starlingx.io/component=application'''&lt;br /&gt;
** We will standardize helm charts as specified [https://wiki.openstack.org/wiki/StarlingX/Containers/Applications/AppIntegration#Parameterizing_the_Component_Label here].&lt;br /&gt;
* '''''STX.APP.19''''' - StarlingX applications should be compliant with our use of the Pod Security Admission Controller&lt;br /&gt;
* '''''STX.APP.20''''' - StarlingX follows the [https://governance.openstack.org/tc/reference/opens.html Four Opens] and must provide software this is appropriately licensed. Applications that rely on and integrate upstream technologies (helm charts/images), must have a compatible license for inclusion in StarlingX. This implies that as applications are maintained and updated, licenses must be re-checked for compliance.&lt;br /&gt;
** Known list of issues that have impacted applications&lt;br /&gt;
*** [https://redis.com/blog/redis-adopts-dual-source-available-licensing/ Redis Adopts Dual Source-Available Licensing | Redis]&lt;br /&gt;
&lt;br /&gt;
== Active Applications ==&lt;br /&gt;
These applications are currently under development and actively maintained&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-dell-storage | app-dell-storage]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-harbor | app-harbor]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-intel-device-plugins | app-intel-device-plugins]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-intel-ethernet-operator | app-intel-ethernet-operator]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-istio | app-istio]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-kubernetes-power-manager | app-kubernetes-power-manager]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-kubevirt | app-kubevirt]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-metallb | app-metallb]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-node-feature-discovery | app-node-feature-discovery]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-node-interface-metrics-exporter | app-node-interface-metrics-exporter]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-oran-o2 | app-oran-o2]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-power-metrics | app-power-metrics]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-rook-ceph | app-rook-ceph]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-security-profiles-operator | app-security-profiles-operator]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-sriov-fec-operator | app-sriov-fec-operator]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-sts-silicom | app-sts-silicom]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-audit | audit-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-cert-manager | cert-manager-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-metrics-server | metrics-server-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-nginx-ingress-controller | nginx-ingress-controller-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-oidc-auth | oidc-auth-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-openstack | openstack-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-ceph | platform-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-portieris | portieris-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-ptp-notification | ptp-notification-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/rook-ceph-migration | rook-ceph (migration)]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-snmp | snmp-armada-app]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/app-vault | vault-armada-app]]&lt;br /&gt;
&lt;br /&gt;
== Inactive Applications ==&lt;br /&gt;
These applications are currently NOT maintained and their functionality/usability is unknown&lt;br /&gt;
* monitor-armada-app&lt;br /&gt;
* SDO-rv-service&lt;br /&gt;
== Developer Resources ==&lt;br /&gt;
* [[StarlingX/Containers/Applications/HowToAddNewFluxCDAppInSTX | Create a new application]]&lt;br /&gt;
* [[StarlingX/Containers/Applications/AppIntegration | Application Integration with the Platform]]&lt;br /&gt;
&lt;br /&gt;
== Page Archive ==&lt;br /&gt;
* [[StarlingX/Containers/Applications/Archive/HowToAddNewArmadaAppInSTX | How To Add an Armada App]]&lt;br /&gt;
* [[StarlingX/Containers/Application/Archive/ArmadaAppCodeStructure | Armada App Code Structure]]&lt;br /&gt;
* [[StarlingX/Containers/Application/Archive/ConvertingArmadaAppsToFluxCD | Armada to FluxCD Conversion ]]&lt;/div&gt;</summary>
		<author><name>Mohammad.issa</name></author>	</entry>

	</feed>