/*
Copyright 2014 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package node

import (
	"context"
	"strconv"
	"time"

	v1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/fields"
	"k8s.io/apimachinery/pkg/labels"
	"k8s.io/apimachinery/pkg/util/uuid"
	"k8s.io/apimachinery/pkg/util/wait"
	"k8s.io/kubernetes/test/e2e/framework"
	e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
	admissionapi "k8s.io/pod-security-admission/api"

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

var _ = SIGDescribe("Events", func() {
	f := framework.NewDefaultFramework("events")
	f.NamespacePodSecurityLevel = admissionapi.LevelBaseline

	ginkgo.It("should be sent by kubelets and the scheduler about pods scheduling and running ", func(ctx context.Context) {

		podClient := f.ClientSet.CoreV1().Pods(f.Namespace.Name)

		ginkgo.By("creating the pod")
		name := "send-events-" + string(uuid.NewUUID())
		value := strconv.Itoa(time.Now().Nanosecond())
		pod := &v1.Pod{
			ObjectMeta: metav1.ObjectMeta{
				Name: name,
				Labels: map[string]string{
					"name": "foo",
					"time": value,
				},
			},
			Spec: v1.PodSpec{
				Containers: []v1.Container{
					{
						Name:  "p",
						Image: framework.ServeHostnameImage,
						Args:  []string{"serve-hostname"},
						Ports: []v1.ContainerPort{{ContainerPort: 80}},
					},
				},
			},
		}

		ginkgo.By("submitting the pod to kubernetes")
		ginkgo.DeferCleanup(func(ctx context.Context) error {
			ginkgo.By("deleting the pod")
			return podClient.Delete(ctx, pod.Name, metav1.DeleteOptions{})
		})
		if _, err := podClient.Create(ctx, pod, metav1.CreateOptions{}); err != nil {
			framework.Failf("Failed to create pod: %v", err)
		}

		framework.ExpectNoError(e2epod.WaitForPodNameRunningInNamespace(ctx, f.ClientSet, pod.Name, f.Namespace.Name))

		ginkgo.By("verifying the pod is in kubernetes")
		selector := labels.SelectorFromSet(labels.Set(map[string]string{"time": value}))
		options := metav1.ListOptions{LabelSelector: selector.String()}
		pods, err := podClient.List(ctx, options)
		framework.ExpectNoError(err)
		gomega.Expect(pods.Items).To(gomega.HaveLen(1))

		ginkgo.By("retrieving the pod")
		podWithUID, err := podClient.Get(ctx, pod.Name, metav1.GetOptions{})
		if err != nil {
			framework.Failf("Failed to get pod: %v", err)
		}
		framework.Logf("%+v\n", podWithUID)
		var events *v1.EventList
		// Check for scheduler event about the pod.
		ginkgo.By("checking for scheduler event about the pod")
		framework.ExpectNoError(wait.Poll(framework.Poll, 5*time.Minute, func() (bool, error) {
			selector := fields.Set{
				"involvedObject.kind":      "Pod",
				"involvedObject.uid":       string(podWithUID.UID),
				"involvedObject.namespace": f.Namespace.Name,
				"source":                   v1.DefaultSchedulerName,
			}.AsSelector().String()
			options := metav1.ListOptions{FieldSelector: selector}
			events, err := f.ClientSet.CoreV1().Events(f.Namespace.Name).List(ctx, options)
			if err != nil {
				return false, err
			}
			if len(events.Items) > 0 {
				framework.Logf("Saw scheduler event for our pod.")
				return true, nil
			}
			return false, nil
		}))
		// Check for kubelet event about the pod.
		ginkgo.By("checking for kubelet event about the pod")
		framework.ExpectNoError(wait.Poll(framework.Poll, 5*time.Minute, func() (bool, error) {
			selector := fields.Set{
				"involvedObject.uid":       string(podWithUID.UID),
				"involvedObject.kind":      "Pod",
				"involvedObject.namespace": f.Namespace.Name,
				"source":                   "kubelet",
			}.AsSelector().String()
			options := metav1.ListOptions{FieldSelector: selector}
			events, err = f.ClientSet.CoreV1().Events(f.Namespace.Name).List(ctx, options)
			if err != nil {
				return false, err
			}
			if len(events.Items) > 0 {
				framework.Logf("Saw kubelet event for our pod.")
				return true, nil
			}
			return false, nil
		}))
	})
})
