Skip to content

Commit 492e55a

Browse files
committed
feat(backup_service): support backup encryption for manual backups
1 parent 45c1acf commit 492e55a

File tree

8 files changed

+126
-62
lines changed

8 files changed

+126
-62
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ require (
1414
github.com/jonboulle/clockwork v0.5.0
1515
github.com/prometheus/client_golang v1.20.4
1616
github.com/stretchr/testify v1.10.0
17-
github.com/ydb-platform/ydb-go-genproto v0.0.0-20241112172322-ea1f63298f77
17+
github.com/ydb-platform/ydb-go-genproto v0.0.0-20250911135631-b3beddd517d9
1818
github.com/ydb-platform/ydb-go-sdk-prometheus/v2 v2.1.2
1919
github.com/ydb-platform/ydb-go-sdk/v3 v3.108.5
2020
go.uber.org/automaxprocs v1.5.3

go.sum

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
3131
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
3232
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
3333
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
34-
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
35-
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
34+
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
35+
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
36+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
37+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
3638
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
3739
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
3840
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -50,6 +52,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
5052
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
5153
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
5254
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
55+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
56+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
5357
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
5458
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
5559
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -69,8 +73,6 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y
6973
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
7074
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
7175
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
72-
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
73-
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
7476
github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I=
7577
github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60=
7678
github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0=
@@ -104,20 +106,24 @@ github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncj
104106
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
105107
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
106108
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
107-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
108-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
109109
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
110110
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
111-
github.com/ydb-platform/ydb-go-genproto v0.0.0-20241112172322-ea1f63298f77 h1:LY6cI8cP4B9rrpTleZk95+08kl2gF4rixG7+V/dwL6Q=
112-
github.com/ydb-platform/ydb-go-genproto v0.0.0-20241112172322-ea1f63298f77/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I=
111+
github.com/ydb-platform/ydb-go-genproto v0.0.0-20250911135631-b3beddd517d9 h1:SKqSRP6/ocY2Z4twOqKEKxpmawVTHTvQiom7hrU6jt0=
112+
github.com/ydb-platform/ydb-go-genproto v0.0.0-20250911135631-b3beddd517d9/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I=
113113
github.com/ydb-platform/ydb-go-sdk-prometheus/v2 v2.1.2 h1:/kDHhXMNGjsqy+SZ3Zn7gZ2ziZekUJLnPXqwy6vyAX8=
114114
github.com/ydb-platform/ydb-go-sdk-prometheus/v2 v2.1.2/go.mod h1:fGsyzk5v4hqteuWNw8liz3iu3xQSRe+zBEdVzyGQy9s=
115-
github.com/ydb-platform/ydb-go-sdk/v3 v3.99.3 h1:KxELBOo/THNL4S5UW708JvAueKGqK00PgI2fvn5T+00=
116-
github.com/ydb-platform/ydb-go-sdk/v3 v3.99.3/go.mod h1:knXehPLqrF/uBrYY0EbDtAMR+Ve8sAwIm/pNsfvbs7E=
117-
github.com/ydb-platform/ydb-go-sdk/v3 v3.107.1-0.20250417120650-061e5de8fb8a h1:1iX6jYOrU9tYrbOHgP4pF9tLKS5+Sqfk4Iajcjtm0aI=
118-
github.com/ydb-platform/ydb-go-sdk/v3 v3.107.1-0.20250417120650-061e5de8fb8a/go.mod h1:l5sSv153E18VvYcsmr51hok9Sjc16tEC8AXGbwrk+ho=
119115
github.com/ydb-platform/ydb-go-sdk/v3 v3.108.5 h1:h6API3jJKooqBa5MNhBnilscwOMf2xjn+gFhoH56FHk=
120116
github.com/ydb-platform/ydb-go-sdk/v3 v3.108.5/go.mod h1:IMoR7zRpTwEwx+9iHtA13CAyEsSibUMgMXYkHVboAh8=
117+
go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
118+
go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
119+
go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
120+
go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
121+
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
122+
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
123+
go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
124+
go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
125+
go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
126+
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
121127
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
122128
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
123129
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
@@ -143,8 +149,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
143149
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
144150
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
145151
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
146-
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
147-
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
148152
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
149153
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
150154
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -153,8 +157,6 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
153157
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
154158
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
155159
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
156-
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
157-
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
158160
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
159161
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
160162
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -163,14 +165,10 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
163165
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
164166
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
165167
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
166-
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
167-
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
168168
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
169169
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
170170
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
171171
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
172-
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
173-
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
174172
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
175173
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
176174
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -186,8 +184,6 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA
186184
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
187185
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
188186
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
189-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU=
190-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
191187
google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE=
192188
google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
193189
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -197,8 +193,6 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
197193
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
198194
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
199195
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
200-
google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
201-
google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
202196
google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A=
203197
google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
204198
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
@@ -214,8 +208,6 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
214208
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
215209
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
216210
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
217-
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
218-
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
219211
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
220212
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
221213
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

internal/backup_operations/make_backup.go

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package backup_operations
22

33
import (
44
"context"
5+
"crypto/rand"
56
"errors"
67
"fmt"
78
"github.com/jonboulle/clockwork"
@@ -35,6 +36,7 @@ type MakeBackupInternalRequest struct {
3536
ScheduleID *string
3637
Ttl *time.Duration
3738
ParentOperationID *string
39+
EncryptionSettings *pb.EncryptionSettings
3840
}
3941

4042
func FromBackupSchedule(schedule *types.BackupSchedule) MakeBackupInternalRequest {
@@ -62,6 +64,7 @@ func FromTBWROperation(tbwr *types.TakeBackupWithRetryOperation) MakeBackupInter
6264
ScheduleID: tbwr.ScheduleID,
6365
Ttl: tbwr.Ttl,
6466
ParentOperationID: &tbwr.ID,
67+
EncryptionSettings: tbwr.EncryptionSettings,
6568
}
6669
}
6770

@@ -255,6 +258,34 @@ func IsEmptyBackup(backup *types.Backup) bool {
255258
return backup.Size == 0 && backup.S3Endpoint == ""
256259
}
257260

261+
func GetEncryptionParams(settings *pb.EncryptionSettings) ([]byte, string, error) {
262+
var algorithm string
263+
var length int
264+
265+
switch settings.Algorithm {
266+
case pb.EncryptionSettings_UNSPECIFIED:
267+
case pb.EncryptionSettings_AES_128_GCM:
268+
algorithm = "AES-128-GCM"
269+
length = 16
270+
break
271+
case pb.EncryptionSettings_AES_256_GCM:
272+
algorithm = "AES-256-GCM"
273+
length = 32
274+
break
275+
case pb.EncryptionSettings_CHACHA20_POLY1305:
276+
algorithm = "ChaCha20-Poly1305"
277+
length = 32
278+
break
279+
}
280+
281+
dek := make([]byte, length)
282+
_, err := rand.Read(dek)
283+
if err != nil {
284+
return nil, "", err
285+
}
286+
return dek, algorithm, nil
287+
}
288+
258289
func MakeBackup(
259290
ctx context.Context,
260291
clientConn client.ClientConnector,
@@ -330,6 +361,18 @@ func MakeBackup(
330361
S3ForcePathStyle: s3.S3ForcePathStyle,
331362
}
332363

364+
if req.EncryptionSettings != nil {
365+
dek, algorithm, err := GetEncryptionParams(req.EncryptionSettings)
366+
if err != nil {
367+
return nil, nil, err
368+
}
369+
370+
s3Settings.EncryptionKey = dek
371+
s3Settings.EncryptionAlgorithm = algorithm
372+
// TODO: encrypt the DEK using the specified KEK
373+
// TODO: stores the encrypted DEK in S3
374+
}
375+
333376
clientOperationID, err := clientConn.ExportToS3(ctx, client, s3Settings)
334377
if err != nil {
335378
xlog.Error(ctx, "can't start export operation", zap.Error(err))
@@ -379,9 +422,10 @@ func MakeBackup(
379422
CreatedAt: now,
380423
Creator: subject,
381424
},
382-
YdbOperationId: clientOperationID,
383-
UpdatedAt: now,
384-
ParentOperationID: req.ParentOperationID,
425+
YdbOperationId: clientOperationID,
426+
UpdatedAt: now,
427+
ParentOperationID: req.ParentOperationID,
428+
EncryptionSettings: req.EncryptionSettings,
385429
}
386430

387431
return backup, op, nil

internal/connectors/client/connector.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -225,15 +225,8 @@ func (d *ClientYdbConnector) ExportToS3(
225225

226226
items := make([]*Ydb_Export.ExportToS3Settings_Item, len(s3Settings.SourcePaths))
227227
for i, source := range s3Settings.SourcePaths {
228-
// Destination prefix format: s3_destination_prefix/rel_source_path
229-
destinationPrefix := path.Join(
230-
s3Settings.DestinationPrefix,
231-
strings.TrimPrefix(source, clientDb.Name()+"/"),
232-
)
233-
234228
items[i] = &Ydb_Export.ExportToS3Settings_Item{
235-
SourcePath: source,
236-
DestinationPrefix: destinationPrefix,
229+
SourcePath: source,
237230
}
238231
}
239232

@@ -263,6 +256,16 @@ func (d *ClientYdbConnector) ExportToS3(
263256
NumberOfRetries: s3Settings.NumberOfRetries,
264257
Items: items,
265258
DisableVirtualAddressing: s3Settings.S3ForcePathStyle,
259+
SourcePath: clientDb.Name(),
260+
DestinationPrefix: s3Settings.DestinationPrefix,
261+
EncryptionSettings: &Ydb_Export.EncryptionSettings{
262+
EncryptionAlgorithm: s3Settings.EncryptionAlgorithm,
263+
Key: &Ydb_Export.EncryptionSettings_SymmetricKey_{
264+
SymmetricKey: &Ydb_Export.EncryptionSettings_SymmetricKey{
265+
Key: s3Settings.EncryptionKey,
266+
},
267+
},
268+
},
266269
},
267270
},
268271
)
@@ -315,14 +318,17 @@ func prepareItemsForImport(dbName string, s3Client S3API, s3Settings types.Impor
315318
func(p *s3.ListObjectsOutput, last bool) (shouldContinue bool) {
316319
for _, object := range p.Contents {
317320

321+
// TODO: support import for encrypted backups
318322
key, found := strings.CutSuffix(*object.Key, "scheme.pb")
319323
if found {
320324
shouldRestore := backupEverything || pathPrefixes[key]
321325
if shouldRestore {
322326
*itemsPtr = append(
323327
*itemsPtr,
324328
&Ydb_Import.ImportFromS3Settings_Item{
325-
SourcePrefix: key,
329+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
330+
SourcePrefix: key,
331+
},
326332
DestinationPath: path.Join(
327333
dbName,
328334
s3Settings.DestinationPrefix,

internal/connectors/client/prepare_items_test.go

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,21 @@ func TestPrepareItemsForImport(t *testing.T) {
4444
assert.NoError(t, err)
4545
expected := []Ydb_Import.ImportFromS3Settings_Item{
4646
{
47-
SourcePrefix: "local/table_1/",
47+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
48+
SourcePrefix: "local/table_1/",
49+
},
4850
DestinationPath: "/cluster/local/table_1",
4951
},
5052
{
51-
SourcePrefix: "local/table_2/",
53+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
54+
SourcePrefix: "local/table_2/",
55+
},
5256
DestinationPath: "/cluster/local/table_2",
5357
},
5458
{
55-
SourcePrefix: "local/folder/table_3/",
59+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
60+
SourcePrefix: "local/folder/table_3/",
61+
},
5662
DestinationPath: "/cluster/local/folder/table_3",
5763
},
5864
}
@@ -64,15 +70,21 @@ func TestPrepareItemsForImport(t *testing.T) {
6470

6571
expected = []Ydb_Import.ImportFromS3Settings_Item{
6672
{
67-
SourcePrefix: "local/table_1/",
73+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
74+
SourcePrefix: "local/table_1/",
75+
},
6876
DestinationPath: "/cluster/local/prefix/table_1",
6977
},
7078
{
71-
SourcePrefix: "local/table_2/",
79+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
80+
SourcePrefix: "local/table_2/",
81+
},
7282
DestinationPath: "/cluster/local/prefix/table_2",
7383
},
7484
{
75-
SourcePrefix: "local/folder/table_3/",
85+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
86+
SourcePrefix: "local/folder/table_3/",
87+
},
7688
DestinationPath: "/cluster/local/prefix/folder/table_3",
7789
},
7890
}
@@ -84,11 +96,15 @@ func TestPrepareItemsForImport(t *testing.T) {
8496

8597
expected = []Ydb_Import.ImportFromS3Settings_Item{
8698
{
87-
SourcePrefix: "local/table_1/",
99+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
100+
SourcePrefix: "local/table_1/",
101+
},
88102
DestinationPath: "/cluster/local/prefix/table_1",
89103
},
90104
{
91-
SourcePrefix: "local/folder/table_3/",
105+
Source: &Ydb_Import.ImportFromS3Settings_Item_SourcePrefix{
106+
SourcePrefix: "local/folder/table_3/",
107+
},
92108
DestinationPath: "/cluster/local/prefix/folder/table_3",
93109
},
94110
}

internal/server/services/backup/backup_service.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package backup
33
import (
44
"context"
55
"github.com/jonboulle/clockwork"
6+
"google.golang.org/protobuf/proto"
67
"strconv"
78
"time"
89
"ydbcp/internal/audit"
@@ -109,9 +110,9 @@ func (s *BackupService) MakeBackup(ctx context.Context, req *pb.MakeBackupReques
109110
ctx = xlog.With(ctx, zap.String("SubjectID", subject))
110111
now := timestamppb.Now()
111112

113+
var encryptionSettings *pb.EncryptionSettings
112114
if req.EncryptionSettings != nil {
113-
s.IncApiCallsCounter(methodName, codes.Unimplemented)
114-
return nil, status.Error(codes.Unimplemented, "backup encryption is not supported yet")
115+
encryptionSettings = proto.Clone(req.EncryptionSettings).(*pb.EncryptionSettings)
115116
}
116117

117118
tbwr := &types.TakeBackupWithRetryOperation{
@@ -129,7 +130,8 @@ func (s *BackupService) MakeBackup(ctx context.Context, req *pb.MakeBackupReques
129130
Creator: subject,
130131
CreatedAt: now,
131132
},
132-
UpdatedAt: now,
133+
UpdatedAt: now,
134+
EncryptionSettings: encryptionSettings,
133135
},
134136
Retries: 0,
135137
RetryConfig: &pb.RetryConfig{

0 commit comments

Comments
 (0)