Skip to content

Commit a2c9ab0

Browse files
committed
feat: implement lets encrypt cert issuer
fixes akash-network/support#302 Signed-off-by: Artur Troian <[email protected]>
1 parent 04097f4 commit a2c9ab0

File tree

11 files changed

+1450
-274
lines changed

11 files changed

+1450
-274
lines changed

cmd/provider-services/cmd/certs.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"fmt"
1212
"math/big"
1313
"os"
14+
"path/filepath"
1415

1516
"github.com/tendermint/tendermint/libs/log"
1617
"golang.org/x/sync/errgroup"
@@ -89,7 +90,7 @@ func aqParseOpts(opts ...accountQuerierOption) (*accountQuerierOptions, error) {
8990
return ac, nil
9091
}
9192

92-
type accountQuerierOption func(options *accountQuerierOptions) error
93+
type accountQuerierOption func(*accountQuerierOptions) error
9394

9495
func WithTLSCert(cert, key string) accountQuerierOption {
9596
return func(options *accountQuerierOptions) error {
@@ -127,11 +128,13 @@ func newAccountQuerier(ctx context.Context, cctx sdkclient.Context, log log.Logg
127128
ctx, cancel := context.WithCancel(ctx)
128129
group, ctx := errgroup.WithContext(ctx)
129130

131+
log = log.With("module", "account-querier")
132+
130133
q := &accountQuerier{
131134
ctx: ctx,
132135
group: group,
133136
cancel: cancel,
134-
log: log.With("module", "account-querier"),
137+
log: log,
135138
bus: bus,
136139
pstorage: pstorage,
137140
qc: qc,
@@ -145,17 +148,25 @@ func newAccountQuerier(ctx context.Context, cctx sdkclient.Context, log log.Logg
145148
}
146149

147150
if cOpts.tlsCertFile != "" {
148-
cert, err := tls.LoadX509KeyPair(cOpts.tlsCertFile, cOpts.tlsKeyFile)
149-
if err != nil {
150-
return nil, err
151+
// key-cert pair may not yet be created. don't fail,
152+
// rather add a directory to watch for a new cert
153+
154+
_, err := os.Stat(cOpts.tlsCertFile)
155+
if err == nil {
156+
cert, err := tls.LoadX509KeyPair(cOpts.tlsCertFile, cOpts.tlsKeyFile)
157+
if err != nil {
158+
return nil, err
159+
}
160+
161+
q.caCerts = []tls.Certificate{cert}
151162
}
152163

153-
q.caCerts = []tls.Certificate{cert}
154-
err = watcher.Add(cOpts.tlsCertFile)
164+
dir := filepath.Dir(cOpts.tlsCertFile)
165+
log.Info(fmt.Sprintf("watching dir '%s' for cert changes", dir))
166+
err = watcher.Add(dir)
155167
if err != nil {
156168
return nil, err
157169
}
158-
159170
}
160171

161172
kpm, err := cutils.NewKeyPairManager(cctx, cctx.FromAddress)
@@ -369,6 +380,7 @@ func (c *accountQuerier) run() error {
369380
c.mtlsCerts = []tls.Certificate{}
370381
}
371382
} else if c.cOpts.tlsCertFile != "" && evt.Name == c.cOpts.tlsCertFile {
383+
c.log.Info(fmt.Sprintf("detected certificate change, reloading"))
372384
cert, err := tls.LoadX509KeyPair(c.cOpts.tlsCertFile, c.cOpts.tlsKeyFile)
373385
if err != nil {
374386
c.log.Error("unable to load tls certificate", "err", err)

cmd/provider-services/cmd/flags.go

Lines changed: 312 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,312 @@
1+
package cmd
2+
3+
import (
4+
"time"
5+
6+
"github.com/go-acme/lego/v4/lego"
7+
"github.com/spf13/cobra"
8+
"github.com/spf13/viper"
9+
10+
"github.com/cosmos/cosmos-sdk/client/flags"
11+
sdk "github.com/cosmos/cosmos-sdk/types"
12+
13+
mparams "github.com/akash-network/akash-api/go/node/market/v1beta4"
14+
15+
"github.com/akash-network/provider"
16+
providerflags "github.com/akash-network/provider/cmd/provider-services/cmd/flags"
17+
)
18+
19+
func addRunFlags(cmd *cobra.Command) error {
20+
cfg := provider.NewDefaultConfig()
21+
22+
cmd.Flags().String(flags.FlagChainID, "", "The network chain ID")
23+
if err := viper.BindPFlag(flags.FlagChainID, cmd.Flags().Lookup(flags.FlagChainID)); err != nil {
24+
panic(err)
25+
}
26+
27+
cmd.Flags().Bool(FlagClusterK8s, false, "Use Kubernetes cluster")
28+
if err := viper.BindPFlag(FlagClusterK8s, cmd.Flags().Lookup(FlagClusterK8s)); err != nil {
29+
return err
30+
}
31+
32+
cmd.Flags().String(providerflags.FlagK8sManifestNS, "lease", "Cluster manifest namespace")
33+
if err := viper.BindPFlag(providerflags.FlagK8sManifestNS, cmd.Flags().Lookup(providerflags.FlagK8sManifestNS)); err != nil {
34+
return err
35+
}
36+
37+
cmd.Flags().String(FlagGatewayListenAddress, "0.0.0.0:8443", "Gateway listen address")
38+
if err := viper.BindPFlag(FlagGatewayListenAddress, cmd.Flags().Lookup(FlagGatewayListenAddress)); err != nil {
39+
return err
40+
}
41+
42+
cmd.Flags().String(FlagGatewayGRPCListenAddress, "0.0.0.0:8444", "Gateway listen address")
43+
if err := viper.BindPFlag(FlagGatewayGRPCListenAddress, cmd.Flags().Lookup(FlagGatewayGRPCListenAddress)); err != nil {
44+
return err
45+
}
46+
47+
cmd.Flags().String(FlagBidPricingStrategy, "scale", "Pricing strategy to use")
48+
if err := viper.BindPFlag(FlagBidPricingStrategy, cmd.Flags().Lookup(FlagBidPricingStrategy)); err != nil {
49+
return err
50+
}
51+
52+
cmd.Flags().String(FlagBidPriceCPUScale, "0", "cpu pricing scale in uakt per millicpu")
53+
if err := viper.BindPFlag(FlagBidPriceCPUScale, cmd.Flags().Lookup(FlagBidPriceCPUScale)); err != nil {
54+
return err
55+
}
56+
57+
cmd.Flags().String(FlagBidPriceMemoryScale, "0", "memory pricing scale in uakt per megabyte")
58+
if err := viper.BindPFlag(FlagBidPriceMemoryScale, cmd.Flags().Lookup(FlagBidPriceMemoryScale)); err != nil {
59+
return err
60+
}
61+
62+
cmd.Flags().String(FlagBidPriceStorageScale, "0", "storage pricing scale in uakt per megabyte")
63+
if err := viper.BindPFlag(FlagBidPriceStorageScale, cmd.Flags().Lookup(FlagBidPriceStorageScale)); err != nil {
64+
return err
65+
}
66+
67+
cmd.Flags().String(FlagBidPriceEndpointScale, "0", "endpoint pricing scale in uakt")
68+
if err := viper.BindPFlag(FlagBidPriceEndpointScale, cmd.Flags().Lookup(FlagBidPriceEndpointScale)); err != nil {
69+
return err
70+
}
71+
72+
cmd.Flags().String(FlagBidPriceIPScale, "0", "leased ip pricing scale in uakt")
73+
if err := viper.BindPFlag(FlagBidPriceIPScale, cmd.Flags().Lookup(FlagBidPriceIPScale)); err != nil {
74+
return err
75+
}
76+
77+
cmd.Flags().String(FlagBidPriceScriptPath, "", "path to script to run for computing bid price")
78+
if err := viper.BindPFlag(FlagBidPriceScriptPath, cmd.Flags().Lookup(FlagBidPriceScriptPath)); err != nil {
79+
return err
80+
}
81+
82+
cmd.Flags().Uint(FlagBidPriceScriptProcessLimit, 32, "limit to the number of scripts run concurrently for bid pricing")
83+
if err := viper.BindPFlag(FlagBidPriceScriptProcessLimit, cmd.Flags().Lookup(FlagBidPriceScriptProcessLimit)); err != nil {
84+
return err
85+
}
86+
87+
cmd.Flags().Duration(FlagBidPriceScriptTimeout, time.Second*10, "execution timelimit for bid pricing as a duration")
88+
if err := viper.BindPFlag(FlagBidPriceScriptTimeout, cmd.Flags().Lookup(FlagBidPriceScriptTimeout)); err != nil {
89+
return err
90+
}
91+
92+
cmd.Flags().String(FlagBidDeposit, cfg.BidDeposit.String(), "Bid deposit amount")
93+
if err := viper.BindPFlag(FlagBidDeposit, cmd.Flags().Lookup(FlagBidDeposit)); err != nil {
94+
return err
95+
}
96+
97+
cmd.Flags().String(FlagClusterPublicHostname, "", "The public IP of the Kubernetes cluster")
98+
if err := viper.BindPFlag(FlagClusterPublicHostname, cmd.Flags().Lookup(FlagClusterPublicHostname)); err != nil {
99+
return err
100+
}
101+
102+
cmd.Flags().Uint(FlagClusterNodePortQuantity, 1, "The number of node ports available on the Kubernetes cluster")
103+
if err := viper.BindPFlag(FlagClusterNodePortQuantity, cmd.Flags().Lookup(FlagClusterNodePortQuantity)); err != nil {
104+
return err
105+
}
106+
107+
cmd.Flags().Duration(FlagClusterWaitReadyDuration, time.Second*5, "The time to wait for the cluster to be available")
108+
if err := viper.BindPFlag(FlagClusterWaitReadyDuration, cmd.Flags().Lookup(FlagClusterWaitReadyDuration)); err != nil {
109+
return err
110+
}
111+
112+
cmd.Flags().Duration(FlagInventoryResourcePollPeriod, time.Second*5, "The period to poll the cluster inventory")
113+
if err := viper.BindPFlag(FlagInventoryResourcePollPeriod, cmd.Flags().Lookup(FlagInventoryResourcePollPeriod)); err != nil {
114+
return err
115+
}
116+
117+
cmd.Flags().Uint(FlagInventoryResourceDebugFrequency, 10, "The rate at which to log all inventory resources")
118+
if err := viper.BindPFlag(FlagInventoryResourceDebugFrequency, cmd.Flags().Lookup(FlagInventoryResourceDebugFrequency)); err != nil {
119+
return err
120+
}
121+
122+
cmd.Flags().Bool(FlagDeploymentIngressStaticHosts, false, "")
123+
if err := viper.BindPFlag(FlagDeploymentIngressStaticHosts, cmd.Flags().Lookup(FlagDeploymentIngressStaticHosts)); err != nil {
124+
return err
125+
}
126+
127+
cmd.Flags().String(FlagDeploymentIngressDomain, "", "")
128+
if err := viper.BindPFlag(FlagDeploymentIngressDomain, cmd.Flags().Lookup(FlagDeploymentIngressDomain)); err != nil {
129+
return err
130+
}
131+
132+
cmd.Flags().Bool(FlagDeploymentIngressExposeLBHosts, false, "")
133+
if err := viper.BindPFlag(FlagDeploymentIngressExposeLBHosts, cmd.Flags().Lookup(FlagDeploymentIngressExposeLBHosts)); err != nil {
134+
return err
135+
}
136+
137+
cmd.Flags().Bool(FlagDeploymentNetworkPoliciesEnabled, true, "Enable network policies")
138+
if err := viper.BindPFlag(FlagDeploymentNetworkPoliciesEnabled, cmd.Flags().Lookup(FlagDeploymentNetworkPoliciesEnabled)); err != nil {
139+
return err
140+
}
141+
142+
cmd.Flags().String(FlagDockerImagePullSecretsName, "", "Name of the local image pull secret configured with kubectl")
143+
if err := viper.BindPFlag(FlagDockerImagePullSecretsName, cmd.Flags().Lookup(FlagDockerImagePullSecretsName)); err != nil {
144+
return err
145+
}
146+
147+
cmd.Flags().Uint64(FlagOvercommitPercentMemory, 0, "Percentage of memory overcommit")
148+
if err := viper.BindPFlag(FlagOvercommitPercentMemory, cmd.Flags().Lookup(FlagOvercommitPercentMemory)); err != nil {
149+
return err
150+
}
151+
152+
cmd.Flags().Uint64(FlagOvercommitPercentCPU, 0, "Percentage of CPU overcommit")
153+
if err := viper.BindPFlag(FlagOvercommitPercentCPU, cmd.Flags().Lookup(FlagOvercommitPercentCPU)); err != nil {
154+
return err
155+
}
156+
157+
cmd.Flags().Uint64(FlagOvercommitPercentStorage, 0, "Percentage of storage overcommit")
158+
if err := viper.BindPFlag(FlagOvercommitPercentStorage, cmd.Flags().Lookup(FlagOvercommitPercentStorage)); err != nil {
159+
return err
160+
}
161+
162+
cmd.Flags().StringSlice(FlagDeploymentBlockedHostnames, nil, "hostnames blocked for deployments")
163+
if err := viper.BindPFlag(FlagDeploymentBlockedHostnames, cmd.Flags().Lookup(FlagDeploymentBlockedHostnames)); err != nil {
164+
return err
165+
}
166+
167+
cmd.Flags().String(FlagAuthPem, "", "")
168+
169+
if err := providerflags.AddKubeConfigPathFlag(cmd); err != nil {
170+
return err
171+
}
172+
173+
cmd.Flags().String(FlagDeploymentRuntimeClass, "gvisor", "kubernetes runtime class for deployments, use none for no specification")
174+
if err := viper.BindPFlag(FlagDeploymentRuntimeClass, cmd.Flags().Lookup(FlagDeploymentRuntimeClass)); err != nil {
175+
return err
176+
}
177+
178+
cmd.Flags().Duration(FlagBidTimeout, 5*time.Minute, "time after which bids are cancelled if no lease is created")
179+
if err := viper.BindPFlag(FlagBidTimeout, cmd.Flags().Lookup(FlagBidTimeout)); err != nil {
180+
return err
181+
}
182+
183+
cmd.Flags().Duration(FlagManifestTimeout, 5*time.Minute, "time after which bids are cancelled if no manifest is received")
184+
if err := viper.BindPFlag(FlagManifestTimeout, cmd.Flags().Lookup(FlagManifestTimeout)); err != nil {
185+
return err
186+
}
187+
188+
cmd.Flags().String(FlagMetricsListener, "", "ip and port to start the metrics listener on")
189+
if err := viper.BindPFlag(FlagMetricsListener, cmd.Flags().Lookup(FlagMetricsListener)); err != nil {
190+
return err
191+
}
192+
193+
cmd.Flags().Duration(FlagWithdrawalPeriod, time.Hour*24, "period at which withdrawals are made from the escrow accounts")
194+
if err := viper.BindPFlag(FlagWithdrawalPeriod, cmd.Flags().Lookup(FlagWithdrawalPeriod)); err != nil {
195+
return err
196+
}
197+
198+
cmd.Flags().Duration(FlagLeaseFundsMonitorInterval, time.Minute*10, "interval at which lease is checked for funds available on the escrow accounts. >= 1m")
199+
if err := viper.BindPFlag(FlagLeaseFundsMonitorInterval, cmd.Flags().Lookup(FlagLeaseFundsMonitorInterval)); err != nil {
200+
return err
201+
}
202+
203+
cmd.Flags().Uint64(FlagMinimumBalance, mparams.DefaultBidMinDeposit.Amount.Mul(sdk.NewIntFromUint64(2)).Uint64(), "minimum account balance at which withdrawal is started")
204+
if err := viper.BindPFlag(FlagMinimumBalance, cmd.Flags().Lookup(FlagMinimumBalance)); err != nil {
205+
return err
206+
}
207+
208+
cmd.Flags().String(FlagProviderConfig, "", "provider configuration file path")
209+
if err := viper.BindPFlag(FlagProviderConfig, cmd.Flags().Lookup(FlagProviderConfig)); err != nil {
210+
return err
211+
}
212+
213+
cmd.Flags().Duration(FlagRPCQueryTimeout, time.Minute, "timeout for requests made to the RPC node")
214+
if err := viper.BindPFlag(FlagRPCQueryTimeout, cmd.Flags().Lookup(FlagRPCQueryTimeout)); err != nil {
215+
return err
216+
}
217+
218+
cmd.Flags().Duration(FlagCachedResultMaxAge, 5*time.Second, "max. cache age for results from the RPC node")
219+
if err := viper.BindPFlag(FlagCachedResultMaxAge, cmd.Flags().Lookup(FlagCachedResultMaxAge)); err != nil {
220+
return err
221+
}
222+
223+
cmd.Flags().Bool(FlagEnableIPOperator, false, "enable usage of the IP operator to lease IP addresses")
224+
if err := viper.BindPFlag(FlagEnableIPOperator, cmd.Flags().Lookup(FlagEnableIPOperator)); err != nil {
225+
return err
226+
}
227+
228+
cmd.Flags().Duration(FlagTxBroadcastTimeout, 30*time.Second, "tx broadcast timeout. defaults to 30s")
229+
if err := viper.BindPFlag(FlagTxBroadcastTimeout, cmd.Flags().Lookup(FlagTxBroadcastTimeout)); err != nil {
230+
return err
231+
}
232+
233+
cmd.Flags().Uint(FlagMonitorMaxRetries, 40, "max count of status retries before closing the lease. defaults to 40")
234+
if err := viper.BindPFlag(FlagMonitorMaxRetries, cmd.Flags().Lookup(FlagMonitorMaxRetries)); err != nil {
235+
return err
236+
}
237+
238+
cmd.Flags().Duration(FlagMonitorRetryPeriod, 4*time.Second, "monitor status retry period. defaults to 4s (min value)")
239+
if err := viper.BindPFlag(FlagMonitorRetryPeriod, cmd.Flags().Lookup(FlagMonitorRetryPeriod)); err != nil {
240+
return err
241+
}
242+
243+
cmd.Flags().Duration(FlagMonitorRetryPeriodJitter, 15*time.Second, "monitor status retry window. defaults to 15s")
244+
if err := viper.BindPFlag(FlagMonitorRetryPeriodJitter, cmd.Flags().Lookup(FlagMonitorRetryPeriodJitter)); err != nil {
245+
return err
246+
}
247+
248+
cmd.Flags().Duration(FlagMonitorHealthcheckPeriod, 10*time.Second, "monitor healthcheck period. defaults to 10s")
249+
if err := viper.BindPFlag(FlagMonitorHealthcheckPeriod, cmd.Flags().Lookup(FlagMonitorHealthcheckPeriod)); err != nil {
250+
return err
251+
}
252+
253+
cmd.Flags().Duration(FlagMonitorHealthcheckPeriodJitter, 5*time.Second, "monitor healthcheck window. defaults to 5s")
254+
if err := viper.BindPFlag(FlagMonitorHealthcheckPeriodJitter, cmd.Flags().Lookup(FlagMonitorHealthcheckPeriodJitter)); err != nil {
255+
return err
256+
}
257+
258+
cmd.Flags().String(FlagPersistentConfigBackend, "bbolt", "backend storage for persistent config. defaults to bbolt. available options: bbolt")
259+
if err := viper.BindPFlag(FlagPersistentConfigBackend, cmd.Flags().Lookup(FlagPersistentConfigBackend)); err != nil {
260+
return err
261+
}
262+
263+
cmd.Flags().String(FlagPersistentConfigPath, "", "path to backend storage for persistent config")
264+
if err := viper.BindPFlag(FlagPersistentConfigPath, cmd.Flags().Lookup(FlagPersistentConfigPath)); err != nil {
265+
return err
266+
}
267+
268+
if err := providerflags.AddServiceEndpointFlag(cmd, serviceHostnameOperator); err != nil {
269+
return err
270+
}
271+
272+
if err := providerflags.AddServiceEndpointFlag(cmd, serviceIPOperator); err != nil {
273+
return err
274+
}
275+
276+
cmd.Flags().Bool(FlagCertIssuerEnabled, false, "enable certificate issuer")
277+
if err := viper.BindPFlag(FlagCertIssuerEnabled, cmd.Flags().Lookup(FlagCertIssuerEnabled)); err != nil {
278+
return err
279+
}
280+
281+
cmd.Flags().String(FlagCertIssuerEmail, "", "user email for certificate registar")
282+
if err := viper.BindPFlag(FlagCertIssuerEmail, cmd.Flags().Lookup(FlagCertIssuerEmail)); err != nil {
283+
return err
284+
}
285+
286+
cmd.Flags().String(FlagCertIssuerCADirURL, lego.LEDirectoryStaging, "URL to server directory URL. Defaults to Let's Encrypt Staging")
287+
if err := viper.BindPFlag(FlagCertIssuerCADirURL, cmd.Flags().Lookup(FlagCertIssuerCADirURL)); err != nil {
288+
return err
289+
}
290+
291+
cmd.Flags().String(FlagCertIssuerStorageDir, "", "path to store acme information. defaults to $AP_HOME/.certissuer")
292+
if err := viper.BindPFlag(FlagCertIssuerStorageDir, cmd.Flags().Lookup(FlagCertIssuerStorageDir)); err != nil {
293+
return err
294+
}
295+
296+
cmd.Flags().StringSlice(FlagCertIssuerDNSProviders, nil, "comma separated list of dns providers")
297+
if err := viper.BindPFlag(FlagCertIssuerDNSProviders, cmd.Flags().Lookup(FlagCertIssuerDNSProviders)); err != nil {
298+
return err
299+
}
300+
301+
cmd.Flags().String(FlagCertIssuerKID, "", "")
302+
if err := viper.BindPFlag(FlagCertIssuerKID, cmd.Flags().Lookup(FlagCertIssuerKID)); err != nil {
303+
return err
304+
}
305+
306+
cmd.Flags().String(FlagCertIssuerHMAC, "", "")
307+
if err := viper.BindPFlag(FlagCertIssuerHMAC, cmd.Flags().Lookup(FlagCertIssuerHMAC)); err != nil {
308+
return err
309+
}
310+
311+
return nil
312+
}

0 commit comments

Comments
 (0)