Skip to content

Commit c82b349

Browse files
Restore etcd storage using go.etcd.io/etcd/client/v3 v3.5.21
Migrate from the old monolithic go.etcd.io/etcd module (which depended on google.golang.org/grpc/naming, removed in grpc v1.30.0) to the modern modular go.etcd.io/etcd/client/v3 v3.5.21. Changes: - storage/etcd/: restored all 4 files with updated import paths - go.etcd.io/etcd/clientv3 -> go.etcd.io/etcd/client/v3 - go.etcd.io/etcd/clientv3/namespace -> go.etcd.io/etcd/client/v3/namespace - go.etcd.io/etcd/pkg/transport -> go.etcd.io/etcd/client/pkg/v3/transport - cmd/dex/config.go: restored etcd storage registration - go.mod: added go.etcd.io/etcd/client/v3 and client/pkg/v3 v3.5.21 - .github/workflows/ci.yml: update etcd image to v3.5.21, add DEX_ETCD_ENDPOINTS env var Signed-off-by: Aishwarya2001A <aaishwar@progress.com>
1 parent 5f77ac2 commit c82b349

8 files changed

Lines changed: 1179 additions & 2 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
options: --health-cmd "mysql -proot -e \"show databases;\"" --health-interval 10s --health-timeout 5s --health-retries 5
3131

3232
etcd:
33-
image: gcr.io/etcd-development/etcd:v3.2.9
33+
image: gcr.io/etcd-development/etcd:v3.5.21
3434
ports:
3535
- 2379
3636
env:
@@ -73,6 +73,7 @@ jobs:
7373
DEX_KEYSTONE_ADMIN_URL: http://localhost:${{ job.services.keystone.ports[35357] }}
7474
DEX_KEYSTONE_ADMIN_USER: demo
7575
DEX_KEYSTONE_ADMIN_PASS: DEMO_PASS
76+
DEX_ETCD_ENDPOINTS: http://localhost:${{ job.services.etcd.ports[2379] }}
7677

7778
- name: Run linter
7879
run: make lint

cmd/dex/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/dexidp/dex/pkg/log"
1313
"github.com/dexidp/dex/server"
1414
"github.com/dexidp/dex/storage"
15+
"github.com/dexidp/dex/storage/etcd"
1516
"github.com/dexidp/dex/storage/kubernetes"
1617
"github.com/dexidp/dex/storage/memory"
1718
"github.com/dexidp/dex/storage/sql"
@@ -173,6 +174,7 @@ type StorageConfig interface {
173174
}
174175

