diff --git a/internal/certmgmt/deployers/sp_ksyun_kcm.go b/internal/certmgmt/deployers/sp_ksyun_kcm.go new file mode 100644 index 000000000..b862fe2b2 --- /dev/null +++ b/internal/certmgmt/deployers/sp_ksyun_kcm.go @@ -0,0 +1,25 @@ +package deployers + +import ( + "fmt" + + "github.com/certimate-go/certimate/internal/domain" + "github.com/certimate-go/certimate/pkg/core" + dplyimpl "github.com/certimate-go/certimate/pkg/core/deployer/providers/ksyun-kcm" + xmaps "github.com/certimate-go/certimate/pkg/utils/maps" +) + +func init() { + Registries.MustRegister(domain.DeploymentProviderTypeKsyunKCM, func(options *ProviderFactoryOptions) (core.Deployer, error) { + credentials := domain.AccessConfigForKsyun{} + if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil { + return nil, fmt.Errorf("failed to populate provider access config: %w", err) + } + + provider, err := dplyimpl.NewDeployer(&dplyimpl.DeployerConfig{ + AccessKeyId: credentials.AccessKeyId, + SecretAccessKey: credentials.SecretAccessKey, + }) + return provider, err + }) +} diff --git a/internal/domain/provider.go b/internal/domain/provider.go index e177bafdc..603d2f8ec 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -393,6 +393,7 @@ const ( DeploymentProviderTypeKong = DeploymentProviderType(AccessProviderTypeKong) DeploymentProviderTypeKubernetesSecret = DeploymentProviderType(AccessProviderTypeKubernetes + "-secret") DeploymentProviderTypeKsyunCDN = DeploymentProviderType(AccessProviderTypeKsyun + "-cdn") + DeploymentProviderTypeKsyunKCM = DeploymentProviderType(AccessProviderTypeKsyun + "-kcm") DeploymentProviderTypeKsyunSLB = DeploymentProviderType(AccessProviderTypeKsyun + "-slb") DeploymentProviderTypeLeCDN = DeploymentProviderType(AccessProviderTypeLeCDN) DeploymentProviderTypeLinodeLOS = DeploymentProviderType(AccessProviderTypeLinode + "-los") diff --git a/pkg/core/deployer/providers/ksyun-kcm/ksyun_kcm.go b/pkg/core/deployer/providers/ksyun-kcm/ksyun_kcm.go new file mode 100644 index 000000000..d45d08401 --- /dev/null +++ b/pkg/core/deployer/providers/ksyun-kcm/ksyun_kcm.go @@ -0,0 +1,72 @@ +package ksyunkcm + +import ( + "context" + "fmt" + "log/slog" + + "github.com/certimate-go/certimate/pkg/core" + cmgrimpl "github.com/certimate-go/certimate/pkg/core/certmgr/providers/ksyun-kcm" +) + +type ( + Provider = core.Deployer + DeployResult = core.DeployerDeployResult +) + +type DeployerConfig struct { + // 金山云 AccessKeyId。 + AccessKeyId string `json:"accessKeyId"` + // 金山云 SecretAccessKey。 + SecretAccessKey string `json:"secretAccessKey"` +} + +type Deployer struct { + config *DeployerConfig + logger *slog.Logger + sdkCertmgr core.Certmgr +} + +var _ Provider = (*Deployer)(nil) + +func NewDeployer(config *DeployerConfig) (*Deployer, error) { + if config == nil { + return nil, fmt.Errorf("the configuration of the deployer provider is nil") + } + + pcertmgr, err := cmgrimpl.NewCertmgr(&cmgrimpl.CertmgrConfig{ + AccessKeyId: config.AccessKeyId, + SecretAccessKey: config.SecretAccessKey, + }) + if err != nil { + return nil, fmt.Errorf("could not create certmgr: %w", err) + } + + return &Deployer{ + config: config, + logger: slog.Default(), + sdkCertmgr: pcertmgr, + }, nil +} + +func (d *Deployer) SetLogger(logger *slog.Logger) { + if logger == nil { + d.logger = slog.New(slog.DiscardHandler) + } else { + d.logger = logger + } + + d.sdkCertmgr.SetLogger(logger) +} + +func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*DeployResult, error) { + // 上传证书 + upres, err := d.sdkCertmgr.Upload(ctx, certPEM, privkeyPEM) + if err != nil { + return nil, fmt.Errorf("failed to upload certificate file: %w", err) + } else { + d.logger.Info("ssl certificate uploaded", slog.Any("result", upres)) + } + + return &DeployResult{}, nil +} diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index 869b90551..155b66a31 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -679,6 +679,7 @@ export const DEPLOYMENT_PROVIDERS = Object.freeze({ KONG: `${ACCESS_PROVIDERS.KONG}`, KUBERNETES_SECRET: `${ACCESS_PROVIDERS.KUBERNETES}-secret`, KSYUN_CDN: `${ACCESS_PROVIDERS.KSYUN}-cdn`, + KSYUN_KCM: `${ACCESS_PROVIDERS.KSYUN}-kcm`, KSYUN_SLB: `${ACCESS_PROVIDERS.KSYUN}-slb`, LECDN: `${ACCESS_PROVIDERS.LECDN}`, LINODE_LOS: `${ACCESS_PROVIDERS.LINODE}-los`, @@ -880,6 +881,7 @@ export const deploymentProvidersMap: Map