From 3e03884c476604a717c1fa5fb35771f60e39dd8f Mon Sep 17 00:00:00 2001
From: Pierre Riteau <pierre@stackhpc.com>
Date: Tue, 29 Aug 2023 16:53:49 +0200
Subject: [PATCH] Speed up calls to Bifrost

For overcloud commands involving Bifrost (e.g. overcloud provision), we
use the Bifrost dynamic inventory. This runs bifrost_inventory.py which
gathers node and port information for all bare metal hosts. Because this
gets executed for each node in our inventory, it produces a large number
of API requests to Ironic, which grows as the number of hosts increases.

Halve the number of calls using the BIFROST_NODE_NAMES environment
variable, which restricts fetching port information to just the node
being queried. bifrost_inventory.py still performs one call for each
node, which must be fixed separately in Bifrost [1].

Time to query overcloud nodes' hardware introspection data for 44 hosts:

* before patch: 823 seconds
* after patch: 415 seconds

With the patch to Bifrost [1], this is further reduced to 46 seconds.

[1] https://review.opendev.org/c/openstack/bifrost/+/882950

Change-Id: I341075115442a38c327e3ade74b81b1b9e7e85c6
---
 ansible/overcloud-bios-raid.yml                          | 2 ++
 ansible/overcloud-deprovision.yml                        | 3 +++
 ansible/overcloud-hardware-inspect.yml                   | 4 ++++
 ansible/overcloud-introspection-data-save.yml            | 2 +-
 ansible/overcloud-provision.yml                          | 4 ++++
 releasenotes/notes/bifrost-speedup-9902552b86150ad4.yaml | 5 +++++
 6 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 releasenotes/notes/bifrost-speedup-9902552b86150ad4.yaml

diff --git a/ansible/overcloud-bios-raid.yml b/ansible/overcloud-bios-raid.yml
index 8d657a9b..efa25ad4 100644
--- a/ansible/overcloud-bios-raid.yml
+++ b/ansible/overcloud-bios-raid.yml
@@ -71,6 +71,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -102,6 +103,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
diff --git a/ansible/overcloud-deprovision.yml b/ansible/overcloud-deprovision.yml
index e907508e..76bd3445 100644
--- a/ansible/overcloud-deprovision.yml
+++ b/ansible/overcloud-deprovision.yml
@@ -38,6 +38,7 @@
         export OS_CLOUD=bifrost &&
         export OS_BAREMETAL_API_VERSION=1.34 &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -72,6 +73,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal -vvvv
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -98,6 +100,7 @@
         export OS_CLOUD=bifrost &&
         export OS_BAREMETAL_API_VERSION=1.34 &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
diff --git a/ansible/overcloud-hardware-inspect.yml b/ansible/overcloud-hardware-inspect.yml
index e784f201..3477b7c1 100644
--- a/ansible/overcloud-hardware-inspect.yml
+++ b/ansible/overcloud-hardware-inspect.yml
@@ -32,6 +32,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -66,6 +67,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal -vvvv
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -91,6 +93,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal -vvvv
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -115,6 +118,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
diff --git a/ansible/overcloud-introspection-data-save.yml b/ansible/overcloud-introspection-data-save.yml
index 25c0d360..945567b8 100644
--- a/ansible/overcloud-introspection-data-save.yml
+++ b/ansible/overcloud-introspection-data-save.yml
@@ -13,7 +13,7 @@
       command: >
         docker exec bifrost_deploy
         bash -c '
-        env BIFROST_INVENTORY_SOURCE=ironic OS_CLOUD=bifrost
+        env BIFROST_INVENTORY_SOURCE=ironic BIFROST_NODE_NAMES="{{ inventory_hostname }}" OS_CLOUD=bifrost
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
diff --git a/ansible/overcloud-provision.yml b/ansible/overcloud-provision.yml
index d1536de3..20ef8be9 100644
--- a/ansible/overcloud-provision.yml
+++ b/ansible/overcloud-provision.yml
@@ -43,6 +43,7 @@
         export OS_CLOUD=bifrost &&
         export OS_BAREMETAL_API_VERSION=1.34 &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -77,6 +78,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal -vvvv
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -102,6 +104,7 @@
         bash -c '
         export OS_CLOUD=bifrost &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal -vvvv
         --connection local
         --inventory /etc/bifrost/inventory/
@@ -166,6 +169,7 @@
         export OS_CLOUD=bifrost &&
         export OS_BAREMETAL_API_VERSION=1.34 &&
         export BIFROST_INVENTORY_SOURCE=ironic &&
+        export BIFROST_NODE_NAMES="{{ inventory_hostname }}" &&
         ansible baremetal
         --connection local
         --inventory /etc/bifrost/inventory/
diff --git a/releasenotes/notes/bifrost-speedup-9902552b86150ad4.yaml b/releasenotes/notes/bifrost-speedup-9902552b86150ad4.yaml
new file mode 100644
index 00000000..2f1473fe
--- /dev/null
+++ b/releasenotes/notes/bifrost-speedup-9902552b86150ad4.yaml
@@ -0,0 +1,5 @@
+---
+fixes:
+  - |
+    Improves performance of Bifrost operations by preventing unnecessary
+    requests to the Ironic API.
-- 
GitLab