175176
var storages = map[string]func() StorageConfig{
177+
"etcd": func() StorageConfig { return new(etcd.Etcd) },
176178
"kubernetes": func() StorageConfig { return new(kubernetes.Config) },
177179
"memory": func() StorageConfig { return new(memory.Config) },
178180
"postgres": func() StorageConfig { return new(sql.Postgres) },

go.mod

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ require (
2424
github.com/spf13/cobra v0.0.5
2525
github.com/stretchr/testify v1.11.1
2626
github.com/testcontainers/testcontainers-go v0.10.0
27+
go.etcd.io/etcd/client/pkg/v3 v3.5.21
28+
go.etcd.io/etcd/client/v3 v3.5.21
2729
golang.org/x/crypto v0.46.0
2830
golang.org/x/net v0.48.0
2931
golang.org/x/oauth2 v0.34.0
@@ -46,6 +48,8 @@ require (
4648
github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102 // indirect
4749
github.com/containerd/containerd v1.5.0-beta.1 // indirect
4850
github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7 // indirect
51+
github.com/coreos/go-semver v0.3.0 // indirect
52+
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
4953
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
5054
github.com/docker/distribution v2.7.1+incompatible // indirect
5155
github.com/docker/docker v20.10.5+incompatible // indirect
@@ -75,15 +79,20 @@ require (
7579
github.com/prometheus/common v0.63.0 // indirect
7680
github.com/prometheus/procfs v0.16.0 // indirect
7781
github.com/spf13/pflag v1.0.5 // indirect
82+
go.etcd.io/etcd/api/v3 v3.5.21 // indirect
7883
go.opencensus.io v0.24.0 // indirect
7984
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
8085
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
8186
go.opentelemetry.io/otel v1.39.0 // indirect
8287
go.opentelemetry.io/otel/metric v1.39.0 // indirect
8388
go.opentelemetry.io/otel/trace v1.39.0 // indirect
89+
go.uber.org/atomic v1.7.0 // indirect
90+
go.uber.org/multierr v1.6.0 // indirect
91+
go.uber.org/zap v1.17.0 // indirect
8492
golang.org/x/sync v0.19.0 // indirect
8593
golang.org/x/sys v0.39.0 // indirect
8694
golang.org/x/text v0.32.0 // indirect
95+
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect
8796
google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect
8897
google.golang.org/protobuf v1.36.10 // indirect
8998
gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect

go.sum

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2879,12 +2879,15 @@ github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHo
28792879
github.com/coreos/go-oidc v2.3.0+incompatible h1:+5vEsrgprdLjjQ9FzIKAzQz1wwPD+83hQRfUIPh7rO0=
28802880
github.com/coreos/go-oidc v2.3.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
28812881
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
2882+
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
28822883
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
28832884
github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
28842885
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
28852886
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
28862887
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
28872888
github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
2889+
github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
2890+
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
28882891
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
28892892
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
28902893
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
@@ -3060,6 +3063,7 @@ github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblf
30603063
github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
30613064
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
30623065
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
3066+
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
30633067
github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
30643068
github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU=
30653069
github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
@@ -3724,6 +3728,12 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
37243728
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
37253729
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
37263730
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
3731+
go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8=
3732+
go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY=
3733+
go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc=
3734+
go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs=
3735+
go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY=
3736+
go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU=
37273737
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
37283738
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
37293739
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -3854,16 +3864,20 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
38543864
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
38553865
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
38563866
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
3867+
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
38573868
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
38583869
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
38593870
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
38603871
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
38613872
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
3873+
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
38623874
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
38633875
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
38643876
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
38653877
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
38663878
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
3879+
go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
3880+
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
38673881
golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
38683882
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
38693883
golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -4906,7 +4920,6 @@ google.golang.org/genproto v0.0.0-20241216192217-9240e9c98484/go.mod h1:Gmd/M/W9
49064920
google.golang.org/genproto v0.0.0-20250106144421-5f5ef82da422/go.mod h1:1NPAxoesyw/SgLPqaUp9u1f9PWCLAk/jVmhx7gJZStg=
49074921
google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE=
49084922
google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE=
4909-
google.golang.org/genproto v0.0.0-20250324211829-b45e905df463 h1:qEFnJI6AnfZk0NNe8YTyXQh5i//Zxi4gBHwRgp76qpw=
49104923
google.golang.org/genproto v0.0.0-20250324211829-b45e905df463/go.mod h1:SqIx1NV9hcvqdLHo7uNZDS5lrUJybQ3evo3+z/WBfA0=
49114924
google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8=
49124925
google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
@@ -5198,6 +5211,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
51985211
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
51995212
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
52005213
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
5214+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
52015215
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
52025216
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
52035217
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=

storage/etcd/config.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package etcd
2+
3+
import (
4+
"time"
5+
6+
clientv3 "go.etcd.io/etcd/client/v3"
7+
"go.etcd.io/etcd/client/v3/namespace"
8+
"go.etcd.io/etcd/client/pkg/v3/transport"
9+
10+
"github.com/dexidp/dex/pkg/log"
11+
"github.com/dexidp/dex/storage"
12+
)
13+
14+
var defaultDialTimeout = 2 * time.Second
15+
16+
// SSL represents SSL options for etcd databases.
17+
type SSL struct {
18+
ServerName string `json:"serverName" yaml:"serverName"`
19+
CAFile string `json:"caFile" yaml:"caFile"`
20+
KeyFile string `json:"keyFile" yaml:"keyFile"`
21+
CertFile string `json:"certFile" yaml:"certFile"`
22+
}
23+
24+
// Etcd options for connecting to etcd databases.
25+
// If you are using a shared etcd cluster for storage, it might be useful to
26+
// configure an etcd namespace either via Namespace field or using `etcd grpc-proxy
27+
// --namespace=<prefix>`
28+
type Etcd struct {
29+
Endpoints []string `json:"endpoints" yaml:"endpoints"`
30+
Namespace string `json:"namespace" yaml:"namespace"`
31+
Username string `json:"username" yaml:"username"`
32+
Password string `json:"password" yaml:"password"`
33+
SSL SSL `json:"ssl" yaml:"ssl"`
34+
}
35+
36+
// Open creates a new storage implementation backed by Etcd
37+
func (p *Etcd) Open(logger log.Logger) (storage.Storage, error) {
38+
return p.open(logger)
39+
}
40+
41+
func (p *Etcd) open(logger log.Logger) (*conn, error) {
42+
cfg := clientv3.Config{
43+
Endpoints: p.Endpoints,
44+
DialTimeout: defaultDialTimeout,
45+
Username: p.Username,
46+
Password: p.Password,
47+
}
48+
49+
var cfgtls *transport.TLSInfo
50+
tlsinfo := transport.TLSInfo{}
51+
if p.SSL.CertFile != "" {
52+
tlsinfo.CertFile = p.SSL.CertFile
53+
cfgtls = &tlsinfo
54+
}
55+
56+
if p.SSL.KeyFile != "" {
57+
tlsinfo.KeyFile = p.SSL.KeyFile
58+
cfgtls = &tlsinfo
59+
}
60+
61+
if p.SSL.CAFile != "" {
62+
tlsinfo.TrustedCAFile = p.SSL.CAFile
63+
cfgtls = &tlsinfo
64+
}
65+
66+
if p.SSL.ServerName != "" {
67+
tlsinfo.ServerName = p.SSL.ServerName
68+
cfgtls = &tlsinfo
69+
}
70+
71+
if cfgtls != nil {
72+
clientTLS, err := cfgtls.ClientConfig()
73+
if err != nil {
74+
return nil, err
75+
}
76+
cfg.TLS = clientTLS
77+
}
78+
79+
db, err := clientv3.New(cfg)
80+
if err != nil {
81+
return nil, err
82+
}
83+
if len(p.Namespace) > 0 {
84+
db.KV = namespace.NewKV(db.KV, p.Namespace)
85+
}
86+
c := &conn{
87+
db: db,
88+
logger: logger,
89+
}
90+
return c, nil
91+
}

0 commit comments

Comments
 (0)