From 129ae3d6ee4f8d20cdf4bfeeca06f3cb6964c3f5 Mon Sep 17 00:00:00 2001 From: Rao Yunkun Date: Fri, 16 Apr 2021 17:32:53 +0800 Subject: [PATCH 1/2] Keep 3 decimal places for metering fee value. Signed-off-by: Rao Yunkun --- pkg/models/monitoring/utils.go | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/pkg/models/monitoring/utils.go b/pkg/models/monitoring/utils.go index 4aae8e989..450e600a8 100644 --- a/pkg/models/monitoring/utils.go +++ b/pkg/models/monitoring/utils.go @@ -23,11 +23,7 @@ const ( meteringConfigName = "ks-metering.yaml" meteringDefaultPrecision = 10 - meteringCorePrecision = 3 - meteringMemPrecision = 1 - meteringIngressPrecision = 0 - meteringEgressPrecision = 0 - meteringPvcPrecision = 1 + meteringFeePrecision = 3 ) var meterResourceUnitMap = map[int]string{ @@ -232,7 +228,7 @@ func getFeeWithMeterName(meterName string, sum string) string { CpuPerCorePerHour := new(big.Float).SetFloat64(priceInfo.CpuPerCorePerHour) tmp := s.Mul(s, CpuPerCorePerHour) - return fmt.Sprintf(generateFloatFormat(meteringCorePrecision), tmp) + return fmt.Sprintf(generateFloatFormat(meteringFeePrecision), tmp) case METER_RESOURCE_TYPE_MEM: oneGiga := new(big.Float).SetInt64(1073741824) MemPerGigabytesPerHour := new(big.Float).SetFloat64(priceInfo.MemPerGigabytesPerHour) @@ -240,7 +236,7 @@ func getFeeWithMeterName(meterName string, sum string) string { // transform unit from bytes to Gigabytes s.Quo(s, oneGiga) - return fmt.Sprintf(generateFloatFormat(meteringMemPrecision), s.Mul(s, MemPerGigabytesPerHour)) + return fmt.Sprintf(generateFloatFormat(meteringFeePrecision), s.Mul(s, MemPerGigabytesPerHour)) case METER_RESOURCE_TYPE_NET_INGRESS: oneMega := new(big.Float).SetInt64(1048576) IngressNetworkTrafficPerMegabytesPerHour := new(big.Float).SetFloat64(priceInfo.IngressNetworkTrafficPerMegabytesPerHour) @@ -248,23 +244,23 @@ func getFeeWithMeterName(meterName string, sum string) string { // transform unit from bytes to Migabytes s.Quo(s, oneMega) - return fmt.Sprintf(generateFloatFormat(meteringIngressPrecision), s.Mul(s, IngressNetworkTrafficPerMegabytesPerHour)) + return fmt.Sprintf(generateFloatFormat(meteringFeePrecision), s.Mul(s, IngressNetworkTrafficPerMegabytesPerHour)) case METER_RESOURCE_TYPE_NET_EGRESS: oneMega := new(big.Float).SetInt64(1048576) - EgressNetworkTrafficPerMegabytesPerHour := new(big.Float).SetPrec(meteringEgressPrecision).SetFloat64(priceInfo.EgressNetworkTrafficPerMegabytesPerHour) + EgressNetworkTrafficPerMegabytesPerHour := new(big.Float).SetPrec(meteringFeePrecision).SetFloat64(priceInfo.EgressNetworkTrafficPerMegabytesPerHour) // transform unit from bytes to Migabytes s.Quo(s, oneMega) - return fmt.Sprintf(generateFloatFormat(meteringEgressPrecision), s.Mul(s, EgressNetworkTrafficPerMegabytesPerHour)) + return fmt.Sprintf(generateFloatFormat(meteringFeePrecision), s.Mul(s, EgressNetworkTrafficPerMegabytesPerHour)) case METER_RESOURCE_TYPE_PVC: oneGiga := new(big.Float).SetInt64(1073741824) - PvcPerGigabytesPerHour := new(big.Float).SetPrec(meteringPvcPrecision).SetFloat64(priceInfo.PvcPerGigabytesPerHour) + PvcPerGigabytesPerHour := new(big.Float).SetPrec(meteringFeePrecision).SetFloat64(priceInfo.PvcPerGigabytesPerHour) // transform unit from bytes to Gigabytes s.Quo(s, oneGiga) - return fmt.Sprintf(generateFloatFormat(meteringPvcPrecision), s.Mul(s, PvcPerGigabytesPerHour)) + return fmt.Sprintf(generateFloatFormat(meteringFeePrecision), s.Mul(s, PvcPerGigabytesPerHour)) } return "" From 6952cf218f423964c62c3c2a21639c994abc40c3 Mon Sep 17 00:00:00 2001 From: Rao Yunkun Date: Fri, 16 Apr 2021 22:07:42 +0800 Subject: [PATCH 2/2] Update Unit Test. Signed-off-by: Rao Yunkun --- pkg/models/monitoring/utils_test.go | 104 ++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/pkg/models/monitoring/utils_test.go b/pkg/models/monitoring/utils_test.go index 29ecc47f4..ad794ee6a 100644 --- a/pkg/models/monitoring/utils_test.go +++ b/pkg/models/monitoring/utils_test.go @@ -176,6 +176,17 @@ func saveTestConfig(t *testing.T, conf *MeterConfig) { } } +func testInvalidConfig(t *testing.T) { + os.Mkdir(meteringConfigName, os.ModeDir) + defer os.RemoveAll(meteringConfigName) + _, err := LoadYaml() + if err == nil { + t.Error("LoadYaml should fail") + return + } + return +} + func cleanTestConfig(t *testing.T) { if _, err := os.Stat(meteringConfigName); os.IsNotExist(err) { @@ -303,7 +314,100 @@ func TestSquashPoints(t *testing.T) { } } +func TestLoadYaml(t *testing.T) { + + testInvalidConfig(t) + + // LoadYaml file not exist + _, err := LoadYaml() + if err == nil { + t.Error("LoadYaml should return error.") + return + } + + saveTestConfig(t, &MeterConfig{ + Billing: Billing{ + PriceInfo: PriceInfo{ + IngressNetworkTrafficPerMegabytesPerHour: 1, + EgressNetworkTrafficPerMegabytesPerHour: 2, + CpuPerCorePerHour: 3, + MemPerGigabytesPerHour: 4, + PvcPerGigabytesPerHour: 5, + CurrencyUnit: "CNY", + }, + }, + }) + + _, err = LoadYaml() + if err != nil { + t.Error("LoadYaml failed") + return + } + cleanTestConfig(t) +} + func TestGetFeeWithMeterName(t *testing.T) { + saveTestConfig(t, &MeterConfig{ + Billing: Billing{ + PriceInfo: PriceInfo{ + IngressNetworkTrafficPerMegabytesPerHour: 1, + EgressNetworkTrafficPerMegabytesPerHour: 2, + CpuPerCorePerHour: 3, + MemPerGigabytesPerHour: 4, + PvcPerGigabytesPerHour: 5, + CurrencyUnit: "CNY", + }, + }, + }) + defer cleanTestConfig(t) + + if getFeeWithMeterName("meter_cluster_cpu_usage", "1") != "3.000" { + t.Error("failed to get fee with meter_cluster_cpu_usage") + return + } + if getFeeWithMeterName("meter_cluster_memory_usage", "0") != "0.000" { + t.Error("failed to get fee with meter_cluster_memory_usage") + return + } + if getFeeWithMeterName("meter_cluster_net_bytes_transmitted", "0") != "0.000" { + t.Error("failed to get fee with meter_cluster_net_bytes_transmitted") + return + } + if getFeeWithMeterName("meter_cluster_net_bytes_received", "0") != "0.000" { + t.Error("failed to get fee with meter_cluster_net_bytes_received") + return + } + if getFeeWithMeterName("meter_cluster_pvc_bytes_total", "0") != "0.000" { + t.Error("failed to get fee with meter_cluster_pvc_bytes_total") + return + } +} + +func TestGetPriceInfo(t *testing.T) { + meterConfig := MeterConfig{ + Billing: Billing{ + PriceInfo: PriceInfo{ + CpuPerCorePerHour: 1, + MemPerGigabytesPerHour: 1, + IngressNetworkTrafficPerMegabytesPerHour: 1, + EgressNetworkTrafficPerMegabytesPerHour: 1, + PvcPerGigabytesPerHour: 1, + CurrencyUnit: "USD", + }, + }, + } + + if meterConfig.GetPriceInfo().CurrencyUnit != meterConfig.Billing.PriceInfo.CurrencyUnit || + meterConfig.GetPriceInfo().CpuPerCorePerHour != meterConfig.Billing.PriceInfo.CpuPerCorePerHour || + meterConfig.GetPriceInfo().MemPerGigabytesPerHour != meterConfig.Billing.PriceInfo.MemPerGigabytesPerHour || + meterConfig.GetPriceInfo().IngressNetworkTrafficPerMegabytesPerHour != meterConfig.Billing.PriceInfo.IngressNetworkTrafficPerMegabytesPerHour || + meterConfig.GetPriceInfo().EgressNetworkTrafficPerMegabytesPerHour != meterConfig.Billing.PriceInfo.EgressNetworkTrafficPerMegabytesPerHour || + meterConfig.GetPriceInfo().PvcPerGigabytesPerHour != meterConfig.Billing.PriceInfo.PvcPerGigabytesPerHour { + t.Error("failed to get price info") + } +} + +func TestUpdateMetricStatData(t *testing.T) { saveTestConfig(t, &MeterConfig{ Billing: Billing{