diff --git a/castai/commitments/mapping.go b/castai/commitments/mapping.go index 73317804..12a9cc74 100644 --- a/castai/commitments/mapping.go +++ b/castai/commitments/mapping.go @@ -18,14 +18,16 @@ import ( type ( // Terraform SDK's diff setter uses mapstructure under the hood - GCPCUDResource struct { - // CAST AI only fields + CASTFields struct { ID *string `mapstructure:"id,omitempty"` // ID of the commitment AllowedUsage *float32 `mapstructure:"allowed_usage,omitempty"` Prioritization *bool `mapstructure:"prioritization,omitempty"` Status *string `mapstructure:"status,omitempty"` Assignments []*CommitmentAssignmentResource `mapstructure:"assignments,omitempty"` + } + GCPCUDResource struct { + CASTFields `mapstructure:",squash"` // Fields from GCP CUDs export JSON CUDID string `mapstructure:"cud_id"` // ID of the CUD in GCP CUDStatus string `mapstructure:"cud_status"` @@ -40,13 +42,7 @@ type ( } AzureReservationResource struct { - // CAST AI only fields - ID *string `mapstructure:"id,omitempty"` // ID of the commitment - AllowedUsage *float32 `mapstructure:"allowed_usage,omitempty"` - Prioritization *bool `mapstructure:"prioritization,omitempty"` - Status *string `mapstructure:"status,omitempty"` - Assignments []*CommitmentAssignmentResource `mapstructure:"assignments,omitempty"` - + CASTFields `mapstructure:",squash"` // Fields from Azure reservations export CSV Count int `mapstructure:"count"` ReservationID string `mapstructure:"reservation_id"` // ID of the reservation in Azure @@ -184,10 +180,13 @@ func MapCommitmentToCUDResource( } return &GCPCUDResource{ - ID: c.Id, - AllowedUsage: c.AllowedUsage, - Prioritization: c.Prioritization, - Status: (*string)(c.Status), + CASTFields: CASTFields{ + ID: c.Id, + AllowedUsage: c.AllowedUsage, + Prioritization: c.Prioritization, + Status: (*string)(c.Status), + Assignments: MapCommitmentAssignmentsToResources(as, lo.FromPtr(c.Prioritization)), + }, CUDID: lo.FromPtr(c.GcpResourceCudContext.CudId), CUDStatus: lo.FromPtr(c.GcpResourceCudContext.Status), EndTimestamp: endDate, @@ -198,7 +197,6 @@ func MapCommitmentToCUDResource( MemoryMb: memory, Plan: lo.FromPtr((*string)(c.GcpResourceCudContext.Plan)), Type: lo.FromPtr(c.GcpResourceCudContext.Type), - Assignments: MapCommitmentAssignmentsToResources(as, lo.FromPtr(c.Prioritization)), }, nil } @@ -218,10 +216,13 @@ func MapCommitmentToReservationResource( endDate = c.EndDate.Format(time.RFC3339) } return &AzureReservationResource{ - ID: c.Id, - AllowedUsage: c.AllowedUsage, - Prioritization: c.Prioritization, - Status: (*string)(c.Status), + CASTFields: CASTFields{ + ID: c.Id, + AllowedUsage: c.AllowedUsage, + Prioritization: c.Prioritization, + Status: (*string)(c.Status), + Assignments: MapCommitmentAssignmentsToResources(as, lo.FromPtr(c.Prioritization)), + }, Count: int(lo.FromPtr(c.AzureReservationContext.Count)), ReservationID: lo.FromPtr(c.AzureReservationContext.Id), ReservationStatus: lo.FromPtr(c.AzureReservationContext.Status), @@ -234,7 +235,6 @@ func MapCommitmentToReservationResource( Scope: lo.FromPtr(c.AzureReservationContext.Scope), ScopeResourceGroup: lo.FromPtr(c.AzureReservationContext.ScopeResourceGroup), ScopeSubscription: lo.FromPtr(c.AzureReservationContext.ScopeSubscription), - Assignments: MapCommitmentAssignmentsToResources(as, lo.FromPtr(c.Prioritization)), }, nil } diff --git a/castai/commitments/mapping_test.go b/castai/commitments/mapping_test.go index 4e964c46..f28f24c9 100644 --- a/castai/commitments/mapping_test.go +++ b/castai/commitments/mapping_test.go @@ -52,10 +52,16 @@ func TestMapCommitmentToCUDResource(t *testing.T) { {ClusterId: lo.ToPtr("cluster-id-2")}, }, expected: &GCPCUDResource{ - ID: lo.ToPtr(id1.String()), - AllowedUsage: lo.ToPtr[float32](0.5), - Prioritization: lo.ToPtr(true), - Status: lo.ToPtr("ACTIVE"), + CASTFields: CASTFields{ + ID: lo.ToPtr(id1.String()), + AllowedUsage: lo.ToPtr[float32](0.5), + Prioritization: lo.ToPtr(true), + Status: lo.ToPtr("ACTIVE"), + Assignments: []*CommitmentAssignmentResource{ + {ClusterID: "cluster-id-1"}, + {ClusterID: "cluster-id-2"}, + }, + }, CUDID: "123456", CUDStatus: "ACTIVE", StartTimestamp: endTs.Format(time.RFC3339), @@ -66,10 +72,6 @@ func TestMapCommitmentToCUDResource(t *testing.T) { MemoryMb: 1024, Plan: "TWELVE_MONTHS", Type: "COMPUTE_OPTIMIZED_C2D", - Assignments: []*CommitmentAssignmentResource{ - {ClusterID: "cluster-id-1"}, - {ClusterID: "cluster-id-2"}, - }, }, }, "should fail as gcp cud context is nil": { @@ -91,10 +93,16 @@ func TestMapCommitmentToCUDResource(t *testing.T) { {ClusterId: lo.ToPtr("cluster-id-2")}, }, expected: &GCPCUDResource{ - ID: lo.ToPtr(id1.String()), - AllowedUsage: lo.ToPtr[float32](0.5), - Prioritization: lo.ToPtr(true), - Status: lo.ToPtr("ACTIVE"), + CASTFields: CASTFields{ + ID: lo.ToPtr(id1.String()), + AllowedUsage: lo.ToPtr[float32](0.5), + Prioritization: lo.ToPtr(true), + Status: lo.ToPtr("ACTIVE"), + Assignments: []*CommitmentAssignmentResource{ + {ClusterID: "cluster-id-1"}, + {ClusterID: "cluster-id-2"}, + }, + }, CUDID: "123456", CUDStatus: "ACTIVE", StartTimestamp: endTs.Format(time.RFC3339), @@ -104,10 +112,6 @@ func TestMapCommitmentToCUDResource(t *testing.T) { MemoryMb: 1024, Plan: "TWELVE_MONTHS", Type: "COMPUTE_OPTIMIZED_C2D", - Assignments: []*CommitmentAssignmentResource{ - {ClusterID: "cluster-id-1"}, - {ClusterID: "cluster-id-2"}, - }, }, }, "should succeed with nil memory": { @@ -121,10 +125,16 @@ func TestMapCommitmentToCUDResource(t *testing.T) { {ClusterId: lo.ToPtr("cluster-id-2")}, }, expected: &GCPCUDResource{ - ID: lo.ToPtr(id1.String()), - AllowedUsage: lo.ToPtr[float32](0.5), - Prioritization: lo.ToPtr(true), - Status: lo.ToPtr("ACTIVE"), + CASTFields: CASTFields{ + ID: lo.ToPtr(id1.String()), + AllowedUsage: lo.ToPtr[float32](0.5), + Prioritization: lo.ToPtr(true), + Status: lo.ToPtr("ACTIVE"), + Assignments: []*CommitmentAssignmentResource{ + {ClusterID: "cluster-id-1"}, + {ClusterID: "cluster-id-2"}, + }, + }, CUDID: "123456", CUDStatus: "ACTIVE", StartTimestamp: endTs.Format(time.RFC3339), @@ -134,10 +144,6 @@ func TestMapCommitmentToCUDResource(t *testing.T) { CPU: 8, Plan: "TWELVE_MONTHS", Type: "COMPUTE_OPTIMIZED_C2D", - Assignments: []*CommitmentAssignmentResource{ - {ClusterID: "cluster-id-1"}, - {ClusterID: "cluster-id-2"}, - }, }, }, "should fail as cpu is an invalid string": { @@ -218,10 +224,16 @@ func TestMapCommitmentToReservationResource(t *testing.T) { {ClusterId: lo.ToPtr("cluster-id-2")}, }, expected: &AzureReservationResource{ - ID: lo.ToPtr(id1.String()), - AllowedUsage: lo.ToPtr[float32](0.5), - Prioritization: lo.ToPtr(true), - Status: lo.ToPtr("ACTIVE"), + CASTFields: CASTFields{ + ID: lo.ToPtr(id1.String()), + AllowedUsage: lo.ToPtr[float32](0.5), + Prioritization: lo.ToPtr(true), + Status: lo.ToPtr("ACTIVE"), + Assignments: []*CommitmentAssignmentResource{ + {ClusterID: "cluster-id-1"}, + {ClusterID: "cluster-id-2"}, + }, + }, Count: 2, ReservationID: reservationID.String(), ReservationStatus: "Succeeded", @@ -234,10 +246,6 @@ func TestMapCommitmentToReservationResource(t *testing.T) { Scope: "Single subscription", ScopeResourceGroup: "All resource groups", ScopeSubscription: scopeSubscription.String(), - Assignments: []*CommitmentAssignmentResource{ - {ClusterID: "cluster-id-1"}, - {ClusterID: "cluster-id-2"}, - }, }, }, "should fail as azure reservation context is nil": { @@ -341,9 +349,11 @@ func TestMapCUDImportToResource(t *testing.T) { Plan: "TWELVE_MONTHS", Type: "COMPUTE_OPTIMIZED_C2D", // Configured fields - Prioritization: lo.ToPtr(true), - Status: lo.ToPtr("ACTIVE"), - AllowedUsage: lo.ToPtr[float32](0.7), + CASTFields: CASTFields{ + Prioritization: lo.ToPtr(true), + Status: lo.ToPtr("ACTIVE"), + AllowedUsage: lo.ToPtr[float32](0.7), + }, }, }, "should fail as cpu amount is invalid": { @@ -469,9 +479,11 @@ func TestMapReservationImportToResource(t *testing.T) { return c }(), expected: &AzureReservationResource{ - AllowedUsage: lo.ToPtr[float32](0.7), - Prioritization: lo.ToPtr(true), - Status: lo.ToPtr("ACTIVE"), + CASTFields: CASTFields{ + AllowedUsage: lo.ToPtr[float32](0.7), + Prioritization: lo.ToPtr(true), + Status: lo.ToPtr("ACTIVE"), + }, Count: 2, ReservationID: lo.FromPtr(testAzureCommitmentImport.ReservationId), ReservationStatus: lo.FromPtr(testAzureCommitmentImport.Status), @@ -912,9 +924,15 @@ func TestMapConfiguredCUDImportsToResources(t *testing.T) { }, expected: []*GCPCUDResource{ { - AllowedUsage: lo.ToPtr[float32](0.5), - Prioritization: lo.ToPtr(true), - Status: lo.ToPtr("ACTIVE"), + CASTFields: CASTFields{ + AllowedUsage: lo.ToPtr[float32](0.5), + Prioritization: lo.ToPtr(true), + Status: lo.ToPtr("ACTIVE"), + Assignments: []*CommitmentAssignmentResource{ + {ClusterID: "cluster-1", Priority: lo.ToPtr(1)}, + {ClusterID: "cluster-2", Priority: lo.ToPtr(2)}, + }, + }, CUDID: lo.FromPtr(testGCPCommitmentImport.Id), CUDStatus: lo.FromPtr(testGCPCommitmentImport.Status), StartTimestamp: lo.FromPtr(testGCPCommitmentImport.StartTimestamp), @@ -925,10 +943,6 @@ func TestMapConfiguredCUDImportsToResources(t *testing.T) { MemoryMb: 20480, Plan: lo.FromPtr(testGCPCommitmentImport.Plan), Type: lo.FromPtr(testGCPCommitmentImport.Type), - Assignments: []*CommitmentAssignmentResource{ - {ClusterID: "cluster-1"}, - {ClusterID: "cluster-2"}, - }, }, }, }, @@ -1015,9 +1029,15 @@ func TestMapConfiguredReservationImportsToResources(t *testing.T) { }, expected: []*AzureReservationResource{ { - AllowedUsage: lo.ToPtr[float32](0.5), - Prioritization: lo.ToPtr(true), - Status: lo.ToPtr("ACTIVE"), + CASTFields: CASTFields{ + AllowedUsage: lo.ToPtr[float32](0.5), + Prioritization: lo.ToPtr(true), + Status: lo.ToPtr("ACTIVE"), + Assignments: []*CommitmentAssignmentResource{ + {ClusterID: "cluster-1", Priority: lo.ToPtr(1)}, + {ClusterID: "cluster-2", Priority: lo.ToPtr(2)}, + }, + }, Count: int(lo.FromPtr(testAzureCommitmentImport.Quantity)), ReservationID: lo.FromPtr(testAzureCommitmentImport.ReservationId), ReservationStatus: lo.FromPtr(testAzureCommitmentImport.Status), @@ -1030,10 +1050,6 @@ func TestMapConfiguredReservationImportsToResources(t *testing.T) { Scope: lo.FromPtr(testAzureCommitmentImport.Scope), ScopeResourceGroup: lo.FromPtr(testAzureCommitmentImport.ScopeResourceGroup), ScopeSubscription: lo.FromPtr(testAzureCommitmentImport.ScopeSubscription), - Assignments: []*CommitmentAssignmentResource{ - {ClusterID: "cluster-1"}, - {ClusterID: "cluster-2"}, - }, }, }, },