Use a real apiserver to test the store
This commit is contained in:
parent
3e3e29b78f
commit
c639f490b1
2 changed files with 29 additions and 40 deletions
|
@ -31,6 +31,7 @@ CODEGEN_PKG=${CODEGEN_PKG:-$(cd "${SCRIPT_ROOT}"; ls -d -1 ./vendor/k8s.io/code-
|
||||||
# --output-base "$(dirname ${BASH_SOURCE})/../../.."
|
# --output-base "$(dirname ${BASH_SOURCE})/../../.."
|
||||||
mkdir -p ${CODEGEN_PKG}/hack
|
mkdir -p ${CODEGEN_PKG}/hack
|
||||||
cp ${SCRIPT_ROOT}/hack/boilerplate/boilerplate.go.txt ${CODEGEN_PKG}/hack/boilerplate.go.txt
|
cp ${SCRIPT_ROOT}/hack/boilerplate/boilerplate.go.txt ${CODEGEN_PKG}/hack/boilerplate.go.txt
|
||||||
|
chmod +x ${CODEGEN_PKG}/*.sh
|
||||||
|
|
||||||
${CODEGEN_PKG}/generate-groups.sh "deepcopy" \
|
${CODEGEN_PKG}/generate-groups.sh "deepcopy" \
|
||||||
k8s.io/ingress-nginx/internal k8s.io/ingress-nginx/internal \
|
k8s.io/ingress-nginx/internal k8s.io/ingress-nginx/internal \
|
||||||
|
|
|
@ -17,7 +17,9 @@ limitations under the License.
|
||||||
package store
|
package store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
@ -25,18 +27,15 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/eapache/channels"
|
"github.com/eapache/channels"
|
||||||
|
v1 "k8s.io/api/core/v1"
|
||||||
extensions "k8s.io/api/extensions/v1beta1"
|
extensions "k8s.io/api/extensions/v1beta1"
|
||||||
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
|
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
"k8s.io/client-go/tools/cache"
|
|
||||||
|
|
||||||
"encoding/base64"
|
|
||||||
"io/ioutil"
|
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/kubernetes/fake"
|
"k8s.io/client-go/tools/cache"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||||
|
|
||||||
"k8s.io/ingress-nginx/internal/file"
|
"k8s.io/ingress-nginx/internal/file"
|
||||||
"k8s.io/ingress-nginx/internal/ingress"
|
"k8s.io/ingress-nginx/internal/ingress"
|
||||||
"k8s.io/ingress-nginx/internal/ingress/annotations/parser"
|
"k8s.io/ingress-nginx/internal/ingress/annotations/parser"
|
||||||
|
@ -53,13 +52,26 @@ func TestStore(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
clientSet := fake.NewSimpleClientset()
|
//TODO: move env definition to docker image?
|
||||||
|
os.Setenv("KUBEBUILDER_ASSETS", "/usr/local/bin")
|
||||||
|
|
||||||
|
te := &envtest.Environment{}
|
||||||
|
cfg, err := te.Start()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer te.Stop()
|
||||||
|
|
||||||
|
clientSet, err := kubernetes.NewForConfig(cfg)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
t.Run("should return an error searching for non existing objects", func(t *testing.T) {
|
t.Run("should return an error searching for non existing objects", func(t *testing.T) {
|
||||||
ns := createNamespace(clientSet, t)
|
ns := createNamespace(clientSet, t)
|
||||||
defer deleteNamespace(ns, clientSet, t)
|
defer deleteNamespace(ns, clientSet, t)
|
||||||
cm := createConfigMap(clientSet, ns, t)
|
createConfigMap(clientSet, ns, t)
|
||||||
defer deleteConfigMap(cm, ns, clientSet, t)
|
|
||||||
|
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
updateCh := channels.NewRingChannel(1024)
|
updateCh := channels.NewRingChannel(1024)
|
||||||
|
@ -116,8 +128,7 @@ func TestStore(t *testing.T) {
|
||||||
t.Run("should return one event for add, update and delete of ingress", func(t *testing.T) {
|
t.Run("should return one event for add, update and delete of ingress", func(t *testing.T) {
|
||||||
ns := createNamespace(clientSet, t)
|
ns := createNamespace(clientSet, t)
|
||||||
defer deleteNamespace(ns, clientSet, t)
|
defer deleteNamespace(ns, clientSet, t)
|
||||||
cm := createConfigMap(clientSet, ns, t)
|
createConfigMap(clientSet, ns, t)
|
||||||
defer deleteConfigMap(cm, ns, clientSet, t)
|
|
||||||
|
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
updateCh := channels.NewRingChannel(1024)
|
updateCh := channels.NewRingChannel(1024)
|
||||||
|
@ -270,8 +281,7 @@ func TestStore(t *testing.T) {
|
||||||
t.Run("should not receive updates for ingress with invalid class", func(t *testing.T) {
|
t.Run("should not receive updates for ingress with invalid class", func(t *testing.T) {
|
||||||
ns := createNamespace(clientSet, t)
|
ns := createNamespace(clientSet, t)
|
||||||
defer deleteNamespace(ns, clientSet, t)
|
defer deleteNamespace(ns, clientSet, t)
|
||||||
cm := createConfigMap(clientSet, ns, t)
|
createConfigMap(clientSet, ns, t)
|
||||||
defer deleteConfigMap(cm, ns, clientSet, t)
|
|
||||||
|
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
updateCh := channels.NewRingChannel(1024)
|
updateCh := channels.NewRingChannel(1024)
|
||||||
|
@ -383,8 +393,7 @@ func TestStore(t *testing.T) {
|
||||||
t.Run("should not receive events from secret not referenced from ingress", func(t *testing.T) {
|
t.Run("should not receive events from secret not referenced from ingress", func(t *testing.T) {
|
||||||
ns := createNamespace(clientSet, t)
|
ns := createNamespace(clientSet, t)
|
||||||
defer deleteNamespace(ns, clientSet, t)
|
defer deleteNamespace(ns, clientSet, t)
|
||||||
cm := createConfigMap(clientSet, ns, t)
|
createConfigMap(clientSet, ns, t)
|
||||||
defer deleteConfigMap(cm, ns, clientSet, t)
|
|
||||||
|
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
updateCh := channels.NewRingChannel(1024)
|
updateCh := channels.NewRingChannel(1024)
|
||||||
|
@ -474,8 +483,7 @@ func TestStore(t *testing.T) {
|
||||||
t.Run("should receive events from secret referenced from ingress", func(t *testing.T) {
|
t.Run("should receive events from secret referenced from ingress", func(t *testing.T) {
|
||||||
ns := createNamespace(clientSet, t)
|
ns := createNamespace(clientSet, t)
|
||||||
defer deleteNamespace(ns, clientSet, t)
|
defer deleteNamespace(ns, clientSet, t)
|
||||||
cm := createConfigMap(clientSet, ns, t)
|
createConfigMap(clientSet, ns, t)
|
||||||
defer deleteConfigMap(cm, ns, clientSet, t)
|
|
||||||
|
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
updateCh := channels.NewRingChannel(1024)
|
updateCh := channels.NewRingChannel(1024)
|
||||||
|
@ -588,8 +596,7 @@ func TestStore(t *testing.T) {
|
||||||
t.Run("should create an ingress with a secret which does not exist", func(t *testing.T) {
|
t.Run("should create an ingress with a secret which does not exist", func(t *testing.T) {
|
||||||
ns := createNamespace(clientSet, t)
|
ns := createNamespace(clientSet, t)
|
||||||
defer deleteNamespace(ns, clientSet, t)
|
defer deleteNamespace(ns, clientSet, t)
|
||||||
cm := createConfigMap(clientSet, ns, t)
|
createConfigMap(clientSet, ns, t)
|
||||||
defer deleteConfigMap(cm, ns, clientSet, t)
|
|
||||||
|
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
updateCh := channels.NewRingChannel(1024)
|
updateCh := channels.NewRingChannel(1024)
|
||||||
|
@ -742,11 +749,10 @@ func TestStore(t *testing.T) {
|
||||||
|
|
||||||
func createNamespace(clientSet kubernetes.Interface, t *testing.T) string {
|
func createNamespace(clientSet kubernetes.Interface, t *testing.T) string {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
t.Log("Creating temporal namespace")
|
|
||||||
|
|
||||||
namespace := &v1.Namespace{
|
namespace := &v1.Namespace{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "store-test",
|
Name: fmt.Sprintf("store-test-%v", time.Now().Unix()),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -754,25 +760,21 @@ func createNamespace(clientSet kubernetes.Interface, t *testing.T) string {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("error creating the namespace: %v", err)
|
t.Errorf("error creating the namespace: %v", err)
|
||||||
}
|
}
|
||||||
t.Logf("Temporal namespace %v created", ns)
|
|
||||||
|
|
||||||
return ns.Name
|
return ns.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteNamespace(ns string, clientSet kubernetes.Interface, t *testing.T) {
|
func deleteNamespace(ns string, clientSet kubernetes.Interface, t *testing.T) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
t.Logf("Deleting temporal namespace %v", ns)
|
|
||||||
|
|
||||||
err := clientSet.CoreV1().Namespaces().Delete(ns, &metav1.DeleteOptions{})
|
err := clientSet.CoreV1().Namespaces().Delete(ns, &metav1.DeleteOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("error deleting the namespace: %v", err)
|
t.Errorf("error deleting the namespace: %v", err)
|
||||||
}
|
}
|
||||||
t.Logf("Temporal namespace %v deleted", ns)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func createConfigMap(clientSet kubernetes.Interface, ns string, t *testing.T) string {
|
func createConfigMap(clientSet kubernetes.Interface, ns string, t *testing.T) string {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
t.Log("Creating temporal config map")
|
|
||||||
|
|
||||||
configMap := &v1.ConfigMap{
|
configMap := &v1.ConfigMap{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
@ -785,22 +787,10 @@ func createConfigMap(clientSet kubernetes.Interface, ns string, t *testing.T) st
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("error creating the configuration map: %v", err)
|
t.Errorf("error creating the configuration map: %v", err)
|
||||||
}
|
}
|
||||||
t.Logf("Temporal configmap %v created", cm)
|
|
||||||
|
|
||||||
return cm.Name
|
return cm.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteConfigMap(cm, ns string, clientSet kubernetes.Interface, t *testing.T) {
|
|
||||||
t.Helper()
|
|
||||||
t.Logf("Deleting temporal configmap %v", cm)
|
|
||||||
|
|
||||||
err := clientSet.CoreV1().ConfigMaps(ns).Delete(cm, &metav1.DeleteOptions{})
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("error deleting the configmap: %v", err)
|
|
||||||
}
|
|
||||||
t.Logf("Temporal configmap %v deleted", cm)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ensureIngress(ingress *extensions.Ingress, clientSet kubernetes.Interface, t *testing.T) *extensions.Ingress {
|
func ensureIngress(ingress *extensions.Ingress, clientSet kubernetes.Interface, t *testing.T) *extensions.Ingress {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
ing, err := clientSet.ExtensionsV1beta1().Ingresses(ingress.Namespace).Update(ingress)
|
ing, err := clientSet.ExtensionsV1beta1().Ingresses(ingress.Namespace).Update(ingress)
|
||||||
|
@ -821,8 +811,6 @@ func ensureIngress(ingress *extensions.Ingress, clientSet kubernetes.Interface,
|
||||||
t.Fatalf("error updating ingress %+v: %v", ingress, err)
|
t.Fatalf("error updating ingress %+v: %v", ingress, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Logf("Ingress %+v updated", ingress)
|
|
||||||
|
|
||||||
return ing
|
return ing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue