Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 4 additions & 18 deletions pkg/operator/encryption/controllers/key_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,22 +43,8 @@ func TestKeyController(t *testing.T) {
apiServerWithAESGCM := simpleAPIServer.DeepCopy()
apiServerWithAESGCM.Spec.Encryption = configv1.APIServerEncryption{Type: "aesgcm"}

dummyKMSConfig := &configv1.KMSConfig{
Type: configv1.VaultKMSProvider,
Vault: configv1.VaultKMSConfig{
KMSPluginImage: "registry.example.com/kms-plugin@sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
VaultAddress: "https://vault.example.com",
Authentication: configv1.VaultAuthentication{
Type: configv1.VaultAuthenticationTypeAppRole,
AppRole: configv1.VaultAppRoleAuthentication{
Secret: configv1.VaultSecretReference{Name: "vault-approle-secret"},
},
},
TransitKey: "test-transit-key",
},
}
apiServerWithKMS := simpleAPIServer.DeepCopy()
apiServerWithKMS.Spec.Encryption = configv1.APIServerEncryption{Type: "KMS", KMS: dummyKMSConfig}
apiServerWithKMS.Spec.Encryption = configv1.APIServerEncryption{Type: "KMS", KMS: encryptiontesting.DefaultKMSProviderConfig}

scenarios := []struct {
name string
Expand Down Expand Up @@ -387,7 +373,7 @@ func TestKeyController(t *testing.T) {

// Verify KMS provider config content
kmsProviderConfigData := actualSecret.Data["encryption.apiserver.operator.openshift.io-kms-provider-config"]
expectedProviderConfig, err := encoding.EncodeKMSConfig(dummyKMSConfig)
expectedProviderConfig, err := encoding.EncodeKMSConfig(encryptiontesting.DefaultKMSProviderConfig)
if err != nil {
ts.Fatalf("failed to encode KMS config: %v", err)
}
Expand Down Expand Up @@ -465,7 +451,7 @@ func TestKeyController(t *testing.T) {

// Verify KMS provider config content
kmsProviderConfigData := actualSecret.Data["encryption.apiserver.operator.openshift.io-kms-provider-config"]
expectedProviderConfig, err := encoding.EncodeKMSConfig(dummyKMSConfig)
expectedProviderConfig, err := encoding.EncodeKMSConfig(encryptiontesting.DefaultKMSProviderConfig)
if err != nil {
ts.Fatalf("failed to encode KMS config: %v", err)
}
Expand Down Expand Up @@ -559,7 +545,7 @@ func TestKeyController(t *testing.T) {

// Verify KMS provider config content
kmsProviderConfigData := actualSecret.Data["encryption.apiserver.operator.openshift.io-kms-provider-config"]
expectedProviderConfig, err := encoding.EncodeKMSConfig(dummyKMSConfig)
expectedProviderConfig, err := encoding.EncodeKMSConfig(encryptiontesting.DefaultKMSProviderConfig)
if err != nil {
ts.Fatalf("failed to encode KMS config: %v", err)
}
Expand Down
285 changes: 173 additions & 112 deletions pkg/operator/encryption/controllers/state_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"k8s.io/client-go/kubernetes/fake"
clientgotesting "k8s.io/client-go/testing"

configv1 "github.com/openshift/api/config/v1"
operatorv1 "github.com/openshift/api/operator/v1"
configv1clientfake "github.com/openshift/client-go/config/clientset/versioned/fake"
configv1informers "github.com/openshift/client-go/config/informers/externalversions"
Expand Down Expand Up @@ -724,25 +725,28 @@ func TestStateController(t *testing.T) {
encryptiontesting.CreateEncryptionKeySecretWithKMSConfig("kms", []schema.GroupResource{{Group: "", Resource: "secrets"}}, 1),
},
expectedActions: []string{"list:pods:kms", "get:secrets:kms", "list:secrets:openshift-config-managed", "get:secrets:openshift-config-managed", "create:secrets:openshift-config-managed", "create:events:kms", "create:events:kms"},
expectedEncryptionCfg: &encryptiondata.Config{Encryption: &apiserverconfigv1.EncryptionConfiguration{
TypeMeta: metav1.TypeMeta{
Kind: "EncryptionConfiguration",
APIVersion: "apiserver.config.k8s.io/v1",
},
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
Identity: &apiserverconfigv1.IdentityConfiguration{},
}, {
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
expectedEncryptionCfg: &encryptiondata.Config{
Encryption: &apiserverconfigv1.EncryptionConfiguration{
TypeMeta: metav1.TypeMeta{
Kind: "EncryptionConfiguration",
APIVersion: "apiserver.config.k8s.io/v1",
},
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
Identity: &apiserverconfigv1.IdentityConfiguration{},
}, {
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}},
}},
}},
}},
},
KMSProviders: map[string]*configv1.KMSConfig{"1": encryptiontesting.DefaultKMSProviderConfig},
},
validateFunc: func(ts *testing.T, actions []clientgotesting.Action, destName string, expectedEncryptionCfg *encryptiondata.Config) {
wasSecretValidated := false
for _, action := range actions {
Expand Down Expand Up @@ -793,25 +797,28 @@ func TestStateController(t *testing.T) {
return ecs
}(),
},
expectedEncryptionCfg: &encryptiondata.Config{Encryption: &apiserverconfigv1.EncryptionConfiguration{
TypeMeta: metav1.TypeMeta{
Kind: "EncryptionConfiguration",
APIVersion: "apiserver.config.k8s.io/v1",
},
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
expectedEncryptionCfg: &encryptiondata.Config{
Encryption: &apiserverconfigv1.EncryptionConfiguration{
TypeMeta: metav1.TypeMeta{
Kind: "EncryptionConfiguration",
APIVersion: "apiserver.config.k8s.io/v1",
},
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
}},
}},
}},
}},
},
KMSProviders: map[string]*configv1.KMSConfig{"1": encryptiontesting.DefaultKMSProviderConfig},
},
expectedActions: []string{
"list:pods:kms",
"get:secrets:kms",
Expand Down Expand Up @@ -852,40 +859,46 @@ func TestStateController(t *testing.T) {
encryptiontesting.CreateDummyKubeAPIPod("kube-apiserver-1", "kms", "node-1"),
encryptiontesting.CreateMigratedEncryptionKeySecretWithKMSConfig("kms", []schema.GroupResource{{Group: "", Resource: "secrets"}}, 1, time.Now()),
func() *corev1.Secret {
ec := &encryptiondata.Config{Encryption: &apiserverconfigv1.EncryptionConfiguration{
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
ec := &encryptiondata.Config{
Encryption: &apiserverconfigv1.EncryptionConfiguration{
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
}},
}},
}},
}}
},
KMSProviders: map[string]*configv1.KMSConfig{"1": encryptiontesting.DefaultKMSProviderConfig},
}
ecs := createEncryptionCfgSecret(t, "kms", "1", ec)
return ecs
}(),
func() *corev1.Secret {
ec := &encryptiondata.Config{Encryption: &apiserverconfigv1.EncryptionConfiguration{
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
ec := &encryptiondata.Config{
Encryption: &apiserverconfigv1.EncryptionConfiguration{
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
}},
}},
}},
}}
},
KMSProviders: map[string]*configv1.KMSConfig{"1": encryptiontesting.DefaultKMSProviderConfig},
}
ecs := createEncryptionCfgSecret(t, "openshift-config-managed", "1", ec)
ecs.Name = "encryption-config-kms"
return ecs
Expand All @@ -904,7 +917,20 @@ func TestStateController(t *testing.T) {
initialResources: []runtime.Object{
encryptiontesting.CreateDummyKubeAPIPod("kube-apiserver-1", "kms", "node-1"),
encryptiontesting.CreateExpiredMigratedEncryptionKeySecretWithKMSConfig("kms", []schema.GroupResource{{Group: "", Resource: "secrets"}}, 1),
encryptiontesting.CreateEncryptionKeySecretWithKMSConfig("kms", []schema.GroupResource{{Group: "", Resource: "secrets"}}, 2),
encryptiontesting.CreateEncryptionKeySecretWithCustomKMSConfig("kms", []schema.GroupResource{{Group: "", Resource: "secrets"}}, 2, &configv1.KMSConfig{
Type: configv1.VaultKMSProvider,
Vault: configv1.VaultKMSConfig{
KMSPluginImage: "registry.example.com/kms-plugin@sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
VaultAddress: "https://vault2.example.com",
Authentication: configv1.VaultAuthentication{
Type: configv1.VaultAuthenticationTypeAppRole,
AppRole: configv1.VaultAppRoleAuthentication{
Secret: configv1.VaultSecretReference{Name: "vault-approle-secret-2"},
},
},
TransitKey: "test-transit-key-2",
},
}),
func() *corev1.Secret { // encryption config in kms namespace
ec := &encryptiondata.Config{Encryption: &apiserverconfigv1.EncryptionConfiguration{
Resources: []apiserverconfigv1.ResourceConfiguration{{
Expand Down Expand Up @@ -959,32 +985,51 @@ func TestStateController(t *testing.T) {
return ecs
}(),
},
expectedEncryptionCfg: &encryptiondata.Config{Encryption: &apiserverconfigv1.EncryptionConfiguration{
TypeMeta: metav1.TypeMeta{
Kind: "EncryptionConfiguration",
APIVersion: "apiserver.config.k8s.io/v1",
expectedEncryptionCfg: &encryptiondata.Config{
Encryption: &apiserverconfigv1.EncryptionConfiguration{
TypeMeta: metav1.TypeMeta{
Kind: "EncryptionConfiguration",
APIVersion: "apiserver.config.k8s.io/v1",
},
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "2_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-2.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
}},
}},
},
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "2_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-2.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "1_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-1.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
KMSProviders: map[string]*configv1.KMSConfig{
"1": encryptiontesting.DefaultKMSProviderConfig,
"2": {
Type: configv1.VaultKMSProvider,
Vault: configv1.VaultKMSConfig{
KMSPluginImage: "registry.example.com/kms-plugin@sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
VaultAddress: "https://vault2.example.com",
Authentication: configv1.VaultAuthentication{
Type: configv1.VaultAuthenticationTypeAppRole,
AppRole: configv1.VaultAppRoleAuthentication{
Secret: configv1.VaultSecretReference{Name: "vault-approle-secret-2"},
},
},
TransitKey: "test-transit-key-2",
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
}},
}},
}},
},
},
},
expectedActions: []string{
"list:pods:kms",
"get:secrets:kms",
Expand Down Expand Up @@ -1055,32 +1100,48 @@ func TestStateController(t *testing.T) {
return ecs
}(),
},
expectedEncryptionCfg: &encryptiondata.Config{Encryption: &apiserverconfigv1.EncryptionConfiguration{
TypeMeta: metav1.TypeMeta{
Kind: "EncryptionConfiguration",
APIVersion: "apiserver.config.k8s.io/v1",
expectedEncryptionCfg: &encryptiondata.Config{
Encryption: &apiserverconfigv1.EncryptionConfiguration{
TypeMeta: metav1.TypeMeta{
Kind: "EncryptionConfiguration",
APIVersion: "apiserver.config.k8s.io/v1",
},
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
AESCBC: &apiserverconfigv1.AESConfiguration{
Keys: []apiserverconfigv1.Key{{
Name: "1",
Secret: "NjFkZWY5NjRmYjk2N2Y1ZDdjNDRhMmFmOGRhYjY4NjU=", // # notsecret
}},
},
}, {
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "2_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-2.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
}},
}},
},
Resources: []apiserverconfigv1.ResourceConfiguration{{
Resources: []string{"secrets"},
Providers: []apiserverconfigv1.ProviderConfiguration{{
AESCBC: &apiserverconfigv1.AESConfiguration{
Keys: []apiserverconfigv1.Key{{
Name: "1",
Secret: "NjFkZWY5NjRmYjk2N2Y1ZDdjNDRhMmFmOGRhYjY4NjU=", // # notsecret
}},
},
}, {
KMS: &apiserverconfigv1.KMSConfiguration{
APIVersion: "v2",
Name: "2_secrets",
Endpoint: "unix:///var/run/kmsplugin/kms-2.sock",
Timeout: &metav1.Duration{Duration: 10 * time.Second},
KMSProviders: map[string]*configv1.KMSConfig{"2": {
Type: configv1.VaultKMSProvider,
Vault: configv1.VaultKMSConfig{
KMSPluginImage: "registry.example.com/kms-plugin@sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
VaultAddress: "https://vault.example.com",
Authentication: configv1.VaultAuthentication{
Type: configv1.VaultAuthenticationTypeAppRole,
AppRole: configv1.VaultAppRoleAuthentication{
Secret: configv1.VaultSecretReference{Name: "vault-approle-secret"},
},
},
}, {
Identity: &apiserverconfigv1.IdentityConfiguration{},
}},
TransitKey: "test-transit-key",
},
}},
}},
},
expectedActions: []string{
"list:pods:kms",
"get:secrets:kms",
Expand Down
Loading