Skip to content

Commit

Permalink
Merge pull request #146 from timuthy/feature.pvc-events
Browse files Browse the repository at this point in the history
Read PVC warning events
  • Loading branch information
shreyas-s-rao committed Mar 12, 2021
2 parents b208bc6 + a4369b9 commit 3b9cd9a
Show file tree
Hide file tree
Showing 44 changed files with 4,657 additions and 99 deletions.
214 changes: 134 additions & 80 deletions controllers/etcd_controller.go

Large diffs are not rendered by default.

104 changes: 90 additions & 14 deletions controllers/etcd_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@ import (

"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

"github.com/gardener/etcd-druid/pkg/common"
"github.com/gardener/gardener/pkg/utils/imagevector"
"github.com/gardener/gardener/pkg/utils/test/matchers"
"github.com/ghodss/yaml"

druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1"
"github.com/gardener/etcd-druid/pkg/common"
"github.com/gardener/etcd-druid/pkg/utils"
"github.com/gardener/gardener/pkg/utils/kubernetes/health"
. "github.com/onsi/ginkgo"
Expand Down Expand Up @@ -141,9 +142,13 @@ func cmdIterator(element interface{}) string {
var _ = Describe("Druid", func() {
//Reconciliation of new etcd resource deployment without any existing statefulsets.
Context("when adding etcd resources", func() {
var err error
var instance *druidv1alpha1.Etcd
var c client.Client
var (
err error
instance *druidv1alpha1.Etcd
sts *appsv1.StatefulSet
svc *corev1.Service
c client.Client
)

BeforeEach(func() {
instance = getEtcd("foo1", "default", false)
Expand All @@ -159,18 +164,93 @@ var _ = Describe("Druid", func() {
storeSecret := instance.Spec.Backup.Store.SecretRef.Name
errors := createSecrets(c, instance.Namespace, storeSecret)
Expect(len(errors)).Should(BeZero())
Expect(c.Create(context.TODO(), instance)).To(Succeed())

sts = &appsv1.StatefulSet{}
// Wait until StatefulSet has been created by controller
Eventually(func() error {
return c.Get(context.TODO(), types.NamespacedName{
Name: instance.Name,
Namespace: instance.Namespace,
}, sts)
}, timeout, pollingInterval).Should(BeNil())

svc = &corev1.Service{}
// Wait until Service has been created by controller
Eventually(func() error {
return c.Get(context.TODO(), types.NamespacedName{
Name: fmt.Sprintf("%s-client", instance.Name),
Namespace: instance.Namespace,
}, svc)
}, timeout, pollingInterval).Should(BeNil())
})
It("should create and adopt statefulset", func() {
defer WithWd("..")()
Expect(c.Create(context.TODO(), instance)).To(Succeed())
ss := appsv1.StatefulSet{}
Eventually(func() error { return statefulsetIsCorrectlyReconciled(c, instance, &ss) }, timeout, pollingInterval).Should(BeNil())
setStatefulSetReady(&ss)
err = c.Status().Update(context.TODO(), &ss)
setStatefulSetReady(sts)
err = c.Status().Update(context.TODO(), sts)
Eventually(func() error { return statefulsetIsCorrectlyReconciled(c, instance, sts) }, timeout, pollingInterval).Should(BeNil())
Expect(err).NotTo(HaveOccurred())
})
It("should create and adopt statefulset and printing events", func() {
// Check StatefulSet requirements
Expect(len(sts.Spec.VolumeClaimTemplates)).To(Equal(1))
Expect(sts.Spec.Replicas).To(PointTo(Equal(int32(1))))

// Create PVC
pvc := &corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf("%s-%s-%d", sts.Spec.VolumeClaimTemplates[0].Name, sts.Name, 0),
Namespace: sts.Namespace,
},
Spec: corev1.PersistentVolumeClaimSpec{
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: resource.MustParse("1Gi"),
},
},
},
}
Expect(c.Create(context.TODO(), pvc)).To(Succeed())

// Create PVC warning Event
pvcMessage := "Failed to provision volume"
Expect(c.Create(context.TODO(), &corev1.Event{
ObjectMeta: metav1.ObjectMeta{
Name: "pvc-event-1",
Namespace: pvc.Namespace,
},
InvolvedObject: corev1.ObjectReference{
APIVersion: "v1",
Kind: "PersistentVolumeClaim",
Name: pvc.Name,
Namespace: pvc.Namespace,
},
Type: corev1.EventTypeWarning,
Message: pvcMessage,
})).To(Succeed())

// Eventually, warning message should be reflected in `etcd` object status.
Eventually(func() string {
if err := c.Get(context.TODO(), client.ObjectKeyFromObject(instance), instance); err != nil {
return ""
}
if instance.Status.LastError == nil {
return ""
}
return *instance.Status.LastError
}, timeout, pollingInterval).Should(ContainSubstring(pvcMessage))
})
AfterEach(func() {
// Delete `etcd` instance
Expect(c.Delete(context.TODO(), instance)).To(Succeed())
Eventually(func() error {
return c.Get(context.TODO(), client.ObjectKeyFromObject(instance), &druidv1alpha1.Etcd{})
}, timeout, pollingInterval).Should(matchers.BeNotFoundError())
// Delete service manually because garbage collection is not available in `envtest`
Expect(c.Delete(context.TODO(), svc)).To(Succeed())
Eventually(func() error {
return c.Get(context.TODO(), client.ObjectKeyFromObject(svc), &corev1.Service{})
}, timeout, pollingInterval).Should(matchers.BeNotFoundError())
})
})

Expand Down Expand Up @@ -203,7 +283,6 @@ var _ = Describe("Druid", func() {
Expect(c.Create(context.TODO(), sts)).To(Succeed())

// Create StatefulSet
defer WithWd("..")()
Expect(c.Create(context.TODO(), instance)).To(Succeed())

// Update OwnerRef with UID from just created `etcd` instance
Expand Down Expand Up @@ -271,7 +350,6 @@ var _ = Describe("Druid", func() {

})
It("should restart pod", func() {
defer WithWd("..")()
Expect(c.Create(context.TODO(), instance)).To(Succeed())
Eventually(func() error { return podDeleted(c, instance) }, timeout, pollingInterval).Should(BeNil())
})
Expand Down Expand Up @@ -315,7 +393,6 @@ var _ = Describe("Druid", func() {
Expect(c.Create(context.TODO(), sts)).To(Succeed())

// Create StatefulSet
defer WithWd("..")()
Expect(c.Create(context.TODO(), instance)).To(Succeed())

// Update OwnerRef with UID from just created `etcd` instance
Expand Down Expand Up @@ -370,7 +447,6 @@ var _ = Describe("Druid", func() {
var cm *corev1.ConfigMap
var svc *corev1.Service

defer WithWd("..")()
instance = generateEtcd(name, "default")
c = mgr.GetClient()
ns := corev1.Namespace{
Expand Down
19 changes: 14 additions & 5 deletions controllers/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import (
"testing"
"time"

"github.com/gardener/gardener/extensions/pkg/util/test"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"

Expand Down Expand Up @@ -53,6 +55,8 @@ var (
mgr manager.Manager
mgrStopped *sync.WaitGroup

revertFns []func()

testLog = ctrl.Log.WithName("test")
)

Expand Down Expand Up @@ -88,17 +92,19 @@ var _ = BeforeSuite(func(done Done) {
Expect(err).ToNot(HaveOccurred())
Expect(k8sClient).ToNot(BeNil())

revertFns = []func(){
test.WithVar(&DefaultTimeout, 20*time.Second),
WithWd(".."),
}

Expect(cfg).ToNot(BeNil())
mgr, err = manager.New(cfg, manager.Options{
MetricsBindAddress: "0",
MetricsBindAddress: "0",
ClientDisableCacheFor: UncachedObjectList,
})
Expect(err).NotTo(HaveOccurred())

Expect(cfg).ToNot(BeNil())
mgr, err = manager.New(cfg, manager.Options{})

Expect(err).NotTo(HaveOccurred())
defer WithWd("..")()
er, err := NewEtcdReconcilerWithImageVector(mgr)
Expect(err).NotTo(HaveOccurred())

Expand All @@ -114,6 +120,9 @@ var _ = AfterSuite(func() {
mgrCancel()
mgrStopped.Wait()
Expect(testEnv.Stop()).To(Succeed())
for _, f := range revertFns {
f()
}
})

func startTestManager(ctx context.Context, mgr manager.Manager) *sync.WaitGroup {
Expand Down
1 change: 1 addition & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ func main() {
ctrl.SetLogger(zap.New(zap.UseDevMode(true)))

mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
ClientDisableCacheFor: controllers.UncachedObjectList,
Scheme: scheme,
MetricsBindAddress: metricsAddr,
LeaderElection: enableLeaderElection,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 3b9cd9a

Please sign in to comment.