Changed SecretAccessKeyID member to pointer as it is optional and tagged omitempty. Added issuer tests for access key ID secret validation. Added issuer API validations for AccessKeyID/SecretAccessKeyID.

Signed-off-by: Compy <hello@86pixels.com>
This commit is contained in:
Compy 2022-06-17 22:52:17 -05:00
parent 561103934d
commit 9c47be0964
17 changed files with 145 additions and 33 deletions

View File

@ -403,9 +403,9 @@ type ACMEIssuerDNS01ProviderRoute53 struct {
// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
AccessKeyID string
// If set, pull the AWS access key ID from a key within a kubernetes secret. More info: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
SecretAccessKeyID cmmeta.SecretKeySelector
// If set, pull the AWS access key ID from a key within a kubernetes secret.
// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
SecretAccessKeyID *cmmeta.SecretKeySelector
// The SecretAccessKey is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata
// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials

View File

@ -1205,8 +1205,14 @@ func Convert_acme_ACMEIssuerDNS01ProviderRFC2136_To_v1_ACMEIssuerDNS01ProviderRF
func autoConvert_v1_ACMEIssuerDNS01ProviderRoute53_To_acme_ACMEIssuerDNS01ProviderRoute53(in *v1.ACMEIssuerDNS01ProviderRoute53, out *acme.ACMEIssuerDNS01ProviderRoute53, s conversion.Scope) error {
out.AccessKeyID = in.AccessKeyID
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(&in.SecretAccessKeyID, &out.SecretAccessKeyID, s); err != nil {
return err
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(meta.SecretKeySelector)
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(*in, *out, s); err != nil {
return err
}
} else {
out.SecretAccessKeyID = nil
}
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(&in.SecretAccessKey, &out.SecretAccessKey, s); err != nil {
return err
@ -1224,8 +1230,14 @@ func Convert_v1_ACMEIssuerDNS01ProviderRoute53_To_acme_ACMEIssuerDNS01ProviderRo
func autoConvert_acme_ACMEIssuerDNS01ProviderRoute53_To_v1_ACMEIssuerDNS01ProviderRoute53(in *acme.ACMEIssuerDNS01ProviderRoute53, out *v1.ACMEIssuerDNS01ProviderRoute53, s conversion.Scope) error {
out.AccessKeyID = in.AccessKeyID
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(&in.SecretAccessKeyID, &out.SecretAccessKeyID, s); err != nil {
return err
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(apismetav1.SecretKeySelector)
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(*in, *out, s); err != nil {
return err
}
} else {
out.SecretAccessKeyID = nil
}
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(&in.SecretAccessKey, &out.SecretAccessKey, s); err != nil {
return err

View File

@ -460,7 +460,7 @@ type ACMEIssuerDNS01ProviderRoute53 struct {
// If set, pull the AWS access key ID from a key within a kubernetes secret.
// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
// +optional
SecretAccessKeyID cmmeta.SecretKeySelector `json:"accessKeyIDSecretRef"`
SecretAccessKeyID *cmmeta.SecretKeySelector `json:"accessKeyIDSecretRef,omitempty"`
// The SecretAccessKey is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata
// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials

View File

@ -1204,8 +1204,14 @@ func Convert_acme_ACMEIssuerDNS01ProviderRFC2136_To_v1alpha2_ACMEIssuerDNS01Prov
func autoConvert_v1alpha2_ACMEIssuerDNS01ProviderRoute53_To_acme_ACMEIssuerDNS01ProviderRoute53(in *ACMEIssuerDNS01ProviderRoute53, out *acme.ACMEIssuerDNS01ProviderRoute53, s conversion.Scope) error {
out.AccessKeyID = in.AccessKeyID
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(&in.SecretAccessKeyID, &out.SecretAccessKeyID, s); err != nil {
return err
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(meta.SecretKeySelector)
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(*in, *out, s); err != nil {
return err
}
} else {
out.SecretAccessKeyID = nil
}
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(&in.SecretAccessKey, &out.SecretAccessKey, s); err != nil {
return err
@ -1223,8 +1229,14 @@ func Convert_v1alpha2_ACMEIssuerDNS01ProviderRoute53_To_acme_ACMEIssuerDNS01Prov
func autoConvert_acme_ACMEIssuerDNS01ProviderRoute53_To_v1alpha2_ACMEIssuerDNS01ProviderRoute53(in *acme.ACMEIssuerDNS01ProviderRoute53, out *ACMEIssuerDNS01ProviderRoute53, s conversion.Scope) error {
out.AccessKeyID = in.AccessKeyID
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(&in.SecretAccessKeyID, &out.SecretAccessKeyID, s); err != nil {
return err
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(apismetav1.SecretKeySelector)
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(*in, *out, s); err != nil {
return err
}
} else {
out.SecretAccessKeyID = nil
}
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(&in.SecretAccessKey, &out.SecretAccessKey, s); err != nil {
return err

View File

@ -124,7 +124,7 @@ func (in *ACMEChallengeSolverDNS01) DeepCopyInto(out *ACMEChallengeSolverDNS01)
if in.Route53 != nil {
in, out := &in.Route53, &out.Route53
*out = new(ACMEIssuerDNS01ProviderRoute53)
**out = **in
(*in).DeepCopyInto(*out)
}
if in.AzureDNS != nil {
in, out := &in.AzureDNS, &out.AzureDNS
@ -573,7 +573,11 @@ func (in *ACMEIssuerDNS01ProviderRFC2136) DeepCopy() *ACMEIssuerDNS01ProviderRFC
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ACMEIssuerDNS01ProviderRoute53) DeepCopyInto(out *ACMEIssuerDNS01ProviderRoute53) {
*out = *in
out.SecretAccessKeyID = in.SecretAccessKeyID
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(metav1.SecretKeySelector)
**out = **in
}
out.SecretAccessKey = in.SecretAccessKey
return
}

View File

@ -460,7 +460,7 @@ type ACMEIssuerDNS01ProviderRoute53 struct {
// If set, pull the AWS access key ID from a key within a kubernetes secret.
// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
// +optional
SecretAccessKeyID cmmeta.SecretKeySelector `json:"accessKeyIDSecretRef"`
SecretAccessKeyID *cmmeta.SecretKeySelector `json:"accessKeyIDSecretRef,omitempty"`
// The SecretAccessKey is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata
// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials

View File

@ -1204,8 +1204,14 @@ func Convert_acme_ACMEIssuerDNS01ProviderRFC2136_To_v1alpha3_ACMEIssuerDNS01Prov
func autoConvert_v1alpha3_ACMEIssuerDNS01ProviderRoute53_To_acme_ACMEIssuerDNS01ProviderRoute53(in *ACMEIssuerDNS01ProviderRoute53, out *acme.ACMEIssuerDNS01ProviderRoute53, s conversion.Scope) error {
out.AccessKeyID = in.AccessKeyID
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(&in.SecretAccessKeyID, &out.SecretAccessKeyID, s); err != nil {
return err
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(meta.SecretKeySelector)
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(*in, *out, s); err != nil {
return err
}
} else {
out.SecretAccessKeyID = nil
}
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(&in.SecretAccessKey, &out.SecretAccessKey, s); err != nil {
return err
@ -1223,8 +1229,14 @@ func Convert_v1alpha3_ACMEIssuerDNS01ProviderRoute53_To_acme_ACMEIssuerDNS01Prov
func autoConvert_acme_ACMEIssuerDNS01ProviderRoute53_To_v1alpha3_ACMEIssuerDNS01ProviderRoute53(in *acme.ACMEIssuerDNS01ProviderRoute53, out *ACMEIssuerDNS01ProviderRoute53, s conversion.Scope) error {
out.AccessKeyID = in.AccessKeyID
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(&in.SecretAccessKeyID, &out.SecretAccessKeyID, s); err != nil {
return err
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(apismetav1.SecretKeySelector)
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(*in, *out, s); err != nil {
return err
}
} else {
out.SecretAccessKeyID = nil
}
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(&in.SecretAccessKey, &out.SecretAccessKey, s); err != nil {
return err

View File

@ -124,7 +124,7 @@ func (in *ACMEChallengeSolverDNS01) DeepCopyInto(out *ACMEChallengeSolverDNS01)
if in.Route53 != nil {
in, out := &in.Route53, &out.Route53
*out = new(ACMEIssuerDNS01ProviderRoute53)
**out = **in
(*in).DeepCopyInto(*out)
}
if in.AzureDNS != nil {
in, out := &in.AzureDNS, &out.AzureDNS
@ -573,7 +573,11 @@ func (in *ACMEIssuerDNS01ProviderRFC2136) DeepCopy() *ACMEIssuerDNS01ProviderRFC
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ACMEIssuerDNS01ProviderRoute53) DeepCopyInto(out *ACMEIssuerDNS01ProviderRoute53) {
*out = *in
out.SecretAccessKeyID = in.SecretAccessKeyID
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(metav1.SecretKeySelector)
**out = **in
}
out.SecretAccessKey = in.SecretAccessKey
return
}

View File

@ -459,7 +459,7 @@ type ACMEIssuerDNS01ProviderRoute53 struct {
// If set, pull the AWS access key ID from a key within a kubernetes secret.
// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
// +optional
SecretAccessKeyID cmmeta.SecretKeySelector `json:"accessKeyIDSecretRef"`
SecretAccessKeyID *cmmeta.SecretKeySelector `json:"accessKeyIDSecretRef,omitempty"`
// The SecretAccessKey is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata
// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials

View File

@ -1204,8 +1204,14 @@ func Convert_acme_ACMEIssuerDNS01ProviderRFC2136_To_v1beta1_ACMEIssuerDNS01Provi
func autoConvert_v1beta1_ACMEIssuerDNS01ProviderRoute53_To_acme_ACMEIssuerDNS01ProviderRoute53(in *ACMEIssuerDNS01ProviderRoute53, out *acme.ACMEIssuerDNS01ProviderRoute53, s conversion.Scope) error {
out.AccessKeyID = in.AccessKeyID
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(&in.SecretAccessKeyID, &out.SecretAccessKeyID, s); err != nil {
return err
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(meta.SecretKeySelector)
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(*in, *out, s); err != nil {
return err
}
} else {
out.SecretAccessKeyID = nil
}
if err := metav1.Convert_v1_SecretKeySelector_To_meta_SecretKeySelector(&in.SecretAccessKey, &out.SecretAccessKey, s); err != nil {
return err
@ -1223,8 +1229,14 @@ func Convert_v1beta1_ACMEIssuerDNS01ProviderRoute53_To_acme_ACMEIssuerDNS01Provi
func autoConvert_acme_ACMEIssuerDNS01ProviderRoute53_To_v1beta1_ACMEIssuerDNS01ProviderRoute53(in *acme.ACMEIssuerDNS01ProviderRoute53, out *ACMEIssuerDNS01ProviderRoute53, s conversion.Scope) error {
out.AccessKeyID = in.AccessKeyID
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(&in.SecretAccessKeyID, &out.SecretAccessKeyID, s); err != nil {
return err
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(apismetav1.SecretKeySelector)
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(*in, *out, s); err != nil {
return err
}
} else {
out.SecretAccessKeyID = nil
}
if err := metav1.Convert_meta_SecretKeySelector_To_v1_SecretKeySelector(&in.SecretAccessKey, &out.SecretAccessKey, s); err != nil {
return err

View File

@ -124,7 +124,7 @@ func (in *ACMEChallengeSolverDNS01) DeepCopyInto(out *ACMEChallengeSolverDNS01)
if in.Route53 != nil {
in, out := &in.Route53, &out.Route53
*out = new(ACMEIssuerDNS01ProviderRoute53)
**out = **in
(*in).DeepCopyInto(*out)
}
if in.AzureDNS != nil {
in, out := &in.AzureDNS, &out.AzureDNS
@ -573,7 +573,11 @@ func (in *ACMEIssuerDNS01ProviderRFC2136) DeepCopy() *ACMEIssuerDNS01ProviderRFC
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ACMEIssuerDNS01ProviderRoute53) DeepCopyInto(out *ACMEIssuerDNS01ProviderRoute53) {
*out = *in
out.SecretAccessKeyID = in.SecretAccessKeyID
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(metav1.SecretKeySelector)
**out = **in
}
out.SecretAccessKey = in.SecretAccessKey
return
}

View File

@ -124,7 +124,7 @@ func (in *ACMEChallengeSolverDNS01) DeepCopyInto(out *ACMEChallengeSolverDNS01)
if in.Route53 != nil {
in, out := &in.Route53, &out.Route53
*out = new(ACMEIssuerDNS01ProviderRoute53)
**out = **in
(*in).DeepCopyInto(*out)
}
if in.AzureDNS != nil {
in, out := &in.AzureDNS, &out.AzureDNS
@ -573,7 +573,11 @@ func (in *ACMEIssuerDNS01ProviderRFC2136) DeepCopy() *ACMEIssuerDNS01ProviderRFC
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ACMEIssuerDNS01ProviderRoute53) DeepCopyInto(out *ACMEIssuerDNS01ProviderRoute53) {
*out = *in
out.SecretAccessKeyID = in.SecretAccessKeyID
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(meta.SecretKeySelector)
**out = **in
}
out.SecretAccessKey = in.SecretAccessKey
return
}

View File

@ -404,6 +404,17 @@ func ValidateACMEChallengeSolverDNS01(p *cmacme.ACMEChallengeSolverDNS01, fldPat
if len(p.Route53.Region) == 0 {
el = append(el, field.Required(fldPath.Child("route53", "region"), ""))
}
// accessKeyID or accessKeyIDSecretRef must be specified, but not both
if len(p.Route53.AccessKeyID) == 0 && p.Route53.SecretAccessKeyID == nil {
el = append(el, field.Required(fldPath.Child("route53"), "accessKeyID or accessKeyIDSecretRef is required"))
}
if len(p.Route53.AccessKeyID) > 0 && p.Route53.SecretAccessKeyID != nil {
el = append(el, field.Required(fldPath.Child("route53"), "accessKeyID and accessKeyIDSecretRef cannot both be specified"))
}
// if an accessKeyIDSecretRef is given, validate that it resolves to an actual secret
if p.Route53.SecretAccessKeyID != nil {
el = append(el, ValidateSecretKeySelector(p.Route53.SecretAccessKeyID, fldPath.Child("route53", "accessKeyIDSecretRef"))...)
}
}
}
if p.AcmeDNS != nil {

View File

@ -711,6 +711,29 @@ func TestValidateACMEIssuerDNS01Config(t *testing.T) {
},
errs: []*field.Error{
field.Required(fldPath.Child("route53", "region"), ""),
field.Required(fldPath.Child("route53"), "accessKeyID or accessKeyIDSecretRef is required"),
},
},
"missing route53 accessKeyID and accessKeyIDSecretRef": {
cfg: &cmacme.ACMEChallengeSolverDNS01{
Route53: &cmacme.ACMEIssuerDNS01ProviderRoute53{
Region: "valid",
},
},
errs: []*field.Error{
field.Required(fldPath.Child("route53"), "accessKeyID or accessKeyIDSecretRef is required"),
},
},
"both route53 accessKeyID and accessKeyIDSecretRef specified": {
cfg: &cmacme.ACMEChallengeSolverDNS01{
Route53: &cmacme.ACMEIssuerDNS01ProviderRoute53{
Region: "valid",
AccessKeyID: "valid",
SecretAccessKeyID: &validSecretKeyRef,
},
},
errs: []*field.Error{
field.Required(fldPath.Child("route53"), "accessKeyID and accessKeyIDSecretRef cannot both be specified"),
},
},
"missing provider config": {

View File

@ -463,7 +463,7 @@ type ACMEIssuerDNS01ProviderRoute53 struct {
// If set, pull the AWS access key ID from a key within a kubernetes secret.
// see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials
// +optional
SecretAccessKeyID cmmeta.SecretKeySelector `json:"accessKeyIDSecretRef"`
SecretAccessKeyID *cmmeta.SecretKeySelector `json:"accessKeyIDSecretRef,omitempty"`
// The SecretAccessKey is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata
// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials

View File

@ -124,7 +124,7 @@ func (in *ACMEChallengeSolverDNS01) DeepCopyInto(out *ACMEChallengeSolverDNS01)
if in.Route53 != nil {
in, out := &in.Route53, &out.Route53
*out = new(ACMEIssuerDNS01ProviderRoute53)
**out = **in
(*in).DeepCopyInto(*out)
}
if in.AzureDNS != nil {
in, out := &in.AzureDNS, &out.AzureDNS
@ -573,7 +573,11 @@ func (in *ACMEIssuerDNS01ProviderRFC2136) DeepCopy() *ACMEIssuerDNS01ProviderRFC
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ACMEIssuerDNS01ProviderRoute53) DeepCopyInto(out *ACMEIssuerDNS01ProviderRoute53) {
*out = *in
out.SecretAccessKeyID = in.SecretAccessKeyID
if in.SecretAccessKeyID != nil {
in, out := &in.SecretAccessKeyID, &out.SecretAccessKeyID
*out = new(metav1.SecretKeySelector)
**out = **in
}
out.SecretAccessKey = in.SecretAccessKey
return
}

View File

@ -299,6 +299,16 @@ func (s *Solver) solverForChallenge(ctx context.Context, issuer v1.GenericIssuer
return nil, nil, fmt.Errorf("route53 accessKeyID and accessKeyIDSecretRef cannot both be specified")
}
// If a SecretAccessKeyID name is given, make sure we have a key specified as well
if providerConfig.Route53.SecretAccessKeyID.Name != "" && providerConfig.Route53.SecretAccessKeyID.Key == "" {
return nil, nil, fmt.Errorf("route53 accessKeyIDSecretRef requires a key field to be specified")
}
// If a SecretAccessKeyID key is given, make sure there is a name specified as well
if providerConfig.Route53.SecretAccessKeyID.Key != "" && providerConfig.Route53.SecretAccessKeyID.Name == "" {
return nil, nil, fmt.Errorf("route53 accessKeyIDSecretRef requires a name field to be specified")
}
// Default to the AccessKeyID literal in the configuration
secretAccessKeyID := strings.TrimSpace(providerConfig.Route53.AccessKeyID)