github.com/jenkins-x/jx/v2@v2.1.155/pkg/kube/test_integration/activity_integration_test.go (about)

     1  // +build integration
     2  
     3  package test_integration_test
     4  
     5  import (
     6  	"fmt"
     7  	"testing"
     8  
     9  	jenkinsio_v1 "github.com/jenkins-x/jx-api/pkg/apis/jenkins.io/v1"
    10  	"github.com/jenkins-x/jx-api/pkg/client/clientset/versioned"
    11  	v1 "github.com/jenkins-x/jx-api/pkg/client/clientset/versioned/typed/jenkins.io/v1"
    12  	"github.com/jenkins-x/jx/v2/pkg/cmd/clients"
    13  	"github.com/jenkins-x/jx/v2/pkg/kube"
    14  	core_v1 "k8s.io/api/core/v1"
    15  	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    16  	"k8s.io/apimachinery/pkg/fields"
    17  	"k8s.io/apimachinery/pkg/labels"
    18  	"k8s.io/apimachinery/pkg/selection"
    19  	"k8s.io/apimachinery/pkg/util/rand"
    20  	"k8s.io/client-go/kubernetes"
    21  
    22  	. "github.com/onsi/ginkgo"
    23  	. "github.com/onsi/gomega"
    24  )
    25  
    26  func TestPipelineActivity(t *testing.T) {
    27  	RegisterFailHandler(Fail)
    28  	RunSpecs(t, "Pipeline Activity Integration Test Suite")
    29  }
    30  
    31  var _ = Describe("PipelineActivity", func() {
    32  
    33  	Describe("#ListSelectedPipelineActivities", func() {
    34  		var (
    35  			jxClient               versioned.Interface
    36  			pipelineActivityClient v1.PipelineActivityInterface
    37  			testPipelineActivities []jenkinsio_v1.PipelineActivity
    38  			kubeClient             kubernetes.Interface
    39  			testNamespace          string
    40  			err                    error
    41  		)
    42  
    43  		BeforeSuite(func() {
    44  			By("Creating JX and Kube Client")
    45  			factory := clients.NewFactory()
    46  			jxClient, _, err = factory.CreateJXClient()
    47  			Expect(err).Should(BeNil())
    48  
    49  			kubeClient, _, err = factory.CreateKubeClient()
    50  			Expect(err).Should(BeNil())
    51  
    52  			testNamespace = "activity-integration-test-" + rand.String(5)
    53  			By(fmt.Sprintf("Creating test namespace %s", testNamespace))
    54  
    55  			err = createNamespace(kubeClient, testNamespace)
    56  			Expect(err).Should(BeNil())
    57  		})
    58  
    59  		BeforeEach(func() {
    60  			pipelineActivityClient = jxClient.JenkinsV1().PipelineActivities(testNamespace)
    61  			Expect(err).Should(BeNil())
    62  		})
    63  
    64  		AfterSuite(func() {
    65  			By(fmt.Sprintf("Deleting test namespace %s", testNamespace))
    66  			err = deleteNamespace(kubeClient, testNamespace)
    67  			Expect(err).Should(BeNil())
    68  		})
    69  
    70  		Context("w/o PipelineActivity instances", func() {
    71  			It("should return the empty list with nil selectors", func() {
    72  				paList, err := kube.ListSelectedPipelineActivities(pipelineActivityClient, nil, nil)
    73  				Expect(err).Should(BeNil())
    74  
    75  				Expect(paList).ShouldNot(BeNil())
    76  				Expect(len(paList.Items)).Should(Equal(0))
    77  			})
    78  
    79  			It("should return the empty list with any selectors", func() {
    80  				labelSelector := labels.Everything()
    81  				fieldSelector := fields.OneTermEqualSelector("foo", "bar")
    82  				paList, err := kube.ListSelectedPipelineActivities(pipelineActivityClient, labelSelector, fieldSelector)
    83  				Expect(err).Should(BeNil())
    84  
    85  				Expect(paList).ShouldNot(BeNil())
    86  				Expect(len(paList.Items)).Should(Equal(0))
    87  			})
    88  		})
    89  
    90  		Context("w/ PipelineActivity instances", func() {
    91  			BeforeEach(func() {
    92  				if testPipelineActivities == nil {
    93  					By("Creating test PipelineActivities")
    94  					testPipelineActivities, err = createTestPipelineActivities(pipelineActivityClient)
    95  					Expect(err).Should(BeNil())
    96  				}
    97  			})
    98  
    99  			It("list w/o selectors should return all PipelineActivity instances", func() {
   100  				paList, err := kube.ListSelectedPipelineActivities(pipelineActivityClient, nil, nil)
   101  				Expect(err).Should(BeNil())
   102  
   103  				Expect(paList).ShouldNot(BeNil())
   104  				Expect(len(paList.Items)).Should(Equal(len(testPipelineActivities)))
   105  			})
   106  
   107  			It("list w/ label selectors should return PipelineActivity instances with matching label", func() {
   108  				requirement, err := labels.NewRequirement("gitBranch", selection.Equals, []string{"foo"})
   109  				labelSelector := labels.NewSelector().Add(*requirement)
   110  				paList, err := kube.ListSelectedPipelineActivities(pipelineActivityClient, labelSelector, nil)
   111  				Expect(err).Should(BeNil())
   112  
   113  				Expect(paList).ShouldNot(BeNil())
   114  				Expect(len(paList.Items)).Should(Equal(0))
   115  
   116  				requirement, err = labels.NewRequirement("branch", selection.Equals, []string{"branch-0"})
   117  				labelSelector = labels.NewSelector().Add(*requirement)
   118  				paList, err = kube.ListSelectedPipelineActivities(pipelineActivityClient, labelSelector, nil)
   119  				Expect(err).Should(BeNil())
   120  
   121  				Expect(paList).ShouldNot(BeNil())
   122  				Expect(len(paList.Items)).Should(Equal(1))
   123  				Expect(paList.Items[0].Spec).Should(Equal(testPipelineActivities[0].Spec))
   124  			})
   125  
   126  			It("list w/ field selectors should return PipelineActivity instances with matching fields", func() {
   127  				fieldSelector := fields.OneTermEqualSelector("gitOwner", "foo")
   128  				paList, err := kube.ListSelectedPipelineActivities(pipelineActivityClient, nil, fieldSelector)
   129  				Expect(err).Should(BeNil())
   130  
   131  				Expect(paList).ShouldNot(BeNil())
   132  				Expect(len(paList.Items)).Should(Equal(0))
   133  
   134  				fieldSelector = fields.OneTermEqualSelector("spec.gitOwner", "johndoe-0")
   135  				paList, err = kube.ListSelectedPipelineActivities(pipelineActivityClient, nil, fieldSelector)
   136  				Expect(err).Should(BeNil())
   137  
   138  				Expect(paList).ShouldNot(BeNil())
   139  				Expect(len(paList.Items)).Should(Equal(1))
   140  				Expect(paList.Items[0].Spec).Should(Equal(testPipelineActivities[0].Spec))
   141  
   142  				gitOwnerSelector := fields.OneTermEqualSelector("spec.gitOwner", "johndoe-0")
   143  				gitRepoSelector := fields.OneTermEqualSelector("spec.gitRepository", "foo-0")
   144  				fieldSelector = fields.AndSelectors(gitOwnerSelector, gitRepoSelector)
   145  				paList, err = kube.ListSelectedPipelineActivities(pipelineActivityClient, nil, fieldSelector)
   146  				Expect(err).Should(BeNil())
   147  
   148  				Expect(paList).ShouldNot(BeNil())
   149  				Expect(len(paList.Items)).Should(Equal(1))
   150  				Expect(paList.Items[0].Spec).Should(Equal(testPipelineActivities[0].Spec))
   151  			})
   152  
   153  			It("list w/ multiple field selectors should return PipelineActivity instances with matching fields", func() {
   154  				gitOwnerSelector := fields.OneTermEqualSelector("spec.gitOwner", "johndoe-0")
   155  				gitRepoSelector := fields.OneTermEqualSelector("spec.gitRepository", "bar")
   156  				fieldSelector := fields.AndSelectors(gitOwnerSelector, gitRepoSelector)
   157  				paList, err := kube.ListSelectedPipelineActivities(pipelineActivityClient, nil, fieldSelector)
   158  				Expect(err).Should(BeNil())
   159  
   160  				Expect(paList).ShouldNot(BeNil())
   161  				Expect(len(paList.Items)).Should(Equal(0))
   162  
   163  				gitOwnerSelector = fields.OneTermEqualSelector("spec.gitOwner", "johndoe-0")
   164  				gitRepoSelector = fields.OneTermEqualSelector("spec.gitRepository", "foo-0")
   165  				fieldSelector = fields.AndSelectors(gitOwnerSelector, gitRepoSelector)
   166  				paList, err = kube.ListSelectedPipelineActivities(pipelineActivityClient, nil, fieldSelector)
   167  				Expect(err).Should(BeNil())
   168  
   169  				Expect(paList).ShouldNot(BeNil())
   170  				Expect(len(paList.Items)).Should(Equal(1))
   171  				Expect(paList.Items[0].Spec).Should(Equal(testPipelineActivities[0].Spec))
   172  			})
   173  
   174  			It("list w/ field and label selectors should return matching PipelineActivity instances", func() {
   175  				requirement, err := labels.NewRequirement("branch", selection.Equals, []string{"branch-5"})
   176  				labelSelector := labels.NewSelector().Add(*requirement)
   177  
   178  				fieldSelector := fields.OneTermEqualSelector("spec.gitRepository", "foo-5")
   179  				paList, err := kube.ListSelectedPipelineActivities(pipelineActivityClient, labelSelector, fieldSelector)
   180  				Expect(err).Should(BeNil())
   181  
   182  				Expect(paList).ShouldNot(BeNil())
   183  				Expect(len(paList.Items)).Should(Equal(2))
   184  			})
   185  		})
   186  	})
   187  })
   188  
   189  func createNamespace(client kubernetes.Interface, ns string) error {
   190  	namespace := core_v1.Namespace{
   191  		ObjectMeta: meta_v1.ObjectMeta{
   192  			Name: ns,
   193  		},
   194  	}
   195  	_, err := client.CoreV1().Namespaces().Create(&namespace)
   196  	return err
   197  }
   198  
   199  func deleteNamespace(client kubernetes.Interface, ns string) error {
   200  	return client.CoreV1().Namespaces().Delete(ns, &meta_v1.DeleteOptions{})
   201  }
   202  
   203  func createTestPipelineActivities(client v1.PipelineActivityInterface) ([]jenkinsio_v1.PipelineActivity, error) {
   204  	var pipelineActivities []jenkinsio_v1.PipelineActivity
   205  	var clone jenkinsio_v1.PipelineActivity
   206  
   207  	for i := 0; i < 10; i++ {
   208  		pa := jenkinsio_v1.PipelineActivity{
   209  			ObjectMeta: meta_v1.ObjectMeta{
   210  				Name: fmt.Sprintf("pa-%d", i),
   211  				Labels: map[string]string{
   212  					"lastCommitSHA": fmt.Sprintf("%d", i),
   213  					"branch":        fmt.Sprintf("branch-%d", i),
   214  				},
   215  			},
   216  			Spec: jenkinsio_v1.PipelineActivitySpec{
   217  				GitOwner:      fmt.Sprintf("johndoe-%d", i),
   218  				GitRepository: fmt.Sprintf("foo-%d", i),
   219  				LastCommitSHA: fmt.Sprintf("%d", i),
   220  				GitBranch:     fmt.Sprintf("branch-%d", i),
   221  			},
   222  		}
   223  
   224  		if i == 5 {
   225  			clone = *pa.DeepCopy()
   226  			clone.Name = clone.Name + "-clone"
   227  			created, err := client.Create(&clone)
   228  			if err != nil {
   229  				return nil, err
   230  			}
   231  			pipelineActivities = append(pipelineActivities, *created)
   232  		}
   233  
   234  		created, err := client.Create(&pa)
   235  		if err != nil {
   236  			return nil, err
   237  		}
   238  		pipelineActivities = append(pipelineActivities, *created)
   239  	}
   240  
   241  	return pipelineActivities, nil
   242  }