mirror of
https://github.com/usual2970/certimate.git
synced 2025-06-10 22:49:51 +00:00
feat: add jdcloud dns-01 applicant
This commit is contained in:
parent
469c24751e
commit
72896e052c
@ -93,6 +93,7 @@ make local.run
|
|||||||
| [百度智能云](https://cloud.baidu.com/) | |
|
| [百度智能云](https://cloud.baidu.com/) | |
|
||||||
| [华为云](https://www.huaweicloud.com/) | |
|
| [华为云](https://www.huaweicloud.com/) | |
|
||||||
| [火山引擎](https://www.volcengine.com/) | |
|
| [火山引擎](https://www.volcengine.com/) | |
|
||||||
|
| [京东云](https://www.jdcloud.com/) | |
|
||||||
| [AWS Route53](https://aws.amazon.com/route53/) | |
|
| [AWS Route53](https://aws.amazon.com/route53/) | |
|
||||||
| [Azure](https://azure.microsoft.com/) | |
|
| [Azure](https://azure.microsoft.com/) | |
|
||||||
| [CloudFlare](https://www.cloudflare.com/) | |
|
| [CloudFlare](https://www.cloudflare.com/) | |
|
||||||
|
@ -92,6 +92,7 @@ The following DNS providers are supported:
|
|||||||
| [Baidu AI Cloud](https://intl.cloud.baidu.com/) | |
|
| [Baidu AI Cloud](https://intl.cloud.baidu.com/) | |
|
||||||
| [Huawei Cloud](https://www.huaweicloud.com/) | |
|
| [Huawei Cloud](https://www.huaweicloud.com/) | |
|
||||||
| [Volcengine](https://www.volcengine.com/) | |
|
| [Volcengine](https://www.volcengine.com/) | |
|
||||||
|
| [JD Cloud](https://www.jdcloud.com/) | |
|
||||||
| [AWS Route53](https://aws.amazon.com/route53/) | |
|
| [AWS Route53](https://aws.amazon.com/route53/) | |
|
||||||
| [Azure DNS](https://azure.microsoft.com/) | |
|
| [Azure DNS](https://azure.microsoft.com/) | |
|
||||||
| [CloudFlare](https://www.cloudflare.com/) | |
|
| [CloudFlare](https://www.cloudflare.com/) | |
|
||||||
|
2
go.mod
2
go.mod
@ -77,12 +77,14 @@ require (
|
|||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.16.0 // indirect
|
github.com/go-playground/validator/v10 v10.16.0 // indirect
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
|
||||||
|
github.com/gofrs/uuid v4.4.0+incompatible // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/google/gnostic-models v0.6.9 // indirect
|
github.com/google/gnostic-models v0.6.9 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
|
github.com/jdcloud-api/jdcloud-sdk-go v1.62.0 // indirect
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
|
4
go.sum
4
go.sum
@ -427,6 +427,8 @@ github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM=
|
|||||||
github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
||||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||||
|
github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
|
||||||
|
github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
@ -576,6 +578,8 @@ github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/U
|
|||||||
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
|
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
|
||||||
github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
|
github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
|
||||||
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
|
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
|
||||||
|
github.com/jdcloud-api/jdcloud-sdk-go v1.62.0 h1:uPfyOSY16mBrhggriDNeySFB4ZkzMMXpNac2P0fbDRw=
|
||||||
|
github.com/jdcloud-api/jdcloud-sdk-go v1.62.0/go.mod h1:UrKjuULIWLjHFlG6aSPunArE5QX57LftMmStAZJBEX8=
|
||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||||
|
@ -17,6 +17,7 @@ import (
|
|||||||
pGname "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/gname"
|
pGname "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/gname"
|
||||||
pGoDaddy "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy"
|
pGoDaddy "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/godaddy"
|
||||||
pHuaweiCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud"
|
pHuaweiCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/huaweicloud"
|
||||||
|
pJDCloud "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/jdcloud"
|
||||||
pNameDotCom "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom"
|
pNameDotCom "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namedotcom"
|
||||||
pNameSilo "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo"
|
pNameSilo "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/namesilo"
|
||||||
pNS1 "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/ns1"
|
pNS1 "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/ns1"
|
||||||
@ -85,7 +86,7 @@ func createApplicant(options *applicantOptions) (challenge.Provider, error) {
|
|||||||
return applicant, err
|
return applicant, err
|
||||||
}
|
}
|
||||||
|
|
||||||
case domain.ApplyDNSProviderTypeAzureDNS:
|
case domain.ApplyDNSProviderTypeAzure, domain.ApplyDNSProviderTypeAzureDNS:
|
||||||
{
|
{
|
||||||
access := domain.AccessConfigForAzure{}
|
access := domain.AccessConfigForAzure{}
|
||||||
if err := maps.Populate(options.ProviderAccessConfig, &access); err != nil {
|
if err := maps.Populate(options.ProviderAccessConfig, &access); err != nil {
|
||||||
@ -214,6 +215,23 @@ func createApplicant(options *applicantOptions) (challenge.Provider, error) {
|
|||||||
return applicant, err
|
return applicant, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case domain.ApplyDNSProviderTypeJDCloud, domain.ApplyDNSProviderTypeJDCloudDNS:
|
||||||
|
{
|
||||||
|
access := domain.AccessConfigForJDCloud{}
|
||||||
|
if err := maps.Populate(options.ProviderAccessConfig, &access); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
applicant, err := pJDCloud.NewChallengeProvider(&pJDCloud.ChallengeProviderConfig{
|
||||||
|
AccessKeyId: access.AccessKeyId,
|
||||||
|
AccessKeySecret: access.AccessKeySecret,
|
||||||
|
RegionId: maps.GetValueAsString(options.ProviderApplyConfig, "region_id"),
|
||||||
|
DnsPropagationTimeout: options.DnsPropagationTimeout,
|
||||||
|
DnsTTL: options.DnsTTL,
|
||||||
|
})
|
||||||
|
return applicant, err
|
||||||
|
}
|
||||||
|
|
||||||
case domain.ApplyDNSProviderTypeNameDotCom:
|
case domain.ApplyDNSProviderTypeNameDotCom:
|
||||||
{
|
{
|
||||||
access := domain.AccessConfigForNameDotCom{}
|
access := domain.AccessConfigForNameDotCom{}
|
||||||
|
@ -115,12 +115,17 @@ type AccessConfigForHuaweiCloud struct {
|
|||||||
SecretAccessKey string `json:"secretAccessKey"`
|
SecretAccessKey string `json:"secretAccessKey"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AccessConfigForLocal struct{}
|
type AccessConfigForJDCloud struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
}
|
||||||
|
|
||||||
type AccessConfigForKubernetes struct {
|
type AccessConfigForKubernetes struct {
|
||||||
KubeConfig string `json:"kubeConfig,omitempty"`
|
KubeConfig string `json:"kubeConfig,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type AccessConfigForLocal struct{}
|
||||||
|
|
||||||
type AccessConfigForNameDotCom struct {
|
type AccessConfigForNameDotCom struct {
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
ApiToken string `json:"apiToken"`
|
ApiToken string `json:"apiToken"`
|
||||||
|
@ -34,7 +34,7 @@ const (
|
|||||||
AccessProviderTypeGoDaddy = AccessProviderType("godaddy")
|
AccessProviderTypeGoDaddy = AccessProviderType("godaddy")
|
||||||
AccessProviderTypeGoEdge = AccessProviderType("goedge") // GoEdge(预留)
|
AccessProviderTypeGoEdge = AccessProviderType("goedge") // GoEdge(预留)
|
||||||
AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud")
|
AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud")
|
||||||
AccessProviderTypeJDCloud = AccessProviderType("jdcloud") // 京东云(预留)
|
AccessProviderTypeJDCloud = AccessProviderType("jdcloud")
|
||||||
AccessProviderTypeKubernetes = AccessProviderType("k8s")
|
AccessProviderTypeKubernetes = AccessProviderType("k8s")
|
||||||
AccessProviderTypeLocal = AccessProviderType("local")
|
AccessProviderTypeLocal = AccessProviderType("local")
|
||||||
AccessProviderTypeNameDotCom = AccessProviderType("namedotcom")
|
AccessProviderTypeNameDotCom = AccessProviderType("namedotcom")
|
||||||
@ -68,6 +68,7 @@ const (
|
|||||||
ApplyDNSProviderTypeAliyunDNS = ApplyDNSProviderType("aliyun-dns")
|
ApplyDNSProviderTypeAliyunDNS = ApplyDNSProviderType("aliyun-dns")
|
||||||
ApplyDNSProviderTypeAWS = ApplyDNSProviderType("aws") // 兼容旧值,等同于 [ApplyDNSProviderTypeAWSRoute53]
|
ApplyDNSProviderTypeAWS = ApplyDNSProviderType("aws") // 兼容旧值,等同于 [ApplyDNSProviderTypeAWSRoute53]
|
||||||
ApplyDNSProviderTypeAWSRoute53 = ApplyDNSProviderType("aws-route53")
|
ApplyDNSProviderTypeAWSRoute53 = ApplyDNSProviderType("aws-route53")
|
||||||
|
ApplyDNSProviderTypeAzure = ApplyDNSProviderType("azure") // 兼容旧值,等同于 [ApplyDNSProviderTypeAzure]
|
||||||
ApplyDNSProviderTypeAzureDNS = ApplyDNSProviderType("azure-dns")
|
ApplyDNSProviderTypeAzureDNS = ApplyDNSProviderType("azure-dns")
|
||||||
ApplyDNSProviderTypeBaiduCloud = ApplyDNSProviderType("baiducloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeBaiduCloudDNS]
|
ApplyDNSProviderTypeBaiduCloud = ApplyDNSProviderType("baiducloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeBaiduCloudDNS]
|
||||||
ApplyDNSProviderTypeBaiduCloudDNS = ApplyDNSProviderType("baiducloud-dns")
|
ApplyDNSProviderTypeBaiduCloudDNS = ApplyDNSProviderType("baiducloud-dns")
|
||||||
@ -78,6 +79,8 @@ const (
|
|||||||
ApplyDNSProviderTypeGoDaddy = ApplyDNSProviderType("godaddy")
|
ApplyDNSProviderTypeGoDaddy = ApplyDNSProviderType("godaddy")
|
||||||
ApplyDNSProviderTypeHuaweiCloud = ApplyDNSProviderType("huaweicloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeHuaweiCloudDNS]
|
ApplyDNSProviderTypeHuaweiCloud = ApplyDNSProviderType("huaweicloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeHuaweiCloudDNS]
|
||||||
ApplyDNSProviderTypeHuaweiCloudDNS = ApplyDNSProviderType("huaweicloud-dns")
|
ApplyDNSProviderTypeHuaweiCloudDNS = ApplyDNSProviderType("huaweicloud-dns")
|
||||||
|
ApplyDNSProviderTypeJDCloud = ApplyDNSProviderType("jdcloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeJDCloudDNS]
|
||||||
|
ApplyDNSProviderTypeJDCloudDNS = ApplyDNSProviderType("jdcloud-dns")
|
||||||
ApplyDNSProviderTypeNameDotCom = ApplyDNSProviderType("namedotcom")
|
ApplyDNSProviderTypeNameDotCom = ApplyDNSProviderType("namedotcom")
|
||||||
ApplyDNSProviderTypeNameSilo = ApplyDNSProviderType("namesilo")
|
ApplyDNSProviderTypeNameSilo = ApplyDNSProviderType("namesilo")
|
||||||
ApplyDNSProviderTypeNS1 = ApplyDNSProviderType("ns1")
|
ApplyDNSProviderTypeNS1 = ApplyDNSProviderType("ns1")
|
||||||
|
@ -184,10 +184,10 @@ func (d *DNSProvider) removeDNSRecord(domain, subDomain, value string) error {
|
|||||||
|
|
||||||
if record == nil {
|
if record == nil {
|
||||||
return nil
|
return nil
|
||||||
|
} else {
|
||||||
|
err = d.client.DeleteRecord(domain, record.Id, d.generateClientToken())
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = d.client.DeleteRecord(domain, record.Id, d.generateClientToken())
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) generateClientToken() string {
|
func (d *DNSProvider) generateClientToken() string {
|
||||||
|
@ -0,0 +1,229 @@
|
|||||||
|
package lego_jdcloud
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
"github.com/go-acme/lego/v4/challenge/dns01"
|
||||||
|
"github.com/go-acme/lego/v4/platform/config/env"
|
||||||
|
jdCore "github.com/jdcloud-api/jdcloud-sdk-go/core"
|
||||||
|
jdDnsApi "github.com/jdcloud-api/jdcloud-sdk-go/services/domainservice/apis"
|
||||||
|
jdDnsClient "github.com/jdcloud-api/jdcloud-sdk-go/services/domainservice/client"
|
||||||
|
jdDnsModel "github.com/jdcloud-api/jdcloud-sdk-go/services/domainservice/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
envNamespace = "JDCLOUD_"
|
||||||
|
|
||||||
|
EnvAccessKeyID = envNamespace + "ACCESS_KEY_ID"
|
||||||
|
EnvAccessKeySecret = envNamespace + "ACCESS_KEY_SECRET"
|
||||||
|
EnvRegionId = envNamespace + "REGION_ID"
|
||||||
|
|
||||||
|
EnvTTL = envNamespace + "TTL"
|
||||||
|
EnvPropagationTimeout = envNamespace + "PROPAGATION_TIMEOUT"
|
||||||
|
EnvPollingInterval = envNamespace + "POLLING_INTERVAL"
|
||||||
|
EnvHTTPTimeout = envNamespace + "HTTP_TIMEOUT"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ challenge.ProviderTimeout = (*DNSProvider)(nil)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
AccessKeyID string
|
||||||
|
AccessKeySecret string
|
||||||
|
RegionId string
|
||||||
|
|
||||||
|
PropagationTimeout time.Duration
|
||||||
|
PollingInterval time.Duration
|
||||||
|
TTL int32
|
||||||
|
HTTPTimeout time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
type DNSProvider struct {
|
||||||
|
client *jdDnsClient.DomainserviceClient
|
||||||
|
config *Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDefaultConfig() *Config {
|
||||||
|
return &Config{
|
||||||
|
TTL: int32(env.GetOrDefaultInt(EnvTTL, 300)),
|
||||||
|
PropagationTimeout: env.GetOrDefaultSecond(EnvPropagationTimeout, 2*time.Minute),
|
||||||
|
PollingInterval: env.GetOrDefaultSecond(EnvPollingInterval, dns01.DefaultPollingInterval),
|
||||||
|
HTTPTimeout: env.GetOrDefaultSecond(EnvHTTPTimeout, 30*time.Second),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDNSProvider() (*DNSProvider, error) {
|
||||||
|
values, err := env.Get(EnvAccessKeyID, EnvAccessKeySecret)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("jdcloud: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
config := NewDefaultConfig()
|
||||||
|
config.AccessKeyID = values[EnvAccessKeyID]
|
||||||
|
config.AccessKeySecret = values[EnvAccessKeySecret]
|
||||||
|
config.RegionId = values[EnvRegionId]
|
||||||
|
|
||||||
|
return NewDNSProviderConfig(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
|
if config == nil {
|
||||||
|
return nil, errors.New("jdcloud: the configuration of the DNS provider is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
clientCredentials := jdCore.NewCredentials(config.AccessKeyID, config.AccessKeySecret)
|
||||||
|
clientConfig := jdCore.NewConfig()
|
||||||
|
clientConfig.SetTimeout(config.HTTPTimeout)
|
||||||
|
client := jdDnsClient.NewDomainserviceClient(clientCredentials)
|
||||||
|
client.SetConfig(clientConfig)
|
||||||
|
|
||||||
|
return &DNSProvider{
|
||||||
|
client: client,
|
||||||
|
config: config,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
|
info := dns01.GetChallengeInfo(domain, keyAuth)
|
||||||
|
|
||||||
|
zoneName, err := dns01.FindZoneByFqdn(info.EffectiveFQDN)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("jdcloud: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
subDomain, err := dns01.ExtractSubDomain(info.EffectiveFQDN, zoneName)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("jdcloud: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := d.addOrUpdateDNSRecord(domain, subDomain, info.Value); err != nil {
|
||||||
|
return fmt.Errorf("jdcloud: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
|
fqdn, value := dns01.GetRecord(domain, keyAuth)
|
||||||
|
subDomain := dns01.UnFqdn(fqdn)
|
||||||
|
|
||||||
|
if err := d.removeDNSRecord(domain, subDomain, value); err != nil {
|
||||||
|
return fmt.Errorf("jdcloud: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
|
return d.config.PropagationTimeout, d.config.PollingInterval
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) getDNSZone(domain string) (*jdDnsModel.DomainInfo, error) {
|
||||||
|
pageNumber := 1
|
||||||
|
pageSize := 100
|
||||||
|
for {
|
||||||
|
request := &jdDnsApi.DescribeDomainsRequest{}
|
||||||
|
request.RegionId = d.config.RegionId
|
||||||
|
request.DomainName = &domain
|
||||||
|
request.PageNumber = pageNumber
|
||||||
|
request.PageSize = pageSize
|
||||||
|
|
||||||
|
response, err := d.client.DescribeDomains(request)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range response.Result.DataList {
|
||||||
|
if item.DomainName == domain {
|
||||||
|
return &item, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(response.Result.DataList) < pageSize {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
pageNumber++
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("jdcloud: zone %s not found", domain)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) getDNSZoneAndRecord(domain, subDomain string) (*jdDnsModel.DomainInfo, *jdDnsModel.RRInfo, error) {
|
||||||
|
zone, err := d.getDNSZone(domain)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pageNumber := 1
|
||||||
|
pageSize := 100
|
||||||
|
for {
|
||||||
|
request := jdDnsApi.NewDescribeResourceRecordRequest(d.config.RegionId, fmt.Sprintf("%d", &zone.Id))
|
||||||
|
request.Search = &subDomain
|
||||||
|
request.PageNumber = &pageNumber
|
||||||
|
request.PageSize = &pageSize
|
||||||
|
|
||||||
|
response, err := d.client.DescribeResourceRecord(request)
|
||||||
|
if err != nil {
|
||||||
|
return zone, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, record := range response.Result.DataList {
|
||||||
|
if record.Type == "TXT" && record.HostRecord == subDomain {
|
||||||
|
return zone, &record, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(response.Result.DataList) < pageSize {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
pageNumber++
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) addOrUpdateDNSRecord(domain, subDomain, value string) error {
|
||||||
|
zone, record, err := d.getDNSZoneAndRecord(domain, subDomain)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if record == nil {
|
||||||
|
request := jdDnsApi.NewCreateResourceRecordRequest(d.config.RegionId, fmt.Sprintf("%d", &zone.Id), &jdDnsModel.AddRR{
|
||||||
|
Type: "TXT",
|
||||||
|
HostRecord: subDomain,
|
||||||
|
HostValue: value,
|
||||||
|
Ttl: int(d.config.TTL),
|
||||||
|
})
|
||||||
|
_, err := d.client.CreateResourceRecord(request)
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
request := jdDnsApi.NewModifyResourceRecordRequest(d.config.RegionId, fmt.Sprintf("%d", &zone.Id), fmt.Sprintf("%d", &record.Id), &jdDnsModel.UpdateRR{
|
||||||
|
Type: "TXT",
|
||||||
|
HostRecord: subDomain,
|
||||||
|
HostValue: value,
|
||||||
|
Ttl: int(d.config.TTL),
|
||||||
|
})
|
||||||
|
_, err := d.client.ModifyResourceRecord(request)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DNSProvider) removeDNSRecord(domain, subDomain, value string) error {
|
||||||
|
zone, record, err := d.getDNSZoneAndRecord(domain, subDomain)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if record == nil {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
req := jdDnsApi.NewDeleteResourceRecordRequest(d.config.RegionId, fmt.Sprintf("%d", &zone.Id), fmt.Sprintf("%d", &record.Id))
|
||||||
|
_, err = d.client.DeleteResourceRecord(req)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package jdcloud
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-acme/lego/v4/challenge"
|
||||||
|
|
||||||
|
internal "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/jdcloud/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChallengeProviderConfig struct {
|
||||||
|
AccessKeyId string `json:"accessKeyId"`
|
||||||
|
AccessKeySecret string `json:"accessKeySecret"`
|
||||||
|
RegionId string `json:"regionId"`
|
||||||
|
DnsPropagationTimeout int32 `json:"dnsPropagationTimeout,omitempty"`
|
||||||
|
DnsTTL int32 `json:"dnsTTL,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewChallengeProvider(config *ChallengeProviderConfig) (challenge.Provider, error) {
|
||||||
|
if config == nil {
|
||||||
|
panic("config is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
regionId := config.RegionId
|
||||||
|
if regionId == "" {
|
||||||
|
// 京东云的 SDK 要求必须传一个区域,实际上 DNS-01 流程里用不到,但不传会报错
|
||||||
|
regionId = "cn-north-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
providerConfig := internal.NewDefaultConfig()
|
||||||
|
providerConfig.AccessKeyID = config.AccessKeyId
|
||||||
|
providerConfig.AccessKeySecret = config.AccessKeySecret
|
||||||
|
providerConfig.RegionId = regionId
|
||||||
|
if config.DnsPropagationTimeout != 0 {
|
||||||
|
providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second
|
||||||
|
}
|
||||||
|
if config.DnsTTL != 0 {
|
||||||
|
providerConfig.TTL = config.DnsTTL
|
||||||
|
}
|
||||||
|
|
||||||
|
provider, err := internal.NewDNSProviderConfig(providerConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider, nil
|
||||||
|
}
|
1
ui/public/imgs/providers/jdcloud.svg
Normal file
1
ui/public/imgs/providers/jdcloud.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg viewBox="0 0 2030 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M1669.09384945 432.48813594c15.51186469 21.69491531 27.11864437 51.1457625 25.81694906 112.86779625-17.46440719 193.78983094-181.96610156 316.14915281-345.76271156 316.14915281-177.24745781 0-302.04745781-127.56610125-377.111865-270.10169531C954.30062883 557.72203344 941.44639195 520.13559312 929.35147664 487.59322063c-23.701695 32.21694937-73.6542375 84.77288156-99.09152531 109.23389812A629.15254219 629.15254219 0 0 0 890.24639133 720.81355906c20.01355969 31.18644094 70.508475 101.74915219 142.69830562 157.61355938 65.62711875 50.60338969 128.59661062 81.68135625 199.81016906 99.41694937a487.81016906 487.81016906 0 0 0 354.65762719-50.00677968c128.81355937-73.81694906 219.60678-209.78983031 236.04067781-350.96949188-31.72881375-52.61016937-100.501695-114.76610156-154.35932156-144.37966031zM585.37859508 381.12542375a238.96949156 238.96949156 0 0 1 126.96949125 36.39322031c30.53559281-32.5423725 57.54576281-66.16949156 85.58644125-100.06779656A370.54915219 370.54915219 0 0 0 214.66673039 621.01694937a373.09830469 373.09830469 0 0 0 4.39322062 57.00339c10.3593225 12.79999969 114.71186438 4.12203375 130.98305063-10.52203406a242.49491531 242.49491531 0 0 1-4.55593219-46.48135594 239.89152563 239.89152563 0 0 1 239.89152563-239.89152562zM585.37859508 992a370.6576275 370.6576275 0 0 1-320.97627094-185.38305094c4.98983062-6.61694906 121.60000031-19.57966125 149.42372812-18.00678a239.07796594 239.07796594 0 0 0 171.55254282 72.29830594s147.52542375 11.33559281 285.39661031-97.62711937c0 0 51.85084781 73.87118625 91.66101656 101.64067781 0 0-130.00677938 127.07796656-377.05762687 127.07796656z" fill="#E1251B"></path><path d="M1545.05317101 74.305085C1369.9209682 0.70508469 1199.0735107 22.18305125 1030.23283195 146.27796594 881.35147664 255.67457656 822.1243582 365.88474594 726.88367976 460.47457625c-113.89830469 113.13898313-199.32203344 151.21355906-267.06440718 176.81355938-69.96610125 26.46779625-167.59322062 44.52881344-240.75932157 40.51525406a371.41694906 371.41694906 0 0 0 45.34237313 128.59661062c186.79322063-3.19999969 318.48135562-74.68474594 403.41694875-126.48135656 74.2508475-45.28813594 185.97966094-159.34915219 244.61016937-233.22033844 94.21016906-118.56271219 216.94915219-231.97288125 329.16610219-267.55254281 156.7457625-49.62711844 309.1525425 19.79661 383.02372875 117.85762688 6.61694906 8.62372875 145.13898281 58.3593225 188.691525 95.78305125C1797.31079883 324.88135625 1721.8124932 148.61016969 1545.05317101 74.305085z" fill="#E1251B"></path><path d="M1809.24300164 377.81694875A497.35593188 497.35593188 0 0 0 1526.39554383 286.91525469c-122.63050875 0-245.42372906 47.78305125-331.82372813 132.88135594-62.86101656 61.83050812-93.4508475 112.00000031-163.14576281 195.57966093a570.35932219 570.35932219 0 0 0 92.63728781 108.47457563c9.00339-13.12542375 59.66101688-84.82711875 97.62711844-135.21355875 48.81355969-64.10847469 98.38644094-115.36271156 173.5593225-145.03050844a350.04745781 350.04745781 0 0 1 427.498305 139.3355925A486.02033906 486.02033906 0 0 0 1809.24300164 377.81694875z" fill="#E1251B"></path></svg>
|
@ -1,4 +1,4 @@
|
|||||||
import { memo, useEffect, useState } from "react";
|
import { memo } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { ReadOutlined as ReadOutlinedIcon } from "@ant-design/icons";
|
import { ReadOutlined as ReadOutlinedIcon } from "@ant-design/icons";
|
||||||
import { Badge, Divider, Space, Typography } from "antd";
|
import { Badge, Divider, Space, Typography } from "antd";
|
||||||
|
@ -27,6 +27,7 @@ import AccessFormGcoreConfig from "./AccessFormGcoreConfig";
|
|||||||
import AccessFormGnameConfig from "./AccessFormGnameConfig";
|
import AccessFormGnameConfig from "./AccessFormGnameConfig";
|
||||||
import AccessFormGoDaddyConfig from "./AccessFormGoDaddyConfig";
|
import AccessFormGoDaddyConfig from "./AccessFormGoDaddyConfig";
|
||||||
import AccessFormHuaweiCloudConfig from "./AccessFormHuaweiCloudConfig";
|
import AccessFormHuaweiCloudConfig from "./AccessFormHuaweiCloudConfig";
|
||||||
|
import AccessFormJDCloudConfig from "./AccessFormJDCloudConfig";
|
||||||
import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig";
|
import AccessFormKubernetesConfig from "./AccessFormKubernetesConfig";
|
||||||
import AccessFormLocalConfig from "./AccessFormLocalConfig";
|
import AccessFormLocalConfig from "./AccessFormLocalConfig";
|
||||||
import AccessFormNameDotComConfig from "./AccessFormNameDotComConfig";
|
import AccessFormNameDotComConfig from "./AccessFormNameDotComConfig";
|
||||||
@ -131,6 +132,8 @@ const AccessForm = forwardRef<AccessFormInstance, AccessFormProps>(({ className,
|
|||||||
return <AccessFormEdgioConfig {...nestedFormProps} />;
|
return <AccessFormEdgioConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.HUAWEICLOUD:
|
case ACCESS_PROVIDERS.HUAWEICLOUD:
|
||||||
return <AccessFormHuaweiCloudConfig {...nestedFormProps} />;
|
return <AccessFormHuaweiCloudConfig {...nestedFormProps} />;
|
||||||
|
case ACCESS_PROVIDERS.JDCLOUD:
|
||||||
|
return <AccessFormJDCloudConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.KUBERNETES:
|
case ACCESS_PROVIDERS.KUBERNETES:
|
||||||
return <AccessFormKubernetesConfig {...nestedFormProps} />;
|
return <AccessFormKubernetesConfig {...nestedFormProps} />;
|
||||||
case ACCESS_PROVIDERS.LOCAL:
|
case ACCESS_PROVIDERS.LOCAL:
|
||||||
|
76
ui/src/components/access/AccessFormJDCloudConfig.tsx
Normal file
76
ui/src/components/access/AccessFormJDCloudConfig.tsx
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { Form, type FormInstance, Input } from "antd";
|
||||||
|
import { createSchemaFieldRule } from "antd-zod";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { type AccessConfigForJDCloud } from "@/domain/access";
|
||||||
|
|
||||||
|
type AccessFormJDCloudConfigFieldValues = Nullish<AccessConfigForJDCloud>;
|
||||||
|
|
||||||
|
export type AccessFormJDCloudConfigProps = {
|
||||||
|
form: FormInstance;
|
||||||
|
formName: string;
|
||||||
|
disabled?: boolean;
|
||||||
|
initialValues?: AccessFormJDCloudConfigFieldValues;
|
||||||
|
onValuesChange?: (values: AccessFormJDCloudConfigFieldValues) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const initFormModel = (): AccessFormJDCloudConfigFieldValues => {
|
||||||
|
return {
|
||||||
|
accessKeyId: "",
|
||||||
|
accessKeySecret: "",
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const AccessFormJDCloudConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange: onValuesChange }: AccessFormJDCloudConfigProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const formSchema = z.object({
|
||||||
|
accessKeyId: z
|
||||||
|
.string()
|
||||||
|
.min(1, t("access.form.jdcloud_access_key_id.placeholder"))
|
||||||
|
.max(64, t("common.errmsg.string_max", { max: 64 }))
|
||||||
|
.trim(),
|
||||||
|
accessKeySecret: z
|
||||||
|
.string()
|
||||||
|
.min(1, t("access.form.jdcloud_access_key_secret.placeholder"))
|
||||||
|
.max(64, t("common.errmsg.string_max", { max: 64 }))
|
||||||
|
.trim(),
|
||||||
|
});
|
||||||
|
const formRule = createSchemaFieldRule(formSchema);
|
||||||
|
|
||||||
|
const handleFormChange = (_: unknown, values: z.infer<typeof formSchema>) => {
|
||||||
|
onValuesChange?.(values);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Form
|
||||||
|
form={formInst}
|
||||||
|
disabled={disabled}
|
||||||
|
initialValues={initialValues ?? initFormModel()}
|
||||||
|
layout="vertical"
|
||||||
|
name={formName}
|
||||||
|
onValuesChange={handleFormChange}
|
||||||
|
>
|
||||||
|
<Form.Item
|
||||||
|
name="accessKeyId"
|
||||||
|
label={t("access.form.jdcloud_access_key_id.label")}
|
||||||
|
rules={[formRule]}
|
||||||
|
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.jdcloud_access_key_id.tooltip") }}></span>}
|
||||||
|
>
|
||||||
|
<Input autoComplete="new-password" placeholder={t("access.form.jdcloud_access_key_id.placeholder")} />
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Form.Item
|
||||||
|
name="accessKeySecret"
|
||||||
|
label={t("access.form.jdcloud_access_key_secret.label")}
|
||||||
|
rules={[formRule]}
|
||||||
|
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.jdcloud_access_key_secret.tooltip") }}></span>}
|
||||||
|
>
|
||||||
|
<Input.Password autoComplete="new-password" placeholder={t("access.form.jdcloud_access_key_secret.placeholder")} />
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AccessFormJDCloudConfig;
|
@ -35,6 +35,7 @@ import { validDomainName, validIPv4Address, validIPv6Address } from "@/utils/val
|
|||||||
|
|
||||||
import ApplyNodeConfigFormAWSRoute53Config from "./ApplyNodeConfigFormAWSRoute53Config";
|
import ApplyNodeConfigFormAWSRoute53Config from "./ApplyNodeConfigFormAWSRoute53Config";
|
||||||
import ApplyNodeConfigFormHuaweiCloudDNSConfig from "./ApplyNodeConfigFormHuaweiCloudDNSConfig";
|
import ApplyNodeConfigFormHuaweiCloudDNSConfig from "./ApplyNodeConfigFormHuaweiCloudDNSConfig";
|
||||||
|
import ApplyNodeConfigFormJDCloudDNSConfig from "./ApplyNodeConfigFormJDCloudDNSConfig";
|
||||||
|
|
||||||
type ApplyNodeConfigFormFieldValues = Partial<WorkflowNodeConfigForApply>;
|
type ApplyNodeConfigFormFieldValues = Partial<WorkflowNodeConfigForApply>;
|
||||||
|
|
||||||
@ -145,6 +146,9 @@ const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeCon
|
|||||||
case APPLY_DNS_PROVIDERS.HUAWEICLOUD:
|
case APPLY_DNS_PROVIDERS.HUAWEICLOUD:
|
||||||
case APPLY_DNS_PROVIDERS.HUAWEICLOUD_DNS:
|
case APPLY_DNS_PROVIDERS.HUAWEICLOUD_DNS:
|
||||||
return <ApplyNodeConfigFormHuaweiCloudDNSConfig {...nestedFormProps} />;
|
return <ApplyNodeConfigFormHuaweiCloudDNSConfig {...nestedFormProps} />;
|
||||||
|
case APPLY_DNS_PROVIDERS.JDCLOUD:
|
||||||
|
case APPLY_DNS_PROVIDERS.JDCLOUD_DNS:
|
||||||
|
return <ApplyNodeConfigFormJDCloudDNSConfig {...nestedFormProps} />;
|
||||||
}
|
}
|
||||||
}, [disabled, initialValues?.providerConfig, fieldProvider, nestedFormInst, nestedFormName]);
|
}, [disabled, initialValues?.providerConfig, fieldProvider, nestedFormInst, nestedFormName]);
|
||||||
|
|
||||||
|
@ -0,0 +1,61 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { Form, type FormInstance, Input } from "antd";
|
||||||
|
import { createSchemaFieldRule } from "antd-zod";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
type ApplyNodeConfigFormJDCloudDNSConfigFieldValues = Nullish<{
|
||||||
|
regionId: string;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export type ApplyNodeConfigFormJDCloudDNSConfigProps = {
|
||||||
|
form: FormInstance;
|
||||||
|
formName: string;
|
||||||
|
disabled?: boolean;
|
||||||
|
initialValues?: ApplyNodeConfigFormJDCloudDNSConfigFieldValues;
|
||||||
|
onValuesChange?: (values: ApplyNodeConfigFormJDCloudDNSConfigFieldValues) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const initFormModel = (): ApplyNodeConfigFormJDCloudDNSConfigFieldValues => {
|
||||||
|
return {
|
||||||
|
regionId: "cn-north-1",
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const ApplyNodeConfigFormJDCloudDNSConfig = ({
|
||||||
|
form: formInst,
|
||||||
|
formName,
|
||||||
|
disabled,
|
||||||
|
initialValues,
|
||||||
|
onValuesChange,
|
||||||
|
}: ApplyNodeConfigFormJDCloudDNSConfigProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const formSchema = z.object({
|
||||||
|
regionId: z
|
||||||
|
.string({ message: t("workflow_node.apply.form.jdcloud_dns_region_id.placeholder") })
|
||||||
|
.nonempty(t("workflow_node.apply.form.jdcloud_dns_region_id.placeholder"))
|
||||||
|
.trim(),
|
||||||
|
});
|
||||||
|
const formRule = createSchemaFieldRule(formSchema);
|
||||||
|
|
||||||
|
const handleFormChange = (_: unknown, values: z.infer<typeof formSchema>) => {
|
||||||
|
onValuesChange?.(values);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Form
|
||||||
|
form={formInst}
|
||||||
|
disabled={disabled}
|
||||||
|
initialValues={initialValues ?? initFormModel()}
|
||||||
|
layout="vertical"
|
||||||
|
name={formName}
|
||||||
|
onValuesChange={handleFormChange}
|
||||||
|
>
|
||||||
|
<Form.Item name="regionId" label={t("workflow_node.apply.form.jdcloud_dns_region_id_id.label")} rules={[formRule]}>
|
||||||
|
<Input placeholder={t("workflow_node.apply.form.jdcloud_dns_region_id.placeholder")} />
|
||||||
|
</Form.Item>
|
||||||
|
</Form>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ApplyNodeConfigFormJDCloudDNSConfig;
|
@ -24,6 +24,7 @@ export interface AccessModel extends BaseModel {
|
|||||||
| AccessConfigForGname
|
| AccessConfigForGname
|
||||||
| AccessConfigForGoDaddy
|
| AccessConfigForGoDaddy
|
||||||
| AccessConfigForHuaweiCloud
|
| AccessConfigForHuaweiCloud
|
||||||
|
| AccessConfigForJDCloud
|
||||||
| AccessConfigForKubernetes
|
| AccessConfigForKubernetes
|
||||||
| AccessConfigForLocal
|
| AccessConfigForLocal
|
||||||
| AccessConfigForNameDotCom
|
| AccessConfigForNameDotCom
|
||||||
@ -133,6 +134,11 @@ export type AccessConfigForHuaweiCloud = {
|
|||||||
secretAccessKey: string;
|
secretAccessKey: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type AccessConfigForJDCloud = {
|
||||||
|
accessKeyId: string;
|
||||||
|
accessKeySecret: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type AccessConfigForKubernetes = {
|
export type AccessConfigForKubernetes = {
|
||||||
kubeConfig?: string;
|
kubeConfig?: string;
|
||||||
};
|
};
|
||||||
|
@ -22,6 +22,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
|
|||||||
GODADDY: "godaddy",
|
GODADDY: "godaddy",
|
||||||
EDGIO: "edgio",
|
EDGIO: "edgio",
|
||||||
HUAWEICLOUD: "huaweicloud",
|
HUAWEICLOUD: "huaweicloud",
|
||||||
|
JDCLOUD: "jdcloud",
|
||||||
KUBERNETES: "k8s",
|
KUBERNETES: "k8s",
|
||||||
LOCAL: "local",
|
LOCAL: "local",
|
||||||
NAMEDOTCOM: "namedotcom",
|
NAMEDOTCOM: "namedotcom",
|
||||||
@ -70,6 +71,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
|
|||||||
[ACCESS_PROVIDERS.BAIDUCLOUD, "provider.baiducloud", "/imgs/providers/baiducloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
[ACCESS_PROVIDERS.BAIDUCLOUD, "provider.baiducloud", "/imgs/providers/baiducloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
||||||
[ACCESS_PROVIDERS.HUAWEICLOUD, "provider.huaweicloud", "/imgs/providers/huaweicloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
[ACCESS_PROVIDERS.HUAWEICLOUD, "provider.huaweicloud", "/imgs/providers/huaweicloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
||||||
[ACCESS_PROVIDERS.VOLCENGINE, "provider.volcengine", "/imgs/providers/volcengine.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
[ACCESS_PROVIDERS.VOLCENGINE, "provider.volcengine", "/imgs/providers/volcengine.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
||||||
|
[ACCESS_PROVIDERS.JDCLOUD, "provider.jdcloud", "/imgs/providers/jdcloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
||||||
[ACCESS_PROVIDERS.AWS, "provider.aws", "/imgs/providers/aws.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
[ACCESS_PROVIDERS.AWS, "provider.aws", "/imgs/providers/aws.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
||||||
[ACCESS_PROVIDERS.GCORE, "provider.gcore", "/imgs/providers/gcore.png", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
[ACCESS_PROVIDERS.GCORE, "provider.gcore", "/imgs/providers/gcore.png", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
|
||||||
[ACCESS_PROVIDERS.QINIU, "provider.qiniu", "/imgs/providers/qiniu.svg", [ACCESS_USAGES.DEPLOY]],
|
[ACCESS_PROVIDERS.QINIU, "provider.qiniu", "/imgs/providers/qiniu.svg", [ACCESS_USAGES.DEPLOY]],
|
||||||
@ -117,6 +119,7 @@ export const APPLY_DNS_PROVIDERS = Object.freeze({
|
|||||||
ALIYUN_DNS: `${ACCESS_PROVIDERS.ALIYUN}-dns`,
|
ALIYUN_DNS: `${ACCESS_PROVIDERS.ALIYUN}-dns`,
|
||||||
AWS: `${ACCESS_PROVIDERS.AWS}`, // 兼容旧值,等同于 `AWS_ROUTE53`
|
AWS: `${ACCESS_PROVIDERS.AWS}`, // 兼容旧值,等同于 `AWS_ROUTE53`
|
||||||
AWS_ROUTE53: `${ACCESS_PROVIDERS.AWS}-route53`,
|
AWS_ROUTE53: `${ACCESS_PROVIDERS.AWS}-route53`,
|
||||||
|
AZURE: `${ACCESS_PROVIDERS.AZURE}`, // 兼容旧值,等同于 `AZURE_DNS`
|
||||||
AZURE_DNS: `${ACCESS_PROVIDERS.AZURE}-dns`,
|
AZURE_DNS: `${ACCESS_PROVIDERS.AZURE}-dns`,
|
||||||
BAIDUCLOUD: `${ACCESS_PROVIDERS.BAIDUCLOUD}`, // 兼容旧值,等同于 `BAIDUCLOUD_DNS`
|
BAIDUCLOUD: `${ACCESS_PROVIDERS.BAIDUCLOUD}`, // 兼容旧值,等同于 `BAIDUCLOUD_DNS`
|
||||||
BAIDUCLOUD_DNS: `${ACCESS_PROVIDERS.BAIDUCLOUD}-dns`,
|
BAIDUCLOUD_DNS: `${ACCESS_PROVIDERS.BAIDUCLOUD}-dns`,
|
||||||
@ -127,6 +130,8 @@ export const APPLY_DNS_PROVIDERS = Object.freeze({
|
|||||||
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
|
GODADDY: `${ACCESS_PROVIDERS.GODADDY}`,
|
||||||
HUAWEICLOUD: `${ACCESS_PROVIDERS.HUAWEICLOUD}`, // 兼容旧值,等同于 `HUAWEICLOUD_DNS`
|
HUAWEICLOUD: `${ACCESS_PROVIDERS.HUAWEICLOUD}`, // 兼容旧值,等同于 `HUAWEICLOUD_DNS`
|
||||||
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
|
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
|
||||||
|
JDCLOUD: `${ACCESS_PROVIDERS.JDCLOUD}`, // 兼容旧值,等同于 `JDCLOUD_DNS`
|
||||||
|
JDCLOUD_DNS: `${ACCESS_PROVIDERS.JDCLOUD}-dns`,
|
||||||
NAMEDOTCOM: `${ACCESS_PROVIDERS.NAMEDOTCOM}`,
|
NAMEDOTCOM: `${ACCESS_PROVIDERS.NAMEDOTCOM}`,
|
||||||
NAMESILO: `${ACCESS_PROVIDERS.NAMESILO}`,
|
NAMESILO: `${ACCESS_PROVIDERS.NAMESILO}`,
|
||||||
NS1: `${ACCESS_PROVIDERS.NS1}`,
|
NS1: `${ACCESS_PROVIDERS.NS1}`,
|
||||||
@ -159,6 +164,7 @@ export const applyDNSProvidersMap: Map<ApplyDNSProvider["type"] | string, ApplyD
|
|||||||
[APPLY_DNS_PROVIDERS.BAIDUCLOUD_DNS, "provider.baiducloud.dns"],
|
[APPLY_DNS_PROVIDERS.BAIDUCLOUD_DNS, "provider.baiducloud.dns"],
|
||||||
[APPLY_DNS_PROVIDERS.HUAWEICLOUD_DNS, "provider.huaweicloud.dns"],
|
[APPLY_DNS_PROVIDERS.HUAWEICLOUD_DNS, "provider.huaweicloud.dns"],
|
||||||
[APPLY_DNS_PROVIDERS.VOLCENGINE_DNS, "provider.volcengine.dns"],
|
[APPLY_DNS_PROVIDERS.VOLCENGINE_DNS, "provider.volcengine.dns"],
|
||||||
|
[APPLY_DNS_PROVIDERS.JDCLOUD_DNS, "provider.jdcloud.dns"],
|
||||||
[APPLY_DNS_PROVIDERS.AWS_ROUTE53, "provider.aws.route53"],
|
[APPLY_DNS_PROVIDERS.AWS_ROUTE53, "provider.aws.route53"],
|
||||||
[APPLY_DNS_PROVIDERS.AZURE_DNS, "provider.azure.dns"],
|
[APPLY_DNS_PROVIDERS.AZURE_DNS, "provider.azure.dns"],
|
||||||
[APPLY_DNS_PROVIDERS.CLOUDFLARE, "provider.cloudflare"],
|
[APPLY_DNS_PROVIDERS.CLOUDFLARE, "provider.cloudflare"],
|
||||||
|
@ -38,8 +38,8 @@
|
|||||||
"access.form.aliyun_access_key_id.label": "Aliyun AccessKeyId",
|
"access.form.aliyun_access_key_id.label": "Aliyun AccessKeyId",
|
||||||
"access.form.aliyun_access_key_id.placeholder": "Please enter Aliyun AccessKeyId",
|
"access.form.aliyun_access_key_id.placeholder": "Please enter Aliyun AccessKeyId",
|
||||||
"access.form.aliyun_access_key_id.tooltip": "For more information, see <a href=\"https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair\" target=\"_blank\">https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair</a>",
|
"access.form.aliyun_access_key_id.tooltip": "For more information, see <a href=\"https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair\" target=\"_blank\">https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair</a>",
|
||||||
"access.form.aliyun_access_key_secret.label": "Aliyun AccessKey Secret",
|
"access.form.aliyun_access_key_secret.label": "Aliyun AccessKeySecret",
|
||||||
"access.form.aliyun_access_key_secret.placeholder": "Please enter Aliyun AccessKey Secret",
|
"access.form.aliyun_access_key_secret.placeholder": "Please enter Aliyun AccessKeySecret",
|
||||||
"access.form.aliyun_access_key_secret.tooltip": "For more information, see <a href=\"https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair\" target=\"_blank\">https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair</a>",
|
"access.form.aliyun_access_key_secret.tooltip": "For more information, see <a href=\"https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair\" target=\"_blank\">https://www.alibabacloud.com/help/en/acr/create-and-obtain-an-accesskey-pair</a>",
|
||||||
"access.form.aws_access_key_id.label": "AWS AccessKeyId",
|
"access.form.aws_access_key_id.label": "AWS AccessKeyId",
|
||||||
"access.form.aws_access_key_id.placeholder": "Please enter AWS AccessKeyId",
|
"access.form.aws_access_key_id.placeholder": "Please enter AWS AccessKeyId",
|
||||||
@ -133,6 +133,12 @@
|
|||||||
"access.form.huaweicloud_secret_access_key.label": "Huawei Cloud SecretAccessKey",
|
"access.form.huaweicloud_secret_access_key.label": "Huawei Cloud SecretAccessKey",
|
||||||
"access.form.huaweicloud_secret_access_key.placeholder": "Please enter Huawei Cloud SecretAccessKey",
|
"access.form.huaweicloud_secret_access_key.placeholder": "Please enter Huawei Cloud SecretAccessKey",
|
||||||
"access.form.huaweicloud_secret_access_key.tooltip": "For more information, see <a href=\"https://support.huaweicloud.com/intl/en-us/usermanual-ca/ca_01_0003.html\" target=\"_blank\">https://support.huaweicloud.com/intl/en-us/usermanual-ca/ca_01_0003.html</a>",
|
"access.form.huaweicloud_secret_access_key.tooltip": "For more information, see <a href=\"https://support.huaweicloud.com/intl/en-us/usermanual-ca/ca_01_0003.html\" target=\"_blank\">https://support.huaweicloud.com/intl/en-us/usermanual-ca/ca_01_0003.html</a>",
|
||||||
|
"access.form.jdcloud_access_key_id.label": "JD Cloud AccessKeyId",
|
||||||
|
"access.form.jdcloud_access_key_id.placeholder": "Please enter JD Cloud AccessKeyId",
|
||||||
|
"access.form.jdcloud_access_key_id.tooltip": "For more information, see <a href=\"https://docs.jdcloud.com/en/account-management/accesskey-management\" target=\"_blank\">https://docs.jdcloud.com/en/account-management/accesskey-management</a>",
|
||||||
|
"access.form.jdcloud_access_key_secret.label": "JD Cloud AccessKeySecret",
|
||||||
|
"access.form.jdcloud_access_key_secret.placeholder": "Please enter JD Cloud AccessKeySecret",
|
||||||
|
"access.form.jdcloud_access_key_secret.tooltip": "For more information, see <a href=\"https://docs.jdcloud.com/en/account-management/accesskey-management\" target=\"_blank\">https://docs.jdcloud.com/en/account-management/accesskey-management</a>",
|
||||||
"access.form.k8s_kubeconfig.label": "KubeConfig",
|
"access.form.k8s_kubeconfig.label": "KubeConfig",
|
||||||
"access.form.k8s_kubeconfig.placeholder": "Please enter KubeConfig file",
|
"access.form.k8s_kubeconfig.placeholder": "Please enter KubeConfig file",
|
||||||
"access.form.k8s_kubeconfig.upload": "Choose File ...",
|
"access.form.k8s_kubeconfig.upload": "Choose File ...",
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
"provider.aliyun.cdn": "Alibaba Cloud - CDN (Content Delivery Network)",
|
"provider.aliyun.cdn": "Alibaba Cloud - CDN (Content Delivery Network)",
|
||||||
"provider.aliyun.clb": "Alibaba Cloud - CLB (Classic Load Balancer)",
|
"provider.aliyun.clb": "Alibaba Cloud - CLB (Classic Load Balancer)",
|
||||||
"provider.aliyun.dcdn": "Alibaba Cloud - DCDN (Dynamic Route for Content Delivery Network)",
|
"provider.aliyun.dcdn": "Alibaba Cloud - DCDN (Dynamic Route for Content Delivery Network)",
|
||||||
"provider.aliyun.dns": "Alibaba Cloud - DNS (Domain Name Service)",
|
"provider.aliyun.dns": "Alibaba Cloud - DNS",
|
||||||
"provider.aliyun.esa": "Alibaba Cloud - ESA (Edge Security Acceleration)",
|
"provider.aliyun.esa": "Alibaba Cloud - ESA (Edge Security Acceleration)",
|
||||||
"provider.aliyun.live": "Alibaba Cloud - ApsaraVideo Live",
|
"provider.aliyun.live": "Alibaba Cloud - ApsaraVideo Live",
|
||||||
"provider.aliyun.nlb": "Alibaba Cloud - NLB (Network Load Balancer)",
|
"provider.aliyun.nlb": "Alibaba Cloud - NLB (Network Load Balancer)",
|
||||||
@ -69,8 +69,10 @@
|
|||||||
"provider.godaddy": "GoDaddy",
|
"provider.godaddy": "GoDaddy",
|
||||||
"provider.huaweicloud": "Huawei Cloud",
|
"provider.huaweicloud": "Huawei Cloud",
|
||||||
"provider.huaweicloud.cdn": "Huawei Cloud - CDN (Content Delivery Network)",
|
"provider.huaweicloud.cdn": "Huawei Cloud - CDN (Content Delivery Network)",
|
||||||
"provider.huaweicloud.dns": "Huawei Cloud - DNS (Domain Name Service)",
|
"provider.huaweicloud.dns": "Huawei Cloud - DNS",
|
||||||
"provider.huaweicloud.elb": "Huawei Cloud - ELB (Elastic Load Balance)",
|
"provider.huaweicloud.elb": "Huawei Cloud - ELB (Elastic Load Balance)",
|
||||||
|
"provider.jdcloud": "JD Cloud",
|
||||||
|
"provider.jdcloud.dns": "JD Cloud - DNS",
|
||||||
"provider.kubernetes": "Kubernetes",
|
"provider.kubernetes": "Kubernetes",
|
||||||
"provider.kubernetes.secret": "Kubernetes - Secret",
|
"provider.kubernetes.secret": "Kubernetes - Secret",
|
||||||
"provider.local": "Local deployment",
|
"provider.local": "Local deployment",
|
||||||
@ -88,7 +90,7 @@
|
|||||||
"provider.tencentcloud.clb": "Tencent Cloud - CLB (Cloud Load Balancer)",
|
"provider.tencentcloud.clb": "Tencent Cloud - CLB (Cloud Load Balancer)",
|
||||||
"provider.tencentcloud.cos": "Tencent Cloud - COS (Cloud Object Storage)",
|
"provider.tencentcloud.cos": "Tencent Cloud - COS (Cloud Object Storage)",
|
||||||
"provider.tencentcloud.css": "Tencent Cloud - CSS (Cloud Streaming Service)",
|
"provider.tencentcloud.css": "Tencent Cloud - CSS (Cloud Streaming Service)",
|
||||||
"provider.tencentcloud.dns": "Tencent Cloud - DNS (Domain Name Service)",
|
"provider.tencentcloud.dns": "Tencent Cloud - DNS",
|
||||||
"provider.tencentcloud.ecdn": "Tencent Cloud - ECDN (Enterprise Content Delivery Network)",
|
"provider.tencentcloud.ecdn": "Tencent Cloud - ECDN (Enterprise Content Delivery Network)",
|
||||||
"provider.tencentcloud.eo": "Tencent Cloud - EdgeOne",
|
"provider.tencentcloud.eo": "Tencent Cloud - EdgeOne",
|
||||||
"provider.tencentcloud.ssl_deploy": "Tencent Cloud - via SSL Certificate Service Deployment Job",
|
"provider.tencentcloud.ssl_deploy": "Tencent Cloud - via SSL Certificate Service Deployment Job",
|
||||||
@ -99,7 +101,7 @@
|
|||||||
"provider.volcengine.cdn": "Volcengine - CDN (Content Delivery Network)",
|
"provider.volcengine.cdn": "Volcengine - CDN (Content Delivery Network)",
|
||||||
"provider.volcengine.clb": "Volcengine - CLB (Cloud Load Balancer)",
|
"provider.volcengine.clb": "Volcengine - CLB (Cloud Load Balancer)",
|
||||||
"provider.volcengine.dcdn": "Volcengine - DCDN (Dynamic Content Delivery Network)",
|
"provider.volcengine.dcdn": "Volcengine - DCDN (Dynamic Content Delivery Network)",
|
||||||
"provider.volcengine.dns": "Volcengine - DNS (Domain Name Service)",
|
"provider.volcengine.dns": "Volcengine - DNS",
|
||||||
"provider.volcengine.live": "Volcengine - Live",
|
"provider.volcengine.live": "Volcengine - Live",
|
||||||
"provider.volcengine.tos": "Volcengine - TOS (Tinder Object Storage)",
|
"provider.volcengine.tos": "Volcengine - TOS (Tinder Object Storage)",
|
||||||
"provider.webhook": "Webhook",
|
"provider.webhook": "Webhook",
|
||||||
|
@ -46,6 +46,8 @@
|
|||||||
"workflow_node.apply.form.huaweicloud_dns_region.label": "Huawei Cloud DNS region",
|
"workflow_node.apply.form.huaweicloud_dns_region.label": "Huawei Cloud DNS region",
|
||||||
"workflow_node.apply.form.huaweicloud_dns_region.placeholder": "Please enter Huawei Cloud DNS region (e.g. cn-north-1)",
|
"workflow_node.apply.form.huaweicloud_dns_region.placeholder": "Please enter Huawei Cloud DNS region (e.g. cn-north-1)",
|
||||||
"workflow_node.apply.form.huaweicloud_dns_region.tooltip": "For more information, see <a href=\"https://console-intl.huaweicloud.com/apiexplorer/#/endpoint?locale=en-us\" target=\"_blank\">https://console-intl.huaweicloud.com/apiexplorer/#/endpoint</a>",
|
"workflow_node.apply.form.huaweicloud_dns_region.tooltip": "For more information, see <a href=\"https://console-intl.huaweicloud.com/apiexplorer/#/endpoint?locale=en-us\" target=\"_blank\">https://console-intl.huaweicloud.com/apiexplorer/#/endpoint</a>",
|
||||||
|
"workflow_node.apply.form.jdcloud_dns_region_id.label": "JD Cloud DNS region ID",
|
||||||
|
"workflow_node.apply.form.jdcloud_dns_region_id.placeholder": "Please enter JD Cloud DNS region ID (e.g. cn-north-1)",
|
||||||
"workflow_node.apply.form.advanced_config.label": "Advanced settings",
|
"workflow_node.apply.form.advanced_config.label": "Advanced settings",
|
||||||
"workflow_node.apply.form.key_algorithm.label": "Certificate key algorithm",
|
"workflow_node.apply.form.key_algorithm.label": "Certificate key algorithm",
|
||||||
"workflow_node.apply.form.key_algorithm.placeholder": "Please select certificate key algorithm",
|
"workflow_node.apply.form.key_algorithm.placeholder": "Please select certificate key algorithm",
|
||||||
|
@ -38,8 +38,8 @@
|
|||||||
"access.form.aliyun_access_key_id.label": "阿里云 AccessKeyId",
|
"access.form.aliyun_access_key_id.label": "阿里云 AccessKeyId",
|
||||||
"access.form.aliyun_access_key_id.placeholder": "请输入阿里云 AccessKeyId",
|
"access.form.aliyun_access_key_id.placeholder": "请输入阿里云 AccessKeyId",
|
||||||
"access.form.aliyun_access_key_id.tooltip": "这是什么?请参阅 <a href=\"https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair\" target=\"_blank\">https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair</a>",
|
"access.form.aliyun_access_key_id.tooltip": "这是什么?请参阅 <a href=\"https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair\" target=\"_blank\">https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair</a>",
|
||||||
"access.form.aliyun_access_key_secret.label": "阿里云 AccessKey Secret",
|
"access.form.aliyun_access_key_secret.label": "阿里云 AccessKeySecret",
|
||||||
"access.form.aliyun_access_key_secret.placeholder": "请输入阿里云 AccessKey Secret",
|
"access.form.aliyun_access_key_secret.placeholder": "请输入阿里云 AccessKeySecret",
|
||||||
"access.form.aliyun_access_key_secret.tooltip": "这是什么?请参阅 <a href=\"https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair\" target=\"_blank\">https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair</a>",
|
"access.form.aliyun_access_key_secret.tooltip": "这是什么?请参阅 <a href=\"https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair\" target=\"_blank\">https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair</a>",
|
||||||
"access.form.aws_access_key_id.label": "AWS AccessKeyId",
|
"access.form.aws_access_key_id.label": "AWS AccessKeyId",
|
||||||
"access.form.aws_access_key_id.placeholder": "请输入 AWS AccessKeyId",
|
"access.form.aws_access_key_id.placeholder": "请输入 AWS AccessKeyId",
|
||||||
@ -133,6 +133,12 @@
|
|||||||
"access.form.huaweicloud_secret_access_key.label": "华为云 SecretAccessKey",
|
"access.form.huaweicloud_secret_access_key.label": "华为云 SecretAccessKey",
|
||||||
"access.form.huaweicloud_secret_access_key.placeholder": "请输入华为云 SecretAccessKey",
|
"access.form.huaweicloud_secret_access_key.placeholder": "请输入华为云 SecretAccessKey",
|
||||||
"access.form.huaweicloud_secret_access_key.tooltip": "这是什么?请参阅 <a href=\"https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html\" target=\"_blank\">https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html</a>",
|
"access.form.huaweicloud_secret_access_key.tooltip": "这是什么?请参阅 <a href=\"https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html\" target=\"_blank\">https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html</a>",
|
||||||
|
"access.form.jdcloud_access_key_id.label": "京东云 AccessKeyId",
|
||||||
|
"access.form.jdcloud_access_key_id.placeholder": "请输入京东云 AccessKeyId",
|
||||||
|
"access.form.jdcloud_access_key_id.tooltip": "这是什么?请参阅 <a href=\"https://docs.jdcloud.com/cn/account-management/accesskey-management\" target=\"_blank\">https://docs.jdcloud.com/cn/account-management/accesskey-management</a>",
|
||||||
|
"access.form.jdcloud_access_key_secret.label": "京东云 AccessKeySecret",
|
||||||
|
"access.form.jdcloud_access_key_secret.placeholder": "请输入京东云 AccessKeySecret",
|
||||||
|
"access.form.jdcloud_access_key_secret.tooltip": "这是什么?请参阅 <a href=\"https://docs.jdcloud.com/cn/account-management/accesskey-management\" target=\"_blank\">https://docs.jdcloud.com/cn/account-management/accesskey-management</a>",
|
||||||
"access.form.k8s_kubeconfig.label": "KubeConfig",
|
"access.form.k8s_kubeconfig.label": "KubeConfig",
|
||||||
"access.form.k8s_kubeconfig.placeholder": "请选择 KubeConfig 文件",
|
"access.form.k8s_kubeconfig.placeholder": "请选择 KubeConfig 文件",
|
||||||
"access.form.k8s_kubeconfig.upload": "选择文件",
|
"access.form.k8s_kubeconfig.upload": "选择文件",
|
||||||
|
@ -53,6 +53,8 @@
|
|||||||
"provider.huaweicloud.dns": "华为云 - 云解析 DNS",
|
"provider.huaweicloud.dns": "华为云 - 云解析 DNS",
|
||||||
"provider.huaweicloud.elb": "华为云 - 弹性负载均衡 ELB",
|
"provider.huaweicloud.elb": "华为云 - 弹性负载均衡 ELB",
|
||||||
"provider.huaweicloud.waf": "华为云 - Web 应用防火墙 WAF",
|
"provider.huaweicloud.waf": "华为云 - Web 应用防火墙 WAF",
|
||||||
|
"provider.jdcloud": "京东云",
|
||||||
|
"provider.jdcloud.dns": "京东云 - 云解析 DNS",
|
||||||
"provider.kubernetes": "Kubernetes",
|
"provider.kubernetes": "Kubernetes",
|
||||||
"provider.kubernetes.secret": "Kubernetes - Secret",
|
"provider.kubernetes.secret": "Kubernetes - Secret",
|
||||||
"provider.local": "本地部署",
|
"provider.local": "本地部署",
|
||||||
|
@ -46,6 +46,8 @@
|
|||||||
"workflow_node.apply.form.huaweicloud_dns_region.label": "华为云 DNS 服务区域",
|
"workflow_node.apply.form.huaweicloud_dns_region.label": "华为云 DNS 服务区域",
|
||||||
"workflow_node.apply.form.huaweicloud_dns_region.placeholder": "请输入华为云 DNS 服务区域(例如:cn-north-1)",
|
"workflow_node.apply.form.huaweicloud_dns_region.placeholder": "请输入华为云 DNS 服务区域(例如:cn-north-1)",
|
||||||
"workflow_node.apply.form.huaweicloud_dns_region.tooltip": "这是什么?请参阅 <a href=\"https://console.huaweicloud.com/apiexplorer/#/endpoint\" target=\"_blank\">https://console.huaweicloud.com/apiexplorer/#/endpoint</a>",
|
"workflow_node.apply.form.huaweicloud_dns_region.tooltip": "这是什么?请参阅 <a href=\"https://console.huaweicloud.com/apiexplorer/#/endpoint\" target=\"_blank\">https://console.huaweicloud.com/apiexplorer/#/endpoint</a>",
|
||||||
|
"workflow_node.apply.form.jdcloud_dns_region_id.label": "京东云 DNS 服务地域 ID",
|
||||||
|
"workflow_node.apply.form.jdcloud_dns_region_id.placeholder": "请输入京东云 DNS 服务地域 ID(例如:cn-north-1)",
|
||||||
"workflow_node.apply.form.advanced_config.label": "高级设置",
|
"workflow_node.apply.form.advanced_config.label": "高级设置",
|
||||||
"workflow_node.apply.form.key_algorithm.label": "数字证书算法",
|
"workflow_node.apply.form.key_algorithm.label": "数字证书算法",
|
||||||
"workflow_node.apply.form.key_algorithm.placeholder": "请选择数字证书算法",
|
"workflow_node.apply.form.key_algorithm.placeholder": "请选择数字证书算法",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user