diff --git a/infracost-usage-example.yml b/infracost-usage-example.yml index 5a8a811d1dc..1d909531aee 100644 --- a/infracost-usage-example.yml +++ b/infracost-usage-example.yml @@ -57,10 +57,27 @@ resource_type_default_usage: kms_key_versions: 10 secretsmanager_active_secrets: 400 secretsmanager_instance: 1 + logdna_gigabyte_months: 1 + activitytracker_gigabyte_months: 1 + monitoring_node_hour: 1 + monitoring_container_hour: 1 + monitoring_api_call: 1 + monitoring_timeseries_hour: 1 + continuousdelivery_authorized_users: 1 + wml_capacity_unit_hour: 20 + wml_instance: 1 + wml_class1_ru: 20 + wml_class2_ru: 20 + wml_class3_ru: 20 ibm_tg_gateway: connection: 3 data_transfer_global: 1000 data_transfer_local: 1000 + ibm_database: + database_ram_mb: 12288 + database_disk_mb: 131072 + database_core: 3 + database_members: 4 resource_usage: # @@ -1274,8 +1291,19 @@ resource_usage: monitoring_api_call: 100000 # Additional API calls above the base 1M/instance monitoring_timeseries_hour: 100 # Additional time-series cost above the base 1000/host continuousdelivery_authorized_users: 10 # Number of authorized users to the CD instance and its managed toolchains - + wml_capacity_unit_hour: 20 # Amount of Capacity Unit-Hours used in a month + wml_instance: 1 # The number of instances used per month where each instance includes 2500 CUHs + wml_class1_ru: 20 # The number of resource units used for inferencing with class 1 type models where each ru is 1000 tokens + wml_class2_ru: 20 # The number of resource units used for inferencing with class 2 type models where each ru is 1000 tokens + wml_class3_ru: 20 # The number of resource units used for inferencing with class 3 type models where each ru is 1000 tokens + ibm_tg_gateway.tg_gateway: connection: 25 # Monthly number of connections to the gateway data_transfer_local: 2500 # Monthly local traffic through the gateway in GB data_transfer_global: 2500 # Monthly global traffic through the gateway in GB + + ibm_database.postgres: + database_ram_mb: 12288 # Allocated memory in MB per-member + database_disk_mb: 131072 # Allocated disk in MB per-member + database_core: 3 # Allocated dedicated CPU per-member + database_members: 4 # Allocated number of members in the cluster diff --git a/internal/providers/terraform/ibm/ibm.go b/internal/providers/terraform/ibm/ibm.go index 55acbd953f5..2ccd7d744e8 100644 --- a/internal/providers/terraform/ibm/ibm.go +++ b/internal/providers/terraform/ibm/ibm.go @@ -68,6 +68,12 @@ var globalCatalogServiceId = map[string]catalogMetadata{ "kms": {"ee41347f-b18e-4ca6-bf80-b5467c63f9a6", []string{}, nil}, "cloud-object-storage": {"dff97f5c-bc5e-4455-b470-411c3edbe49c", []string{}, nil}, "roks": {"containers.kubernetes.cluster.roks", []string{}, nil}, + "pm-20": {"51c53b72-918f-4869-b834-2d99eb28422a", []string{}, nil}, + "data-science-experience": {"39ba9d4c-b1c5-4cc3-a163-38b580121e01", []string{}, nil}, + "discovery": {"76b7bf22-b443-47db-b3db-066ba2988f47", []string{}, nil}, + "wx": {"51c53b72-918f-4869-b834-2d99eb28422a", []string{}, nil}, + "conversation": {"7045626d-55e3-4418-be11-683a26dbc1e5", []string{}, nil}, + "aiopenscale": {"2ad019f3-0fd6-4c25-966d-f3952481a870", []string{}, nil}, } func SetCatalogMetadata(d *schema.ResourceData, resourceType string, config map[string]any) { diff --git a/internal/providers/terraform/ibm/testdata/cloudant_test/cloudant_test.golden b/internal/providers/terraform/ibm/testdata/cloudant_test/cloudant_test.golden index c078078dc0a..c2440a0af1a 100644 --- a/internal/providers/terraform/ibm/testdata/cloudant_test/cloudant_test.golden +++ b/internal/providers/terraform/ibm/testdata/cloudant_test/cloudant_test.golden @@ -2,32 +2,32 @@ Name Monthly Qty Unit Monthly Cost Cloudant - dedicated-cloudant - Dedicated-Hardware - └─ Dedicated Hardware 1 instance $5,000.00 + └─ Dedicated Hardware 1 instance $5,920.00 Cloudant - lite-cloudant - Lite └─ Lite Cloudant 1 instance $0.00 Cloudant - standard-cloudant - Standard - ├─ Reads (capacity: 1) 100 reads/second $25.00 - ├─ Writes (capacity: 1) 50 writes/second $25.00 - ├─ Global Queries (capacity: 1) 5 queries/second $25.00 + ├─ Reads (capacity: 1) 100 reads/second $29.60 + ├─ Writes (capacity: 1) 50 writes/second $29.60 + ├─ Global Queries (capacity: 1) 5 queries/second $29.60 └─ Free Estimated Storage (first 20GB) 20 GB $0.00 Cloudant - standard-cloudant-without-usage - Standard - ├─ Reads (capacity: 1) 100 reads/second $25.00 - ├─ Writes (capacity: 1) 50 writes/second $25.00 - ├─ Global Queries (capacity: 1) 5 queries/second $25.00 + ├─ Reads (capacity: 1) 100 reads/second $29.60 + ├─ Writes (capacity: 1) 50 writes/second $29.60 + ├─ Global Queries (capacity: 1) 5 queries/second $29.60 ├─ Free Estimated Storage (first 20GB) Monthly cost depends on usage: $0.00 per GB - └─ Estimated Storage Monthly cost depends on usage: $1.00 per GB + └─ Estimated Storage Monthly cost depends on usage: $1.18 per GB Cloudant - standard-exceeded-storage - Standard - ├─ Reads (capacity: 1) 100 reads/second $25.00 - ├─ Writes (capacity: 1) 50 writes/second $25.00 - ├─ Global Queries (capacity: 1) 5 queries/second $25.00 + ├─ Reads (capacity: 1) 100 reads/second $29.60 + ├─ Writes (capacity: 1) 50 writes/second $29.60 + ├─ Global Queries (capacity: 1) 5 queries/second $29.60 ├─ Free Estimated Storage (first 20GB) 20 GB $0.00 - └─ Estimated Storage 20 GB $20.00 + └─ Estimated Storage 20 GB $23.60 - OVERALL TOTAL $5,245.00 + OVERALL TOTAL $6,210.00 ────────────────────────────────── 5 cloud resources were detected: ∙ 5 were estimated \ No newline at end of file diff --git a/internal/providers/terraform/ibm/testdata/cloudant_test/cloudant_test.tf b/internal/providers/terraform/ibm/testdata/cloudant_test/cloudant_test.tf index e2785a4d648..f2c22a5ff61 100644 --- a/internal/providers/terraform/ibm/testdata/cloudant_test/cloudant_test.tf +++ b/internal/providers/terraform/ibm/testdata/cloudant_test/cloudant_test.tf @@ -3,7 +3,7 @@ terraform { required_providers { ibm = { source = "IBM-Cloud/ibm" - version = "1.58.0" + version = "1.63.0" } } } diff --git a/internal/providers/terraform/ibm/testdata/container_vpc_cluster_test/container_vpc_cluster_test.golden b/internal/providers/terraform/ibm/testdata/container_vpc_cluster_test/container_vpc_cluster_test.golden index 9e2aa2a731d..a518ef7eee0 100644 --- a/internal/providers/terraform/ibm/testdata/container_vpc_cluster_test/container_vpc_cluster_test.golden +++ b/internal/providers/terraform/ibm/testdata/container_vpc_cluster_test/container_vpc_cluster_test.golden @@ -4,22 +4,26 @@ ibm_is_vpc.vpc1 ├─ VPC instance 1 Instance $0.00 ├─ VPC egress free allowance (first 5GB) 5 GB $0.00 - └─ VPC egress us-south (first 9995 GB) 9,995 GB $869.57 - └─ VPC egress us-south (next 40000 GB) 40,000 GB $3,320.00 - └─ VPC egress us-south (next 100000 GB) 100 GB $7.00 + └─ VPC egress us-south (first 9995 GB) 9,995 GB $908.70 + └─ VPC egress us-south (next 40000 GB) 40,000 GB $3,469.40 + └─ VPC egress us-south (next 100000 GB) 100 GB $7.32 └─ VPC egress us-south (over 149995 GB) 0 GB $0.00 mycluster - ├─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-1) x(3) workers 2,190 hours $565.42 - └─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-2) x(3) workers 2,190 hours $565.42 + ├─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-1) x(3) workers 2,190 hours $608.59 + └─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-2) x(3) workers 2,190 hours $608.59 mycluster-without-usage - ├─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-1) x(3) workers 3 hours $0.77 - └─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-2) x(3) workers 3 hours $0.77 + ├─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-1) x(3) workers 3 hours $0.83 + └─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-2) x(3) workers 3 hours $0.83 - OVERALL TOTAL $5,328.95 + mycluster-without-usage + ├─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-1) x(3) workers 2,190 hours $983.08 + └─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-2) x(3) workers 2,190 hours $983.08 + + OVERALL TOTAL $7,570.40 ────────────────────────────────── -5 cloud resources were detected: -∙ 3 were estimated, 1 of which usage-based costs, see https://infracost.io/usage-file +6 cloud resources were detected: +∙ 4 were estimated, 1 of which usage-based costs, see https://infracost.io/usage-file ∙ 2 were free: ∙ 2 x ibm_is_subnet \ No newline at end of file diff --git a/internal/providers/terraform/ibm/testdata/container_vpc_cluster_test/container_vpc_cluster_test.tf b/internal/providers/terraform/ibm/testdata/container_vpc_cluster_test/container_vpc_cluster_test.tf index caa68d6be0f..33ea0d99032 100644 --- a/internal/providers/terraform/ibm/testdata/container_vpc_cluster_test/container_vpc_cluster_test.tf +++ b/internal/providers/terraform/ibm/testdata/container_vpc_cluster_test/container_vpc_cluster_test.tf @@ -2,13 +2,15 @@ terraform { required_providers { ibm = { source = "IBM-Cloud/ibm" - version = "1.58.0" + version = "1.63.0" } } } provider "ibm" { generation = 2 region = "us-south" + ibmcloud_timeout = "1" + max_retries = "1" } resource "ibm_is_vpc" "vpc1" { @@ -60,3 +62,19 @@ resource "ibm_container_vpc_cluster" "cluster_without_usage" { name = "us-south-2" } } + +resource "ibm_container_vpc_cluster" "roks_cluster_with_usage" { + name = "mycluster-without-usage" + vpc_id = ibm_is_vpc.vpc1.id + flavor = "bx2.4x16" + worker_count = 3 + kube_version = "4.13_openshift" + zones { + subnet_id = ibm_is_subnet.subnet1.id + name = "us-south-1" + } + zones { + subnet_id = ibm_is_subnet.subnet1.id + name = "us-south-2" + } +} diff --git a/internal/providers/terraform/ibm/testdata/container_vpc_worker_pool_test/container_vpc_worker_pool_test.golden b/internal/providers/terraform/ibm/testdata/container_vpc_worker_pool_test/container_vpc_worker_pool_test.golden index 2c0c78c767d..34405c7455f 100644 --- a/internal/providers/terraform/ibm/testdata/container_vpc_worker_pool_test/container_vpc_worker_pool_test.golden +++ b/internal/providers/terraform/ibm/testdata/container_vpc_worker_pool_test/container_vpc_worker_pool_test.golden @@ -2,23 +2,23 @@ Name Monthly Qty Unit Monthly Cost ibm_container_vpc_worker_pool.cluster_pool - └─ VPC Container Work Zone flavor: (bx2.2x8) region: (us-south) name: (us-south-2) x(3) workers 2,190 hours $272.84 + └─ VPC Container Work Zone flavor: (bx2.2x8) region: (us-south) name: (us-south-2) x(3) workers 2,190 hours $293.67 ibm_container_vpc_worker_pool.cluster_pool_without_usage - └─ VPC Container Work Zone flavor: (bx2.2x8) region: (us-south) name: (us-south-2) x(3) workers 3 hours $0.37 + └─ VPC Container Work Zone flavor: (bx2.2x8) region: (us-south) name: (us-south-2) x(3) workers 3 hours $0.40 ibm_is_vpc.vpc1 ├─ VPC instance 1 Instance $0.00 ├─ VPC egress free allowance (first 5GB) 5 GB $0.00 - └─ VPC egress us-south (first 9995 GB) 9,995 GB $869.57 - └─ VPC egress us-south (next 40000 GB) 40,000 GB $3,320.00 - └─ VPC egress us-south (next 100000 GB) 100 GB $7.00 + └─ VPC egress us-south (first 9995 GB) 9,995 GB $908.70 + └─ VPC egress us-south (next 40000 GB) 40,000 GB $3,469.40 + └─ VPC egress us-south (next 100000 GB) 100 GB $7.32 └─ VPC egress us-south (over 149995 GB) 0 GB $0.00 mycluster - └─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-1) x(3) workers 2,190 hours $565.42 + └─ VPC Container Work Zone flavor: (bx2.4x16) region: (us-south) name: (us-south-1) x(3) workers 2,190 hours $608.59 - OVERALL TOTAL $5,035.19 + OVERALL TOTAL $5,288.07 ────────────────────────────────── 6 cloud resources were detected: ∙ 4 were estimated, 3 of which include usage-based costs, see https://infracost.io/usage-file diff --git a/internal/providers/terraform/ibm/testdata/container_vpc_worker_pool_test/container_vpc_worker_pool_test.tf b/internal/providers/terraform/ibm/testdata/container_vpc_worker_pool_test/container_vpc_worker_pool_test.tf index fc91a2ee2d0..219c3bc4ee0 100644 --- a/internal/providers/terraform/ibm/testdata/container_vpc_worker_pool_test/container_vpc_worker_pool_test.tf +++ b/internal/providers/terraform/ibm/testdata/container_vpc_worker_pool_test/container_vpc_worker_pool_test.tf @@ -2,7 +2,7 @@ terraform { required_providers { ibm = { source = "IBM-Cloud/ibm" - version = "1.58.0" + version = "1.63.0" } } } diff --git a/internal/providers/terraform/ibm/testdata/database_test/database_test.golden b/internal/providers/terraform/ibm/testdata/database_test/database_test.golden index 294f223d09f..9586db00386 100644 --- a/internal/providers/terraform/ibm/testdata/database_test/database_test.golden +++ b/internal/providers/terraform/ibm/testdata/database_test/database_test.golden @@ -1,16 +1,21 @@ - Name Monthly Qty Unit Monthly Cost - - ibm_database.test_db1 - ├─ RAM 24 GB-RAM $129.36 - ├─ Disk 256 GB-DISK $161.28 - └─ Core 6 Virtual Processor Core $193.80 - - ibm_database.test_db2 - ├─ RAM 60 GB-RAM $323.40 - └─ Disk 20 GB-DISK $12.60 - - OVERALL TOTAL $820.44 + Name Monthly Qty Unit Monthly Cost + + ibm_database.test_db1 + ├─ RAM (first 1 GB-RAM) 1 GB-RAM $5.23 + ├─ RAM (over 0 GB-RAM) 1 GB-RAM $5.39 + ├─ Disk (first 1 GB-DISK) 1 GB-DISK $0.61 + ├─ Disk (over 0 GB-DISK) 1 GB-DISK $0.63 + └─ Core (first 1 Virtual Processor Core) 1 Virtual Processor Core $31.40 + └─ Core (over 0 Virtual Processor Core) 1 Virtual Processor Core $32.34 + + ibm_database.test_db2 + ├─ RAM (first 1 GB-RAM) 1 GB-RAM $5.23 + ├─ RAM (over 0 GB-RAM) 1 GB-RAM $5.39 + └─ Disk (first 1 GB-DISK) 1 GB-DISK $0.61 + └─ Disk (over 0 GB-DISK) 1 GB-DISK $0.63 + + OVERALL TOTAL $87.45 ────────────────────────────────── 2 cloud resources were detected: -∙ 2 were estimated \ No newline at end of file +∙ 2 were estimated, all of which include usage-based costs, see https://infracost.io/usage-file \ No newline at end of file diff --git a/internal/providers/terraform/ibm/testdata/database_test/database_test.tf b/internal/providers/terraform/ibm/testdata/database_test/database_test.tf index 7b5eb863268..79c8430a45d 100644 --- a/internal/providers/terraform/ibm/testdata/database_test/database_test.tf +++ b/internal/providers/terraform/ibm/testdata/database_test/database_test.tf @@ -3,7 +3,7 @@ terraform { required_providers { ibm = { source = "IBM-Cloud/ibm" - version = "1.61.0" + version = "1.63.0" } } } @@ -30,6 +30,11 @@ resource "ibm_database" "test_db1" { allocation_count = 3 } } + configuration = < included_cuh { + q = decimalPtr(decimal.NewFromFloat(cuh)) + } else { + q = decimalPtr(decimal.NewFromFloat(included_cuh)) + } + } + + return &schema.CostComponent{ + Name: "Capacity Unit-Hours", + Unit: "CUH", + UnitMultiplier: decimal.NewFromInt(1), + MonthlyQuantity: q, + ProductFilter: &schema.ProductFilter{ + VendorName: strPtr("ibm"), + Region: strPtr(r.Location), + Service: &r.Service, + AttributeFilters: []*schema.AttributeFilter{ + {Key: "planName", Value: &r.Plan}, + }, + }, + PriceFilter: &schema.PriceFilter{ + Unit: strPtr("CAPACITY_UNIT_HOURS"), + }, + } +} + +func WMLClass1ResourceUnitsCostComponent(r *ResourceInstance) *schema.CostComponent { + var q *decimal.Decimal + if r.WML_Class1RU != nil { + q = decimalPtr(decimal.NewFromFloat(*r.WML_Class1RU)) + } + return &schema.CostComponent{ + Name: "Class 1 Resource Units", + Unit: "RU", + UnitMultiplier: decimal.NewFromInt(1), + MonthlyQuantity: q, + ProductFilter: &schema.ProductFilter{ + VendorName: strPtr("ibm"), + Region: strPtr(r.Location), + Service: &r.Service, + AttributeFilters: []*schema.AttributeFilter{ + {Key: "planName", Value: &r.Plan}, + }, + }, + PriceFilter: &schema.PriceFilter{ + Unit: strPtr("CLASS_ONE_RESOURCE_UNITS"), + }, + } +} + +func WMLClass2ResourceUnitsCostComponent(r *ResourceInstance) *schema.CostComponent { + var q *decimal.Decimal + if r.WML_Class1RU != nil { + q = decimalPtr(decimal.NewFromFloat(*r.WML_Class2RU)) + } + return &schema.CostComponent{ + Name: "Class 2 Resource Units", + Unit: "RU", + UnitMultiplier: decimal.NewFromInt(1), + MonthlyQuantity: q, + ProductFilter: &schema.ProductFilter{ + VendorName: strPtr("ibm"), + Region: strPtr(r.Location), + Service: &r.Service, + AttributeFilters: []*schema.AttributeFilter{ + {Key: "planName", Value: &r.Plan}, + }, + }, + PriceFilter: &schema.PriceFilter{ + Unit: strPtr("CLASS_TWO_RESOURCE_UNITS"), + }, + } +} + +func WMLClass3ResourceUnitsCostComponent(r *ResourceInstance) *schema.CostComponent { + var q *decimal.Decimal + if r.WML_Class1RU != nil { + q = decimalPtr(decimal.NewFromFloat(*r.WML_Class3RU)) + } + return &schema.CostComponent{ + Name: "Class 3 Resource Units", + Unit: "RU", + UnitMultiplier: decimal.NewFromInt(1), + MonthlyQuantity: q, + ProductFilter: &schema.ProductFilter{ + VendorName: strPtr("ibm"), + Region: strPtr(r.Location), + Service: &r.Service, + AttributeFilters: []*schema.AttributeFilter{ + {Key: "planName", Value: &r.Plan}, + }, + }, + PriceFilter: &schema.PriceFilter{ + Unit: strPtr("CLASS_THREE_RESOURCE_UNITS"), + }, + } +} diff --git a/internal/resources/ibm/tg_gateway.go b/internal/resources/ibm/tg_gateway.go index 89154b4ca7d..882619e5c7e 100644 --- a/internal/resources/ibm/tg_gateway.go +++ b/internal/resources/ibm/tg_gateway.go @@ -8,6 +8,8 @@ import ( "github.com/shopspring/decimal" ) +const STANDARD_PLAN = "transit-gateway-standard-plan" + // TgGateway struct represents a transit gateway between VPCs // // Resource information: https://cloud.ibm.com/docs/transit-gateway?topic=transit-gateway-getting-started @@ -55,6 +57,9 @@ func (r *TgGateway) connectionFreeCostComponent() *schema.CostComponent { Service: strPtr("transit.gateway"), ProductFamily: strPtr("service"), Region: strPtr("global"), + AttributeFilters: []*schema.AttributeFilter{ + {Key: "planName", Value: strPtr(STANDARD_PLAN)}, + }, }, } component.SetCustomPrice(decimalPtr(decimal.NewFromInt(0))) @@ -62,6 +67,7 @@ func (r *TgGateway) connectionFreeCostComponent() *schema.CostComponent { } func (r *TgGateway) connectionCostComponent() *schema.CostComponent { + var q *decimal.Decimal if r.Connection != nil { q = decimalPtr(decimal.NewFromInt(*r.Connection)) @@ -81,6 +87,9 @@ func (r *TgGateway) connectionCostComponent() *schema.CostComponent { Service: strPtr("transit.gateway"), ProductFamily: strPtr("service"), Region: strPtr("global"), + AttributeFilters: []*schema.AttributeFilter{ + {Key: "planName", Value: strPtr(STANDARD_PLAN)}, + }, }, PriceFilter: &schema.PriceFilter{ Unit: strPtr("INSTANCES"), @@ -103,6 +112,9 @@ func (r *TgGateway) dataTransferLocalCostComponent() *schema.CostComponent { Service: strPtr("transit.gateway"), ProductFamily: strPtr("service"), Region: strPtr("global"), + AttributeFilters: []*schema.AttributeFilter{ + {Key: "planName", Value: strPtr(STANDARD_PLAN)}, + }, }, PriceFilter: &schema.PriceFilter{ Unit: strPtr("GIGABYTE_TRANSMITTEDS_LOCAL"), @@ -125,6 +137,9 @@ func (r *TgGateway) dataTransferGlobalCostComponent() *schema.CostComponent { Service: strPtr("transit.gateway"), ProductFamily: strPtr("service"), Region: strPtr("global"), + AttributeFilters: []*schema.AttributeFilter{ + {Key: "planName", Value: strPtr(STANDARD_PLAN)}, + }, }, PriceFilter: &schema.PriceFilter{ Unit: strPtr("GIGABYTE_TRANSMITTEDS_GLOBAL"),