Skip to content

Commit

Permalink
Add replicaset helper functions (#804)
Browse files Browse the repository at this point in the history
Update test names

Fix names

Update test YAML

Update label
  • Loading branch information
cbuto committed Mar 17, 2021
1 parent ad51245 commit 9bd5d84
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 0 deletions.
49 changes: 49 additions & 0 deletions modules/k8s/replicaset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package k8s

import (
"context"

"github.com/stretchr/testify/require"
appsv1 "k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/gruntwork-io/terratest/modules/testing"
)

// ListReplicaSets will look for replicasets in the given namespace that match the given filters and return them. This will
// fail the test if there is an error.
func ListReplicaSets(t testing.TestingT, options *KubectlOptions, filters metav1.ListOptions) []appsv1.ReplicaSet {
replicaset, err := ListReplicaSetsE(t, options, filters)
require.NoError(t, err)
return replicaset
}

// ListReplicaSetsE will look for replicasets in the given namespace that match the given filters and return them.
func ListReplicaSetsE(t testing.TestingT, options *KubectlOptions, filters metav1.ListOptions) ([]appsv1.ReplicaSet, error) {
clientset, err := GetKubernetesClientFromOptionsE(t, options)
if err != nil {
return nil, err
}
replicasets, err := clientset.AppsV1().ReplicaSets(options.Namespace).List(context.Background(), filters)
if err != nil {
return nil, err
}
return replicasets.Items, nil
}

// GetReplicaSet returns a Kubernetes replicaset resource in the provided namespace with the given name. This will
// fail the test if there is an error.
func GetReplicaSet(t testing.TestingT, options *KubectlOptions, replicaSetName string) *appsv1.ReplicaSet {
replicaset, err := GetReplicaSetE(t, options, replicaSetName)
require.NoError(t, err)
return replicaset
}

// GetReplicaSetE returns a Kubernetes replicaset resource in the provided namespace with the given name.
func GetReplicaSetE(t testing.TestingT, options *KubectlOptions, replicaSetName string) (*appsv1.ReplicaSet, error) {
clientset, err := GetKubernetesClientFromOptionsE(t, options)
if err != nil {
return nil, err
}
return clientset.AppsV1().ReplicaSets(options.Namespace).Get(context.Background(), replicaSetName, metav1.GetOptions{})
}
87 changes: 87 additions & 0 deletions modules/k8s/replicaset_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// +build kubeall kubernetes

// NOTE: we have build tags to differentiate kubernetes tests from non-kubernetes tests. This is done because minikube
// is heavy and can interfere with docker related tests in terratest. Specifically, many of the tests start to fail with
// `connection refused` errors from `minikube`. To avoid overloading the system, we run the kubernetes tests and helm
// tests separately from the others. This may not be necessary if you have a sufficiently powerful machine. We
// recommend at least 4 cores and 16GB of RAM if you want to run all the tests together.

package k8s

import (
"fmt"

"strings"
"testing"

"github.com/gruntwork-io/terratest/modules/random"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func TestGetReplicaSetEReturnsError(t *testing.T) {
t.Parallel()

options := NewKubectlOptions("", "", "")
_, err := GetReplicaSetE(t, options, "sample-rs")
require.Error(t, err)
}

func TestGetReplicaSets(t *testing.T) {
t.Parallel()

uniqueID := strings.ToLower(random.UniqueId())
options := NewKubectlOptions("", "", uniqueID)
configData := fmt.Sprintf(EXAMPLE_REPLICASET_YAML_TEMPLATE, uniqueID, uniqueID)
KubectlApplyFromString(t, options, configData)
defer KubectlDeleteFromString(t, options, configData)

replicaSet := GetReplicaSet(t, options, "sample-rs")
require.Equal(t, replicaSet.Name, "sample-rs")
require.Equal(t, replicaSet.Namespace, uniqueID)
}

func TestListReplicaSets(t *testing.T) {
t.Parallel()

uniqueID := strings.ToLower(random.UniqueId())
options := NewKubectlOptions("", "", uniqueID)
configData := fmt.Sprintf(EXAMPLE_REPLICASET_YAML_TEMPLATE, uniqueID, uniqueID)
KubectlApplyFromString(t, options, configData)
defer KubectlDeleteFromString(t, options, configData)

replicaSets := ListReplicaSets(t, options, metav1.ListOptions{})
require.Equal(t, len(replicaSets), 1)

replicaSet := replicaSets[0]
require.Equal(t, replicaSet.Name, "sample-rs")
require.Equal(t, replicaSet.Namespace, uniqueID)
}

const EXAMPLE_REPLICASET_YAML_TEMPLATE = `---
apiVersion: v1
kind: Namespace
metadata:
name: %s
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: sample-rs
namespace: %s
labels:
app: sample-rs
spec:
selector:
matchLabels:
name: sample-rs
template:
metadata:
labels:
name: sample-rs
spec:
containers:
- name: alpine
image: alpine:3.8
command: ['sh', '-c', 'echo Hello Terratest! && sleep 99999']
`

0 comments on commit 9bd5d84

Please sign in to comment.