diff --git a/internal/certmgmt/deployers/sp_ucloud_uewaf.go b/internal/certmgmt/deployers/sp_ucloud_uewaf.go new file mode 100644 index 000000000..c5c652297 --- /dev/null +++ b/internal/certmgmt/deployers/sp_ucloud_uewaf.go @@ -0,0 +1,27 @@ +package deployers + +import ( + "fmt" + + "github.com/certimate-go/certimate/internal/domain" + "github.com/certimate-go/certimate/pkg/core/deployer" + uclouduewaf "github.com/certimate-go/certimate/pkg/core/deployer/providers/ucloud-uewaf" + xmaps "github.com/certimate-go/certimate/pkg/utils/maps" +) + +func init() { + Registries.MustRegister(domain.DeploymentProviderTypeUCloudUEWAF, func(options *ProviderFactoryOptions) (deployer.Provider, error) { + credentials := domain.AccessConfigForUCloud{} + if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil { + return nil, fmt.Errorf("failed to populate provider access config: %w", err) + } + + provider, err := uclouduewaf.NewDeployer(&uclouduewaf.DeployerConfig{ + PrivateKey: credentials.PrivateKey, + PublicKey: credentials.PublicKey, + ProjectId: credentials.ProjectId, + Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"), + }) + return provider, err + }) +} diff --git a/internal/domain/provider.go b/internal/domain/provider.go index cd5915d02..a150afecf 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -339,6 +339,7 @@ const ( DeploymentProviderTypeUCloudUALB = DeploymentProviderType(AccessProviderTypeUCloud + "-ualb") DeploymentProviderTypeUCloudUCDN = DeploymentProviderType(AccessProviderTypeUCloud + "-ucdn") DeploymentProviderTypeUCloudUCLB = DeploymentProviderType(AccessProviderTypeUCloud + "-uclb") + DeploymentProviderTypeUCloudUEWAF = DeploymentProviderType(AccessProviderTypeUCloud + "-uewaf") DeploymentProviderTypeUCloudUPathX = DeploymentProviderType(AccessProviderTypeUCloud + "-pathx") DeploymentProviderTypeUCloudUS3 = DeploymentProviderType(AccessProviderTypeUCloud + "-us3") DeploymentProviderTypeUniCloudWebHost = DeploymentProviderType(AccessProviderTypeUniCloud + "-webhost") diff --git a/pkg/core/certifier/challengers/dns01/ucloud/internal/lego.go b/pkg/core/certifier/challengers/dns01/ucloud/internal/lego.go index 6a93a2bad..5a262e084 100644 --- a/pkg/core/certifier/challengers/dns01/ucloud/internal/lego.go +++ b/pkg/core/certifier/challengers/dns01/ucloud/internal/lego.go @@ -75,6 +75,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) { cfg := ucloud.NewConfig() cfg.Timeout = config.HTTPTimeout + cfg.ProjectId = config.ProjectId credential := auth.NewCredential() credential.PrivateKey = config.PrivateKey credential.PublicKey = config.PublicKey @@ -101,9 +102,6 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error { request.RecordName = ucloud.String(dns01.UnFqdn(info.EffectiveFQDN)) request.Content = ucloud.String(info.Value) request.TTL = ucloud.String(fmt.Sprintf("%d", d.config.TTL)) - if d.config.ProjectId != "" { - request.SetProjectId(d.config.ProjectId) - } if _, err := d.client.AddDomainDNS(request); err != nil { return fmt.Errorf("ucloud: error when create record: %w", err) } @@ -122,9 +120,6 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { // REF: https://docs.ucloud.cn/api/udnr-api/udnr_domain_dns_query request := d.client.NewQueryDomainDNSRequest() request.Dn = ucloud.String(authZone) - if d.config.ProjectId != "" { - request.SetProjectId(d.config.ProjectId) - } response, err := d.client.QueryDomainDNS(request) if err != nil { return fmt.Errorf("ucloud: error when list records: %w", err) @@ -138,9 +133,6 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error { delreq.DnsType = ucloud.String(record.DnsType) delreq.RecordName = ucloud.String(record.RecordName) delreq.Content = ucloud.String(record.Content) - if d.config.ProjectId != "" { - delreq.SetProjectId(d.config.ProjectId) - } _, err := d.client.DeleteDomainDNS(delreq) if err != nil { return fmt.Errorf("ucloud: error when delete record: %w", err) diff --git a/pkg/core/certmgr/providers/1panel/1panel.go b/pkg/core/certmgr/providers/1panel/1panel.go index 03774b941..82c50631c 100644 --- a/pkg/core/certmgr/providers/1panel/1panel.go +++ b/pkg/core/certmgr/providers/1panel/1panel.go @@ -322,5 +322,5 @@ func createSDKClient(serverUrl, apiVersion, apiKey string, skipTlsVerify bool, n return client, nil } - return nil, fmt.Errorf("invalid 1panel api version") + return nil, errors.New("1panel: invalid api version") } diff --git a/pkg/core/certmgr/providers/gcore-cdn/gcore_cdn.go b/pkg/core/certmgr/providers/gcore-cdn/gcore_cdn.go index f8d59f9cf..022721ace 100644 --- a/pkg/core/certmgr/providers/gcore-cdn/gcore_cdn.go +++ b/pkg/core/certmgr/providers/gcore-cdn/gcore_cdn.go @@ -80,7 +80,7 @@ func (c *Certmgr) Replace(ctx context.Context, certIdOrName string, certPEM, pri func createSDKClient(apiToken string) (*sslcerts.Service, error) { if apiToken == "" { - return nil, errors.New("invalid gcore api token") + return nil, errors.New("gcore: invalid api token") } requester := gcore.NewClient( diff --git a/pkg/core/certmgr/providers/qiniu-sslcert/qiniu_sslcert.go b/pkg/core/certmgr/providers/qiniu-sslcert/qiniu_sslcert.go index 876890410..754d0bbd1 100644 --- a/pkg/core/certmgr/providers/qiniu-sslcert/qiniu_sslcert.go +++ b/pkg/core/certmgr/providers/qiniu-sslcert/qiniu_sslcert.go @@ -152,11 +152,10 @@ func (c *Certmgr) Replace(ctx context.Context, certIdOrName string, certPEM, pri func createSDKClient(accessKey, secretKey string) (*qiniusdk.SslCertManager, error) { if secretKey == "" { - return nil, errors.New("invalid qiniu access key") + return nil, errors.New("qiniu: invalid access key") } - if secretKey == "" { - return nil, errors.New("invalid qiniu secret key") + return nil, errors.New("qiniu: invalid secret key") } credential := auth.New(accessKey, secretKey) diff --git a/pkg/core/certmgr/providers/ucloud-ulb/ucloud_ulb.go b/pkg/core/certmgr/providers/ucloud-ulb/ucloud_ulb.go index 1280216b5..95c4065a5 100644 --- a/pkg/core/certmgr/providers/ucloud-ulb/ucloud_ulb.go +++ b/pkg/core/certmgr/providers/ucloud-ulb/ucloud_ulb.go @@ -40,7 +40,7 @@ func NewCertmgr(config *CertmgrConfig) (*Certmgr, error) { return nil, errors.New("the configuration of the certmgr provider is nil") } - client, err := createSDKClient(config.PrivateKey, config.PublicKey) + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId, config.Region) if err != nil { return nil, fmt.Errorf("could not create client: %w", err) } @@ -81,15 +81,11 @@ func (c *Certmgr) Upload(ctx context.Context, certPEM, privkeyPEM string) (*cert // 创建 SSL 证书 // REF: https://docs.ucloud.cn/api/ulb-api/create_ssl createSSLReq := c.sdkClient.NewCreateSSLRequest() - createSSLReq.Region = ucloud.String(c.config.Region) createSSLReq.SSLName = ucloud.String(certName) createSSLReq.SSLType = ucloud.String("Pem") createSSLReq.UserCert = ucloud.String(serverCertPEM) createSSLReq.CaCert = ucloud.String(intermediaCertPEM) createSSLReq.PrivateKey = ucloud.String(privkeyPEM) - if c.config.ProjectId != "" { - createSSLReq.ProjectId = ucloud.String(c.config.ProjectId) - } createSSLResp, err := c.sdkClient.CreateSSL(createSSLReq) c.logger.Debug("sdk request 'ulb.CreateSSL'", slog.Any("request", createSSLReq), slog.Any("response", createSSLResp)) @@ -122,12 +118,8 @@ func (c *Certmgr) tryGetResultIfCertExists(ctx context.Context, certPEM, privkey } describeSSLReq := c.sdkClient.NewDescribeSSLRequest() - describeSSLReq.Region = ucloud.String(c.config.Region) describeSSLReq.Offset = ucloud.Int(describeSSLOffset) describeSSLReq.Limit = ucloud.Int(describeSSLLimit) - if c.config.ProjectId != "" { - describeSSLReq.ProjectId = ucloud.String(c.config.ProjectId) - } describeSSLResp, err := c.sdkClient.DescribeSSL(describeSSLReq) c.logger.Debug("sdk request 'ulb.DescribeSSL'", slog.Any("request", describeSSLReq), slog.Any("response", describeSSLResp)) if err != nil { @@ -180,8 +172,17 @@ func (c *Certmgr) tryGetResultIfCertExists(ctx context.Context, certPEM, privkey return nil, false, nil } -func createSDKClient(privateKey, publicKey string) (*ucloudsdk.ULBClient, error) { +func createSDKClient(privateKey, publicKey, projectId, region string) (*ucloudsdk.ULBClient, error) { + if privateKey == "" { + return nil, fmt.Errorf("ucloud: invalid private key") + } + if publicKey == "" { + return nil, fmt.Errorf("ucloud: invalid public key") + } + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId + cfg.Region = region credential := auth.NewCredential() credential.PrivateKey = privateKey diff --git a/pkg/core/certmgr/providers/ucloud-upathx/ucloud_upathx.go b/pkg/core/certmgr/providers/ucloud-upathx/ucloud_upathx.go index b2356226a..11fb55e47 100644 --- a/pkg/core/certmgr/providers/ucloud-upathx/ucloud_upathx.go +++ b/pkg/core/certmgr/providers/ucloud-upathx/ucloud_upathx.go @@ -39,16 +39,7 @@ func NewCertmgr(config *CertmgrConfig) (*Certmgr, error) { return nil, errors.New("the configuration of the certmgr provider is nil") } - if config.ProjectId == "" { - defaultProjectId, err := getSDKDefaultProjectId(config.PrivateKey, config.PublicKey) - if err != nil { - return nil, fmt.Errorf("could not create client: %w", err) - } - - config.ProjectId = defaultProjectId - } - - client, err := createSDKClient(config.PrivateKey, config.PublicKey) + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId) if err != nil { return nil, fmt.Errorf("could not create client: %w", err) } @@ -94,9 +85,6 @@ func (c *Certmgr) Upload(ctx context.Context, certPEM, privkeyPEM string) (*cert createPathXSSLReq.UserCert = ucloud.String(serverCertPEM) createPathXSSLReq.CACert = ucloud.String(intermediaCertPEM) createPathXSSLReq.PrivateKey = ucloud.String(privkeyPEM) - if c.config.ProjectId != "" { - createPathXSSLReq.ProjectId = ucloud.String(c.config.ProjectId) - } createPathXSSLResp, err := c.sdkClient.CreatePathXSSL(createPathXSSLReq) c.logger.Debug("sdk request 'pathx.CreatePathXSSL'", slog.Any("request", createPathXSSLReq), slog.Any("response", createPathXSSLResp)) @@ -131,9 +119,6 @@ func (c *Certmgr) tryGetResultIfCertExists(ctx context.Context, certPEM, privkey describePathXSSLReq := c.sdkClient.NewDescribePathXSSLRequest() describePathXSSLReq.Offset = ucloud.Int(describePathXSSLOffset) describePathXSSLReq.Limit = ucloud.Int(describePathXSSLLimit) - if c.config.ProjectId != "" { - describePathXSSLReq.ProjectId = ucloud.String(c.config.ProjectId) - } describePathXSSLResp, err := c.sdkClient.DescribePathXSSL(describePathXSSLReq) c.logger.Debug("sdk request 'pathx.DescribePathXSSL'", slog.Any("request", describePathXSSLReq), slog.Any("response", describePathXSSLResp)) if err != nil { @@ -186,8 +171,26 @@ func (c *Certmgr) tryGetResultIfCertExists(ctx context.Context, certPEM, privkey return nil, false, nil } -func createSDKClient(privateKey, publicKey string) (*ucloudsdk.UPathXClient, error) { +func createSDKClient(privateKey, publicKey, projectId string) (*ucloudsdk.UPathXClient, error) { + if privateKey == "" { + return nil, errors.New("ucloud: invalid private key") + } + if publicKey == "" { + return nil, errors.New("ucloud: invalid public key") + } + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId + + // PathX 相关接口要求必传 ProjectId 参数 + if cfg.ProjectId == "" { + defaultProjectId, err := getSDKDefaultProjectId(privateKey, publicKey) + if err != nil { + return nil, err + } + + cfg.ProjectId = defaultProjectId + } credential := auth.NewCredential() credential.PrivateKey = privateKey diff --git a/pkg/core/certmgr/providers/ucloud-ussl/ucloud_ussl.go b/pkg/core/certmgr/providers/ucloud-ussl/ucloud_ussl.go index da0c0f403..2b4eac0d4 100644 --- a/pkg/core/certmgr/providers/ucloud-ussl/ucloud_ussl.go +++ b/pkg/core/certmgr/providers/ucloud-ussl/ucloud_ussl.go @@ -42,7 +42,7 @@ func NewCertmgr(config *CertmgrConfig) (*Certmgr, error) { return nil, errors.New("the configuration of the certmgr provider is nil") } - client, err := createSDKClient(config.PrivateKey, config.PublicKey) + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId) if err != nil { return nil, fmt.Errorf("could not create client: %w", err) } @@ -79,9 +79,6 @@ func (c *Certmgr) Upload(ctx context.Context, certPEM, privkeyPEM string) (*cert uploadNormalCertificateReq.SslPublicKey = ucloud.String(certPEMBase64) uploadNormalCertificateReq.SslPrivateKey = ucloud.String(privkeyPEMBase64) uploadNormalCertificateReq.SslMD5 = ucloud.String(certMd5Hex) - if c.config.ProjectId != "" { - uploadNormalCertificateReq.ProjectId = ucloud.String(c.config.ProjectId) - } uploadNormalCertificateResp, err := c.sdkClient.UploadNormalCertificate(uploadNormalCertificateReq) c.logger.Debug("sdk request 'ussl.UploadNormalCertificate'", slog.Any("request", uploadNormalCertificateReq), slog.Any("response", uploadNormalCertificateResp)) if err != nil { @@ -137,9 +134,6 @@ func (c *Certmgr) tryGetResultIfCertExists(ctx context.Context, certPEM string) getCertificateListReq.Sort = ucloud.String("2") getCertificateListReq.Page = ucloud.Int(getCertificateListPage) getCertificateListReq.PageSize = ucloud.Int(getCertificateListLimit) - if c.config.ProjectId != "" { - getCertificateListReq.ProjectId = ucloud.String(c.config.ProjectId) - } getCertificateListResp, err := c.sdkClient.GetCertificateList(getCertificateListReq) c.logger.Debug("sdk request 'ussl.GetCertificateList'", slog.Any("request", getCertificateListReq), slog.Any("response", getCertificateListResp)) if err != nil { @@ -164,9 +158,6 @@ func (c *Certmgr) tryGetResultIfCertExists(ctx context.Context, certPEM string) getCertificateDetailInfoReq := c.sdkClient.NewGetCertificateDetailInfoRequest() getCertificateDetailInfoReq.CertificateID = ucloud.Int(certItem.CertificateID) - if c.config.ProjectId != "" { - getCertificateDetailInfoReq.ProjectId = ucloud.String(c.config.ProjectId) - } getCertificateDetailInfoResp, err := c.sdkClient.GetCertificateDetailInfo(getCertificateDetailInfoReq) if err != nil { return nil, false, fmt.Errorf("failed to execute sdk request 'ussl.GetCertificateDetailInfo': %w", err) @@ -233,8 +224,16 @@ func (c *Certmgr) tryGetResultIfCertExists(ctx context.Context, certPEM string) return nil, false, nil } -func createSDKClient(privateKey, publicKey string) (*ucloudsdk.USSLClient, error) { +func createSDKClient(privateKey, publicKey, projectId string) (*ucloudsdk.USSLClient, error) { + if privateKey == "" { + return nil, fmt.Errorf("ucloud: invalid private key") + } + if publicKey == "" { + return nil, fmt.Errorf("ucloud: invalid public key") + } + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId credential := auth.NewCredential() credential.PrivateKey = privateKey diff --git a/pkg/core/deployer/providers/1panel-console/1panel_console.go b/pkg/core/deployer/providers/1panel-console/1panel_console.go index 817b9439a..7212b130f 100644 --- a/pkg/core/deployer/providers/1panel-console/1panel_console.go +++ b/pkg/core/deployer/providers/1panel-console/1panel_console.go @@ -132,5 +132,5 @@ func createSDKClient(serverUrl, apiVersion, apiKey string, skipTlsVerify bool) ( return client, nil } - return nil, fmt.Errorf("invalid 1panel api version") + return nil, errors.New("1panel: invalid api version") } diff --git a/pkg/core/deployer/providers/1panel-site/1panel_site.go b/pkg/core/deployer/providers/1panel-site/1panel_site.go index 6c8360ac5..a2aedc32a 100644 --- a/pkg/core/deployer/providers/1panel-site/1panel_site.go +++ b/pkg/core/deployer/providers/1panel-site/1panel_site.go @@ -430,5 +430,5 @@ func createSDKClient(serverUrl, apiVersion, apiKey string, skipTlsVerify bool, n return client, nil } - return nil, fmt.Errorf("invalid 1panel api version") + return nil, errors.New("1panel: invalid api version") } diff --git a/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go b/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go index 2df432e73..1ecca181b 100644 --- a/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go +++ b/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go @@ -158,7 +158,7 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep func createSDKClients(apiToken string) (*wSDKClients, error) { if apiToken == "" { - return nil, errors.New("invalid gcore api token") + return nil, errors.New("gcore: invalid api token") } requester := provider.NewClient( diff --git a/pkg/core/deployer/providers/lecdn/lecdn.go b/pkg/core/deployer/providers/lecdn/lecdn.go index 70f16fd07..ff569e6bd 100644 --- a/pkg/core/deployer/providers/lecdn/lecdn.go +++ b/pkg/core/deployer/providers/lecdn/lecdn.go @@ -170,5 +170,5 @@ func createSDKClient(serverUrl, apiVersion, apiRole, username, password string, return client, nil } - return nil, fmt.Errorf("invalid lecdn api version or user role") + return nil, errors.New("lecdn: invalid api version or user role") } diff --git a/pkg/core/deployer/providers/mohua-mvh/mohua_mvh.go b/pkg/core/deployer/providers/mohua-mvh/mohua_mvh.go index c21db16db..6506b3fcd 100644 --- a/pkg/core/deployer/providers/mohua-mvh/mohua_mvh.go +++ b/pkg/core/deployer/providers/mohua-mvh/mohua_mvh.go @@ -93,10 +93,10 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep func createSDKClient(username, apiPassword string) (*mohuasdk.Client, error) { if username == "" { - return nil, errors.New("invalid mohua username") + return nil, errors.New("mohua: invalid username") } if apiPassword == "" { - return nil, errors.New("invalid mohua api password") + return nil, errors.New("mohua: invalid api password") } client := mohuasdk.NewClient( diff --git a/pkg/core/deployer/providers/proxmoxve/proxmoxve.go b/pkg/core/deployer/providers/proxmoxve/proxmoxve.go index a436e66f0..b5a15791b 100644 --- a/pkg/core/deployer/providers/proxmoxve/proxmoxve.go +++ b/pkg/core/deployer/providers/proxmoxve/proxmoxve.go @@ -93,11 +93,11 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep func createSDKClient(serverUrl, apiToken, apiTokenSecret string, skipTlsVerify bool) (*proxmox.Client, error) { if _, err := url.Parse(serverUrl); err != nil { - return nil, errors.New("invalid pve server url") + return nil, errors.New("pve: invalid server url") } if apiToken == "" { - return nil, errors.New("invalid pve api token") + return nil, errors.New("pve: invalid api token") } httpClient := &http.Client{ diff --git a/pkg/core/deployer/providers/ucloud-ualb/ucloud_ualb.go b/pkg/core/deployer/providers/ucloud-ualb/ucloud_ualb.go index 24d8bfee2..40c7cf385 100644 --- a/pkg/core/deployer/providers/ucloud-ualb/ucloud_ualb.go +++ b/pkg/core/deployer/providers/ucloud-ualb/ucloud_ualb.go @@ -54,7 +54,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) { return nil, errors.New("the configuration of the deployer provider is nil") } - client, err := createSDKClient(config.PrivateKey, config.PublicKey) + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId, config.Region) if err != nil { return nil, fmt.Errorf("could not create client: %w", err) } @@ -133,13 +133,9 @@ func (d *Deployer) deployToLoadbalancer(ctx context.Context, cloudCertId string) } describeListenerReq := d.sdkClient.NewDescribeListenersRequest() - describeListenerReq.Region = ucloud.String(d.config.Region) describeListenerReq.LoadBalancerId = ucloud.String(d.config.LoadbalancerId) describeListenerReq.Offset = ucloud.Int(describeListenersOffset) describeListenerReq.Limit = ucloud.Int(describeListenersLimit) - if d.config.ProjectId != "" { - describeListenerReq.ProjectId = ucloud.String(d.config.ProjectId) - } describeListenerResp, err := d.sdkClient.DescribeListeners(describeListenerReq) d.logger.Debug("sdk request 'ulb.DescribeListeners'", slog.Any("request", describeListenerReq), slog.Any("response", describeListenerResp)) if err != nil { @@ -204,13 +200,9 @@ func (d *Deployer) updateListenerCertificate(ctx context.Context, cloudLoadbalan // 描述应用型负载均衡监听器 // REF: https://docs.ucloud.cn/api/ulb-api/describe_listeners describeListenersReq := d.sdkClient.NewDescribeListenersRequest() - describeListenersReq.Region = ucloud.String(d.config.Region) describeListenersReq.LoadBalancerId = ucloud.String(cloudLoadbalancerId) describeListenersReq.ListenerId = ucloud.String(cloudListenerId) describeListenersReq.Limit = ucloud.Int(1) - if d.config.ProjectId != "" { - describeListenersReq.ProjectId = ucloud.String(d.config.ProjectId) - } describeListenerResp, err := d.sdkClient.DescribeListeners(describeListenersReq) d.logger.Debug("sdk request 'ulb.DescribeListeners'", slog.Any("request", describeListenersReq), slog.Any("response", describeListenerResp)) if err != nil { @@ -235,13 +227,9 @@ func (d *Deployer) updateListenerCertificate(ctx context.Context, cloudLoadbalan // 未指定 SNI,只需部署到监听器 updateListenerAttributeReq := d.sdkClient.NewUpdateListenerAttributeRequest() - updateListenerAttributeReq.Region = ucloud.String(d.config.Region) updateListenerAttributeReq.LoadBalancerId = ucloud.String(cloudLoadbalancerId) updateListenerAttributeReq.ListenerId = ucloud.String(cloudListenerId) updateListenerAttributeReq.Certificates = []string{cloudCertId} - if d.config.ProjectId != "" { - updateListenerAttributeReq.ProjectId = ucloud.String(d.config.ProjectId) - } updateListenerResp, err := d.sdkClient.UpdateListenerAttribute(updateListenerAttributeReq) d.logger.Debug("sdk request 'ulb.UpdateListenerAttribute'", slog.Any("request", updateListenerAttributeReq), slog.Any("response", updateListenerResp)) if err != nil { @@ -253,13 +241,9 @@ func (d *Deployer) updateListenerCertificate(ctx context.Context, cloudLoadbalan // 新增监听器扩展证书 // REF: https://docs.ucloud.cn/api/ulb-api/add_ssl_binding_json addSSLBindingReq := d.sdkClient.NewAddSSLBindingRequest() - addSSLBindingReq.Region = ucloud.String(d.config.Region) addSSLBindingReq.LoadBalancerId = ucloud.String(cloudLoadbalancerId) addSSLBindingReq.ListenerId = ucloud.String(cloudListenerId) addSSLBindingReq.SSLIds = []string{cloudCertId} - if d.config.ProjectId != "" { - addSSLBindingReq.ProjectId = ucloud.String(d.config.ProjectId) - } addSSLBindingResp, err := d.sdkClient.AddSSLBinding(addSSLBindingReq) d.logger.Debug("sdk request 'ulb.AddSSLBinding'", slog.Any("request", addSSLBindingReq), slog.Any("response", addSSLBindingResp)) if err != nil { @@ -275,12 +259,8 @@ func (d *Deployer) updateListenerCertificate(ctx context.Context, cloudLoadbalan } describeSSLV2Req := d.sdkClient.NewDescribeSSLV2Request() - describeSSLV2Req.Region = ucloud.String(d.config.Region) describeSSLV2Req.SSLId = ucloud.String(certItem.SSLId) describeSSLV2Req.Limit = ucloud.Int(1) - if d.config.ProjectId != "" { - describeSSLV2Req.ProjectId = ucloud.String(d.config.ProjectId) - } describeSSLV2Resp, err := d.sdkClient.DescribeSSLV2(describeSSLV2Req) d.logger.Debug("sdk request 'ulb.DescribeSSLV2'", slog.Any("request", describeSSLV2Req), slog.Any("response", describeSSLV2Resp)) if err != nil { @@ -303,13 +283,9 @@ func (d *Deployer) updateListenerCertificate(ctx context.Context, cloudLoadbalan // REF: https://docs.ucloud.cn/api/ulb-api/delete_ssl_binding_json if len(sslIdsToDelete) > 0 { deleteSSLBindingReq := d.sdkClient.NewDeleteSSLBindingRequest() - deleteSSLBindingReq.Region = ucloud.String(d.config.Region) deleteSSLBindingReq.LoadBalancerId = ucloud.String(cloudLoadbalancerId) deleteSSLBindingReq.ListenerId = ucloud.String(cloudListenerId) deleteSSLBindingReq.SSLIds = sslIdsToDelete - if d.config.ProjectId != "" { - deleteSSLBindingReq.ProjectId = ucloud.String(d.config.ProjectId) - } deleteSSLBindingResp, err := d.sdkClient.DeleteSSLBinding(deleteSSLBindingReq) d.logger.Debug("sdk request 'ulb.DeleteSSLBinding'", slog.Any("request", deleteSSLBindingReq), slog.Any("response", deleteSSLBindingResp)) if err != nil { @@ -321,8 +297,17 @@ func (d *Deployer) updateListenerCertificate(ctx context.Context, cloudLoadbalan return nil } -func createSDKClient(privateKey, publicKey string) (*ucloudsdk.ULBClient, error) { +func createSDKClient(privateKey, publicKey, projectId, region string) (*ucloudsdk.ULBClient, error) { + if privateKey == "" { + return nil, fmt.Errorf("ucloud: invalid private key") + } + if publicKey == "" { + return nil, fmt.Errorf("ucloud: invalid public key") + } + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId + cfg.Region = region credential := auth.NewCredential() credential.PrivateKey = privateKey diff --git a/pkg/core/deployer/providers/ucloud-ucdn/ucloud_ucdn.go b/pkg/core/deployer/providers/ucloud-ucdn/ucloud_ucdn.go index acc5c1236..d3587518d 100644 --- a/pkg/core/deployer/providers/ucloud-ucdn/ucloud_ucdn.go +++ b/pkg/core/deployer/providers/ucloud-ucdn/ucloud_ucdn.go @@ -41,7 +41,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) { return nil, errors.New("the configuration of the deployer provider is nil") } - client, err := createSDKClient(config.PrivateKey, config.PublicKey) + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId) if err != nil { return nil, fmt.Errorf("could not create client: %w", err) } @@ -90,9 +90,6 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep // REF: https://docs.ucloud.cn/api/ucdn-api/get_ucdn_domain_config getUcdnDomainConfigReq := d.sdkClient.NewGetUcdnDomainConfigRequest() getUcdnDomainConfigReq.DomainId = []string{d.config.DomainId} - if d.config.ProjectId != "" { - getUcdnDomainConfigReq.SetProjectId(d.config.ProjectId) - } getUcdnDomainConfigResp, err := d.sdkClient.GetUcdnDomainConfig(getUcdnDomainConfigReq) d.logger.Debug("sdk request 'ucdn.GetUcdnDomainConfig'", slog.Any("request", getUcdnDomainConfigReq), slog.Any("response", getUcdnDomainConfigResp)) if err != nil { @@ -112,9 +109,6 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep updateUcdnDomainHttpsConfigV2Req.CertId = ucloud.Int(certId) updateUcdnDomainHttpsConfigV2Req.CertName = ucloud.String(upres.CertName) updateUcdnDomainHttpsConfigV2Req.CertType = ucloud.String("ussl") - if d.config.ProjectId != "" { - updateUcdnDomainHttpsConfigV2Req.SetProjectId(d.config.ProjectId) - } updateUcdnDomainHttpsConfigV2Resp, err := d.sdkClient.UpdateUcdnDomainHttpsConfigV2(updateUcdnDomainHttpsConfigV2Req) d.logger.Debug("sdk request 'ucdn.UpdateUcdnDomainHttpsConfigV2'", slog.Any("request", updateUcdnDomainHttpsConfigV2Req), slog.Any("response", updateUcdnDomainHttpsConfigV2Resp)) if err != nil { @@ -124,8 +118,16 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep return &deployer.DeployResult{}, nil } -func createSDKClient(privateKey, publicKey string) (*ucloudsdk.UCDNClient, error) { +func createSDKClient(privateKey, publicKey, projectId string) (*ucloudsdk.UCDNClient, error) { + if privateKey == "" { + return nil, fmt.Errorf("ucloud: invalid private key") + } + if publicKey == "" { + return nil, fmt.Errorf("ucloud: invalid public key") + } + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId credential := auth.NewCredential() credential.PrivateKey = privateKey diff --git a/pkg/core/deployer/providers/ucloud-uclb/ucloud_uclb.go b/pkg/core/deployer/providers/ucloud-uclb/ucloud_uclb.go index 19201ea61..2025dc6cd 100644 --- a/pkg/core/deployer/providers/ucloud-uclb/ucloud_uclb.go +++ b/pkg/core/deployer/providers/ucloud-uclb/ucloud_uclb.go @@ -58,7 +58,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) { return nil, errors.New("the configuration of the deployer provider is nil") } - client, err := createSDKClient(config.PrivateKey, config.PublicKey) + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId, config.Region) if err != nil { return nil, fmt.Errorf("could not create client: %w", err) } @@ -144,13 +144,9 @@ func (d *Deployer) deployToLoadbalancer(ctx context.Context, cloudCertId string) } describeVServerReq := d.sdkClient.NewDescribeVServerRequest() - describeVServerReq.Region = ucloud.String(d.config.Region) describeVServerReq.ULBId = ucloud.String(d.config.LoadbalancerId) describeVServerReq.Offset = ucloud.Int(describeVServerOffset) describeVServerReq.Limit = ucloud.Int(describeVServerLimit) - if d.config.ProjectId != "" { - describeVServerReq.ProjectId = ucloud.String(d.config.ProjectId) - } describeVServerResp, err := d.sdkClient.DescribeVServer(describeVServerReq) d.logger.Debug("sdk request 'ulb.DescribeVServer'", slog.Any("request", describeVServerReq), slog.Any("response", describeVServerResp)) if err != nil { @@ -215,13 +211,9 @@ func (d *Deployer) updateVServerCertificate(ctx context.Context, cloudLoadbalanc // 获取 CLB 下的 VServer 信息 // REF: https://docs.ucloud.cn/api/ulb-api/describe_vserver describeVServerReq := d.sdkClient.NewDescribeVServerRequest() - describeVServerReq.Region = ucloud.String(d.config.Region) describeVServerReq.ULBId = ucloud.String(cloudLoadbalancerId) describeVServerReq.VServerId = ucloud.String(cloudVServerId) describeVServerReq.Limit = ucloud.Int(1) - if d.config.ProjectId != "" { - describeVServerReq.ProjectId = ucloud.String(d.config.ProjectId) - } describeVServerResp, err := d.sdkClient.DescribeVServer(describeVServerReq) d.logger.Debug("sdk request 'ulb.DescribeVServer'", slog.Any("request", describeVServerReq), slog.Any("response", describeVServerResp)) if err != nil { @@ -239,13 +231,9 @@ func (d *Deployer) updateVServerCertificate(ctx context.Context, cloudLoadbalanc // 绑定 SSL 证书 // REF: https://docs.ucloud.cn/api/ulb-api/bind_ssl bindSSLReq := d.sdkClient.NewBindSSLRequest() - bindSSLReq.Region = ucloud.String(d.config.Region) bindSSLReq.ULBId = ucloud.String(cloudLoadbalancerId) bindSSLReq.VServerId = ucloud.String(cloudVServerId) bindSSLReq.SSLId = ucloud.String(cloudCertId) - if d.config.ProjectId != "" { - bindSSLReq.ProjectId = ucloud.String(d.config.ProjectId) - } bindSSLResp, err := d.sdkClient.BindSSL(bindSSLReq) d.logger.Debug("sdk request 'ulb.BindSSL'", slog.Any("request", bindSSLReq), slog.Any("response", bindSSLResp)) if err != nil { @@ -268,12 +256,8 @@ func (d *Deployer) updateVServerCertificate(ctx context.Context, cloudLoadbalanc } describeSSLV2Req := d.sdkClient.NewDescribeSSLV2Request() - describeSSLV2Req.Region = ucloud.String(d.config.Region) describeSSLV2Req.SSLId = ucloud.String(sslItem.SSLId) describeSSLV2Req.Limit = ucloud.Int(1) - if d.config.ProjectId != "" { - describeSSLV2Req.ProjectId = ucloud.String(d.config.ProjectId) - } describeSSLV2Resp, err := d.sdkClient.DescribeSSLV2(describeSSLV2Req) d.logger.Debug("sdk request 'ulb.DescribeSSLV2'", slog.Any("request", describeSSLV2Req), slog.Any("response", describeSSLV2Resp)) if err != nil { @@ -296,13 +280,9 @@ func (d *Deployer) updateVServerCertificate(ctx context.Context, cloudLoadbalanc // REF: https://docs.ucloud.cn/api/ulb-api/unbind_ssl for _, sslId := range sslIdsToUnbind { unbindSSLReq := d.sdkClient.NewUnbindSSLRequest() - unbindSSLReq.Region = ucloud.String(d.config.Region) unbindSSLReq.ULBId = ucloud.String(cloudLoadbalancerId) unbindSSLReq.VServerId = ucloud.String(cloudVServerId) unbindSSLReq.SSLId = ucloud.String(sslId) - if d.config.ProjectId != "" { - unbindSSLReq.ProjectId = ucloud.String(d.config.ProjectId) - } unbindSSLResp, err := d.sdkClient.UnbindSSL(unbindSSLReq) d.logger.Debug("sdk request 'ulb.UnbindSSL'", slog.Any("request", unbindSSLReq), slog.Any("response", unbindSSLResp)) if err != nil { @@ -313,8 +293,17 @@ func (d *Deployer) updateVServerCertificate(ctx context.Context, cloudLoadbalanc return nil } -func createSDKClient(privateKey, publicKey string) (*ucloudsdk.ULBClient, error) { +func createSDKClient(privateKey, publicKey, projectId, region string) (*ucloudsdk.ULBClient, error) { + if privateKey == "" { + return nil, fmt.Errorf("ucloud: invalid private key") + } + if publicKey == "" { + return nil, fmt.Errorf("ucloud: invalid public key") + } + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId + cfg.Region = region credential := auth.NewCredential() credential.PrivateKey = privateKey diff --git a/pkg/core/deployer/providers/ucloud-uewaf/ucloud_uewaf.go b/pkg/core/deployer/providers/ucloud-uewaf/ucloud_uewaf.go new file mode 100644 index 000000000..c1207bef6 --- /dev/null +++ b/pkg/core/deployer/providers/ucloud-uewaf/ucloud_uewaf.go @@ -0,0 +1,110 @@ +package uclouduewaf + +import ( + "context" + "crypto/md5" + "encoding/base64" + "encoding/hex" + "errors" + "fmt" + "log/slog" + "time" + + "github.com/ucloud/ucloud-sdk-go/ucloud" + "github.com/ucloud/ucloud-sdk-go/ucloud/auth" + + "github.com/certimate-go/certimate/pkg/core/deployer" + ucloudsdk "github.com/certimate-go/certimate/pkg/sdk3rd/ucloud/uewaf" +) + +type DeployerConfig struct { + // 优刻得 API 私钥。 + PrivateKey string `json:"privateKey"` + // 优刻得 API 公钥。 + PublicKey string `json:"publicKey"` + // 优刻得项目 ID。 + ProjectId string `json:"projectId,omitempty"` + // 自定义域名(不支持泛域名)。 + Domain string `json:"domain"` +} + +type Deployer struct { + config *DeployerConfig + logger *slog.Logger + sdkClient *ucloudsdk.UEWAFClient +} + +var _ deployer.Provider = (*Deployer)(nil) + +func NewDeployer(config *DeployerConfig) (*Deployer, error) { + if config == nil { + return nil, errors.New("the configuration of the deployer provider is nil") + } + + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId) + if err != nil { + return nil, fmt.Errorf("could not create client: %w", err) + } + + return &Deployer{ + config: config, + logger: slog.Default(), + sdkClient: client, + }, nil +} + +func (d *Deployer) SetLogger(logger *slog.Logger) { + if logger == nil { + d.logger = slog.New(slog.DiscardHandler) + } else { + d.logger = logger + } +} + +func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*deployer.DeployResult, error) { + if d.config.Domain == "" { + return nil, errors.New("config `domain` is required") + } + + // 生成优刻得所需的证书参数 + certPEMBase64 := base64.StdEncoding.EncodeToString([]byte(certPEM)) + privkeyPEMBase64 := base64.StdEncoding.EncodeToString([]byte(privkeyPEM)) + certMd5 := md5.Sum([]byte(certPEMBase64 + privkeyPEMBase64)) + certMd5Hex := hex.EncodeToString(certMd5[:]) + certName := fmt.Sprintf("certimate_%d", time.Now().UnixMilli()) + + // 添加 SSL 证书 + // REF: https://docs.ucloud.cn/api/uewaf-api/add_waf_domain_certificate_info + addWafDomainCertificateInfoReq := d.sdkClient.NewAddWafDomainCertificateInfoRequest() + addWafDomainCertificateInfoReq.Domain = ucloud.String(d.config.Domain) + addWafDomainCertificateInfoReq.CertificateName = ucloud.String(certName) + addWafDomainCertificateInfoReq.SslPublicKey = ucloud.String(certPEMBase64) + addWafDomainCertificateInfoReq.SslPrivateKey = ucloud.String(privkeyPEMBase64) + addWafDomainCertificateInfoReq.SslMD = ucloud.String(certMd5Hex) + addWafDomainCertificateInfoResp, err := d.sdkClient.AddWafDomainCertificateInfo(addWafDomainCertificateInfoReq) + d.logger.Debug("sdk request 'uewaf.AddWafDomainCertificateInfo'", slog.Any("request", addWafDomainCertificateInfoReq), slog.Any("response", addWafDomainCertificateInfoResp)) + if err != nil { + return nil, fmt.Errorf("failed to execute sdk request 'uewaf.AddWafDomainCertificateInfo': %w", err) + } + + return &deployer.DeployResult{}, nil +} + +func createSDKClient(privateKey, publicKey, projectId string) (*ucloudsdk.UEWAFClient, error) { + if privateKey == "" { + return nil, fmt.Errorf("ucloud: invalid private key") + } + if publicKey == "" { + return nil, fmt.Errorf("ucloud: invalid public key") + } + + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId + + credential := auth.NewCredential() + credential.PrivateKey = privateKey + credential.PublicKey = publicKey + + client := ucloudsdk.NewClient(&cfg, &credential) + return client, nil +} diff --git a/pkg/core/deployer/providers/ucloud-uewaf/ucloud_uewaf_test.go b/pkg/core/deployer/providers/ucloud-uewaf/ucloud_uewaf_test.go new file mode 100644 index 000000000..4295eec5b --- /dev/null +++ b/pkg/core/deployer/providers/ucloud-uewaf/ucloud_uewaf_test.go @@ -0,0 +1,75 @@ +package uclouduewaf_test + +import ( + "context" + "flag" + "fmt" + "os" + "strings" + "testing" + + provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/ucloud-uewaf" +) + +var ( + fInputCertPath string + fInputKeyPath string + fPrivateKey string + fPublicKey string + fDomain string +) + +func init() { + argsPrefix := "UCLOUDUEWAF_" + + flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "") + flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "") + flag.StringVar(&fPrivateKey, argsPrefix+"PRIVATEKEY", "", "") + flag.StringVar(&fPublicKey, argsPrefix+"PUBLICKEY", "", "") + flag.StringVar(&fDomain, argsPrefix+"DOMAIN", "", "") +} + +/* +Shell command to run this test: + + go test -v ./ucloud_uewaf_test.go -args \ + --UCLOUDUEWAF_INPUTCERTPATH="/path/to/your-input-cert.pem" \ + --UCLOUDUEWAF_INPUTKEYPATH="/path/to/your-input-key.pem" \ + --UCLOUDUEWAF_PRIVATEKEY="your-private-key" \ + --UCLOUDUEWAF_PUBLICKEY="your-public-key" \ + --UCLOUDUEWAF_DOMAIN="example.com" +*/ +func TestDeploy(t *testing.T) { + flag.Parse() + + t.Run("Deploy", func(t *testing.T) { + t.Log(strings.Join([]string{ + "args:", + fmt.Sprintf("INPUTCERTPATH: %v", fInputCertPath), + fmt.Sprintf("INPUTKEYPATH: %v", fInputKeyPath), + fmt.Sprintf("PRIVATEKEY: %v", fPrivateKey), + fmt.Sprintf("PUBLICKEY: %v", fPublicKey), + fmt.Sprintf("DOMAIN: %v", fDomain), + }, "\n")) + + provider, err := provider.NewDeployer(&provider.DeployerConfig{ + PrivateKey: fPrivateKey, + PublicKey: fPublicKey, + Domain: fDomain, + }) + if err != nil { + t.Errorf("err: %+v", err) + return + } + + fInputCertData, _ := os.ReadFile(fInputCertPath) + fInputKeyData, _ := os.ReadFile(fInputKeyPath) + res, err := provider.Deploy(context.Background(), string(fInputCertData), string(fInputKeyData)) + if err != nil { + t.Errorf("err: %+v", err) + return + } + + t.Logf("ok: %v", res) + }) +} diff --git a/pkg/core/deployer/providers/ucloud-upathx/ucloud_upathx.go b/pkg/core/deployer/providers/ucloud-upathx/ucloud_upathx.go index de4b7474c..4f4942dd4 100644 --- a/pkg/core/deployer/providers/ucloud-upathx/ucloud_upathx.go +++ b/pkg/core/deployer/providers/ucloud-upathx/ucloud_upathx.go @@ -43,16 +43,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) { return nil, errors.New("the configuration of the deployer provider is nil") } - if config.ProjectId == "" { - defaultProjectId, err := getSDKDefaultProjectId(config.PrivateKey, config.PublicKey) - if err != nil { - return nil, fmt.Errorf("could not create client: %w", err) - } - - config.ProjectId = defaultProjectId - } - - client, err := createSDKClient(config.PrivateKey, config.PublicKey) + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId) if err != nil { return nil, fmt.Errorf("could not create client: %w", err) } @@ -106,9 +97,6 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep bindPathXSSLReq.UGAId = ucloud.String(d.config.AcceleratorId) bindPathXSSLReq.Port = []int{int(d.config.ListenerPort)} bindPathXSSLReq.SSLId = ucloud.String(upres.CertId) - if d.config.ProjectId != "" { - bindPathXSSLReq.ProjectId = ucloud.String(d.config.ProjectId) - } bindPathXSSLResp, err := d.sdkClient.BindPathXSSL(bindPathXSSLReq) d.logger.Debug("sdk request 'pathx.BindPathXSSL'", slog.Any("request", bindPathXSSLReq), slog.Any("response", bindPathXSSLResp)) if err != nil { @@ -118,8 +106,26 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep return &deployer.DeployResult{}, nil } -func createSDKClient(privateKey, publicKey string) (*ucloudsdk.UPathXClient, error) { +func createSDKClient(privateKey, publicKey, projectId string) (*ucloudsdk.UPathXClient, error) { + if privateKey == "" { + return nil, fmt.Errorf("ucloud: invalid private key") + } + if publicKey == "" { + return nil, fmt.Errorf("ucloud: invalid public key") + } + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId + + // PathX 相关接口要求必传 ProjectId 参数 + if cfg.ProjectId == "" { + defaultProjectId, err := getSDKDefaultProjectId(privateKey, publicKey) + if err != nil { + return nil, err + } + + cfg.ProjectId = defaultProjectId + } credential := auth.NewCredential() credential.PrivateKey = privateKey diff --git a/pkg/core/deployer/providers/ucloud-us3/ucloud_us3.go b/pkg/core/deployer/providers/ucloud-us3/ucloud_us3.go index 00af12e3c..017ca08d3 100644 --- a/pkg/core/deployer/providers/ucloud-us3/ucloud_us3.go +++ b/pkg/core/deployer/providers/ucloud-us3/ucloud_us3.go @@ -44,7 +44,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) { return nil, errors.New("the configuration of the deployer provider is nil") } - client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.Region) + client, err := createSDKClient(config.PrivateKey, config.PublicKey, config.ProjectId, config.Region) if err != nil { return nil, fmt.Errorf("could not create client: %w", err) } @@ -99,9 +99,6 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep addUFileSSLCertReq.Domain = ucloud.String(d.config.Domain) addUFileSSLCertReq.USSLId = ucloud.String(upres.CertId) addUFileSSLCertReq.CertificateName = ucloud.String(upres.CertName) - if d.config.ProjectId != "" { - addUFileSSLCertReq.SetProjectId(d.config.ProjectId) - } addUFileSSLCertResp, err := d.sdkClient.AddUFileSSLCert(addUFileSSLCertReq) d.logger.Debug("sdk request 'us3.AddUFileSSLCert'", slog.Any("request", addUFileSSLCertReq), slog.Any("response", addUFileSSLCertResp)) if err != nil { @@ -111,8 +108,16 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep return &deployer.DeployResult{}, nil } -func createSDKClient(privateKey, publicKey, region string) (*ucloudsdk.UFileClient, error) { +func createSDKClient(privateKey, publicKey, projectId, region string) (*ucloudsdk.UFileClient, error) { + if privateKey == "" { + return nil, fmt.Errorf("ucloud: invalid private key") + } + if publicKey == "" { + return nil, fmt.Errorf("ucloud: invalid public key") + } + cfg := ucloud.NewConfig() + cfg.ProjectId = projectId cfg.Region = region credential := auth.NewCredential() diff --git a/pkg/sdk3rd/ucloud/uewaf/api_add_waf_domain_certificate_info.go b/pkg/sdk3rd/ucloud/uewaf/api_add_waf_domain_certificate_info.go new file mode 100644 index 000000000..426bd1e8c --- /dev/null +++ b/pkg/sdk3rd/ucloud/uewaf/api_add_waf_domain_certificate_info.go @@ -0,0 +1,46 @@ +package uewaf + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud/request" + "github.com/ucloud/ucloud-sdk-go/ucloud/response" +) + +type AddWafDomainCertificateInfoRequest struct { + request.CommonBase + + Domain *string `required:"true"` + CertificateName *string `required:"true"` + SslPublicKey *string `required:"true"` + SslPrivateKey *string `required:"false"` + SslMD *string `required:"false"` + SslKeyLess *string `required:"false"` +} + +type AddWafDomainCertificateInfoResponse struct { + response.CommonBase + + Id int +} + +func (c *UEWAFClient) NewAddWafDomainCertificateInfoRequest() *AddWafDomainCertificateInfoRequest { + req := &AddWafDomainCertificateInfoRequest{} + + c.Client.SetupRequest(req) + + req.SetRetryable(true) + return req +} + +func (c *UEWAFClient) AddWafDomainCertificateInfo(req *AddWafDomainCertificateInfoRequest) (*AddWafDomainCertificateInfoResponse, error) { + var err error + var res AddWafDomainCertificateInfoResponse + + reqCopier := *req + + err = c.Client.InvokeAction("AddWafDomainCertificateInfo", &reqCopier, &res) + if err != nil { + return &res, err + } + + return &res, nil +} diff --git a/pkg/sdk3rd/ucloud/uewaf/client.go b/pkg/sdk3rd/ucloud/uewaf/client.go new file mode 100644 index 000000000..e0dd24272 --- /dev/null +++ b/pkg/sdk3rd/ucloud/uewaf/client.go @@ -0,0 +1,18 @@ +package uewaf + +import ( + "github.com/ucloud/ucloud-sdk-go/ucloud" + "github.com/ucloud/ucloud-sdk-go/ucloud/auth" +) + +type UEWAFClient struct { + *ucloud.Client +} + +func NewClient(config *ucloud.Config, credential *auth.Credential) *UEWAFClient { + meta := ucloud.ClientMeta{Product: "UEWAF"} + client := ucloud.NewClientWithMeta(config, credential, meta) + return &UEWAFClient{ + client, + } +} diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProvider.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProvider.tsx index aeac89225..e3cf83774 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProvider.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProvider.tsx @@ -86,6 +86,7 @@ import BizDeployNodeConfigFieldsProviderTencentCloudWAF from "./BizDeployNodeCon import BizDeployNodeConfigFieldsProviderUCloudUALB from "./BizDeployNodeConfigFieldsProviderUCloudUALB"; import BizDeployNodeConfigFieldsProviderUCloudUCDN from "./BizDeployNodeConfigFieldsProviderUCloudUCDN"; import BizDeployNodeConfigFieldsProviderUCloudUCLB from "./BizDeployNodeConfigFieldsProviderUCloudUCLB"; +import BizDeployNodeConfigFieldsProviderUCloudUEWAF from "./BizDeployNodeConfigFieldsProviderUCloudUEWAF"; import BizDeployNodeConfigFieldsProviderUCloudUPathX from "./BizDeployNodeConfigFieldsProviderUCloudUPathX"; import BizDeployNodeConfigFieldsProviderUCloudUS3 from "./BizDeployNodeConfigFieldsProviderUCloudUS3"; import BizDeployNodeConfigFieldsProviderUniCloudWebHost from "./BizDeployNodeConfigFieldsProviderUniCloudWebHost"; @@ -194,6 +195,7 @@ const providerComponentMap: Partial { + const { i18n, t } = useTranslation(); + + const { parentNamePath } = useFormNestedFieldsContext(); + const formSchema = z.object({ + [parentNamePath]: getSchema({ i18n }), + }); + const formRule = createSchemaFieldRule(formSchema); + const initialValues = getInitialValues(); + + return ( + <> + + + + + ); +}; + +const getInitialValues = (): Nullish>> => { + return { + domain: "", + }; +}; + +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { + const { t } = i18n; + + return z.object({ + domain: z.string().refine((v) => validDomainName(v), t("common.errmsg.domain_invalid")), + }); +}; + +const _default = Object.assign(BizDeployNodeConfigFieldsProviderUCloudUEWAF, { + getInitialValues, + getSchema, +}); + +export default _default; diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index b47157523..c1ecaa2d0 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -620,6 +620,7 @@ export const DEPLOYMENT_PROVIDERS = Object.freeze({ UCLOUD_UALB: `${ACCESS_PROVIDERS.UCLOUD}-ualb`, UCLOUD_UCDN: `${ACCESS_PROVIDERS.UCLOUD}-ucdn`, UCLOUD_UCLB: `${ACCESS_PROVIDERS.UCLOUD}-uclb`, + UCLOUD_UEWAF: `${ACCESS_PROVIDERS.UCLOUD}-uewaf`, UCLOUD_UPATHX: `${ACCESS_PROVIDERS.UCLOUD}-upathx`, UCLOUD_US3: `${ACCESS_PROVIDERS.UCLOUD}-us3`, UNICLOUD_WEBHOST: `${ACCESS_PROVIDERS.UNICLOUD}-webhost`, @@ -741,6 +742,7 @@ export const deploymentProvidersMap: Map