Procházet zdrojové kódy

support spot nodes in oracle (#3475)

Alex Meijer před 5 měsíci
rodič
revize
0230e7e80d
2 změnil soubory, kde provedl 69 přidání a 1 odebrání
  1. 12 1
      pkg/cloud/oracle/provider.go
  2. 57 0
      pkg/cloud/oracle/provider_test.go

+ 12 - 1
pkg/cloud/oracle/provider.go

@@ -20,6 +20,7 @@ import (
 const nodePoolIdAnnotation = "oci.oraclecloud.com/node-pool-id"
 const virtualPoolIdAnnotation = "oci.oraclecloud.com/virtual-node-pool-id"
 const virtualNodeLabel = "node-role.kubernetes.io/virtual-node"
+const preemptibleLabel = "oci.oraclecloud.com/oke-is-preemptible"
 const managementPlatformOKE = "oke"
 const currencyCodeUSD = "USD"
 
@@ -59,7 +60,17 @@ func (o *Oracle) NodePricing(key models.Key) (*models.Node, models.PricingMetada
 	}
 	o.DownloadPricingDataLock.RLock()
 	defer o.DownloadPricingDataLock.RUnlock()
-	return o.RateCardStore.ForKey(key, o.DefaultPricing)
+	node, metadata, err := o.RateCardStore.ForKey(key, o.DefaultPricing)
+	if err != nil {
+		return node, metadata, err
+	}
+	// Check if the node is preemptible based on the label
+	if oracleKey, ok := key.(*oracleKey); ok {
+		if val, exists := oracleKey.labels[preemptibleLabel]; exists && val == "true" {
+			node.UsageType = "preemptible"
+		}
+	}
+	return node, metadata, nil
 }
 
 func (o *Oracle) GpuPricing(nodeLabels map[string]string) (string, error) {

+ 57 - 0
pkg/cloud/oracle/provider_test.go

@@ -79,6 +79,63 @@ func TestRegions(t *testing.T) {
 	assert.Len(t, regions, 39)
 }
 
+func TestNodePricing_Preemptible(t *testing.T) {
+	oracle := &Oracle{
+		RateCardStore: NewRateCardStore("", "USD"),
+		DefaultPricing: DefaultPricing{
+			OCPU:    "0.2",
+			Memory:  "0.1",
+			GPU:     "0.3",
+			Storage: "0.25",
+		},
+	}
+
+	testCases := []struct {
+		name        string
+		labels      map[string]string
+		expectUsage string
+	}{
+		{
+			name: "preemptible node",
+			labels: map[string]string{
+				v1.LabelInstanceTypeStable: "VM.Standard.E4.Flex",
+				preemptibleLabel:           "true",
+			},
+			expectUsage: "preemptible",
+		},
+		{
+			name: "non-preemptible node",
+			labels: map[string]string{
+				v1.LabelInstanceTypeStable: "VM.Standard.E4.Flex",
+			},
+			expectUsage: "",
+		},
+		{
+			name: "preemptible label false",
+			labels: map[string]string{
+				v1.LabelInstanceTypeStable: "VM.Standard.E4.Flex",
+				preemptibleLabel:           "false",
+			},
+			expectUsage: "",
+		},
+	}
+
+	for _, tc := range testCases {
+		t.Run(tc.name, func(t *testing.T) {
+			key := &oracleKey{
+				instanceType: "VM.Standard.E4.Flex",
+				labels:       tc.labels,
+				providerID:   "ocid.test",
+			}
+
+			node, _, err := oracle.NodePricing(key)
+			assert.NoError(t, err)
+			assert.NotNil(t, node)
+			assert.Equal(t, tc.expectUsage, node.UsageType)
+		})
+	}
+}
+
 func testNode(gpus int) *clustercache.Node {
 	capacity := map[v1.ResourceName]resource.Quantity{}
 	if gpus > 0 {