@@ -18,13 +18,15 @@ package configuration
1818import (
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 {
0 commit comments