mirror of
https://github.com/cloudnative-pg/plugin-barman-cloud.git
synced 2026-09-06 23:12:21 +02:00
Compare commits
4 Commits
15538621dc
...
463870b632
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
463870b632 | ||
|
|
ce8a3db8c5 | ||
|
|
fcb0d1eaf4 | ||
|
|
ea0a7b5698 |
@ -22,19 +22,19 @@ barman==3.19.1 \
|
||||
--hash=sha256:0a6a9e1babf97687732d8b2a3eb79ea95d55246a5257b9433865cb6e755221c0 \
|
||||
--hash=sha256:2f71c4a1f1ba53f694cbdf838bb9906d8ba02b97d1fd3041196e8999bec7a1ee
|
||||
# via -r sidecar-requirements.in
|
||||
boto3==1.43.51 \
|
||||
--hash=sha256:a97057bb609fd38c80448db6a93db770786775dabd651401debf09816d4553d7 \
|
||||
--hash=sha256:b5a416cc703db73b69b22bef563c89c1fb14a4b10a93628d3c7abc4dd1aaf979
|
||||
boto3==1.43.56 \
|
||||
--hash=sha256:57c90df9fb026f2e6ae22530861198130203733c5c9ec4e5cca3a4037f5a8db4 \
|
||||
--hash=sha256:feb699d4ab241ef5c1b80bb58277be2aaad365cd4b672d7817e0bc59ee45131b
|
||||
# via barman
|
||||
botocore==1.43.51 \
|
||||
--hash=sha256:7c2c538c932bddc95834e177ce6f91dcc388c6a7934b4f8d0db13caa30e3e543 \
|
||||
--hash=sha256:e0e5e88585fdb01dcb6b533ac2dd3f18d5d45092a14ccbfd330e3576a4152128
|
||||
botocore==1.43.56 \
|
||||
--hash=sha256:6c01f85f0ff9863076f4c761e74ee3aa96c5ccc1ad09fc1efd62ef8f2d22bf57 \
|
||||
--hash=sha256:aafc741f1b10f6fd63253eaf6ea029680c1ff436d87e1b8969d62aefa0c76976
|
||||
# via
|
||||
# boto3
|
||||
# s3transfer
|
||||
certifi==2026.6.17 \
|
||||
--hash=sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432 \
|
||||
--hash=sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db
|
||||
certifi==2026.7.22 \
|
||||
--hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \
|
||||
--hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55
|
||||
# via requests
|
||||
cffi==2.1.0 \
|
||||
--hash=sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc \
|
||||
@ -423,15 +423,15 @@ cryptography==49.0.0 \
|
||||
# google-auth
|
||||
# msal
|
||||
# pyjwt
|
||||
google-api-core==2.32.0 \
|
||||
--hash=sha256:2b33aad226b19272458c46abfe5c5a38d9531ece0c44502129a1463ce83674ac \
|
||||
--hash=sha256:ae1f0d58a6c8869350bf469f8eb3092e7f8c494a942d9525494afb6c162b0904
|
||||
google-api-core==2.33.0 \
|
||||
--hash=sha256:3a36bcc3e319783f4c97da41f6f45ea6ffcaa55848e341de16e09cb70243c2bb \
|
||||
--hash=sha256:a2e22a0c1d0f03eafff1858b38cf46f832d5902b0c052235bf0ab8402929fbdc
|
||||
# via
|
||||
# google-cloud-core
|
||||
# google-cloud-storage
|
||||
google-auth==2.56.0 \
|
||||
--hash=sha256:6e88c10217e07a92bfd01cac8ee99e32ccfb08414c3102e6c5b8d58f37a0d1e0 \
|
||||
--hash=sha256:f90fa030b569a92654b9d690665a073841df33d57487be53db583a9a0867a553
|
||||
google-auth==2.56.2 \
|
||||
--hash=sha256:c8270ea95b2697b74e3d8438ae9c5b898e38b623b915c7b5c5635921e7de68a6 \
|
||||
--hash=sha256:e28f103ca8091fb7012b99c44243d7366c29863713b8e34a220c3322b7a07051
|
||||
# via
|
||||
# google-api-core
|
||||
# google-cloud-core
|
||||
@ -572,9 +572,9 @@ msal-extensions==1.3.1 \
|
||||
--hash=sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca \
|
||||
--hash=sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4
|
||||
# via azure-identity
|
||||
proto-plus==1.28.1 \
|
||||
--hash=sha256:6660f5f1970874bdcfc3088b435188a36a37bd3596668f7d726417c4ae8cfbed \
|
||||
--hash=sha256:832e68e7fe064cf90ab153b6e5eb935b27891bb89aaeb68b115e9b702f6cb168
|
||||
proto-plus==1.28.2 \
|
||||
--hash=sha256:26d843eb99c1e32fdf1d20ff0faae56607f7748fe774acf9ecd5cfe6c6472501 \
|
||||
--hash=sha256:b874236fcac2358f601e4330bcb76cb8b89c851303ccf4078408b3d4774d1c52
|
||||
# via google-api-core
|
||||
protobuf==7.35.1 \
|
||||
--hash=sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799 \
|
||||
@ -634,9 +634,9 @@ requests==2.34.2 \
|
||||
# google-api-core
|
||||
# google-cloud-storage
|
||||
# msal
|
||||
s3transfer==0.19.1 \
|
||||
--hash=sha256:d3d6371dc3f1e5c5427b2b457bcf13bcf87bec334c95aed18642eae61f6926f3 \
|
||||
--hash=sha256:d5fd7005ee39307455ad5f310b5ea67f4b1960d7fed5b3671ee50c249de675de
|
||||
s3transfer==0.19.2 \
|
||||
--hash=sha256:ba0309fd86be3c27dbf78cdd813c13c5e1df16e5874b99d2535ebbdfb9892993 \
|
||||
--hash=sha256:d8168eccca828cbb2cd573675333f3bddd254313a9c42494b84c76b539e8ba25
|
||||
# via boto3
|
||||
six==1.17.0 \
|
||||
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
||||
|
||||
@ -60,7 +60,7 @@ func BuildRoleRules(barmanObjects []barmancloudv1.ObjectStore) []rbacv1.PolicyRu
|
||||
}
|
||||
}
|
||||
|
||||
return []rbacv1.PolicyRule{
|
||||
rules := []rbacv1.PolicyRule{
|
||||
{
|
||||
APIGroups: []string{
|
||||
barmancloudv1.GroupVersion.Group,
|
||||
@ -87,7 +87,11 @@ func BuildRoleRules(barmanObjects []barmancloudv1.ObjectStore) []rbacv1.PolicyRu
|
||||
},
|
||||
ResourceNames: barmanObjectsSet.ToSortedList(),
|
||||
},
|
||||
{
|
||||
}
|
||||
|
||||
secrets := secretsSet.ToSortedList()
|
||||
if len(secrets) > 0 {
|
||||
rules = append(rules, rbacv1.PolicyRule{
|
||||
APIGroups: []string{
|
||||
"",
|
||||
},
|
||||
@ -99,9 +103,11 @@ func BuildRoleRules(barmanObjects []barmancloudv1.ObjectStore) []rbacv1.PolicyRu
|
||||
"watch",
|
||||
"list",
|
||||
},
|
||||
ResourceNames: secretsSet.ToSortedList(),
|
||||
},
|
||||
ResourceNames: secrets,
|
||||
})
|
||||
}
|
||||
|
||||
return rules
|
||||
}
|
||||
|
||||
// ObjectStoreNamesFromRole extracts the ObjectStore names referenced
|
||||
|
||||
@ -78,13 +78,12 @@ var _ = Describe("BuildRoleRules", func() {
|
||||
Expect(rules[2].ResourceNames).To(ConsistOf("secret-a", "secret-b"))
|
||||
})
|
||||
|
||||
It("should produce rules with empty ResourceNames for empty input", func() {
|
||||
It("should not produce a secrets rule for empty input", func() {
|
||||
rules := BuildRoleRules(nil)
|
||||
Expect(rules).To(HaveLen(3))
|
||||
Expect(rules).To(HaveLen(2))
|
||||
Expect(rules[0].ResourceNames).To(BeEmpty())
|
||||
Expect(rules[0].ResourceNames).NotTo(BeNil())
|
||||
Expect(rules[1].ResourceNames).To(BeEmpty())
|
||||
Expect(rules[2].ResourceNames).To(BeEmpty())
|
||||
})
|
||||
|
||||
It("should deduplicate secret names across ObjectStores", func() {
|
||||
@ -95,6 +94,31 @@ var _ = Describe("BuildRoleRules", func() {
|
||||
rules := BuildRoleRules(objects)
|
||||
Expect(rules[2].ResourceNames).To(Equal([]string{"shared-secret"}))
|
||||
})
|
||||
|
||||
It("should not produce a secrets rule when ObjectStores use IAM role inheritance", func() {
|
||||
objects := []barmancloudv1.ObjectStore{
|
||||
{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "store-a",
|
||||
Namespace: "default",
|
||||
},
|
||||
Spec: barmancloudv1.ObjectStoreSpec{
|
||||
Configuration: barmanapi.BarmanObjectStoreConfiguration{
|
||||
DestinationPath: "s3://bucket/path",
|
||||
BarmanCredentials: barmanapi.BarmanCredentials{
|
||||
AWS: &barmanapi.S3Credentials{
|
||||
InheritFromIAMRole: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
rules := BuildRoleRules(objects)
|
||||
Expect(rules).To(HaveLen(2))
|
||||
Expect(rules[0].ResourceNames).To(Equal([]string{"store-a"}))
|
||||
Expect(rules[1].ResourceNames).To(Equal([]string{"store-a"}))
|
||||
})
|
||||
})
|
||||
|
||||
var _ = Describe("BuildRole", func() {
|
||||
|
||||
@ -28,13 +28,17 @@ import (
|
||||
func CollectSecretNamesFromCredentials(barmanCredentials *barmanapi.BarmanCredentials) []string {
|
||||
var references []*machineryapi.SecretKeySelector
|
||||
if barmanCredentials.AWS != nil {
|
||||
references = append(
|
||||
references,
|
||||
barmanCredentials.AWS.AccessKeyIDReference,
|
||||
barmanCredentials.AWS.SecretAccessKeyReference,
|
||||
barmanCredentials.AWS.RegionReference,
|
||||
barmanCredentials.AWS.SessionToken,
|
||||
)
|
||||
// When using IAM role inheritance, barman-cloud uses the pod
|
||||
// environment credential chain and does not read credential Secrets.
|
||||
if !barmanCredentials.AWS.InheritFromIAMRole {
|
||||
references = append(
|
||||
references,
|
||||
barmanCredentials.AWS.AccessKeyIDReference,
|
||||
barmanCredentials.AWS.SecretAccessKeyReference,
|
||||
barmanCredentials.AWS.RegionReference,
|
||||
barmanCredentials.AWS.SessionToken,
|
||||
)
|
||||
}
|
||||
}
|
||||
if barmanCredentials.Azure != nil {
|
||||
// When using default Azure credentials or managed identity, no secrets are required
|
||||
|
||||
@ -57,6 +57,29 @@ var _ = Describe("CollectSecretNamesFromCredentials", func() {
|
||||
secrets := CollectSecretNamesFromCredentials(credentials)
|
||||
Expect(secrets).To(BeEmpty())
|
||||
})
|
||||
|
||||
It("should return empty list when using InheritFromIAMRole", func() {
|
||||
credentials := &barmanapi.BarmanCredentials{
|
||||
AWS: &barmanapi.S3Credentials{
|
||||
InheritFromIAMRole: true,
|
||||
AccessKeyIDReference: &machineryapi.SecretKeySelector{
|
||||
LocalObjectReference: machineryapi.LocalObjectReference{
|
||||
Name: "aws-secret",
|
||||
},
|
||||
Key: "access-key-id",
|
||||
},
|
||||
RegionReference: &machineryapi.SecretKeySelector{
|
||||
LocalObjectReference: machineryapi.LocalObjectReference{
|
||||
Name: "aws-region",
|
||||
},
|
||||
Key: "region",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
secrets := CollectSecretNamesFromCredentials(credentials)
|
||||
Expect(secrets).To(BeEmpty())
|
||||
})
|
||||
})
|
||||
|
||||
Context("when collecting secrets from Azure credentials", func() {
|
||||
|
||||
@ -31,8 +31,8 @@ import (
|
||||
apierrs "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
|
||||
@ -261,7 +261,7 @@ var _ = Describe("ObjectStoreReconciler", func() {
|
||||
Expect(result).To(Equal(reconcile.Result{}))
|
||||
})
|
||||
|
||||
It("should produce empty ResourceNames when all ObjectStores are deleted", func() {
|
||||
It("should omit the secrets rule when all ObjectStores are deleted", func() {
|
||||
store := newTestObjectStore("my-store", "default", "aws-creds")
|
||||
role := newLabeledRole("my-cluster", "default", []barmancloudv1.ObjectStore{*store})
|
||||
|
||||
@ -291,10 +291,11 @@ var _ = Describe("ObjectStoreReconciler", func() {
|
||||
Name: "my-cluster-barman-cloud",
|
||||
}, &updatedRole)).To(Succeed())
|
||||
|
||||
// All rules should have empty ResourceNames
|
||||
Expect(updatedRole.Rules[0].ResourceNames).To(BeEmpty())
|
||||
Expect(updatedRole.Rules[1].ResourceNames).To(BeEmpty())
|
||||
Expect(updatedRole.Rules[2].ResourceNames).To(BeEmpty())
|
||||
for _, rule := range updatedRole.Rules {
|
||||
Expect(rule.Resources).NotTo(Equal([]string{"secrets"}))
|
||||
}
|
||||
})
|
||||
|
||||
It("should return an error when listing Roles fails", func() {
|
||||
|
||||
@ -121,8 +121,8 @@ func newS3ClientDeployment(namespace string) *appsv1.Deployment {
|
||||
{
|
||||
Name: s3ClientName,
|
||||
// renovate: datasource=docker depName=amazon/aws-cli versioning=docker
|
||||
// Version: 2.36.7
|
||||
Image: "docker.io/amazon/aws-cli@sha256:5b76c069e37cfa091ec6398dc683c09e0c9ef8ae2e557b0a36d931df34011227",
|
||||
// Version: 2.36.8
|
||||
Image: "docker.io/amazon/aws-cli@sha256:7e1b11a3c93bc5af81f496de0662f666b2352a4a6666e8ebae904fe102b131b6",
|
||||
Command: []string{"sleep", "infinity"},
|
||||
Env: []corev1.EnvVar{
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user