Skip to content

Commit

Permalink
Fix peers test to use node key collection prior to peer collection te…
Browse files Browse the repository at this point in the history
…sting
  • Loading branch information
pharr117 committed Jan 28, 2025
1 parent f347fe8 commit bff6102
Showing 1 changed file with 87 additions and 59 deletions.
146 changes: 87 additions & 59 deletions internal/fullnode/peer_collector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
cosmosv1 "github.com/strangelove-ventures/cosmos-operator/api/v1"
"github.com/stretchr/testify/require"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
)

Expand Down Expand Up @@ -37,15 +38,28 @@ func TestPeerCollector_Collect(t *testing.T) {
nodeKey = `{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"HBX8VFQ4OdWfOwIOR7jj0af8mVHik5iGW9o1xnn4vRltk1HmwQS2LLGrMPVS2LIUO9BUqmZ1Pjt+qM8x0ibHxQ=="}}`
)

type mockConfigClient = mockClient[*corev1.ConfigMap]

t.Run("happy path - private addresses", func(t *testing.T) {
var crd cosmosv1.CosmosFullNode
crd.Name = "dydx"
crd.Namespace = namespace
crd.Spec.Replicas = 2
res, err := BuildNodeKeySecrets(nil, &crd)

var mClient mockConfigClient
mClient.ObjectList = corev1.ConfigMapList{Items: []corev1.ConfigMap{
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-0", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-1", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
}}
nodeKeyCollector := NewNodeKeyCollector(&mClient)
nodeKeys, err := nodeKeyCollector.Collect(ctx, &crd)
require.NoError(t, err)
secret := res[0].Object()
secret.Data[nodeKeyFile] = []byte(nodeKey)

var (
getCount int
Expand All @@ -55,25 +69,21 @@ func TestPeerCollector_Collect(t *testing.T) {
objKeys = append(objKeys, key)
getCount++
switch ref := obj.(type) {
case *corev1.Secret:
*ref = *secret
case *corev1.Service:
*ref = corev1.Service{}
}
return nil
})

collector := NewPeerCollector(getter)
peers, err := collector.Collect(ctx, &crd)
peers, err := collector.Collect(ctx, &crd, nodeKeys)
require.NoError(t, err)
require.Len(t, peers, 2)

require.Equal(t, 4, getCount) // 2 secrets + 2 services
require.Equal(t, 2, getCount) // 2 services

wantKeys := []client.ObjectKey{
{Name: "dydx-node-key-0", Namespace: namespace},
{Name: "dydx-p2p-0", Namespace: namespace},
{Name: "dydx-node-key-1", Namespace: namespace},
{Name: "dydx-p2p-1", Namespace: namespace},
}
require.Equal(t, wantKeys, objKeys)
Expand All @@ -98,15 +108,28 @@ func TestPeerCollector_Collect(t *testing.T) {
crd.Name = "dydx"
crd.Namespace = namespace
crd.Spec.Replicas = 3
res, err := BuildNodeKeySecrets(nil, &crd)

var mClient mockConfigClient
mClient.ObjectList = corev1.ConfigMapList{Items: []corev1.ConfigMap{
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-0", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-1", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-2", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
}}
nodeKeyCollector := NewNodeKeyCollector(&mClient)
nodeKeys, err := nodeKeyCollector.Collect(ctx, &crd)
require.NoError(t, err)
secret := res[0].Object()
secret.Data[nodeKeyFile] = []byte(nodeKey)

getter := mockGetter(func(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error {
switch ref := obj.(type) {
case *corev1.Secret:
*ref = *secret
case *corev1.Service:
var svc corev1.Service
switch key.Name {
Expand All @@ -125,7 +148,7 @@ func TestPeerCollector_Collect(t *testing.T) {
})

collector := NewPeerCollector(getter)
peers, err := collector.Collect(ctx, &crd)
peers, err := collector.Collect(ctx, &crd, nodeKeys)
require.NoError(t, err)
require.Len(t, peers, 3)

Expand Down Expand Up @@ -156,11 +179,20 @@ func TestPeerCollector_Collect(t *testing.T) {
crd.Spec.Replicas = 2
crd.Spec.Ordinals.Start = 2

res, err := BuildNodeKeySecrets(nil, &crd)
var mClient mockConfigClient
mClient.ObjectList = corev1.ConfigMapList{Items: []corev1.ConfigMap{
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-2", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-3", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
}}
nodeKeyCollector := NewNodeKeyCollector(&mClient)
nodeKeys, err := nodeKeyCollector.Collect(ctx, &crd)
require.NoError(t, err)
require.Equal(t, crd.Spec.Replicas, int32(len(res)))
secret := res[0].Object()
secret.Data[nodeKeyFile] = []byte(nodeKey)

var (
getCount int
Expand All @@ -170,25 +202,21 @@ func TestPeerCollector_Collect(t *testing.T) {
objKeys = append(objKeys, key)
getCount++
switch ref := obj.(type) {
case *corev1.Secret:
*ref = *secret
case *corev1.Service:
*ref = corev1.Service{}
}
return nil
})

collector := NewPeerCollector(getter)
peers, err := collector.Collect(ctx, &crd)
peers, err := collector.Collect(ctx, &crd, nodeKeys)
require.NoError(t, err)
require.Len(t, peers, 2)

require.Equal(t, 4, getCount) // 2 secrets + 2 services
require.Equal(t, 2, getCount) // 2 services

wantKeys := []client.ObjectKey{
{Name: fmt.Sprintf("dydx-node-key-%d", crd.Spec.Ordinals.Start), Namespace: namespace},
{Name: fmt.Sprintf("dydx-p2p-%d", crd.Spec.Ordinals.Start), Namespace: namespace},
{Name: fmt.Sprintf("dydx-node-key-%d", crd.Spec.Ordinals.Start+1), Namespace: namespace},
{Name: fmt.Sprintf("dydx-p2p-%d", crd.Spec.Ordinals.Start+1), Namespace: namespace},
}
require.Equal(t, wantKeys, objKeys)
Expand All @@ -215,16 +243,27 @@ func TestPeerCollector_Collect(t *testing.T) {
crd.Spec.Replicas = 3
crd.Spec.Ordinals.Start = 0

res, err := BuildNodeKeySecrets(nil, &crd)
var mClient mockConfigClient
mClient.ObjectList = corev1.ConfigMapList{Items: []corev1.ConfigMap{
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-0", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-1", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
{
ObjectMeta: metav1.ObjectMeta{Name: "dydx-2", Namespace: namespace},
Data: map[string]string{nodeKeyFile: nodeKey},
},
}}
nodeKeyCollector := NewNodeKeyCollector(&mClient)
nodeKeys, err := nodeKeyCollector.Collect(ctx, &crd)
require.NoError(t, err)
require.Equal(t, crd.Spec.Replicas, int32(len(res)))
secret := res[0].Object()
secret.Data[nodeKeyFile] = []byte(nodeKey)

getter := mockGetter(func(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error {
switch ref := obj.(type) {
case *corev1.Secret:
*ref = *secret
case *corev1.Service:
var svc corev1.Service
switch key.Name {
Expand All @@ -243,7 +282,7 @@ func TestPeerCollector_Collect(t *testing.T) {
})

collector := NewPeerCollector(getter)
peers, err := collector.Collect(ctx, &crd)
peers, err := collector.Collect(ctx, &crd, nodeKeys)
require.NoError(t, err)
require.Len(t, peers, 3)

Expand Down Expand Up @@ -273,49 +312,38 @@ func TestPeerCollector_Collect(t *testing.T) {
var crd cosmosv1.CosmosFullNode
crd.Spec.Replicas = 0

var mClient mockConfigClient
mClient.ObjectList = corev1.ConfigMapList{Items: []corev1.ConfigMap{}}
nodeKeyCollector := NewNodeKeyCollector(&mClient)
nodeKeys, err := nodeKeyCollector.Collect(ctx, &crd)
require.NoError(t, err)

collector := NewPeerCollector(panicGetter)
peers, err := collector.Collect(ctx, &crd)
peers, err := collector.Collect(ctx, &crd, nodeKeys)
require.NoError(t, err)
require.Len(t, peers, 0)
})

t.Run("get error", func(t *testing.T) {
getter := mockGetter(func(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error {
return errors.New("boom")
})

collector := NewPeerCollector(getter)
var crd cosmosv1.CosmosFullNode
crd.Name = "dydx"
crd.Spec.Replicas = 1
_, err := collector.Collect(ctx, &crd)

require.Error(t, err)
require.EqualError(t, err, "get secret dydx-node-key-0: boom")
require.True(t, err.IsTransient())
})
var mClient mockConfigClient
mClient.ObjectList = corev1.ConfigMapList{Items: []corev1.ConfigMap{}}
nodeKeyCollector := NewNodeKeyCollector(&mClient)
nodeKeys, err := nodeKeyCollector.Collect(ctx, &crd)
require.NoError(t, err)

t.Run("invalid node key", func(t *testing.T) {
getter := mockGetter(func(ctx context.Context, key client.ObjectKey, obj client.Object, opts ...client.GetOption) error {
switch ref := obj.(type) {
case *corev1.Secret:
var secret corev1.Secret
secret.Data = map[string][]byte{nodeKeyFile: []byte("invalid")}
*ref = secret
case *corev1.Service:
panic("should not be called")
}
return nil
return errors.New("boom")
})

var crd cosmosv1.CosmosFullNode
crd.Name = "dydx"
crd.Spec.Replicas = 1
collector := NewPeerCollector(getter)
_, err := collector.Collect(ctx, &crd)
_, err = collector.Collect(ctx, &crd, nodeKeys)

require.Error(t, err)
require.Contains(t, err.Error(), "invalid character")
require.False(t, err.IsTransient())
require.EqualError(t, err, "get server dydx-p2p-0: boom")
require.True(t, err.IsTransient())
})
}

0 comments on commit bff6102

Please sign in to comment.