chore: make volcengine/volc-sdk-golang sdk lightweight

This commit is contained in:
Fu Diwei
2026-05-20 11:45:37 +08:00
committed by RHQYZ
parent d758a21436
commit 501b2da51f
3 changed files with 274 additions and 10 deletions
@@ -8,14 +8,14 @@ import (
"strings"
"github.com/samber/lo"
vevod "github.com/volcengine/volc-sdk-golang/service/vod"
vevodbusiness "github.com/volcengine/volc-sdk-golang/service/vod/models/business"
vevodrequest "github.com/volcengine/volc-sdk-golang/service/vod/models/request"
vevodbiz "github.com/volcengine/volc-sdk-golang/service/vod/models/business"
vevodreq "github.com/volcengine/volc-sdk-golang/service/vod/models/request"
ve "github.com/volcengine/volcengine-go-sdk/volcengine"
"github.com/certimate-go/certimate/pkg/core/certmgr"
certmgrimpl "github.com/certimate-go/certimate/pkg/core/certmgr/providers/volcengine-certcenter"
"github.com/certimate-go/certimate/pkg/core/deployer"
vevod "github.com/certimate-go/certimate/pkg/sdk3rd-trimmed/github.com/volc-sdk-golang/service/vod"
xcerthostname "github.com/certimate-go/certimate/pkg/utils/cert/hostname"
)
@@ -182,7 +182,7 @@ func (d *Deployer) getAllDomains(ctx context.Context) ([]string, error) {
default:
}
listDomainReq := &vevodrequest.VodListDomainRequest{
listDomainReq := &vevodreq.VodListDomainRequest{
SpaceName: d.config.SpaceName,
DomainType: d.config.DomainType,
SourceStationType: 1,
@@ -199,7 +199,7 @@ func (d *Deployer) getAllDomains(ctx context.Context) ([]string, error) {
break
}
var domainInstances []*vevodbusiness.VodDomainInstanceInfo
var domainInstances []*vevodbiz.VodDomainInstanceInfo
switch d.config.DomainType {
case DOMAIN_TYPE_PLAY:
domainInstances = listDomainResp.GetResult().GetPlayInstanceInfo().GetByteInstances()
@@ -231,15 +231,15 @@ func (d *Deployer) getAllDomains(ctx context.Context) ([]string, error) {
func (d *Deployer) updateDomainCertificate(ctx context.Context, domain string, cloudCertId string) error {
// 更新域名配置
// REF: https://www.volcengine.com/docs/4/1317310
updateDomainConfigReq := &vevodrequest.VodUpdateDomainConfigRequest{
updateDomainConfigReq := &vevodreq.VodUpdateDomainConfigRequest{
SpaceName: d.config.SpaceName,
DomainType: d.config.DomainType,
Domain: domain,
Config: &vevodbusiness.VodDomainConfig{
HTTPS: &vevodbusiness.HTTPS{
Config: &vevodbiz.VodDomainConfig{
HTTPS: &vevodbiz.HTTPS{
Switch: ve.Bool(true),
CertInfo: &vevodbusiness.CertInfo{
CertId: &cloudCertId,
CertInfo: &vevodbiz.CertInfo{
CertId: ve.String(cloudCertId),
},
},
},
@@ -0,0 +1,73 @@
package vod
import (
"fmt"
"net/http"
"sync"
"time"
"github.com/volcengine/volc-sdk-golang/base"
vevod "github.com/volcengine/volc-sdk-golang/service/vod"
)
type Vod struct {
*base.Client
DomainCache map[string]map[string]int
Lock sync.RWMutex
disableLog bool
}
type config struct {
disableLog bool
}
type Option func(c *config)
func NewInstance(opts ...Option) *Vod {
cfg := &config{}
for _, opt := range opts {
opt(cfg)
}
instance := &Vod{
DomainCache: make(map[string]map[string]int),
Client: base.NewClient(ServiceInfoMap[base.RegionCnNorth1], ApiInfoList),
disableLog: cfg.disableLog,
}
return instance
}
func NewInstanceWithRegion(region string, opts ...Option) *Vod {
cfg := &config{}
for _, opt := range opts {
opt(cfg)
}
var serviceInfo *base.ServiceInfo
var ok bool
if serviceInfo, ok = ServiceInfoMap[region]; !ok {
serviceInfo = &base.ServiceInfo{
Timeout: 60 * time.Second,
Scheme: "https",
Host: fmt.Sprintf("vod.%s.volcengineapi.com", region),
Header: http.Header{
"Accept": []string{"application/json"},
},
Credentials: base.Credentials{Region: region, Service: "vod"},
}
}
instance := &Vod{
DomainCache: make(map[string]map[string]int),
Client: base.NewClient(serviceInfo, ApiInfoList),
disableLog: cfg.disableLog,
}
return instance
}
var (
ServiceInfoMap = vevod.ServiceInfoMap
ApiInfoList = map[string]*base.ApiInfo{
"ListDomain": vevod.ApiInfoList["ListDomain"],
"UpdateDomainConfig": vevod.ApiInfoList["UpdateDomainConfig"],
}
)
@@ -0,0 +1,191 @@
package vod
import (
"encoding/json"
"net/http"
"net/url"
"strconv"
"google.golang.org/protobuf/encoding/protojson"
"github.com/pkg/errors"
"github.com/volcengine/volc-sdk-golang/service/vod/models/request"
"github.com/volcengine/volc-sdk-golang/service/vod/models/response"
)
func (p *Vod) ListDomain(req *request.VodListDomainRequest) (*response.VodListDomainResponse, int, error) {
query := url.Values{}
form := url.Values{}
marshaler := protojson.MarshalOptions{
Multiline: false,
AllowPartial: false,
UseProtoNames: true,
UseEnumNumbers: false,
EmitUnpopulated: false,
}
jsonData := marshaler.Format(req)
reqMap := map[string]interface{}{}
err := json.Unmarshal([]byte(jsonData), &reqMap)
if err != nil {
return nil, 0, err
}
for k, v := range reqMap {
var sv string
switch ov := v.(type) {
case string:
sv = ov
case int:
sv = strconv.FormatInt(int64(ov), 10)
case uint:
sv = strconv.FormatUint(uint64(ov), 10)
case int8:
sv = strconv.FormatInt(int64(ov), 10)
case uint8:
sv = strconv.FormatUint(uint64(ov), 10)
case int16:
sv = strconv.FormatInt(int64(ov), 10)
case uint16:
sv = strconv.FormatUint(uint64(ov), 10)
case int32:
sv = strconv.FormatInt(int64(ov), 10)
case uint32:
sv = strconv.FormatUint(uint64(ov), 10)
case int64:
sv = strconv.FormatInt(ov, 10)
case uint64:
sv = strconv.FormatUint(ov, 10)
case bool:
sv = strconv.FormatBool(ov)
case float32:
sv = strconv.FormatFloat(float64(ov), 'f', -1, 32)
case float64:
sv = strconv.FormatFloat(ov, 'f', -1, 64)
case []byte:
sv = string(ov)
default:
v2, e2 := json.Marshal(ov)
if e2 != nil {
return nil, 0, e2
}
sv = string(v2)
}
query.Set(k, sv)
form.Add(k, sv)
}
respBody, status, err := p.Query("ListDomain", query)
output := &response.VodListDomainResponse{}
unmarshaler := protojson.UnmarshalOptions{
DiscardUnknown: true,
}
errUnmarshal := unmarshaler.Unmarshal(respBody, output)
if err != nil || status != http.StatusOK {
// if exist http err,check whether the respBody's type is defined struct,
// if it is ,
// return struct,
// otherwise return nil body
// if httpCode is not 200,check whether the respBody's type is defined struct,
// if it is ,
// use errorCode as err and return struct,
// otherwise use respBody string as error and return
if errUnmarshal != nil || len(output.GetResponseMetadata().GetError().GetCode()) == 0 {
if err == nil {
err = errors.New(string(respBody))
}
return nil, status, err
} else {
return output, status, errors.New(output.GetResponseMetadata().GetError().GetCode())
}
}
return output, status, nil
}
func (p *Vod) UpdateDomainConfig(req *request.VodUpdateDomainConfigRequest) (*response.VodUpdateDomainConfigResponse, int, error) {
query := url.Values{}
form := url.Values{}
marshaler := protojson.MarshalOptions{
Multiline: false,
AllowPartial: false,
UseProtoNames: true,
UseEnumNumbers: false,
EmitUnpopulated: false,
}
jsonData := marshaler.Format(req)
reqMap := map[string]interface{}{}
err := json.Unmarshal([]byte(jsonData), &reqMap)
if err != nil {
return nil, 0, err
}
for k, v := range reqMap {
var sv string
switch ov := v.(type) {
case string:
sv = ov
case int:
sv = strconv.FormatInt(int64(ov), 10)
case uint:
sv = strconv.FormatUint(uint64(ov), 10)
case int8:
sv = strconv.FormatInt(int64(ov), 10)
case uint8:
sv = strconv.FormatUint(uint64(ov), 10)
case int16:
sv = strconv.FormatInt(int64(ov), 10)
case uint16:
sv = strconv.FormatUint(uint64(ov), 10)
case int32:
sv = strconv.FormatInt(int64(ov), 10)
case uint32:
sv = strconv.FormatUint(uint64(ov), 10)
case int64:
sv = strconv.FormatInt(ov, 10)
case uint64:
sv = strconv.FormatUint(ov, 10)
case bool:
sv = strconv.FormatBool(ov)
case float32:
sv = strconv.FormatFloat(float64(ov), 'f', -1, 32)
case float64:
sv = strconv.FormatFloat(ov, 'f', -1, 64)
case []byte:
sv = string(ov)
default:
v2, e2 := json.Marshal(ov)
if e2 != nil {
return nil, 0, e2
}
sv = string(v2)
}
query.Set(k, sv)
form.Add(k, sv)
}
respBody, status, err := p.Json("UpdateDomainConfig", url.Values{}, jsonData)
output := &response.VodUpdateDomainConfigResponse{}
unmarshaler := protojson.UnmarshalOptions{
DiscardUnknown: true,
}
errUnmarshal := unmarshaler.Unmarshal(respBody, output)
if err != nil || status != http.StatusOK {
// if exist http err,check whether the respBody's type is defined struct,
// if it is ,
// return struct,
// otherwise return nil body
// if httpCode is not 200,check whether the respBody's type is defined struct,
// if it is ,
// use errorCode as err and return struct,
// otherwise use respBody string as error and return
if errUnmarshal != nil || len(output.GetResponseMetadata().GetError().GetCode()) == 0 {
if err == nil {
err = errors.New(string(respBody))
}
return nil, status, err
} else {
return output, status, errors.New(output.GetResponseMetadata().GetError().GetCode())
}
}
return output, status, nil
}