Repository: metal3-io/baremetal-operator

Issue:
Enable "forbidigo" linter in golangci-lint
Enable "forbidigo" linter in golangci-lint. Fix any warnings enabling it causes.

/area ci
/help
/triage accepted

Hints from issue comments:
@metal3-io-bot: @tuminoid: 
	This request has been marked as needing help from a contributor.

Please ensure the request meets the requirements listed [here](https://git.k8s.io/community/contributors/guide/help-wanted.md).

If this request no longer meets these requirements, the label can be removed
by commenting with the `/remove-help` command.


<details>

In response to [this](https://github.com/metal3-io/baremetal-operator/issues/2356):

>Enable "forbidigo" linter in golangci-lint. Fix any warnings enabling it causes.
>
>/area ci
>/help
>/triage accepted


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>@metal3-io-bot: @tuminoid: The label(s) `area/ci` cannot be applied, because the repository doesn't have them.

<details>

In response to [this](https://github.com/metal3-io/baremetal-operator/issues/2356):

>Enable "forbidigo" linter in golangci-lint. Fix any warnings enabling it causes.
>
>/area ci
>/help
>/triage accepted


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>@erjavaskivuori: /assign

Solution patch:
diff --git a/.github/workflows/e2e-test-optional-periodic.yml b/.github/workflows/e2e-test-optional-periodic.yml
index ea54d1ae..4c67fb86 100644
--- a/.github/workflows/e2e-test-optional-periodic.yml
+++ b/.github/workflows/e2e-test-optional-periodic.yml
@@ -4,6 +4,7 @@ on:
   schedule:
   # Run every day at 04:20 UTC (it is recommended to avoid running at the start of the hour)
   - cron: '20 4 * * *'
+  workflow_dispatch:
 
 permissions: {}
 
diff --git a/.github/workflows/e2e-test-periodic-main.yml b/.github/workflows/e2e-test-periodic-main.yml
index 9ed6cfcd..488c1eb4 100644
--- a/.github/workflows/e2e-test-periodic-main.yml
+++ b/.github/workflows/e2e-test-periodic-main.yml
@@ -4,6 +4,7 @@ on:
   schedule:
   # Run every day at 02:20 UTC (it is recommended to avoid running at the start of the hour)
   - cron: '20 2 * * *'
+  workflow_dispatch:
 
 permissions: {}
 
diff --git a/.github/workflows/e2e-test-periodic-release-0.10.yml b/.github/workflows/e2e-test-periodic-release-0.10.yml
index f3aae76e..d8460693 100644
--- a/.github/workflows/e2e-test-periodic-release-0.10.yml
+++ b/.github/workflows/e2e-test-periodic-release-0.10.yml
@@ -4,6 +4,7 @@ on:
   schedule:
   # Run every day at 02:50 UTC (it is recommended to avoid running at the start of the hour)
   - cron: '50 2 * * *'
+  workflow_dispatch:
 
 permissions: {}
 
diff --git a/.github/workflows/e2e-test-periodic-release-0.8.yml b/.github/workflows/e2e-test-periodic-release-0.8.yml
index 28b89786..d2d39780 100644
--- a/.github/workflows/e2e-test-periodic-release-0.8.yml
+++ b/.github/workflows/e2e-test-periodic-release-0.8.yml
@@ -4,6 +4,7 @@ on:
   schedule:
   # Run every day at 02:20 UTC (it is recommended to avoid running at the start of the hour)
   - cron: '20 2 * * *'
+  workflow_dispatch:
 
 permissions: {}
 
diff --git a/.github/workflows/e2e-test-periodic-release-0.9.yml b/.github/workflows/e2e-test-periodic-release-0.9.yml
index 8a3d5ca5..1ecf025f 100644
--- a/.github/workflows/e2e-test-periodic-release-0.9.yml
+++ b/.github/workflows/e2e-test-periodic-release-0.9.yml
@@ -4,6 +4,7 @@ on:
   schedule:
   # Run every day at 03:20 UTC (it is recommended to avoid running at the start of the hour)
   - cron: '20 3 * * *'
+  workflow_dispatch:
 
 permissions: {}
 
diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml
index 24072a66..bf72050c 100644
--- a/.github/workflows/pipeline.yml
+++ b/.github/workflows/pipeline.yml
@@ -38,8 +38,7 @@ jobs:
       matrix:
         bmc-protocol:
         - redfish-virtualmedia
-        # TODO(lentzi90): Enable again when https://github.com/metal3-io/baremetal-operator/issues/2456 is fixed.
-        # - ipmi
+        - ipmi
     uses: ./.github/workflows/e2e-test.yml
     with:
       bmc-protocol: ${{ matrix.bmc-protocol }}
diff --git a/.golangci.yaml b/.golangci.yaml
index a632cc93..5d6ae292 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -24,7 +24,7 @@ linters:
   #- exhaustive
   - exptostd
   - fatcontext
-  #- forbidigo
+  - forbidigo
   #- forcetypeassert
   - gci
   - ginkgolinter
diff --git a/apis/go.mod b/apis/go.mod
index 029cf92f..49d69bd3 100644
--- a/apis/go.mod
+++ b/apis/go.mod
@@ -6,8 +6,8 @@ require (
 	github.com/google/uuid v1.6.0
 	github.com/metal3-io/baremetal-operator/pkg/hardwareutils v0.5.1
 	github.com/stretchr/testify v1.10.0
-	k8s.io/api v0.32.4
-	k8s.io/apimachinery v0.32.4
+	k8s.io/api v0.32.5
+	k8s.io/apimachinery v0.32.5
 	sigs.k8s.io/controller-runtime v0.20.4
 )
 
@@ -55,8 +55,8 @@ require (
 	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/apiextensions-apiserver v0.32.4 // indirect
-	k8s.io/client-go v0.32.4 // indirect
+	k8s.io/apiextensions-apiserver v0.32.5 // indirect
+	k8s.io/client-go v0.32.5 // indirect
 	k8s.io/klog/v2 v2.130.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
 	k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
diff --git a/apis/go.sum b/apis/go.sum
index 3d37e8b7..fa111729 100644
--- a/apis/go.sum
+++ b/apis/go.sum
@@ -166,14 +166,14 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.32.4 h1:kw8Y/G8E7EpNy7gjB8gJZl3KJkNz8HM2YHrZPtAZsF4=
-k8s.io/api v0.32.4/go.mod h1:5MYFvLvweRhyKylM3Es/6uh/5hGp0dg82vP34KifX4g=
-k8s.io/apiextensions-apiserver v0.32.4 h1:IA+CoR63UDOijR/vEpow6wQnX4V6iVpzazJBskHrpHE=
-k8s.io/apiextensions-apiserver v0.32.4/go.mod h1:Y06XO/b92H8ymOdG1HlA1submf7gIhbEDc3RjriqZOs=
-k8s.io/apimachinery v0.32.4 h1:8EEksaxA7nd7xWJkkwLDN4SvWS5ot9g6Z/VZb3ju25I=
-k8s.io/apimachinery v0.32.4/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/client-go v0.32.4 h1:zaGJS7xoYOYumoWIFXlcVrsiYioRPrXGO7dBfVC5R6M=
-k8s.io/client-go v0.32.4/go.mod h1:k0jftcyYnEtwlFW92xC7MTtFv5BNcZBr+zn9jPlT9Ic=
+k8s.io/api v0.32.5 h1:uqjjsYo1kTJr5NIcoIaP9F+TgXgADH7nKQx91FDAhtk=
+k8s.io/api v0.32.5/go.mod h1:bXXFU3fGCZ/eFMZvfHZC69PeGbXEL4zzjuPVzOxHF64=
+k8s.io/apiextensions-apiserver v0.32.5 h1:o0aKvmzIIs8Uk54pidk32pxET+Pg2ULnh9WI1PuKTwE=
+k8s.io/apiextensions-apiserver v0.32.5/go.mod h1:5fpedJa3HJJFBukAZ6ur91DEDye5gYuXISPbOiNLYpU=
+k8s.io/apimachinery v0.32.5 h1:6We3aJ6crC0ap8EhsEXcgX3LpI6SEjubpiOMXLROwPM=
+k8s.io/apimachinery v0.32.5/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/client-go v0.32.5 h1:huFmQMzgWu0z4kbWsuZci+Gt4Fo72I4CcrvhToZ/Qp0=
+k8s.io/client-go v0.32.5/go.mod h1:Qchw6f9WIVrur7DKojAHpRgGLcANT0RLIvF39Jz58xA=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
diff --git a/cmd/get-hardware-details/main.go b/cmd/get-hardware-details/main.go
index 3638f857..288320a4 100644
--- a/cmd/get-hardware-details/main.go
+++ b/cmd/get-hardware-details/main.go
@@ -6,6 +6,7 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"log"
 	"net"
 	"net/url"
 	"os"
@@ -44,8 +45,7 @@ func main() {
 	endpoint := opts.Endpoint
 	parsedEndpoint, err := url.Parse(endpoint)
 	if err != nil {
-		fmt.Printf("invalid ironic endpoint: %s", err)
-		os.Exit(1)
+		log.Fatalf("invalid ironic endpoint: %s", err)
 	}
 
 	// Previously, this command accepted the Inspector endpoint. But since
@@ -59,37 +59,33 @@ func main() {
 
 	ironic, err := clients.IronicClient(endpoint, opts.AuthConfig, tlsConf)
 	if err != nil {
-		fmt.Printf("could not get ironic client: %s", err)
-		os.Exit(1)
+		log.Fatalf("could not get ironic client: %s", err)
 	}
 
 	introData := nodes.GetInventory(context.TODO(), ironic, opts.NodeID)
 	data, err := introData.Extract()
 	if err != nil {
-		fmt.Printf("could not get inspection data: %s", err)
-		os.Exit(1)
+		log.Fatalf("could not get inspection data: %s", err)
 	}
 
 	json, err := json.MarshalIndent(hardwaredetails.GetHardwareDetails(data, klog.NewKlogr()), "", "\t")
 	if err != nil {
-		fmt.Printf("could not convert inspection data: %s", err)
-		os.Exit(1)
+		log.Fatalf("could not convert inspection data: %s", err)
 	}
 
+	//nolint:forbidigo
 	fmt.Println(string(json))
 }
 
 func getOptions() (o options) {
 	if len(os.Args) != reqOptArgs {
-		fmt.Println("Usage: get-hardware-details <ironic URI> <node UUID>")
-		os.Exit(1)
+		log.Fatalln("Usage: get-hardware-details <ironic URI> <node UUID>")
 	}
 
 	var err error
 	o.Endpoint, o.AuthConfig, err = clients.ConfigFromEndpointURL(os.Args[1])
 	if err != nil {
-		fmt.Printf("Error: %s\n", err)
-		os.Exit(1)
+		log.Fatalf("Error: %s\n", err)
 	}
 	o.NodeID = os.Args[2]
 	return
diff --git a/cmd/make-virt-host/main.go b/cmd/make-virt-host/main.go
index afbe81de..c4f5edca 100644
--- a/cmd/make-virt-host/main.go
+++ b/cmd/make-virt-host/main.go
@@ -5,7 +5,7 @@ import (
 	"encoding/json"
 	"encoding/xml"
 	"flag"
-	"fmt"
+	"log"
 	"os"
 	"os/exec"
 	"strings"
@@ -140,39 +140,34 @@ func main() {
 
 	virshDomain := flag.Arg(0)
 	if virshDomain == "" {
-		fmt.Fprintf(os.Stderr, "Missing domain argument\n")
-		os.Exit(1)
+		log.Fatalln("Missing domain argument")
 	}
 
 	if *verbose {
-		fmt.Printf("net: %s domain: %s\n", *provisionNet, virshDomain)
+		log.Printf("net: %s domain: %s\n", *provisionNet, virshDomain)
 	}
 
 	// Figure out the MAC for the VM
 	virshOut, err := exec.Command("sudo", "virsh", "dumpxml", virshDomain).Output() // #nosec
 	if err != nil {
-		fmt.Fprintf(os.Stderr,
-			"ERROR: Could not get details of domain %s: %s\n",
+		log.Fatalf("ERROR: Could not get details of domain %s: %s\n",
 			virshDomain, err)
-		os.Exit(1)
 	}
 
 	domainResult := Domain{}
 	err = xml.Unmarshal(virshOut, &domainResult)
 	if err != nil {
-		fmt.Fprintf(os.Stderr,
-			"ERROR: Could not unmarshal details of domain %s: %s\n",
+		log.Fatalf("ERROR: Could not unmarshal details of domain %s: %s\n",
 			virshDomain, err)
-		os.Exit(1)
 	}
 
 	if *verbose {
-		fmt.Printf("%v\n", domainResult)
+		log.Printf("%v\n", domainResult)
 	}
 
 	for _, iface := range domainResult.Interfaces {
 		if *verbose {
-			fmt.Printf("%v\n", iface)
+			log.Printf("%v\n", iface)
 		}
 		if iface.Source.Bridge == *provisionNet {
 			desiredMAC = iface.MAC.Address
@@ -184,33 +179,30 @@ func main() {
 	b64Password := base64.StdEncoding.EncodeToString([]byte(*password))
 
 	if *verbose {
-		fmt.Printf("Using MAC: %s\n", desiredMAC)
+		log.Printf("Using MAC: %s\n", desiredMAC)
 	}
 	if desiredMAC == "" {
-		fmt.Fprintf(os.Stderr, "Could not find MAC for %s on network %s\n",
+		log.Fatalf("Could not find MAC for %s on network %s\n",
 			virshDomain, *provisionNet)
-		os.Exit(1)
 	}
 
 	vbmcOut, err := exec.Command(
 		"vbmc", "list", "-f", "json", "-c", "Domain name", "-c", "Port",
 	).Output()
 	if err != nil {
-		fmt.Fprintf(os.Stderr, "ERROR: Could not get details of vbmc: %s\n", err)
-		os.Exit(1)
+		log.Fatalf("ERROR: Could not get details of vbmc: %s\n", err)
 	}
 
 	var vbmcResult []VBMC
 	err = json.Unmarshal(vbmcOut, &vbmcResult)
 	if err != nil {
-		fmt.Fprintf(os.Stderr, "ERROR: Could not unmarshal details of vbmc: %s\n", err)
-		os.Exit(1)
+		log.Fatalf("ERROR: Could not unmarshal details of vbmc: %s\n", err)
 	}
 
 	nameToPort := make(map[string]int)
 	for _, vbmc := range vbmcResult {
 		if *verbose {
-			fmt.Printf("VBMC: %s: %d\n", vbmc.Name, vbmc.Port)
+			log.Printf("VBMC: %s: %d\n", vbmc.Name, vbmc.Port)
 		}
 		nameToPort[vbmc.Name] = vbmc.Port
 	}
@@ -230,6 +222,6 @@ func main() {
 	t := yamltemplate.Must(yamltemplate.New("yaml_out").Parse(templateBody))
 	err = t.Execute(os.Stdout, args)
 	if err != nil {
-		fmt.Fprintf(os.Stderr, "ERROR: %s\n", err)
+		log.Printf("ERROR: %s\n", err)
 	}
 }
diff --git a/go.mod b/go.mod
index 56a227ad..ace3b15f 100644
--- a/go.mod
+++ b/go.mod
@@ -13,12 +13,12 @@ require (
 	github.com/pkg/errors v0.9.1
 	github.com/prometheus/client_golang v1.22.0
 	github.com/stretchr/testify v1.10.0
-	go.etcd.io/etcd/client/pkg/v3 v3.5.21
+	go.etcd.io/etcd/client/pkg/v3 v3.6.0
 	go.uber.org/zap v1.27.0
-	k8s.io/api v0.32.4
-	k8s.io/apimachinery v0.32.4
-	k8s.io/client-go v0.32.4
-	k8s.io/component-base v0.32.4
+	k8s.io/api v0.32.5
+	k8s.io/apimachinery v0.32.5
+	k8s.io/client-go v0.32.5
+	k8s.io/component-base v0.32.5
 	k8s.io/klog/v2 v2.130.1
 	k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
 	sigs.k8s.io/controller-runtime v0.20.4
@@ -94,8 +94,8 @@ require (
 	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/apiextensions-apiserver v0.32.4 // indirect
-	k8s.io/apiserver v0.32.4 // indirect
+	k8s.io/apiextensions-apiserver v0.32.5 // indirect
+	k8s.io/apiserver v0.32.5 // indirect
 	k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
 	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect
 	sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
diff --git a/go.sum b/go.sum
index 6f3a99da..8ff720df 100644
--- a/go.sum
+++ b/go.sum
@@ -118,8 +118,8 @@ github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ
 github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
 github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
 github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
-github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
-github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
 github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
@@ -140,8 +140,8 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc=
-go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs=
+go.etcd.io/etcd/client/pkg/v3 v3.6.0 h1:nchnPqpuxvv3UuGGHaz0DQKYi5EIW5wOYsgUNRc365k=
+go.etcd.io/etcd/client/pkg/v3 v3.6.0/go.mod h1:Jv5SFWMnGvIBn8o3OaBq/PnT0jjsX8iNokAUessNjoA=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
 go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
@@ -227,18 +227,18 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.32.4 h1:kw8Y/G8E7EpNy7gjB8gJZl3KJkNz8HM2YHrZPtAZsF4=
-k8s.io/api v0.32.4/go.mod h1:5MYFvLvweRhyKylM3Es/6uh/5hGp0dg82vP34KifX4g=
-k8s.io/apiextensions-apiserver v0.32.4 h1:IA+CoR63UDOijR/vEpow6wQnX4V6iVpzazJBskHrpHE=
-k8s.io/apiextensions-apiserver v0.32.4/go.mod h1:Y06XO/b92H8ymOdG1HlA1submf7gIhbEDc3RjriqZOs=
-k8s.io/apimachinery v0.32.4 h1:8EEksaxA7nd7xWJkkwLDN4SvWS5ot9g6Z/VZb3ju25I=
-k8s.io/apimachinery v0.32.4/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apiserver v0.32.4 h1:Yf7sd/y+GOQKH1Qf6wUeayZrYXe2SKZ17Bcq7VQM5HQ=
-k8s.io/apiserver v0.32.4/go.mod h1:JFUMNtE2M5yqLZpIsgCb06SkVSW1YcxW1oyLSTfjXR8=
-k8s.io/client-go v0.32.4 h1:zaGJS7xoYOYumoWIFXlcVrsiYioRPrXGO7dBfVC5R6M=
-k8s.io/client-go v0.32.4/go.mod h1:k0jftcyYnEtwlFW92xC7MTtFv5BNcZBr+zn9jPlT9Ic=
-k8s.io/component-base v0.32.4 h1:HuF+2JVLbFS5GODLIfPCb1Td6b+G2HszJoArcWOSr5I=
-k8s.io/component-base v0.32.4/go.mod h1:10KloJEYw1keU/Xmjfy9TKJqUq7J2mYdiD1VDXoco4o=
+k8s.io/api v0.32.5 h1:uqjjsYo1kTJr5NIcoIaP9F+TgXgADH7nKQx91FDAhtk=
+k8s.io/api v0.32.5/go.mod h1:bXXFU3fGCZ/eFMZvfHZC69PeGbXEL4zzjuPVzOxHF64=
+k8s.io/apiextensions-apiserver v0.32.5 h1:o0aKvmzIIs8Uk54pidk32pxET+Pg2ULnh9WI1PuKTwE=
+k8s.io/apiextensions-apiserver v0.32.5/go.mod h1:5fpedJa3HJJFBukAZ6ur91DEDye5gYuXISPbOiNLYpU=
+k8s.io/apimachinery v0.32.5 h1:6We3aJ6crC0ap8EhsEXcgX3LpI6SEjubpiOMXLROwPM=
+k8s.io/apimachinery v0.32.5/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/apiserver v0.32.5 h1:phmm2EOUVFI+cLiq8Grtuh166fTt/qgvkGPkpgzp5uY=
+k8s.io/apiserver v0.32.5/go.mod h1:5bfueS1tgARVWVXRJBMI5mHoCmev0jOvbxebai/kiqc=
+k8s.io/client-go v0.32.5 h1:huFmQMzgWu0z4kbWsuZci+Gt4Fo72I4CcrvhToZ/Qp0=
+k8s.io/client-go v0.32.5/go.mod h1:Qchw6f9WIVrur7DKojAHpRgGLcANT0RLIvF39Jz58xA=
+k8s.io/component-base v0.32.5 h1:2HiX+m3s9Iz5CMqdCVDH2V942UqzQvjuhcXb4W+KCsg=
+k8s.io/component-base v0.32.5/go.mod h1:jDsPNFFElv9m27TcYxlpEX7TZ3vdgx2g4PaqMUHpV/Y=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
diff --git a/hack/tools/deploy-cli/deploy-cli.go b/hack/tools/deploy-cli/deploy-cli.go
index f8a12646..e90da7bd 100644
--- a/hack/tools/deploy-cli/deploy-cli.go
+++ b/hack/tools/deploy-cli/deploy-cli.go
@@ -444,10 +444,10 @@ func kubectlApply(ctx context.Context, kubeconfigPath string, resources []byte,
 		testexec.WithStdin(rbytes),
 	)
 
-	fmt.Printf("Running kubectl %s\n", strings.Join(aargs, " "))
+	log.Printf("Running kubectl %s\n", strings.Join(aargs, " "))
 	stdout, stderr, err := applyCmd.Run(ctx)
-	fmt.Printf("stderr:\n%s\n", string(stderr))
-	fmt.Printf("stdout:\n%s\n", string(stdout))
+	log.Printf("stderr:\n%s\n", string(stderr))
+	log.Printf("stdout:\n%s\n", string(stdout))
 	return err
 }
 
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index baef2c45..7f9a50b0 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -56,9 +56,9 @@ require (
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/api v0.32.4 // indirect
-	k8s.io/apiextensions-apiserver v0.32.4 // indirect
-	k8s.io/apimachinery v0.32.4 // indirect
+	k8s.io/api v0.32.5 // indirect
+	k8s.io/apiextensions-apiserver v0.32.5 // indirect
+	k8s.io/apimachinery v0.32.5 // indirect
 	k8s.io/klog/v2 v2.130.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 // indirect
 	k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index f49ec8b9..bb74d09b 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -178,12 +178,12 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.32.4 h1:kw8Y/G8E7EpNy7gjB8gJZl3KJkNz8HM2YHrZPtAZsF4=
-k8s.io/api v0.32.4/go.mod h1:5MYFvLvweRhyKylM3Es/6uh/5hGp0dg82vP34KifX4g=
-k8s.io/apiextensions-apiserver v0.32.4 h1:IA+CoR63UDOijR/vEpow6wQnX4V6iVpzazJBskHrpHE=
-k8s.io/apiextensions-apiserver v0.32.4/go.mod h1:Y06XO/b92H8ymOdG1HlA1submf7gIhbEDc3RjriqZOs=
-k8s.io/apimachinery v0.32.4 h1:8EEksaxA7nd7xWJkkwLDN4SvWS5ot9g6Z/VZb3ju25I=
-k8s.io/apimachinery v0.32.4/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/api v0.32.5 h1:uqjjsYo1kTJr5NIcoIaP9F+TgXgADH7nKQx91FDAhtk=
+k8s.io/api v0.32.5/go.mod h1:bXXFU3fGCZ/eFMZvfHZC69PeGbXEL4zzjuPVzOxHF64=
+k8s.io/apiextensions-apiserver v0.32.5 h1:o0aKvmzIIs8Uk54pidk32pxET+Pg2ULnh9WI1PuKTwE=
+k8s.io/apiextensions-apiserver v0.32.5/go.mod h1:5fpedJa3HJJFBukAZ6ur91DEDye5gYuXISPbOiNLYpU=
+k8s.io/apimachinery v0.32.5 h1:6We3aJ6crC0ap8EhsEXcgX3LpI6SEjubpiOMXLROwPM=
+k8s.io/apimachinery v0.32.5/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 h1:hcha5B1kVACrLujCKLbr8XWMxCxzQx42DY8QKYJrDLg=
diff --git a/ironic-deployment/overlays/e2e-release-24.1/ironic_bmo_configmap.env b/ironic-deployment/overlays/e2e-release-24.1/ironic_bmo_configmap.env
index 9dc4c4bf..3e41bfbe 100644
--- a/ironic-deployment/overlays/e2e-release-24.1/ironic_bmo_configmap.env
+++ b/ironic-deployment/overlays/e2e-release-24.1/ironic_bmo_configmap.env
@@ -1,6 +1,8 @@
 HTTP_PORT=6180
 PROVISIONING_INTERFACE=eth0
 CACHEURL=http://192.168.222.1/images
+IRONIC_HTTP_URL=http://192.168.222.1:6180
+IRONIC_BASE_URL=https://192.168.222.1:6385
 IRONIC_EXTERNAL_CALLBACK_URL=https://192.168.222.1:6385
 IRONIC_KERNEL_PARAMS=console=ttyS0
 IRONIC_INSPECTOR_VLAN_INTERFACES=all
diff --git a/ironic-deployment/overlays/e2e-release-25.0/ironic_bmo_configmap.env b/ironic-deployment/overlays/e2e-release-25.0/ironic_bmo_configmap.env
index 9dc4c4bf..3e41bfbe 100644
--- a/ironic-deployment/overlays/e2e-release-25.0/ironic_bmo_configmap.env
+++ b/ironic-deployment/overlays/e2e-release-25.0/ironic_bmo_configmap.env
@@ -1,6 +1,8 @@
 HTTP_PORT=6180
 PROVISIONING_INTERFACE=eth0
 CACHEURL=http://192.168.222.1/images
+IRONIC_HTTP_URL=http://192.168.222.1:6180
+IRONIC_BASE_URL=https://192.168.222.1:6385
 IRONIC_EXTERNAL_CALLBACK_URL=https://192.168.222.1:6385
 IRONIC_KERNEL_PARAMS=console=ttyS0
 IRONIC_INSPECTOR_VLAN_INTERFACES=all
diff --git a/ironic-deployment/overlays/e2e-release-26.0/ironic_bmo_configmap.env b/ironic-deployment/overlays/e2e-release-26.0/ironic_bmo_configmap.env
index 9dc4c4bf..3e41bfbe 100644
--- a/ironic-deployment/overlays/e2e-release-26.0/ironic_bmo_configmap.env
+++ b/ironic-deployment/overlays/e2e-release-26.0/ironic_bmo_configmap.env
@@ -1,6 +1,8 @@
 HTTP_PORT=6180
 PROVISIONING_INTERFACE=eth0
 CACHEURL=http://192.168.222.1/images
+IRONIC_HTTP_URL=http://192.168.222.1:6180
+IRONIC_BASE_URL=https://192.168.222.1:6385
 IRONIC_EXTERNAL_CALLBACK_URL=https://192.168.222.1:6385
 IRONIC_KERNEL_PARAMS=console=ttyS0
 IRONIC_INSPECTOR_VLAN_INTERFACES=all
diff --git a/ironic-deployment/overlays/e2e/ironic_bmo_configmap.env b/ironic-deployment/overlays/e2e/ironic_bmo_configmap.env
index 7ff71bd2..ae14e9bc 100644
--- a/ironic-deployment/overlays/e2e/ironic_bmo_configmap.env
+++ b/ironic-deployment/overlays/e2e/ironic_bmo_configmap.env
@@ -1,6 +1,7 @@
 HTTP_PORT=6180
 PROVISIONING_INTERFACE=eth0
 CACHEURL=http://192.168.222.1/images
+IRONIC_HTTP_URL=http://192.168.222.1:6180
 IRONIC_BASE_URL=https://192.168.222.1:6385
 IRONIC_EXTERNAL_CALLBACK_URL=https://192.168.222.1:6385
 IRONIC_KERNEL_PARAMS=console=ttyS0



Test patch:
diff --git a/test/e2e/README.md b/test/e2e/README.md
index 5db5f98b..7f6fa1a4 100644
--- a/test/e2e/README.md
+++ b/test/e2e/README.md
@@ -8,11 +8,12 @@ be reusable so that they can run also on real hardware. This is accomplished by
 tuning the tests based on a configuration file and flags. Examples can be seen
 in `config`.
 
-In the CI system we set up a pre-configured minikube cluster that is then used
-for the tests, as seen in [ci-e2e.sh](../../hack/ci-e2e.sh). This allows us to
-have control over the network and have a static configuration for Ironic and the
-Baremetal Operator. The script creates a VM to represent a BareMetalHost, and
-configures either VBMC or sushy-tools to be used as BMC.
+In the CI system we use a script ([ci-e2e.sh](../../hack/ci-e2e.sh)) to make
+some preparations before running the test suite. The script creates VMs to
+represent BareMetalHosts, and configures either VBMC or sushy-tools to be used
+as BMC. Ironic runs in the "host network" of the kind cluster in the test. The
+kind cluster is then configured to expose the relevant ports on the actual host
+so that they can be reached from the BareMetalHost VMs.
 
 Currently there are two sets of tests, which cannot be ran together in the same
 cluster. One is the "optional" set, currently consists of only the
diff --git a/test/e2e/common.go b/test/e2e/common.go
index d4af7504..69fc5c11 100644
--- a/test/e2e/common.go
+++ b/test/e2e/common.go
@@ -11,6 +11,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"io"
+	"log"
 	"net"
 	"net/http"
 	"os"
@@ -444,10 +445,10 @@ func KubectlDelete(ctx context.Context, kubeconfigPath string, resources []byte,
 		testexec.WithStdin(rbytes),
 	)
 
-	fmt.Printf("Running kubectl %s\n", strings.Join(aargs, " "))
+	log.Printf("Running kubectl %s\n", strings.Join(aargs, " "))
 	stdout, stderr, err := deleteCmd.Run(ctx)
-	fmt.Printf("stderr:\n%s\n", string(stderr))
-	fmt.Printf("stdout:\n%s\n", string(stdout))
+	log.Printf("stderr:\n%s\n", string(stderr))
+	log.Printf("stdout:\n%s\n", string(stdout))
 	return err
 }
 
diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go
index 19fe4c59..fe787ec0 100644
--- a/test/e2e/e2e_suite_test.go
+++ b/test/e2e/e2e_suite_test.go
@@ -8,6 +8,7 @@ import (
 	"encoding/json"
 	"flag"
 	"fmt"
+	"log"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -242,7 +243,7 @@ var _ = SynchronizedBeforeSuite(func() []byte {
 			cmd := exec.Command("kubectl", "get", "service", metricsServiceName, "-n", namespace)
 			output, err := cmd.CombinedOutput()
 			if err != nil {
-				fmt.Printf("Service check output: %s\n", string(output))
+				log.Printf("Service check output: %s\n", string(output))
 				return err
 			}
 			return nil
diff --git a/test/go.mod b/test/go.mod
index c18bc22c..00f0ec24 100644
--- a/test/go.mod
+++ b/test/go.mod
@@ -12,9 +12,9 @@ require (
 	github.com/pkg/errors v0.9.1
 	golang.org/x/crypto v0.38.0
 	gopkg.in/yaml.v2 v2.4.0
-	k8s.io/api v0.32.4
-	k8s.io/apiextensions-apiserver v0.32.4
-	k8s.io/apimachinery v0.32.4
+	k8s.io/api v0.32.5
+	k8s.io/apiextensions-apiserver v0.32.5
+	k8s.io/apimachinery v0.32.5
 	k8s.io/klog/v2 v2.130.1
 	k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
 	libvirt.org/go/libvirt v1.11002.0
@@ -148,10 +148,10 @@ require (
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gotest.tools/v3 v3.5.0 // indirect
-	k8s.io/apiserver v0.32.4 // indirect
-	k8s.io/client-go v0.32.4 // indirect
+	k8s.io/apiserver v0.32.5 // indirect
+	k8s.io/client-go v0.32.5 // indirect
 	k8s.io/cluster-bootstrap v0.32.3 // indirect
-	k8s.io/component-base v0.32.4 // indirect
+	k8s.io/component-base v0.32.5 // indirect
 	k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 // indirect
 	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect
 	sigs.k8s.io/gateway-api v1.1.0 // indirect
diff --git a/test/go.sum b/test/go.sum
index 31f9e2a3..eaeed7ea 100644
--- a/test/go.sum
+++ b/test/go.sum
@@ -378,20 +378,20 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY=
 gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
-k8s.io/api v0.32.4 h1:kw8Y/G8E7EpNy7gjB8gJZl3KJkNz8HM2YHrZPtAZsF4=
-k8s.io/api v0.32.4/go.mod h1:5MYFvLvweRhyKylM3Es/6uh/5hGp0dg82vP34KifX4g=
-k8s.io/apiextensions-apiserver v0.32.4 h1:IA+CoR63UDOijR/vEpow6wQnX4V6iVpzazJBskHrpHE=
-k8s.io/apiextensions-apiserver v0.32.4/go.mod h1:Y06XO/b92H8ymOdG1HlA1submf7gIhbEDc3RjriqZOs=
-k8s.io/apimachinery v0.32.4 h1:8EEksaxA7nd7xWJkkwLDN4SvWS5ot9g6Z/VZb3ju25I=
-k8s.io/apimachinery v0.32.4/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apiserver v0.32.4 h1:Yf7sd/y+GOQKH1Qf6wUeayZrYXe2SKZ17Bcq7VQM5HQ=
-k8s.io/apiserver v0.32.4/go.mod h1:JFUMNtE2M5yqLZpIsgCb06SkVSW1YcxW1oyLSTfjXR8=
-k8s.io/client-go v0.32.4 h1:zaGJS7xoYOYumoWIFXlcVrsiYioRPrXGO7dBfVC5R6M=
-k8s.io/client-go v0.32.4/go.mod h1:k0jftcyYnEtwlFW92xC7MTtFv5BNcZBr+zn9jPlT9Ic=
+k8s.io/api v0.32.5 h1:uqjjsYo1kTJr5NIcoIaP9F+TgXgADH7nKQx91FDAhtk=
+k8s.io/api v0.32.5/go.mod h1:bXXFU3fGCZ/eFMZvfHZC69PeGbXEL4zzjuPVzOxHF64=
+k8s.io/apiextensions-apiserver v0.32.5 h1:o0aKvmzIIs8Uk54pidk32pxET+Pg2ULnh9WI1PuKTwE=
+k8s.io/apiextensions-apiserver v0.32.5/go.mod h1:5fpedJa3HJJFBukAZ6ur91DEDye5gYuXISPbOiNLYpU=
+k8s.io/apimachinery v0.32.5 h1:6We3aJ6crC0ap8EhsEXcgX3LpI6SEjubpiOMXLROwPM=
+k8s.io/apimachinery v0.32.5/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/apiserver v0.32.5 h1:phmm2EOUVFI+cLiq8Grtuh166fTt/qgvkGPkpgzp5uY=
+k8s.io/apiserver v0.32.5/go.mod h1:5bfueS1tgARVWVXRJBMI5mHoCmev0jOvbxebai/kiqc=
+k8s.io/client-go v0.32.5 h1:huFmQMzgWu0z4kbWsuZci+Gt4Fo72I4CcrvhToZ/Qp0=
+k8s.io/client-go v0.32.5/go.mod h1:Qchw6f9WIVrur7DKojAHpRgGLcANT0RLIvF39Jz58xA=
 k8s.io/cluster-bootstrap v0.32.3 h1:AqIpsUhB6MUeaAsl1WvaUw54AHRd2hfZrESlKChtd8s=
 k8s.io/cluster-bootstrap v0.32.3/go.mod h1:CHbBwgOb6liDV6JFUTkx5t85T2xidy0sChBDoyYw344=
-k8s.io/component-base v0.32.4 h1:HuF+2JVLbFS5GODLIfPCb1Td6b+G2HszJoArcWOSr5I=
-k8s.io/component-base v0.32.4/go.mod h1:10KloJEYw1keU/Xmjfy9TKJqUq7J2mYdiD1VDXoco4o=
+k8s.io/component-base v0.32.5 h1:2HiX+m3s9Iz5CMqdCVDH2V942UqzQvjuhcXb4W+KCsg=
+k8s.io/component-base v0.32.5/go.mod h1:jDsPNFFElv9m27TcYxlpEX7TZ3vdgx2g4PaqMUHpV/Y=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 h1:hcha5B1kVACrLujCKLbr8XWMxCxzQx42DY8QKYJrDLg=
diff --git a/test/vbmctl/main.go b/test/vbmctl/main.go
index 71f426b1..2c1da8db 100644
--- a/test/vbmctl/main.go
+++ b/test/vbmctl/main.go
@@ -7,7 +7,7 @@ import (
 	"bytes"
 	"embed"
 	"flag"
-	"fmt"
+	"log"
 	"os"
 	"text/template"
 
@@ -46,12 +46,12 @@ func CreateVolumePool(conn *libvirt.Connect, poolName, poolPath string) (*libvir
 	pool, err := conn.LookupStoragePoolByName(poolName)
 
 	if err == nil {
-		fmt.Println("Pool already exists")
+		log.Println("Pool already exists")
 		return pool, nil
 	}
 
 	if err = os.Mkdir(poolPath, filePerm777); err != nil && !os.IsExist(err) {
-		fmt.Println("Cannot determine the state of the poolPath")
+		log.Println("Cannot determine the state of the poolPath")
 		return nil, err
 	}
 
@@ -66,8 +66,8 @@ func CreateVolumePool(conn *libvirt.Connect, poolName, poolPath string) (*libvir
 	poolCfg, err := RenderTemplate("templates/pool.xml.tpl", data)
 
 	if err != nil {
-		fmt.Println("Failed to read pool XML file")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to read pool XML file")
+		log.Printf("Error occurred: %v\n", err)
 		return nil, err
 	}
 
@@ -75,24 +75,24 @@ func CreateVolumePool(conn *libvirt.Connect, poolName, poolPath string) (*libvir
 	pool, err = conn.StoragePoolDefineXML(poolCfg, 0)
 
 	if err != nil {
-		fmt.Println("Failed to create volume pool")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to create volume pool")
+		log.Printf("Error occurred: %v\n", err)
 		return nil, err
 	}
 
 	if err = pool.SetAutostart(true); err != nil {
-		fmt.Println("Failed to Set the pool autostart")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to Set the pool autostart")
+		log.Printf("Error occurred: %v\n", err)
 		return nil, err
 	}
 
 	if err = pool.Create(0); err != nil {
-		fmt.Println("Failed to Start the pool")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to Start the pool")
+		log.Printf("Error occurred: %v\n", err)
 		return nil, err
 	}
 
-	fmt.Println("Volume pool created successfully")
+	log.Println("Volume pool created successfully")
 	return pool, nil
 }
 
@@ -100,8 +100,8 @@ func CreateVolume(conn *libvirt.Connect, volumeName, poolName, poolPath string,
 	pool, err := CreateVolumePool(conn, poolName, poolPath)
 
 	if err != nil {
-		fmt.Println("Failed to create storage pool")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to create storage pool")
+		log.Printf("Error occurred: %v\n", err)
 		return err
 	}
 
@@ -116,8 +116,8 @@ func CreateVolume(conn *libvirt.Connect, volumeName, poolName, poolPath string,
 	volumeCfg, err := RenderTemplate("templates/volume.xml.tpl", data)
 
 	if err != nil {
-		fmt.Println("Failed to read volume XML file")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to read volume XML file")
+		log.Printf("Error occurred: %v\n", err)
 		return err
 	}
 
@@ -125,12 +125,12 @@ func CreateVolume(conn *libvirt.Connect, volumeName, poolName, poolPath string,
 	_, err = pool.StorageVolCreateXML(volumeCfg, 0)
 
 	if err != nil {
-		fmt.Println("Failed to create volume")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to create volume")
+		log.Printf("Error occurred: %v\n", err)
 		return err
 	}
 
-	fmt.Println("Volume created successfully")
+	log.Println("Volume created successfully")
 	return nil
 }
 
@@ -152,8 +152,8 @@ func CreateLibvirtVM(conn *libvirt.Connect, name, networkName, macAddress string
 	err := qcow2.Blk_Create("/tmp/"+name+".qcow2", opts)
 
 	if err != nil {
-		fmt.Println("Failed to create qcow2 file")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to create qcow2 file")
+		log.Printf("Error occurred: %v\n", err)
 		return err
 	}
 
@@ -182,12 +182,12 @@ func CreateLibvirtVM(conn *libvirt.Connect, name, networkName, macAddress string
 	_, err = conn.DomainDefineXML(vmCfg)
 
 	if err != nil {
-		fmt.Println("Failed to define domain")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to define domain")
+		log.Printf("Error occurred: %v\n", err)
 		return err
 	}
 
-	fmt.Println("Domain created successfully")
+	log.Println("Domain created successfully")
 	return nil
 }
 
@@ -223,8 +223,8 @@ func CreateLibvirtVMWithReservedIPAddress(conn *libvirt.Connect, macAddress, nam
 	err = xmlTpl.Execute(&buf, data)
 
 	if err != nil {
-		fmt.Println("Failed to create BMC")
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Println("Failed to create BMC")
+		log.Printf("Error occurred: %v\n", err)
 		return err
 	}
 
@@ -235,11 +235,11 @@ func CreateLibvirtVMWithReservedIPAddress(conn *libvirt.Connect, macAddress, nam
 		buf.String(),
 		libvirt.NETWORK_UPDATE_AFFECT_LIVE|libvirt.NETWORK_UPDATE_AFFECT_CONFIG,
 	); err != nil {
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Printf("Error occurred: %v\n", err)
 		return err
 	}
 	if err = CreateLibvirtVM(conn, name, networkName, macAddress); err != nil {
-		fmt.Printf("Error occurred: %v\n", err)
+		log.Printf("Error occurred: %v\n", err)
 		return err
 	}
 	return nil
@@ -270,22 +270,20 @@ func main() {
 	} else {
 		bmcs, err = bmoe2e.LoadBMCConfig(*configFile)
 		if err != nil {
-			fmt.Printf("Error occurred: %v\n", err)
-			os.Exit(1)
+			log.Fatalf("Error occurred: %v\n", err)
 		}
 	}
 
 	// Connect to Libvirt
 	conn, err := libvirt.NewConnect("qemu:///system")
 	if err != nil {
-		fmt.Printf("Error occurred: %v\n", err)
-		os.Exit(1)
+		log.Fatalf("Error occurred: %v\n", err)
 	}
 	defer conn.Close()
 
 	for _, bmc := range bmcs {
 		if err = CreateLibvirtVMWithReservedIPAddress(conn, bmc.BootMacAddress, bmc.Name, bmc.IPAddress, "baremetal-e2e"); err != nil {
-			fmt.Printf("Error occurred: %v\n", err)
+			log.Printf("Error occurred: %v\n", err)
 			// Not using os.Exit here so that we still close the connection
 			break
 		}