Merge pull request #3753 from yunkunrao/master
Keep 3 decimal places for metering fee value.
This commit is contained in:
@@ -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 ""
|
||||
|
||||
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user