Skip to content

Commit 8968476

Browse files
committed
MINOR: Add new ACME keywords for HAProxy 3.4
Adds: challenge-ready, dns-delay, dns-timeout.
1 parent 5518afe commit 8968476

File tree

14 files changed

+308
-113
lines changed

14 files changed

+308
-113
lines changed

config-parser/section-parsers.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,9 +1044,12 @@ func (p *configParser) getAcmeParser() *Parsers {
10441044
addParser(parser, &sequence, &simple.Word{Name: "acme-vars"})
10451045
addParser(parser, &sequence, &simple.Number{Name: "bits"})
10461046
addParser(parser, &sequence, &simple.Word{Name: "challenge"})
1047+
addParser(parser, &sequence, &simple.Word{Name: "challenge-ready"})
10471048
addParser(parser, &sequence, &simple.Word{Name: "contact"})
10481049
addParser(parser, &sequence, &simple.Word{Name: "curves"})
10491050
addParser(parser, &sequence, &simple.Word{Name: "directory"})
1051+
addParser(parser, &sequence, &simple.Time{Name: "dns-delay"})
1052+
addParser(parser, &sequence, &simple.Time{Name: "dns-timeout"})
10501053
addParser(parser, &sequence, &simple.Word{Name: "keytype"})
10511054
addParser(parser, &sequence, &simple.Word{Name: "map"})
10521055
addParser(parser, &sequence, &simple.OnOff{Name: "reuse-key"})

configuration/acme_provider.go

Lines changed: 65 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ package configuration
1818
import (
1919
"errors"
2020
"fmt"
21+
"slices"
2122
"sort"
2223
"strings"
2324

2425
strfmt "github.com/go-openapi/strfmt"
2526
parser "github.com/haproxytech/client-native/v6/config-parser"
2627
parser_errors "github.com/haproxytech/client-native/v6/config-parser/errors"
2728
"github.com/haproxytech/client-native/v6/config-parser/types"
29+
"github.com/haproxytech/client-native/v6/configuration/options"
2830
"github.com/haproxytech/client-native/v6/misc"
2931
"github.com/haproxytech/client-native/v6/models"
3032
)
@@ -115,7 +117,7 @@ func (c *client) CreateAcmeProvider(data *models.AcmeProvider, transactionID str
115117
return c.HandleError(data.Name, "", "", t, transactionID == "", err)
116118
}
117119

118-
if err = SerializeAcmeProvider(p, data); err != nil {
120+
if err = SerializeAcmeProvider(p, data, &c.ConfigurationOptions); err != nil {
119121
return c.HandleError(data.Name, "", "", t, transactionID == "", err)
120122
}
121123

@@ -144,7 +146,7 @@ func (c *client) EditAcmeProvider(name string, data *models.AcmeProvider, transa
144146
return c.HandleError(data.Name, "", "", t, transactionID == "", e)
145147
}
146148

147-
if err = SerializeAcmeProvider(p, data); err != nil {
149+
if err = SerializeAcmeProvider(p, data, &c.ConfigurationOptions); err != nil {
148150
return err
149151
}
150152

@@ -161,19 +163,27 @@ func ParseAcmeProvider(p parser.Parser, name string) (*models.AcmeProvider, erro
161163
}
162164
}
163165

164-
var varsStr string
166+
var (
167+
challReadyStr string
168+
dnsDelayStr string
169+
dnsTimeoutStr string
170+
varsStr string
171+
)
165172

166173
stringAttr := map[string]*string{
167-
"account-key": &acme.AccountKey,
168-
"acme-provider": &acme.AcmeProvider,
169-
"acme-vars": &varsStr,
170-
"challenge": &acme.Challenge,
171-
"contact": &acme.Contact,
172-
"curves": &acme.Curves,
173-
"directory": &acme.Directory,
174-
"keytype": &acme.Keytype,
175-
"map": &acme.Map,
176-
"reuse-key": &acme.ReuseKey,
174+
"account-key": &acme.AccountKey,
175+
"acme-provider": &acme.AcmeProvider,
176+
"acme-vars": &varsStr,
177+
"challenge": &acme.Challenge,
178+
"challenge-ready": &challReadyStr,
179+
"contact": &acme.Contact,
180+
"curves": &acme.Curves,
181+
"dns-delay": &dnsDelayStr,
182+
"dns-timeout": &dnsTimeoutStr,
183+
"directory": &acme.Directory,
184+
"keytype": &acme.Keytype,
185+
"map": &acme.Map,
186+
"reuse-key": &acme.ReuseKey,
177187
}
178188

179189
for kw, dest := range stringAttr {
@@ -210,10 +220,23 @@ func ParseAcmeProvider(p parser.Parser, name string) (*models.AcmeProvider, erro
210220
// acme-vars
211221
acme.AcmeVars = ParseAcmeVars(varsStr)
212222

223+
// challenge-ready
224+
if len(challReadyStr) > 0 {
225+
for elem := range strings.SplitSeq(challReadyStr, ",") {
226+
if len(elem) > 0 {
227+
acme.ChallengeReady = append(acme.ChallengeReady, elem)
228+
}
229+
}
230+
}
231+
232+
// durations
233+
acme.DNSDelay = misc.ParseTimeoutDefaultSeconds(dnsDelayStr)
234+
acme.DNSTimeout = misc.ParseTimeoutDefaultSeconds(dnsTimeoutStr)
235+
213236
return acme, nil
214237
}
215238

216-
func SerializeAcmeProvider(p parser.Parser, acme *models.AcmeProvider) error {
239+
func SerializeAcmeProvider(p parser.Parser, acme *models.AcmeProvider, opt *options.ConfigurationOptions) error {
217240
if acme == nil {
218241
return fmt.Errorf("empty %s section", AcmeParentName)
219242
}
@@ -233,17 +256,35 @@ func SerializeAcmeProvider(p parser.Parser, acme *models.AcmeProvider) error {
233256
return fmt.Errorf("acme %s: %w", acme.Name, err)
234257
}
235258

259+
// In challenge-ready, "none" cannot be combined with other values.
260+
if len(acme.ChallengeReady) > 1 && slices.Contains(acme.ChallengeReady, "none") {
261+
return fmt.Errorf("acme %s: challenge-ready: %w", acme.Name, ErrValidationError)
262+
}
263+
264+
var dnsDelay string
265+
if acme.DNSDelay != nil {
266+
dnsDelay = misc.SerializeTime(*acme.DNSDelay, opt.PreferredTimeSuffix)
267+
}
268+
269+
var dnsTimeout string
270+
if acme.DNSTimeout != nil {
271+
dnsTimeout = misc.SerializeTime(*acme.DNSTimeout, opt.PreferredTimeSuffix)
272+
}
273+
236274
stringAttr := map[string]string{
237-
"account-key": acme.AccountKey,
238-
"acme-provider": acme.AcmeProvider,
239-
"acme-vars": acmeVars,
240-
"challenge": acme.Challenge,
241-
"contact": acme.Contact,
242-
"curves": acme.Curves,
243-
"directory": acme.Directory,
244-
"keytype": acme.Keytype,
245-
"map": acme.Map,
246-
"reuse-key": onOff(acme.ReuseKey),
275+
"account-key": acme.AccountKey,
276+
"acme-provider": acme.AcmeProvider,
277+
"acme-vars": acmeVars,
278+
"challenge": acme.Challenge,
279+
"challenge-ready": strings.Join(acme.ChallengeReady, ","),
280+
"contact": acme.Contact,
281+
"curves": acme.Curves,
282+
"dns-delay": dnsDelay,
283+
"dns-timeout": dnsTimeout,
284+
"directory": acme.Directory,
285+
"keytype": acme.Keytype,
286+
"map": acme.Map,
287+
"reuse-key": onOff(acme.ReuseKey),
247288
}
248289

249290
for kw, val := range stringAttr {

configuration/structured_acme.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func serializeStructuredAcmeProvider(a StructuredToParserArgs, ap *models.AcmePr
155155
return a.HandleError(ap.Name, "", "", a.TID, a.TID == "", err)
156156
}
157157

158-
err = SerializeAcmeProvider(p, ap)
158+
err = SerializeAcmeProvider(p, ap, a.Options)
159159
if err != nil {
160160
return a.HandleError(ap.Name, "", "", a.TID, a.TID == "", err)
161161
}

models/acme_provider.go

Lines changed: 71 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/acme_provider_compare_test.go

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/acmeprovider_diff_generated.go

Lines changed: 56 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)