2018-10-09 21:43:24 -06:00
/*
Copyright 2016 The Rook Authors. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package object
import (
2021-04-20 15:26:45 +05:30
"context"
2019-06-13 13:00:22 +02:00
"fmt"
2018-10-09 21:43:24 -06:00
"testing"
2020-10-05 15:46:22 +02:00
"github.com/pkg/errors"
2018-12-03 15:08:29 -07:00
cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
2018-10-09 21:43:24 -06:00
"github.com/rook/rook/pkg/clusterd"
2020-09-10 10:33:47 +02:00
"github.com/rook/rook/pkg/daemon/ceph/client"
2020-07-01 22:46:39 -06:00
clienttest "github.com/rook/rook/pkg/daemon/ceph/client/test"
2019-02-14 09:16:21 -07:00
cephconfig "github.com/rook/rook/pkg/operator/ceph/config"
2021-04-20 15:26:45 +05:30
cephtest "github.com/rook/rook/pkg/operator/ceph/test"
2019-03-15 14:22:09 -07:00
cephver "github.com/rook/rook/pkg/operator/ceph/version"
2021-04-20 15:26:45 +05:30
"github.com/rook/rook/pkg/operator/test"
2018-10-09 21:43:24 -06:00
exectest "github.com/rook/rook/pkg/util/exec/test"
"github.com/stretchr/testify/assert"
2019-01-14 13:04:29 -08:00
v1 "k8s.io/api/core/v1"
2022-05-04 13:23:46 +05:30
k8serrors "k8s.io/apimachinery/pkg/api/errors"
2018-10-09 21:43:24 -06:00
"k8s.io/apimachinery/pkg/api/resource"
2021-04-20 15:26:45 +05:30
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2021-09-03 14:14:51 +09:00
"k8s.io/apimachinery/pkg/util/intstr"
2018-10-09 21:43:24 -06:00
)
2022-05-04 13:23:46 +05:30
func configureSSE ( t * testing . T , c * clusterConfig , kms bool , s3 bool ) {
c . store . Spec . Security = & cephv1 . ObjectStoreSecuritySpec {}
if kms {
c . store . Spec . Security . KeyManagementService = cephv1 . KeyManagementServiceSpec { ConnectionDetails : map [ string ] string {}}
c . store . Spec . Security . KeyManagementService . TokenSecretName = "vault-token"
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "KMS_PROVIDER" ] = "vault"
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_ADDR" ] = "https://1.1.1.1:8200"
}
if s3 {
c . store . Spec . Security . ServerSideEncryptionS3 = cephv1 . KeyManagementServiceSpec { ConnectionDetails : map [ string ] string {}}
c . store . Spec . Security . ServerSideEncryptionS3 . TokenSecretName = "vault-token"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "KMS_PROVIDER" ] = "vault"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_ADDR" ] = "https://1.1.1.1:8200"
}
s := & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : "vault-token" ,
Namespace : c . store . Namespace ,
},
Data : map [ string ][] byte {
"token" : [] byte ( "myt-otkenbenvqrev" ),
},
}
_ , err := c . context . Clientset . CoreV1 (). Secrets ( c . store . Namespace ). Create ( c . clusterInfo . Context , s , metav1 . CreateOptions {})
if err != nil && ! k8serrors . IsAlreadyExists ( err ) {
assert . Error ( t , err )
}
}
2018-10-09 21:43:24 -06:00
func TestPodSpecs ( t * testing . T ) {
store := simpleStore ()
store . Spec . Gateway . Resources = v1 . ResourceRequirements {
Limits : v1 . ResourceList {
2019-03-05 15:51:20 +01:00
v1 . ResourceCPU : * resource . NewQuantity ( 200.0 , resource . BinarySI ),
v1 . ResourceMemory : * resource . NewQuantity ( 1337.0 , resource . BinarySI ),
2018-10-09 21:43:24 -06:00
},
Requests : v1 . ResourceList {
2019-03-05 15:51:20 +01:00
v1 . ResourceCPU : * resource . NewQuantity ( 100.0 , resource . BinarySI ),
v1 . ResourceMemory : * resource . NewQuantity ( 500.0 , resource . BinarySI ),
2018-10-09 21:43:24 -06:00
},
}
2019-08-04 15:40:29 -05:00
store . Spec . Gateway . PriorityClassName = "my-priority-class"
2020-07-01 22:46:39 -06:00
info := clienttest . CreateTestClusterInfo ( 1 )
2022-07-01 10:38:15 -06:00
info . CephVersion = cephver . Quincy
2019-04-02 20:10:09 +02:00
data := cephconfig . NewStatelessDaemonDataPathMap ( cephconfig . RgwType , "default" , "rook-ceph" , "/var/lib/rook/" )
2019-02-14 09:16:21 -07:00
c := & clusterConfig {
clusterInfo : info ,
store : store ,
rookVersion : "rook/rook:myversion" ,
2019-03-21 14:58:06 -10:00
clusterSpec : & cephv1 . ClusterSpec {
2021-07-22 10:33:30 +02:00
CephVersion : cephv1 . CephVersionSpec { Image : "quay.io/ceph/ceph:v15" },
2019-08-09 09:59:32 +07:00
Network : cephv1 . NetworkSpec {
2019-03-21 14:58:06 -10:00
HostNetwork : true ,
},
},
2019-02-14 09:16:21 -07:00
DataPathMap : data ,
}
2018-10-09 21:43:24 -06:00
2019-06-13 13:00:22 +02:00
resourceName := fmt . Sprintf ( "%s-%s" , AppName , c . store . Name )
rgwConfig := & rgwConfig {
ResourceName : resourceName ,
2021-12-06 12:52:11 +05:30
DaemonID : "default" ,
2019-06-13 13:00:22 +02:00
}
2020-07-24 00:26:37 +05:30
s , err := c . makeRGWPodSpec ( rgwConfig )
assert . NoError ( t , err )
2018-10-09 21:43:24 -06:00
2019-12-09 15:30:12 +01:00
// Check pod anti affinity is well added to be compliant with HostNetwork setting
assert . Equal ( t ,
1 ,
len ( s . Spec . Affinity . PodAntiAffinity . RequiredDuringSchedulingIgnoredDuringExecution ))
assert . Equal ( t ,
2020-08-04 15:44:12 -06:00
getLabels ( c . store . Name , c . store . Namespace , false ),
2019-12-09 15:30:12 +01:00
s . Spec . Affinity . PodAntiAffinity . RequiredDuringSchedulingIgnoredDuringExecution [ 0 ]. LabelSelector . MatchLabels )
2021-04-20 15:26:45 +05:30
podTemplate := cephtest . NewPodTemplateSpecTester ( t , & s )
2021-07-22 10:33:30 +02:00
podTemplate . RunFullSuite ( cephconfig . RgwType , "default" , "rook-ceph-rgw" , "mycluster" , "quay.io/ceph/ceph:myversion" ,
2019-08-04 15:40:29 -05:00
"200" , "100" , "1337" , "500" , /* resources */
2021-12-06 12:52:11 +05:30
"my-priority-class" , "default" , "cephobjectstores.ceph.rook.io" , "ceph-rgw" )
2022-02-03 20:26:33 +05:30
t . Run (( "check rgw ConfigureProbe" ), func ( t * testing . T ) {
c . store . Spec . HealthCheck . StartupProbe = & cephv1 . ProbeSpec { Disabled : false , Probe : & v1 . Probe { InitialDelaySeconds : 1000 }}
c . store . Spec . HealthCheck . LivenessProbe = & cephv1 . ProbeSpec { Disabled : false , Probe : & v1 . Probe { InitialDelaySeconds : 900 }}
2022-05-04 13:23:46 +05:30
deployment , err := c . makeDaemonContainer ( rgwConfig )
assert . NoError ( t , err )
2022-02-03 20:26:33 +05:30
assert . NotNil ( t , c . store . Spec . HealthCheck . LivenessProbe )
assert . NotNil ( t , c . store . Spec . HealthCheck . StartupProbe )
assert . Equal ( t , int32 ( 900 ), deployment . LivenessProbe . InitialDelaySeconds )
assert . Equal ( t , int32 ( 1000 ), deployment . StartupProbe . InitialDelaySeconds )
})
2018-10-09 21:43:24 -06:00
}
func TestSSLPodSpec ( t * testing . T ) {
2021-07-02 18:34:22 +05:30
ctx := context . TODO ()
// Placeholder
context := & clusterd . Context { Clientset : test . New ( t , 3 )}
2018-10-09 21:43:24 -06:00
store := simpleStore ()
2019-02-14 09:16:21 -07:00
store . Spec . Gateway . Resources = v1 . ResourceRequirements {
Limits : v1 . ResourceList {
2019-03-05 15:51:20 +01:00
v1 . ResourceCPU : * resource . NewQuantity ( 200.0 , resource . BinarySI ),
v1 . ResourceMemory : * resource . NewQuantity ( 1337.0 , resource . BinarySI ),
2019-02-14 09:16:21 -07:00
},
Requests : v1 . ResourceList {
2019-03-05 15:51:20 +01:00
v1 . ResourceCPU : * resource . NewQuantity ( 100.0 , resource . BinarySI ),
v1 . ResourceMemory : * resource . NewQuantity ( 500.0 , resource . BinarySI ),
2019-02-14 09:16:21 -07:00
},
}
2019-08-04 15:40:29 -05:00
store . Spec . Gateway . PriorityClassName = "my-priority-class"
2020-07-01 22:46:39 -06:00
info := clienttest . CreateTestClusterInfo ( 1 )
2022-07-01 10:38:15 -06:00
info . CephVersion = cephver . Quincy
2021-07-02 18:34:22 +05:30
info . Namespace = store . Namespace
2019-04-02 20:10:09 +02:00
data := cephconfig . NewStatelessDaemonDataPathMap ( cephconfig . RgwType , "default" , "rook-ceph" , "/var/lib/rook/" )
2018-10-09 21:43:24 -06:00
store . Spec . Gateway . SecurePort = 443
2019-02-14 09:16:21 -07:00
c := & clusterConfig {
clusterInfo : info ,
store : store ,
2021-07-02 18:34:22 +05:30
context : context ,
2019-02-14 09:16:21 -07:00
rookVersion : "rook/rook:myversion" ,
2019-03-21 14:58:06 -10:00
clusterSpec : & cephv1 . ClusterSpec {
2022-05-04 13:23:46 +05:30
CephVersion : cephv1 . CephVersionSpec { Image : "quay.io/ceph/ceph:v17.2.3" },
2019-08-09 09:59:32 +07:00
Network : cephv1 . NetworkSpec {
2019-03-21 14:58:06 -10:00
HostNetwork : true ,
},
},
2019-02-14 09:16:21 -07:00
DataPathMap : data ,
}
2019-06-13 13:00:22 +02:00
resourceName := fmt . Sprintf ( "%s-%s" , AppName , c . store . Name )
rgwConfig := & rgwConfig {
ResourceName : resourceName ,
2021-12-06 12:52:11 +05:30
DaemonID : "default" ,
2019-06-13 13:00:22 +02:00
}
2021-04-22 19:51:44 +05:30
_ , err := c . makeRGWPodSpec ( rgwConfig )
// No TLS certs specified, will return error
assert . Error ( t , err )
// Using SSLCertificateRef
2021-07-02 18:34:22 +05:30
// Opaque Secret
2021-04-22 19:51:44 +05:30
c . store . Spec . Gateway . SSLCertificateRef = "mycert"
2021-07-02 18:34:22 +05:30
rgwtlssecret := & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : c . store . Spec . Gateway . SSLCertificateRef ,
Namespace : c . store . Namespace ,
},
Data : map [ string ][] byte {
"cert" : [] byte ( "tlssecrettesting" ),
},
Type : v1 . SecretTypeOpaque ,
}
_ , err = c . context . Clientset . CoreV1 (). Secrets ( store . Namespace ). Create ( ctx , rgwtlssecret , metav1 . CreateOptions {})
assert . NoError ( t , err )
secretVolSrc , err := c . generateVolumeSourceWithTLSSecret ()
assert . NoError ( t , err )
2021-04-22 19:51:44 +05:30
assert . Equal ( t , secretVolSrc . SecretName , "mycert" )
2020-07-24 00:26:37 +05:30
s , err := c . makeRGWPodSpec ( rgwConfig )
assert . NoError ( t , err )
2021-04-20 15:26:45 +05:30
podTemplate := cephtest . NewPodTemplateSpecTester ( t , & s )
2021-07-22 10:33:30 +02:00
podTemplate . RunFullSuite ( cephconfig . RgwType , "default" , "rook-ceph-rgw" , "mycluster" , "quay.io/ceph/ceph:myversion" ,
2021-04-22 19:51:44 +05:30
"200" , "100" , "1337" , "500" , /* resources */
2021-12-06 12:52:11 +05:30
"my-priority-class" , "default" , "cephobjectstores.ceph.rook.io" , "ceph-rgw" )
2021-07-02 18:34:22 +05:30
// TLS Secret
c . store . Spec . Gateway . SSLCertificateRef = "tlscert"
rgwtlssecret = & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : c . store . Spec . Gateway . SSLCertificateRef ,
Namespace : c . store . Namespace ,
},
Data : map [ string ][] byte {
"tls.crt" : [] byte ( "tlssecrettestingcert" ),
"tls.key" : [] byte ( "tlssecrettestingkey" ),
},
Type : v1 . SecretTypeTLS ,
}
_ , err = c . context . Clientset . CoreV1 (). Secrets ( store . Namespace ). Create ( ctx , rgwtlssecret , metav1 . CreateOptions {})
assert . NoError ( t , err )
secretVolSrc , err = c . generateVolumeSourceWithTLSSecret ()
assert . NoError ( t , err )
assert . Equal ( t , secretVolSrc . SecretName , "tlscert" )
s , err = c . makeRGWPodSpec ( rgwConfig )
assert . NoError ( t , err )
podTemplate = cephtest . NewPodTemplateSpecTester ( t , & s )
2021-07-22 10:33:30 +02:00
podTemplate . RunFullSuite ( cephconfig . RgwType , "default" , "rook-ceph-rgw" , "mycluster" , "quay.io/ceph/ceph:myversion" ,
2021-07-02 18:34:22 +05:30
"200" , "100" , "1337" , "500" , /* resources */
2021-12-06 12:52:11 +05:30
"my-priority-class" , "default" , "cephobjectstores.ceph.rook.io" , "ceph-rgw" )
2021-04-22 19:51:44 +05:30
// Using service serving cert
c . store . Spec . Gateway . SSLCertificateRef = ""
2021-09-22 16:39:09 -06:00
c . store . Spec . Gateway . Service = & ( cephv1 . RGWServiceSpec { Annotations : cephv1 . Annotations { cephv1 . ServiceServingCertKey : "rgw-cert" }})
2021-07-02 18:34:22 +05:30
secretVolSrc , err = c . generateVolumeSourceWithTLSSecret ()
assert . NoError ( t , err )
2021-04-22 19:51:44 +05:30
assert . Equal ( t , secretVolSrc . SecretName , "rgw-cert" )
2021-08-05 16:31:17 +04:00
// Using caBundleRef
// Opaque Secret
c . store . Spec . Gateway . CaBundleRef = "mycabundle"
cabundlesecret := & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : c . store . Spec . Gateway . CaBundleRef ,
Namespace : c . store . Namespace ,
},
Data : map [ string ][] byte {
"cabundle" : [] byte ( "cabundletesting" ),
},
Type : v1 . SecretTypeOpaque ,
}
_ , err = c . context . Clientset . CoreV1 (). Secrets ( store . Namespace ). Create ( ctx , cabundlesecret , metav1 . CreateOptions {})
assert . NoError ( t , err )
caBundleVolSrc , err := c . generateVolumeSourceWithCaBundleSecret ()
assert . NoError ( t , err )
assert . Equal ( t , caBundleVolSrc . SecretName , "mycabundle" )
2021-04-22 19:51:44 +05:30
s , err = c . makeRGWPodSpec ( rgwConfig )
assert . NoError ( t , err )
2021-04-20 15:26:45 +05:30
podTemplate = cephtest . NewPodTemplateSpecTester ( t , & s )
2021-07-22 10:33:30 +02:00
podTemplate . RunFullSuite ( cephconfig . RgwType , "default" , "rook-ceph-rgw" , "mycluster" , "quay.io/ceph/ceph:myversion" ,
2019-08-04 15:40:29 -05:00
"200" , "100" , "1337" , "500" , /* resources */
2021-12-06 12:52:11 +05:30
"my-priority-class" , "default" , "cephobjectstores.ceph.rook.io" , "ceph-rgw" )
2019-02-14 09:16:21 -07:00
2018-10-09 21:43:24 -06:00
assert . True ( t , s . Spec . HostNetwork )
assert . Equal ( t , v1 . DNSClusterFirstWithHostNet , s . Spec . DNSPolicy )
}
func TestValidateSpec ( t * testing . T ) {
2020-10-05 15:46:22 +02:00
executor := & exectest . MockExecutor {}
2021-07-21 11:25:52 +02:00
executor . MockExecuteCommandWithOutput = func ( command string , args ... string ) ( string , error ) {
2020-10-05 15:46:22 +02:00
logger . Infof ( "Command: %s %v" , command , args )
if args [ 1 ] == "crush" && args [ 2 ] == "dump" {
return `{"types":[{"type_id": 0,"name": "osd"}, {"type_id": 1,"name": "host"}],"buckets":[{"id": -1,"name":"default"},{"id": -2,"name":"good"}, {"id": -3,"name":"host"}]}` , nil
}
return "" , errors . Errorf ( "unexpected ceph command %q" , args )
}
context := & clusterd . Context { Executor : executor }
2020-06-16 09:49:58 +02:00
r := & ReconcileCephObjectStore {
context : context ,
2020-10-26 19:16:18 -06:00
clusterSpec : & cephv1 . ClusterSpec {
2020-06-16 09:49:58 +02:00
External : cephv1 . ExternalSpec {
Enable : false ,
},
},
2020-09-10 10:33:47 +02:00
clusterInfo : & client . ClusterInfo {
CephCred : client . CephCred {
Username : "client.admin" ,
},
},
2020-06-16 09:49:58 +02:00
}
2018-10-09 21:43:24 -06:00
// valid store
s := simpleStore ()
2020-06-16 09:49:58 +02:00
err := r . validateStore ( s )
2018-10-09 21:43:24 -06:00
assert . Nil ( t , err )
// no name
s . Name = ""
2020-06-16 09:49:58 +02:00
err = r . validateStore ( s )
2018-10-09 21:43:24 -06:00
assert . NotNil ( t , err )
s . Name = "default"
2020-06-16 09:49:58 +02:00
err = r . validateStore ( s )
2018-10-09 21:43:24 -06:00
assert . Nil ( t , err )
// no namespace
s . Namespace = ""
2020-06-16 09:49:58 +02:00
err = r . validateStore ( s )
2018-10-09 21:43:24 -06:00
assert . NotNil ( t , err )
s . Namespace = "mycluster"
2020-06-16 09:49:58 +02:00
err = r . validateStore ( s )
2018-10-09 21:43:24 -06:00
assert . Nil ( t , err )
2019-11-05 17:16:08 +01:00
// no replication or EC is valid
2018-10-09 21:43:24 -06:00
s . Spec . MetadataPool . Replicated . Size = 0
2020-06-16 09:49:58 +02:00
err = r . validateStore ( s )
2019-11-05 17:16:08 +01:00
assert . Nil ( t , err )
2018-10-09 21:43:24 -06:00
s . Spec . MetadataPool . Replicated . Size = 1
2020-06-16 09:49:58 +02:00
err = r . validateStore ( s )
assert . Nil ( t , err )
// external with endpoints, success
s . Spec . Gateway . ExternalRgwEndpoints = [] v1 . EndpointAddress {
{
IP : "192.168.0.1" ,
},
}
err = r . validateStore ( s )
2018-10-09 21:43:24 -06:00
assert . Nil ( t , err )
}
2020-03-30 14:51:07 +02:00
2021-09-03 14:14:51 +09:00
func TestDefaultLivenessProbe ( t * testing . T ) {
2020-03-30 14:51:07 +02:00
store := simpleStore ()
c := & clusterConfig {
store : store ,
clusterSpec : & cephv1 . ClusterSpec {
Network : cephv1 . NetworkSpec {
HostNetwork : false ,
},
},
}
2021-09-03 14:14:51 +09:00
desiredProbe := & v1 . Probe {
2022-04-19 15:48:11 +05:30
ProbeHandler : v1 . ProbeHandler {
2021-09-03 14:14:51 +09:00
TCPSocket : & v1 . TCPSocketAction {
Port : intstr . FromInt ( 8080 ),
},
},
InitialDelaySeconds : 10 ,
}
2020-03-30 14:51:07 +02:00
// No SSL - HostNetwork is disabled - using internal port
2021-09-03 14:14:51 +09:00
p := c . defaultLivenessProbe ()
assert . Equal ( t , desiredProbe , p )
2020-03-30 14:51:07 +02:00
// No SSL - HostNetwork is enabled
c . store . Spec . Gateway . Port = 123
c . store . Spec . Gateway . SecurePort = 0
c . clusterSpec . Network . HostNetwork = true
2021-09-03 14:14:51 +09:00
p = c . defaultLivenessProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . TCPSocket . Port = intstr . FromInt ( 123 )
2021-09-03 14:14:51 +09:00
assert . Equal ( t , desiredProbe , p )
2020-03-30 14:51:07 +02:00
// SSL - HostNetwork is enabled
c . store . Spec . Gateway . Port = 0
c . store . Spec . Gateway . SecurePort = 321
c . store . Spec . Gateway . SSLCertificateRef = "foo"
2021-09-03 14:14:51 +09:00
p = c . defaultLivenessProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . TCPSocket . Port = intstr . FromInt ( 321 )
2021-09-03 14:14:51 +09:00
assert . Equal ( t , desiredProbe , p )
2020-03-30 14:51:07 +02:00
// Both Non-SSL and SSL are enabled
2021-09-03 14:14:51 +09:00
// livenessProbe just on Non-SSL
2020-03-30 14:51:07 +02:00
c . store . Spec . Gateway . Port = 123
c . store . Spec . Gateway . SecurePort = 321
2021-09-03 14:14:51 +09:00
p = c . defaultLivenessProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . TCPSocket . Port = intstr . FromInt ( 123 )
2021-09-03 14:14:51 +09:00
assert . Equal ( t , desiredProbe , p )
}
2022-01-06 06:14:12 +00:00
func TestDefaultStartupProbe ( t * testing . T ) {
store := simpleStore ()
c := & clusterConfig {
store : store ,
clusterSpec : & cephv1 . ClusterSpec {
Network : cephv1 . NetworkSpec {
HostNetwork : false ,
},
},
}
desiredProbe := & v1 . Probe {
2022-04-19 15:48:11 +05:30
ProbeHandler : v1 . ProbeHandler {
2022-01-06 06:14:12 +00:00
TCPSocket : & v1 . TCPSocketAction {
Port : intstr . FromInt ( 8080 ),
},
},
InitialDelaySeconds : 10 ,
PeriodSeconds : 10 ,
FailureThreshold : 18 ,
}
// No SSL - HostNetwork is disabled - using internal port
p := c . defaultStartupProbe ()
assert . Equal ( t , desiredProbe , p )
// No SSL - HostNetwork is enabled
c . store . Spec . Gateway . Port = 123
c . store . Spec . Gateway . SecurePort = 0
c . clusterSpec . Network . HostNetwork = true
p = c . defaultStartupProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . TCPSocket . Port = intstr . FromInt ( 123 )
2022-01-06 06:14:12 +00:00
assert . Equal ( t , desiredProbe , p )
// SSL - HostNetwork is enabled
c . store . Spec . Gateway . Port = 0
c . store . Spec . Gateway . SecurePort = 321
c . store . Spec . Gateway . SSLCertificateRef = "foo"
p = c . defaultStartupProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . TCPSocket . Port = intstr . FromInt ( 321 )
2022-01-06 06:14:12 +00:00
assert . Equal ( t , desiredProbe , p )
// Both Non-SSL and SSL are enabled
// livenessProbe just on Non-SSL
c . store . Spec . Gateway . Port = 123
c . store . Spec . Gateway . SecurePort = 321
p = c . defaultStartupProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . TCPSocket . Port = intstr . FromInt ( 123 )
2022-01-06 06:14:12 +00:00
assert . Equal ( t , desiredProbe , p )
}
2021-09-03 14:14:51 +09:00
func TestDefaultReadinessProbe ( t * testing . T ) {
store := simpleStore ()
c := & clusterConfig {
store : store ,
clusterSpec : & cephv1 . ClusterSpec {
Network : cephv1 . NetworkSpec {
HostNetwork : false ,
},
},
}
desiredProbe := & v1 . Probe {
2022-04-19 15:48:11 +05:30
ProbeHandler : v1 . ProbeHandler {
2021-09-03 14:14:51 +09:00
HTTPGet : & v1 . HTTPGetAction {
Path : readinessProbePath ,
Port : intstr . FromInt ( 8080 ),
Scheme : v1 . URISchemeHTTP ,
},
},
InitialDelaySeconds : 10 ,
}
// No SSL - HostNetwork is disabled - using internal port
p := c . defaultReadinessProbe ()
assert . Equal ( t , desiredProbe , p )
// No SSL - HostNetwork is enabled
c . store . Spec . Gateway . Port = 123
c . store . Spec . Gateway . SecurePort = 0
c . clusterSpec . Network . HostNetwork = true
p = c . defaultReadinessProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . HTTPGet . Port = intstr . FromInt ( 123 )
2021-09-03 14:14:51 +09:00
assert . Equal ( t , desiredProbe , p )
// SSL - HostNetwork is enabled
c . store . Spec . Gateway . Port = 0
c . store . Spec . Gateway . SecurePort = 321
2020-03-30 14:51:07 +02:00
c . store . Spec . Gateway . SSLCertificateRef = "foo"
2021-09-03 14:14:51 +09:00
p = c . defaultReadinessProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . HTTPGet . Port = intstr . FromInt ( 321 )
desiredProbe . ProbeHandler . HTTPGet . Scheme = v1 . URISchemeHTTPS
2021-09-03 14:14:51 +09:00
assert . Equal ( t , desiredProbe , p )
// Both Non-SSL and SSL are enabled
// readinessProbe just on Non-SSL
c . store . Spec . Gateway . Port = 123
c . store . Spec . Gateway . SecurePort = 321
p = c . defaultReadinessProbe ()
2022-04-19 15:48:11 +05:30
desiredProbe . ProbeHandler . HTTPGet . Port = intstr . FromInt ( 123 )
desiredProbe . ProbeHandler . HTTPGet . Scheme = v1 . URISchemeHTTP
2021-09-03 14:14:51 +09:00
assert . Equal ( t , desiredProbe , p )
2020-03-30 14:51:07 +02:00
}
2021-04-20 15:26:45 +05:30
func TestCheckRGWKMS ( t * testing . T ) {
2021-12-21 16:26:14 +01:00
ctx := context . TODO ()
2021-08-19 23:40:38 +05:30
setupTest := func () * clusterConfig {
context := & clusterd . Context { Clientset : test . New ( t , 3 )}
store := simpleStore ()
return & clusterConfig {
2021-12-21 16:26:14 +01:00
context : context ,
store : store ,
clusterInfo : & client . ClusterInfo { Context : ctx },
2021-08-19 23:40:38 +05:30
}
}
2021-04-20 15:26:45 +05:30
2021-08-19 23:40:38 +05:30
t . Run ( "KMS is disabled" , func ( t * testing . T ) {
c := setupTest ()
b , err := c . CheckRGWKMS ()
assert . False ( t , b )
assert . NoError ( t , err )
})
2021-04-20 15:26:45 +05:30
2021-08-19 23:40:38 +05:30
t . Run ( "Vault Secret Engine is missing" , func ( t * testing . T ) {
c := setupTest ()
2022-05-04 13:23:46 +05:30
configureSSE ( t , c , true , false )
2021-08-19 23:40:38 +05:30
b , err := c . CheckRGWKMS ()
assert . False ( t , b )
assert . Error ( t , err )
})
2021-04-20 15:26:45 +05:30
2021-08-19 23:40:38 +05:30
t . Run ( "Vault Secret Engine is kv with v1" , func ( t * testing . T ) {
c := setupTest ()
2022-05-04 13:23:46 +05:30
configureSSE ( t , c , true , false )
2021-08-19 23:40:38 +05:30
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "kv"
b , err := c . CheckRGWKMS ()
assert . False ( t , b )
assert . Error ( t , err )
})
2021-04-20 15:26:45 +05:30
2021-08-19 23:40:38 +05:30
t . Run ( "Vault Secret Engine is kv with v2" , func ( t * testing . T ) {
c := setupTest ()
2022-05-04 13:23:46 +05:30
configureSSE ( t , c , true , false )
2021-08-19 23:40:38 +05:30
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "kv"
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_BACKEND" ] = "v2"
b , err := c . CheckRGWKMS ()
assert . True ( t , b )
assert . NoError ( t , err )
})
2021-04-20 15:26:45 +05:30
2021-08-19 23:40:38 +05:30
t . Run ( "Vault Secret Engine is transit" , func ( t * testing . T ) {
c := setupTest ()
2022-05-04 13:23:46 +05:30
configureSSE ( t , c , true , false )
2021-08-19 23:40:38 +05:30
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
b , err := c . CheckRGWKMS ()
assert . True ( t , b )
assert . NoError ( t , err )
})
2021-04-20 15:26:45 +05:30
2021-08-19 23:40:38 +05:30
t . Run ( "TLS is configured but secrets do not exist" , func ( t * testing . T ) {
c := setupTest ()
2022-05-04 13:23:46 +05:30
configureSSE ( t , c , true , false )
2021-08-19 23:40:38 +05:30
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
b , err := c . CheckRGWKMS ()
assert . False ( t , b )
assert . Error ( t , err , "" )
2022-06-02 09:54:53 +02:00
assert . EqualError ( t , err , "failed to validate vault connection details: failed to find TLS connection details k8s secret \"vault-ca-secret\": secrets \"vault-ca-secret\" not found" )
2021-08-19 23:40:38 +05:30
})
t . Run ( "TLS secret exists but empty key" , func ( t * testing . T ) {
c := setupTest ()
2022-05-04 13:23:46 +05:30
configureSSE ( t , c , true , false )
2021-08-19 23:40:38 +05:30
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
tlsSecret := & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : "vault-ca-secret" ,
Namespace : c . store . Namespace ,
},
}
_ , err := c . context . Clientset . CoreV1 (). Secrets ( c . store . Namespace ). Create ( context . TODO (), tlsSecret , metav1 . CreateOptions {})
assert . NoError ( t , err )
b , err := c . CheckRGWKMS ()
assert . False ( t , b )
assert . Error ( t , err , "" )
assert . EqualError ( t , err , "failed to validate vault connection details: failed to find TLS connection key \"cert\" for \"VAULT_CACERT\" in k8s secret \"vault-ca-secret\"" )
})
t . Run ( "TLS config is valid" , func ( t * testing . T ) {
c := setupTest ()
2022-05-04 13:23:46 +05:30
configureSSE ( t , c , true , false )
2021-08-19 23:40:38 +05:30
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
tlsSecret := & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : "vault-ca-secret" ,
Namespace : c . store . Namespace ,
},
}
tlsSecret . Data = map [ string ][] byte { "cert" : [] byte ( "envnrevbnbvsbjkrtn" )}
_ , err := c . context . Clientset . CoreV1 (). Secrets ( c . store . Namespace ). Create ( context . TODO (), tlsSecret , metav1 . CreateOptions {})
assert . NoError ( t , err )
b , err := c . CheckRGWKMS ()
assert . True ( t , b )
assert . NoError ( t , err , "" )
})
2021-04-20 15:26:45 +05:30
}
2021-09-30 17:45:55 +05:30
2022-05-04 13:23:46 +05:30
func TestCheckRGWSSES3Enabled ( t * testing . T ) {
ctx := context . TODO ()
setupTest := func () * clusterConfig {
context := & clusterd . Context { Clientset : test . New ( t , 3 )}
store := simpleStore ()
return & clusterConfig {
context : context ,
store : store ,
clusterInfo : & client . ClusterInfo { Context : ctx , CephVersion : cephver . CephVersion { Major : 17 , Minor : 2 , Extra : 3 }},
clusterSpec : & cephv1 . ClusterSpec {
CephVersion : cephv1 . CephVersionSpec { Image : "quay.io/ceph/ceph:v17.2.3" },
},
}
}
t . Run ( "KMS is disabled" , func ( t * testing . T ) {
c := setupTest ()
b , err := c . CheckRGWSSES3Enabled ()
assert . False ( t , b )
assert . NoError ( t , err )
})
t . Run ( "Vault Secret Engine is missing" , func ( t * testing . T ) {
c := setupTest ()
configureSSE ( t , c , false , true )
b , err := c . CheckRGWSSES3Enabled ()
assert . False ( t , b )
assert . Error ( t , err )
})
t . Run ( "Vault Secret Engine is kv with v1" , func ( t * testing . T ) {
c := setupTest ()
configureSSE ( t , c , false , true )
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "kv"
b , err := c . CheckRGWSSES3Enabled ()
assert . False ( t , b )
assert . Error ( t , err )
})
t . Run ( "Vault Secret Engine is kv with v2" , func ( t * testing . T ) {
c := setupTest ()
configureSSE ( t , c , false , true )
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "kv"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_BACKEND" ] = "v2"
b , err := c . CheckRGWSSES3Enabled ()
assert . False ( t , b )
assert . Error ( t , err )
})
t . Run ( "Vault Secret Engine is transit" , func ( t * testing . T ) {
c := setupTest ()
configureSSE ( t , c , false , true )
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
b , err := c . CheckRGWSSES3Enabled ()
assert . True ( t , b )
assert . NoError ( t , err )
})
t . Run ( "TLS is configured but secrets do not exist" , func ( t * testing . T ) {
c := setupTest ()
configureSSE ( t , c , false , true )
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
b , err := c . CheckRGWSSES3Enabled ()
assert . False ( t , b )
assert . Error ( t , err , "" )
assert . EqualError ( t , err , "failed to validate vault connection details: failed to find TLS connection details k8s secret \"vault-ca-secret\": secrets \"vault-ca-secret\" not found" )
})
t . Run ( "TLS secret exists but empty key" , func ( t * testing . T ) {
c := setupTest ()
configureSSE ( t , c , false , true )
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
tlsSecret := & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : "vault-ca-secret" ,
Namespace : c . store . Namespace ,
},
}
_ , err := c . context . Clientset . CoreV1 (). Secrets ( c . store . Namespace ). Create ( context . TODO (), tlsSecret , metav1 . CreateOptions {})
assert . NoError ( t , err )
b , err := c . CheckRGWSSES3Enabled ()
assert . False ( t , b )
assert . Error ( t , err , "" )
assert . EqualError ( t , err , "failed to validate vault connection details: failed to find TLS connection key \"cert\" for \"VAULT_CACERT\" in k8s secret \"vault-ca-secret\"" )
})
t . Run ( "TLS config is valid" , func ( t * testing . T ) {
c := setupTest ()
configureSSE ( t , c , false , true )
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
tlsSecret := & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : "vault-ca-secret" ,
Namespace : c . store . Namespace ,
},
}
tlsSecret . Data = map [ string ][] byte { "cert" : [] byte ( "envnrevbnbvsbjkrtn" )}
_ , err := c . context . Clientset . CoreV1 (). Secrets ( c . store . Namespace ). Create ( context . TODO (), tlsSecret , metav1 . CreateOptions {})
assert . NoError ( t , err )
b , err := c . CheckRGWSSES3Enabled ()
assert . True ( t , b )
assert . NoError ( t , err , "" )
})
}
2021-09-30 17:45:55 +05:30
func TestGetDaemonName ( t * testing . T ) {
context := & clusterd . Context { Clientset : test . New ( t , 3 )}
store := simpleStore ()
tests := [] struct {
storeName string
testDaemonName string
daemonID string
}{
{ "default" , "ceph-client.rgw.default.a" , "a" },
{ "my-store" , "ceph-client.rgw.my.store.b" , "b" },
}
for _ , tt := range tests {
t . Run ( tt . storeName , func ( t * testing . T ) {
c := & clusterConfig {
context : context ,
store : store ,
}
c . store . Name = tt . storeName
daemonName := fmt . Sprintf ( "%s-%s" , c . store . Name , tt . daemonID )
resourceName := fmt . Sprintf ( "%s-%s" , AppName , daemonName )
rgwconfig := & rgwConfig {
ResourceName : resourceName ,
DaemonID : daemonName ,
}
daemon := getDaemonName ( rgwconfig )
assert . Equal ( t , tt . testDaemonName , daemon )
})
}
}
2022-06-30 10:56:03 +08:00
func TestMakeRGWPodSpec ( t * testing . T ) {
store := simpleStore ()
info := clienttest . CreateTestClusterInfo ( 1 )
data := cephconfig . NewStatelessDaemonDataPathMap ( cephconfig . RgwType , "default" , "rook-ceph" , "/var/lib/rook/" )
c := & clusterConfig {
store : store ,
rookVersion : "rook/rook:myversion" ,
clusterSpec : & cephv1 . ClusterSpec {
CephVersion : cephv1 . CephVersionSpec { Image : "quay.io/ceph/ceph:v15" },
Network : cephv1 . NetworkSpec {
HostNetwork : true ,
},
},
clusterInfo : info ,
DataPathMap : data ,
}
resourceName := fmt . Sprintf ( "%s-%s" , AppName , c . store . Name )
rgwConfig := & rgwConfig {
ResourceName : resourceName ,
DaemonID : "default" ,
}
tests := [] struct {
name string
isSet bool
enabled bool
}{
{ "host networking is not set to rgw daemon" , false , false },
{ "host networking is set to rgw daemon but not enabled" , true , false },
{ "host networking is enabled for the rgw daemon" , true , true },
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
if tt . isSet {
if tt . enabled {
2022-08-22 14:47:10 +08:00
c . store . Spec . Gateway . HostNetwork = func ( hostNetwork bool ) * bool { return & hostNetwork }( true )
2022-06-30 10:56:03 +08:00
} else {
2022-08-22 14:47:10 +08:00
c . store . Spec . Gateway . HostNetwork = new ( bool )
2022-06-30 10:56:03 +08:00
}
}
podTemplateSpec , _ := c . makeRGWPodSpec ( rgwConfig )
if tt . isSet {
2022-08-22 14:47:10 +08:00
assert . Equal ( t , * c . store . Spec . Gateway . HostNetwork , podTemplateSpec . Spec . HostNetwork )
2022-06-30 10:56:03 +08:00
} else {
assert . Equal ( t , c . clusterSpec . Network . IsHost (), podTemplateSpec . Spec . HostNetwork )
}
})
}
}
2022-05-04 13:23:46 +05:30
func TestAWSServerSideEncryption ( t * testing . T ) {
ctx := context . TODO ()
// Placeholder
context := & clusterd . Context { Clientset : test . New ( t , 3 )}
store := simpleStore ()
info := clienttest . CreateTestClusterInfo ( 1 )
info . CephVersion = cephver . CephVersion { Major : 17 , Minor : 2 , Extra : 3 }
info . Namespace = store . Namespace
data := cephconfig . NewStatelessDaemonDataPathMap ( cephconfig . RgwType , "default" , "rook-ceph" , "/var/lib/rook/" )
c := & clusterConfig {
clusterInfo : info ,
store : store ,
context : context ,
rookVersion : "rook/rook:myversion" ,
clusterSpec : & cephv1 . ClusterSpec {
CephVersion : cephv1 . CephVersionSpec { Image : "quay.io/ceph/ceph:v17.3" },
Network : cephv1 . NetworkSpec {
HostNetwork : true ,
},
},
DataPathMap : data ,
}
resourceName := fmt . Sprintf ( "%s-%s" , AppName , c . store . Name )
rgwConfig := & rgwConfig {
ResourceName : resourceName ,
DaemonID : "default" ,
}
checkRGWOptions := func ( allRGWOptions , optionsNeeded [] string ) bool {
if len ( optionsNeeded ) == 0 {
return false
}
optionMap := make ( map [ string ] bool )
for _ , option := range allRGWOptions {
optionMap [ option ] = true
}
for _ , option := range optionsNeeded {
if _ , found := optionMap [ option ]; ! found {
return false
}
}
return true
}
t . Run ( "SecuritySpec is not configured no options will be configured" , func ( t * testing . T ) {
rgwContainer , err := c . makeDaemonContainer ( rgwConfig )
assert . NoError ( t , err )
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSDefaultOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3DefaultOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTokenOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTokenOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTLSOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTLSOptions ( false )))
})
configureSSE ( t , c , true , false )
t . Run ( "Invalid Security Spec configured, no options will be configured" , func ( t * testing . T ) {
rgwContainer , err := c . makeDaemonContainer ( rgwConfig )
assert . Error ( t , err )
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSDefaultOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3DefaultOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTokenOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTokenOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTLSOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTLSOptions ( false )))
})
t . Run ( "Security Spec configured with kms only,so kms options will be configured" , func ( t * testing . T ) {
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
rgwContainer , err := c . makeDaemonContainer ( rgwConfig )
assert . NoError ( t , err )
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSDefaultOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3DefaultOptions ( false )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTokenOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTokenOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTLSOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTLSOptions ( false )))
})
t . Run ( "Security Spec configured with s3 only, so s3 options will be configured" , func ( t * testing . T ) {
configureSSE ( t , c , false , true )
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
rgwContainer , err := c . makeDaemonContainer ( rgwConfig )
assert . NoError ( t , err )
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSDefaultOptions ( false )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3DefaultOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTokenOptions ( false )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTokenOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTLSOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTLSOptions ( false )))
})
t . Run ( "Security Spec configured with both kms and s3 settings, so both kms and s3 options will be configured" , func ( t * testing . T ) {
configureSSE ( t , c , true , true )
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
rgwContainer , err := c . makeDaemonContainer ( rgwConfig )
assert . NoError ( t , err )
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSDefaultOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3DefaultOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTokenOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTokenOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTLSOptions ( false )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTLSOptions ( false )))
})
tlsSecret := & v1 . Secret {
ObjectMeta : metav1 . ObjectMeta {
Name : "vault-ca-secret" ,
Namespace : c . store . Namespace ,
},
}
tlsSecret . Data = map [ string ][] byte { "cert" : [] byte ( "envnrevbnbvsbjkrtn" )}
_ , err := c . context . Clientset . CoreV1 (). Secrets ( c . store . Namespace ). Create ( ctx , tlsSecret , metav1 . CreateOptions {})
assert . NoError ( t , err )
t . Run ( "Security Spec configured with kms along with TLS, so kms including TLS options will be configured" , func ( t * testing . T ) {
configureSSE ( t , c , true , false )
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
rgwContainer , err := c . makeDaemonContainer ( rgwConfig )
assert . NoError ( t , err )
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSDefaultOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3DefaultOptions ( false )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTokenOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTokenOptions ( false )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTLSOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTLSOptions ( false )))
})
t . Run ( "Security Spec configured with s3 along with TLS, so s3 including TLS options will be configured" , func ( t * testing . T ) {
configureSSE ( t , c , false , true )
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
rgwContainer , err := c . makeDaemonContainer ( rgwConfig )
assert . NoError ( t , err )
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSDefaultOptions ( false )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3DefaultOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTokenOptions ( false )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTokenOptions ( true )))
assert . False ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTLSOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTLSOptions ( true )))
})
t . Run ( "Security Spec configured both kms and s3 aloong with TLS, all the serverr side encryption related options will be configured" , func ( t * testing . T ) {
configureSSE ( t , c , true , true )
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_SECRET_ENGINE" ] = "transit"
c . store . Spec . Security . KeyManagementService . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
c . store . Spec . Security . ServerSideEncryptionS3 . ConnectionDetails [ "VAULT_CACERT" ] = "vault-ca-secret"
rgwContainer , err := c . makeDaemonContainer ( rgwConfig )
assert . NoError ( t , err )
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSDefaultOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3DefaultOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTokenOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTokenOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseKMSVaultTLSOptions ( true )))
assert . True ( t , checkRGWOptions ( rgwContainer . Args , c . sseS3VaultTLSOptions ( true )))
})
}