From 9b72b003088dd80c6db734222d1adc77cd020251 Mon Sep 17 00:00:00 2001 From: yuansl Date: Sat, 26 Oct 2024 19:06:09 +0800 Subject: [PATCH] DP-5182 go-sdk: fusion traffic api adds 'type' parameter (#151) * DP-5182 go-sdk: fusion traffic api adds 'type' parameter - cdn: add 'BandwidthOption' & 'FluxOption' struct - see https://jira.qiniu.io/browse/DP-5182 * cdn: remove useless printf line --- cdn/api.go | 51 ++++++++++++++++++++++++++++++++++++++++-- cdn/api_test.go | 14 +++++++----- cdn/data_type.go | 32 ++++++++++++++++++++++++++ cdn/datatype_string.go | 29 ++++++++++++++++++++++++ cdn/option.go | 11 +++++++++ 5 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 cdn/data_type.go create mode 100644 cdn/datatype_string.go create mode 100644 cdn/option.go diff --git a/cdn/api.go b/cdn/api.go index ce1953a9..d8f140bb 100644 --- a/cdn/api.go +++ b/cdn/api.go @@ -36,11 +36,13 @@ func NewCdnManager(mac *auth.Credentials) *CdnManager { // EndDate 结束日期,格式例如:2016-07-03 // Granularity 取值粒度,取值可选值:5min/hour/day // Domains 域名列表,彼此用 ; 连接 +// DataType 计量数据类型, 可选 'bandwidth'(静态cdn带宽,默认)..., 参考 [DataType] type TrafficReq struct { StartDate string `json:"startDate"` EndDate string `json:"endDate"` Granularity string `json:"granularity"` Domains string `json:"domains"` + DataType string `json:"type,omitempty"` } // TrafficResp 为带宽/流量查询响应内容 @@ -57,14 +59,39 @@ type TrafficData struct { DomainOversea []int `json:"oversea"` } +type options struct { + dataType DataType +} + +func _WithDataType(dataType DataType) Option { + return OptionFunc(func(opt interface{}) { + opt.(*options).dataType = dataType + }) +} + +type BandwidthOption Option + +func WithBandwidthDataType(dataType DataType) BandwidthOption { + if DataTypeBandwidth <= dataType && dataType <= DataType302mBandwidth { + return _WithDataType(dataType) + } + panic("cdn: invalid DataType for GetBandwidthData: " + dataType.String()) +} + // GetBandwidthData 方法用来获取域名访问带宽数据 // // StartDate string 必须 开始日期,例如:2016-07-01 // EndDate string 必须 结束日期,例如:2016-07-03 // Granularity string 必须 粒度,取值:5min / hour /day // Domains []string 必须 域名列表 +// Opts 非必须 可选项 + func (m *CdnManager) GetBandwidthData(startDate, endDate, granularity string, - domainList []string) (bandwidthData TrafficResp, err error) { + domainList []string, opts ...BandwidthOption) (bandwidthData TrafficResp, err error) { + var options options + for _, opt := range opts { + opt.Apply(&options) + } domains := strings.Join(domainList, ";") reqBody := TrafficReq{ StartDate: startDate, @@ -72,6 +99,9 @@ func (m *CdnManager) GetBandwidthData(startDate, endDate, granularity string, Granularity: granularity, Domains: domains, } + if options.dataType.Valid() { + reqBody.DataType = options.dataType.String() + } resData, reqErr := postRequest(m.mac, "/v2/tune/bandwidth", reqBody) if reqErr != nil { @@ -86,14 +116,28 @@ func (m *CdnManager) GetBandwidthData(startDate, endDate, granularity string, return } +type FluxOption Option + +func WithFluxDataType(dataType DataType) FluxOption { + if DataTypeFlow <= dataType && dataType <= DataType302mFlow { + return _WithDataType(dataType) + } + panic("cdn: invalid DataType for GetFluxData: " + dataType.String()) +} + // GetFluxData 方法用来获取域名访问流量数据 // // StartDate string 必须 开始日期,例如:2016-07-01 // EndDate string 必须 结束日期,例如:2016-07-03 // Granularity string 必须 粒度,取值:5min / hour /day // Domains []string 必须 域名列表 +// Opts 非必须 可选项 func (m *CdnManager) GetFluxData(startDate, endDate, granularity string, - domainList []string) (fluxData TrafficResp, err error) { + domainList []string, opts ...FluxOption) (fluxData TrafficResp, err error) { + var options options + for _, opt := range opts { + opt.Apply(&options) + } domains := strings.Join(domainList, ";") reqBody := TrafficReq{ StartDate: startDate, @@ -101,6 +145,9 @@ func (m *CdnManager) GetFluxData(startDate, endDate, granularity string, Granularity: granularity, Domains: domains, } + if options.dataType.Valid() { + reqBody.DataType = options.dataType.String() + } resData, reqErr := postRequest(m.mac, "/v2/tune/flux", reqBody) if reqErr != nil { diff --git a/cdn/api_test.go b/cdn/api_test.go index 15ec7f15..723e4386 100644 --- a/cdn/api_test.go +++ b/cdn/api_test.go @@ -52,6 +52,7 @@ func TestGetBandwidthData(t *testing.T) { startDate string endDate string granularity string + dataType DataType domainList []string } @@ -66,6 +67,7 @@ func TestGetBandwidthData(t *testing.T) { startDate, endDate, "5min", + DataTypeBandwidth, []string{domain}, }, wantCode: 200, @@ -75,7 +77,7 @@ func TestGetBandwidthData(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { ret, err := cdnManager.GetBandwidthData(tc.args.startDate, tc.args.endDate, - tc.args.granularity, tc.args.domainList) + tc.args.granularity, tc.args.domainList, WithBandwidthDataType(tc.args.dataType)) if err != nil || ret.Code != tc.wantCode { t.Errorf("GetBandwidth() error = %v, %v", err, ret.Error) return @@ -90,6 +92,7 @@ func TestGetFluxData(t *testing.T) { startDate string endDate string granularity string + dataType DataType domainList []string } @@ -104,6 +107,7 @@ func TestGetFluxData(t *testing.T) { startDate, endDate, "5min", + DataTypeFlow, []string{domain}, }, wantCode: 200, @@ -113,7 +117,7 @@ func TestGetFluxData(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { ret, err := cdnManager.GetFluxData(tc.args.startDate, tc.args.endDate, - tc.args.granularity, tc.args.domainList) + tc.args.granularity, tc.args.domainList, WithFluxDataType(tc.args.dataType)) if err != nil || ret.Code != tc.wantCode { t.Errorf("GetFlux() error = %v, %v", err, ret.Error) return @@ -189,8 +193,8 @@ func TestRefreshDirs(t *testing.T) { } /* 预取有额度限制 -//TestPrefetchUrls -func TestPrefetchUrls(t *testing.T) { + //TestPrefetchUrls + func TestPrefetchUrls(t *testing.T) { type args struct { urls []string } @@ -218,7 +222,7 @@ func TestPrefetchUrls(t *testing.T) { } }) } -} + } */ // TestGetCdnLogList diff --git a/cdn/data_type.go b/cdn/data_type.go new file mode 100644 index 00000000..1ac7edea --- /dev/null +++ b/cdn/data_type.go @@ -0,0 +1,32 @@ +package cdn + +//go:generate stringer -type DataType -linecomment +type DataType int + +const ( + // 静态cdn带宽(bps) + DataTypeBandwidth DataType = iota + 1 // bandwidth + // 302cdn带宽(bps) + DataType302Bandwidth // 302bandwidth + // 302MIX带宽(bps) + DataType302mBandwidth // 302mbandwidth + // 静态cdn流量(bytes) + DataTypeFlow // flow + // 302cdn流量(bytes) + DataType302Flow // 302flow + // 302MIX流量(bytes) + DataType302mFlow // 302mflow +) + +func DataTypeOf(datatype string) DataType { + for d := DataTypeBandwidth; d <= DataType302mFlow; d++ { + if d.String() == datatype { + return d + } + } + return -1 +} + +func (d DataType) Valid() bool { + return DataTypeBandwidth <= d && d <= DataType302mFlow +} diff --git a/cdn/datatype_string.go b/cdn/datatype_string.go new file mode 100644 index 00000000..5ba79b4f --- /dev/null +++ b/cdn/datatype_string.go @@ -0,0 +1,29 @@ +// Code generated by "stringer -type DataType -linecomment"; DO NOT EDIT. + +package cdn + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[DataTypeBandwidth-1] + _ = x[DataType302Bandwidth-2] + _ = x[DataType302mBandwidth-3] + _ = x[DataTypeFlow-4] + _ = x[DataType302Flow-5] + _ = x[DataType302mFlow-6] +} + +const _DataType_name = "bandwidth302bandwidth302mbandwidthflow302flow302mflow" + +var _DataType_index = [...]uint8{0, 9, 21, 34, 38, 45, 53} + +func (i DataType) String() string { + i -= 1 + if i < 0 || i >= DataType(len(_DataType_index)-1) { + return "DataType(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _DataType_name[_DataType_index[i]:_DataType_index[i+1]] +} diff --git a/cdn/option.go b/cdn/option.go new file mode 100644 index 00000000..4743e238 --- /dev/null +++ b/cdn/option.go @@ -0,0 +1,11 @@ +package cdn + +type Option interface { + Apply(opt interface{}) +} + +type OptionFunc func(interface{}) + +func (f OptionFunc) Apply(opt interface{}) { + f(opt) +}