Skip to content

Commit 5e1e226

Browse files
akgalwaskoala7659
andauthored
Compass Runtime Agent should reconcile the mTLS secret in istio-system (kyma-project#12626)
* Checking secret existence in controller's reconcilation loop. * Fix for failing unit tests * Image bumped * adding one unit test to check credential manager * extend logging with new flag CreadentialsExist * Regenerating mock for Connector interface for modified MaintainConnection method * fix for saving reneved credentials * fix for saving reneved credentials #2 * remove useless comment Co-authored-by: Przemyslaw Golicz <[email protected]>
1 parent 5b4ad3c commit 5e1e226

File tree

11 files changed

+169
-23
lines changed

11 files changed

+169
-23
lines changed

components/compass-runtime-agent/internal/certificates/manager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const (
2222
type Manager interface {
2323
GetClientCredentials() (ClientCredentials, error)
2424
PreserveCredentials(Credentials) error
25+
CredentialsExist() (bool, error)
2526
}
2627

2728
func NewCredentialsManager(clusterCertificateSecretName, caCertSecretName types.NamespacedName, secretsRepository secrets.Repository) *credentialsManager {
@@ -53,6 +54,10 @@ func (cm *credentialsManager) GetClientCredentials() (ClientCredentials, error)
5354
return pemCredentials.AsClientCredentials()
5455
}
5556

57+
func (cm *credentialsManager) CredentialsExist() (bool, error) {
58+
return cm.secretsRepository.Exists(cm.caCertSecretName)
59+
}
60+
5661
func (cm *credentialsManager) PreserveCredentials(credentials Credentials) error {
5762
pemCredentials := credentials.AsPemEncoded()
5863

components/compass-runtime-agent/internal/certificates/manager_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,38 @@ var (
3131
}
3232
)
3333

34+
func TestCredentialsExist(t *testing.T) {
35+
t.Run("should return false if credentials does not exist", func(t *testing.T) {
36+
// given
37+
expectedErr := errors.New("oh, no")
38+
39+
secretsRepository := &mocks.Repository{}
40+
secretsRepository.On("Exists", caCertSecretNamespaceName).Return(false, expectedErr)
41+
42+
// when
43+
credentialsManager := NewCredentialsManager(clusterCertSecretNamespaceName, caCertSecretNamespaceName, secretsRepository)
44+
45+
// then
46+
exists, err := credentialsManager.CredentialsExist()
47+
assert.Equal(t, expectedErr, err)
48+
assert.Equal(t, false, exists)
49+
})
50+
51+
t.Run("should return true if credentials exist", func(t *testing.T) {
52+
// given
53+
secretsRepository := &mocks.Repository{}
54+
secretsRepository.On("Exists", caCertSecretNamespaceName).Return(true, nil)
55+
56+
// when
57+
credentialsManager := NewCredentialsManager(clusterCertSecretNamespaceName, caCertSecretNamespaceName, secretsRepository)
58+
59+
// then
60+
exists, err := credentialsManager.CredentialsExist()
61+
assert.Equal(t, nil, err)
62+
assert.Equal(t, true, exists)
63+
})
64+
}
65+
3466
func TestCertificatePreserver_PreserveCertificates(t *testing.T) {
3567

3668
pemCredentials := PemEncodedCredentials{

components/compass-runtime-agent/internal/certificates/mocks/Manager.go

Lines changed: 24 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/compass-runtime-agent/internal/compassconnection/connector.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const (
2626
//go:generate mockery --name=Connector
2727
type Connector interface {
2828
EstablishConnection(connectorURL, token string) (EstablishedConnection, error)
29-
MaintainConnection(renewCert bool) (*certificates.Credentials, v1alpha1.ManagementInfo, error)
29+
MaintainConnection(renewCert bool, credentialsExist bool) (*certificates.Credentials, v1alpha1.ManagementInfo, error)
3030
}
3131

3232
func NewCompassConnector(
@@ -91,7 +91,7 @@ func (cc *compassConnector) establishConnection(connectorURL, token, requestID s
9191
}, nil
9292
}
9393

94-
func (cc *compassConnector) MaintainConnection(renewCert bool) (*certificates.Credentials, v1alpha1.ManagementInfo, error) {
94+
func (cc *compassConnector) MaintainConnection(renewCert bool, credentialsExist bool) (*certificates.Credentials, v1alpha1.ManagementInfo, error) {
9595
certSecuredClient, err := cc.clientsProvider.GetConnectorCertSecuredClient()
9696
if err != nil {
9797
return nil, v1alpha1.ManagementInfo{}, errors.Wrap(err, "Failed to prepare Certificate-secured Connector client while checking connection")
@@ -107,7 +107,7 @@ func (cc *compassConnector) MaintainConnection(renewCert bool) (*certificates.Cr
107107
return nil, v1alpha1.ManagementInfo{}, err
108108
}
109109

110-
if !renewCert {
110+
if !renewCert && credentialsExist {
111111
return nil, toManagementInfo(configuration.ManagementPlaneInfo), nil
112112
}
113113

components/compass-runtime-agent/internal/compassconnection/mocks/Connector.go

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/compass-runtime-agent/internal/compassconnection/package_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ func TestCompassConnectionController(t *testing.T) {
123123
assert.True(t, ok)
124124
assert.NotEmpty(t, credentials)
125125
}).Return(nil)
126+
credentialsManagerMock.On("CredentialsExist").Return(true, nil)
127+
126128
// Config provider
127129
configProviderMock := configProviderMock()
128130
// Connector clients

components/compass-runtime-agent/internal/compassconnection/supervisor.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ func (s *crSupervisor) InitializeCompassConnection() (*v1alpha1.CompassConnectio
118118
return s.updateCompassConnection(compassConnectionCR)
119119
}
120120

121-
// SynchronizeWithCompass synchronizes with Compass
122121
func (s *crSupervisor) SynchronizeWithCompass(connection *v1alpha1.CompassConnection) (*v1alpha1.CompassConnection, error) {
123122
s.log = s.log.WithField("CompassConnection", connection.Name)
124123

@@ -194,16 +193,20 @@ func (s *crSupervisor) SynchronizeWithCompass(connection *v1alpha1.CompassConnec
194193

195194
func (s *crSupervisor) maintainCompassConnection(compassConnection *v1alpha1.CompassConnection) error {
196195
shouldRenew := compassConnection.ShouldRenewCertificate(s.certValidityRenewalThreshold, s.minimalCompassSyncTime)
196+
credentialsExist, err := s.credentialsManager.CredentialsExist()
197+
if err != nil {
198+
return errors.Wrap(err, "Failed to check whether credentials exist")
199+
}
197200

198-
s.log.Infof("Trying to maintain certificates connection... Renewal: %v", shouldRenew)
199-
newCreds, managementInfo, err := s.compassConnector.MaintainConnection(shouldRenew)
201+
s.log.Infof("Trying to maintain certificates connection... Renewal: %v, CreadentialsExist: %v", shouldRenew, credentialsExist)
202+
newCreds, managementInfo, err := s.compassConnector.MaintainConnection(shouldRenew, credentialsExist)
200203
if err != nil {
201204
return errors.Wrap(err, "Failed to connect to Compass Connector")
202205
}
203206

204207
connectionTime := metav1.Now()
205208

206-
if shouldRenew && newCreds != nil {
209+
if newCreds != nil {
207210
s.log.Infof("Trying to save renewed certificates...")
208211
err = s.credentialsManager.PreserveCredentials(*newCreds)
209212
if err != nil {

components/compass-runtime-agent/internal/secrets/mocks/Repository.go

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/compass-runtime-agent/internal/secrets/repository.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type Manager interface {
2727
//go:generate mockery --name=Repository
2828
// Repository contains operations for managing client credentials
2929
type Repository interface {
30+
Exists(name types.NamespacedName) (bool, error)
3031
Get(name types.NamespacedName) (map[string][]byte, error)
3132
UpsertWithReplace(name types.NamespacedName, data map[string][]byte) error
3233
UpsertWithMerge(name types.NamespacedName, data map[string][]byte) error
@@ -45,6 +46,20 @@ func NewRepository(secretsManagerConstructor ManagerConstructor) Repository {
4546
}
4647
}
4748

49+
func (r *repository) Exists(name types.NamespacedName) (bool, error) {
50+
secretManager := r.secretsManagerConstructor(name.Namespace)
51+
52+
_, err := secretManager.Get(context.Background(), name.Name, metav1.GetOptions{})
53+
if err != nil {
54+
if k8serrors.IsNotFound(err) {
55+
return false, nil
56+
}
57+
return false, err
58+
}
59+
60+
return true, nil
61+
}
62+
4863
// UpsertWithReplace creates a new Kubernetes secret, if secret with specified name already exists overrides it
4964
func (r *repository) UpsertWithReplace(name types.NamespacedName, data map[string][]byte) error {
5065
secretManager := r.secretsManagerConstructor(name.Namespace)

components/compass-runtime-agent/internal/secrets/repository_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,55 @@ var (
3535
}
3636
)
3737

38+
func TestRepository_Exists(t *testing.T) {
39+
t.Run("should return true if exists", func(t *testing.T) {
40+
// given
41+
secret := makeSecret(namespacedName, map[string][]byte{dataKey: []byte("data")})
42+
43+
secretsManagerMock := &mocks.Manager{}
44+
secretsManagerMock.On("Get", context.Background(), secretName, metav1.GetOptions{}).Return(secret, nil)
45+
46+
repository := NewRepository(prepareManagerConstructor(secretsManagerMock))
47+
48+
// when
49+
exists, err := repository.Exists(namespacedName)
50+
51+
// then
52+
assert.NoError(t, err)
53+
assert.Equal(t, true, exists)
54+
})
55+
56+
t.Run("should return false if secret doesn't exist", func(t *testing.T) {
57+
// given
58+
secretsManagerMock := &mocks.Manager{}
59+
secretsManagerMock.On("Get", context.Background(), secretName, metav1.GetOptions{}).Return(nil, k8serrors.NewNotFound(schema.GroupResource{}, "secret"))
60+
61+
repository := NewRepository(prepareManagerConstructor(secretsManagerMock))
62+
63+
// when
64+
exists, err := repository.Exists(namespacedName)
65+
66+
// then
67+
assert.NoError(t, err)
68+
assert.Equal(t, false, exists)
69+
})
70+
71+
t.Run("should return error if failed to read secret", func(t *testing.T) {
72+
// given
73+
secretsManagerMock := &mocks.Manager{}
74+
secretsManagerMock.On("Get", context.Background(), secretName, metav1.GetOptions{}).Return(nil, errors.New("oh, no"))
75+
76+
repository := NewRepository(prepareManagerConstructor(secretsManagerMock))
77+
78+
// when
79+
exists, err := repository.Exists(namespacedName)
80+
81+
// then
82+
assert.Error(t, err)
83+
assert.Equal(t, false, exists)
84+
})
85+
}
86+
3887
func TestRepository_Get(t *testing.T) {
3988
t.Run("should get given secret", func(t *testing.T) {
4089
// given

0 commit comments

Comments
 (0)