Repository: metal3-io/baremetal-operator (go)

Issue:
BMO e2e periodics run for maximum of 6 hours when stuck
When BMO e2e periodics get stuck in docker/minikube issue for example, they don't (always) exit, but they time out in 6 hours (GitHub maximum). Normal run is less than 0.5 hour. We should be good citizens and timeout at 1 hour, to free up resources/not generate unnecessary bill.

edit: there are optional combos that take over 1 hour, so timeout could be 1.5h. My bad.

![image](https://github.com/user-attachments/assets/c8c02b5b-7f9f-4a1c-8167-44167c98f455)

/kind bug


Pull request description:
🐛 Set e2e timeout to 1.5h
Save resources in case the test stucks.

<!-- please add a icon to the title of this PR and delete this line and similar ones -->
<!-- the icon will be either ⚠️ (:warning:, major or breaking changes), ✨ (:sparkles:, feature additions), 🐛 (:bug:, patch and bugfixes), 📖 (:book:, documentation or proposals), or 🌱 (:seedling:, minor or other) -->

**What this PR does / why we need it**:

**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*:
Fixes #2189 


Patch:
diff --git a/apis/metal3.io/v1alpha1/baremetalhost_types.go b/apis/metal3.io/v1alpha1/baremetalhost_types.go
index f7c7c68d..01e950ff 100644
--- a/apis/metal3.io/v1alpha1/baremetalhost_types.go
+++ b/apis/metal3.io/v1alpha1/baremetalhost_types.go
@@ -1115,32 +1115,34 @@ func (host *BareMetalHost) OperationMetricForState(operation ProvisioningState)
 // GetChecksum method returns the checksum of an image.
 func (image *Image) GetChecksum() (checksum, checksumType string, ok bool) {
 	if image == nil {
-		return "", "", false
+		return
 	}
 
 	if image.DiskFormat != nil && *image.DiskFormat == "live-iso" {
 		// Checksum is not required for live-iso
 		ok = true
-		return "", "", ok
+		return
 	}
 
 	if image.Checksum == "" {
 		// Return empty if checksum is not provided
-		return "", "", false
+		return
 	}
 
 	switch image.ChecksumType {
+	case "":
+		checksumType = string(MD5)
 	case MD5, SHA256, SHA512:
 		checksumType = string(image.ChecksumType)
-	case "", AutoChecksum:
+	case AutoChecksum:
 		// No type, let Ironic detect
 	default:
-		return "", "", false
+		return
 	}
 
 	checksum = image.Checksum
 	ok = true
-	return checksum, checksumType, ok
+	return
 }
 
 // +kubebuilder:object:root=true


Test patch:
diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml
index a32edce8..8a492bfa 100644
--- a/.github/workflows/e2e-test.yml
+++ b/.github/workflows/e2e-test.yml
@@ -22,6 +22,7 @@ jobs:
   test:
     name: E2E test
     runs-on: ${{ inputs.runner }}
+    timeout-minutes: 90
 
     steps:
     - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
diff --git a/apis/metal3.io/v1alpha1/baremetalhost_types_test.go b/apis/metal3.io/v1alpha1/baremetalhost_types_test.go
index 242d73ae..6c49ad23 100644
--- a/apis/metal3.io/v1alpha1/baremetalhost_types_test.go
+++ b/apis/metal3.io/v1alpha1/baremetalhost_types_test.go
@@ -338,7 +338,7 @@ func TestGetImageChecksum(t *testing.T) {
 			ExpectedType: "md5",
 		},
 		{
-			Scenario: "checksum value specified and type not specified, default to auto type",
+			Scenario: "checksum value specified but not type",
 			Host: BareMetalHost{
 				ObjectMeta: metav1.ObjectMeta{
 					Name:      "myhost",
@@ -351,7 +351,7 @@ func TestGetImageChecksum(t *testing.T) {
 				},
 			},
 			Expected:     true,
-			ExpectedType: "",
+			ExpectedType: "md5",
 		},
 		{
 			Scenario: "checksum value specified, auto type",