github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/test/e2e/generate_kube_test.go (about)

     1  // +build !remoteclient
     2  
     3  package integration
     4  
     5  import (
     6  	"os"
     7  	"path/filepath"
     8  
     9  	. "github.com/containers/libpod/test/utils"
    10  	"github.com/ghodss/yaml"
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  	v1 "k8s.io/api/core/v1"
    14  )
    15  
    16  var _ = Describe("Podman generate kube", func() {
    17  	var (
    18  		tempdir    string
    19  		err        error
    20  		podmanTest *PodmanTestIntegration
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		tempdir, err = CreateTempDirInTempDir()
    25  		if err != nil {
    26  			os.Exit(1)
    27  		}
    28  		podmanTest = PodmanTestCreate(tempdir)
    29  		podmanTest.Setup()
    30  		podmanTest.SeedImages()
    31  	})
    32  
    33  	AfterEach(func() {
    34  		podmanTest.Cleanup()
    35  		f := CurrentGinkgoTestDescription()
    36  		processTestResult(f)
    37  
    38  	})
    39  
    40  	It("podman generate pod kube on bogus object", func() {
    41  		session := podmanTest.Podman([]string{"generate", "kube", "foobar"})
    42  		session.WaitWithDefaultTimeout()
    43  		Expect(session).To(ExitWithError())
    44  	})
    45  
    46  	It("podman generate service kube on bogus object", func() {
    47  		session := podmanTest.Podman([]string{"generate", "kube", "-s", "foobar"})
    48  		session.WaitWithDefaultTimeout()
    49  		Expect(session).To(ExitWithError())
    50  	})
    51  
    52  	It("podman generate kube on container", func() {
    53  		session := podmanTest.RunTopContainer("top")
    54  		session.WaitWithDefaultTimeout()
    55  		Expect(session.ExitCode()).To(Equal(0))
    56  
    57  		kube := podmanTest.Podman([]string{"generate", "kube", "top"})
    58  		kube.WaitWithDefaultTimeout()
    59  		Expect(kube.ExitCode()).To(Equal(0))
    60  
    61  		pod := new(v1.Pod)
    62  		err := yaml.Unmarshal(kube.Out.Contents(), pod)
    63  		Expect(err).To(BeNil())
    64  
    65  		numContainers := 0
    66  		for range pod.Spec.Containers {
    67  			numContainers = numContainers + 1
    68  		}
    69  		Expect(numContainers).To(Equal(1))
    70  	})
    71  
    72  	It("podman generate service kube on container with --security-opt level", func() {
    73  		session := podmanTest.Podman([]string{"create", "--name", "test", "--security-opt", "label=level:s0:c100,c200", "alpine"})
    74  		session.WaitWithDefaultTimeout()
    75  		Expect(session.ExitCode()).To(Equal(0))
    76  
    77  		kube := podmanTest.Podman([]string{"generate", "kube", "test"})
    78  		kube.WaitWithDefaultTimeout()
    79  		Expect(kube.ExitCode()).To(Equal(0))
    80  
    81  		pod := new(v1.Pod)
    82  		err := yaml.Unmarshal(kube.Out.Contents(), pod)
    83  		Expect(err).To(BeNil())
    84  		Expect(kube.OutputToString()).To(ContainSubstring("level: s0:c100,c200"))
    85  	})
    86  
    87  	It("podman generate service kube on container with --security-opt disable", func() {
    88  		session := podmanTest.Podman([]string{"create", "--name", "test-disable", "--security-opt", "label=disable", "alpine"})
    89  		session.WaitWithDefaultTimeout()
    90  		Expect(session.ExitCode()).To(Equal(0))
    91  
    92  		kube := podmanTest.Podman([]string{"generate", "kube", "test-disable"})
    93  		kube.WaitWithDefaultTimeout()
    94  		Expect(kube.ExitCode()).To(Equal(0))
    95  
    96  		pod := new(v1.Pod)
    97  		err = yaml.Unmarshal(kube.Out.Contents(), pod)
    98  		Expect(err).To(BeNil())
    99  		Expect(kube.OutputToString()).To(ContainSubstring("type: spc_t"))
   100  	})
   101  
   102  	It("podman generate service kube on container with --security-opt type", func() {
   103  		session := podmanTest.Podman([]string{"create", "--name", "test", "--security-opt", "label=type:foo_bar_t", "alpine"})
   104  		session.WaitWithDefaultTimeout()
   105  		Expect(session.ExitCode()).To(Equal(0))
   106  
   107  		kube := podmanTest.Podman([]string{"generate", "kube", "test"})
   108  		kube.WaitWithDefaultTimeout()
   109  		Expect(kube.ExitCode()).To(Equal(0))
   110  
   111  		pod := new(v1.Pod)
   112  		err = yaml.Unmarshal(kube.Out.Contents(), pod)
   113  		Expect(err).To(BeNil())
   114  		Expect(kube.OutputToString()).To(ContainSubstring("type: foo_bar_t"))
   115  	})
   116  
   117  	It("podman generate service kube on container", func() {
   118  		session := podmanTest.RunTopContainer("top")
   119  		session.WaitWithDefaultTimeout()
   120  		Expect(session.ExitCode()).To(Equal(0))
   121  
   122  		kube := podmanTest.Podman([]string{"generate", "kube", "-s", "top"})
   123  		kube.WaitWithDefaultTimeout()
   124  		Expect(kube.ExitCode()).To(Equal(0))
   125  
   126  		// TODO - test generated YAML - service produces multiple
   127  		// structs.
   128  		// pod := new(v1.Pod)
   129  		// err := yaml.Unmarshal([]byte(kube.OutputToString()), pod)
   130  		// Expect(err).To(BeNil())
   131  	})
   132  
   133  	It("podman generate kube on pod", func() {
   134  		_, rc, _ := podmanTest.CreatePod("toppod")
   135  		Expect(rc).To(Equal(0))
   136  
   137  		session := podmanTest.RunTopContainerInPod("topcontainer", "toppod")
   138  		session.WaitWithDefaultTimeout()
   139  		Expect(session.ExitCode()).To(Equal(0))
   140  
   141  		kube := podmanTest.Podman([]string{"generate", "kube", "toppod"})
   142  		kube.WaitWithDefaultTimeout()
   143  		Expect(kube.ExitCode()).To(Equal(0))
   144  
   145  		pod := new(v1.Pod)
   146  		err := yaml.Unmarshal(kube.Out.Contents(), pod)
   147  		Expect(err).To(BeNil())
   148  
   149  		numContainers := 0
   150  		for range pod.Spec.Containers {
   151  			numContainers = numContainers + 1
   152  		}
   153  		Expect(numContainers).To(Equal(1))
   154  	})
   155  
   156  	It("podman generate service kube on pod", func() {
   157  		_, rc, _ := podmanTest.CreatePod("toppod")
   158  		Expect(rc).To(Equal(0))
   159  
   160  		session := podmanTest.RunTopContainerInPod("topcontainer", "toppod")
   161  		session.WaitWithDefaultTimeout()
   162  		Expect(session.ExitCode()).To(Equal(0))
   163  
   164  		kube := podmanTest.Podman([]string{"generate", "kube", "-s", "toppod"})
   165  		kube.WaitWithDefaultTimeout()
   166  		Expect(kube.ExitCode()).To(Equal(0))
   167  
   168  		// TODO: How do we test unmarshal with a service? We have two
   169  		// structs that need to be unmarshalled...
   170  		// _, err := yaml.Marshal(kube.OutputToString())
   171  		// Expect(err).To(BeNil())
   172  	})
   173  
   174  	It("podman generate kube on pod with ports", func() {
   175  		podName := "test"
   176  		podSession := podmanTest.Podman([]string{"pod", "create", "--name", podName, "-p", "4000:4000", "-p", "5000:5000"})
   177  		podSession.WaitWithDefaultTimeout()
   178  		Expect(podSession.ExitCode()).To(Equal(0))
   179  
   180  		ctr1Name := "ctr1"
   181  		ctr1Session := podmanTest.Podman([]string{"create", "--name", ctr1Name, "--pod", podName, ALPINE, "top"})
   182  		ctr1Session.WaitWithDefaultTimeout()
   183  		Expect(ctr1Session.ExitCode()).To(Equal(0))
   184  
   185  		ctr2Name := "ctr2"
   186  		ctr2Session := podmanTest.Podman([]string{"create", "--name", ctr2Name, "--pod", podName, ALPINE, "top"})
   187  		ctr2Session.WaitWithDefaultTimeout()
   188  		Expect(ctr2Session.ExitCode()).To(Equal(0))
   189  
   190  		kube := podmanTest.Podman([]string{"generate", "kube", podName})
   191  		kube.WaitWithDefaultTimeout()
   192  		Expect(kube.ExitCode()).To(Equal(0))
   193  
   194  		pod := new(v1.Pod)
   195  		err := yaml.Unmarshal(kube.Out.Contents(), pod)
   196  		Expect(err).To(BeNil())
   197  
   198  		foundPort4000 := 0
   199  		foundPort5000 := 0
   200  		foundOtherPort := 0
   201  		for _, ctr := range pod.Spec.Containers {
   202  			for _, port := range ctr.Ports {
   203  				if port.HostPort == 4000 {
   204  					foundPort4000 = foundPort4000 + 1
   205  				} else if port.HostPort == 5000 {
   206  					foundPort5000 = foundPort5000 + 1
   207  				} else {
   208  					foundOtherPort = foundOtherPort + 1
   209  				}
   210  			}
   211  		}
   212  		Expect(foundPort4000).To(Equal(1))
   213  		Expect(foundPort5000).To(Equal(1))
   214  		Expect(foundOtherPort).To(Equal(0))
   215  	})
   216  
   217  	It("podman generate and reimport kube on pod", func() {
   218  		podName := "toppod"
   219  		_, rc, _ := podmanTest.CreatePod(podName)
   220  		Expect(rc).To(Equal(0))
   221  
   222  		session := podmanTest.Podman([]string{"create", "--pod", podName, "--name", "test1", ALPINE, "top"})
   223  		session.WaitWithDefaultTimeout()
   224  		Expect(session.ExitCode()).To(Equal(0))
   225  
   226  		session2 := podmanTest.Podman([]string{"create", "--pod", podName, "--name", "test2", ALPINE, "top"})
   227  		session2.WaitWithDefaultTimeout()
   228  		Expect(session2.ExitCode()).To(Equal(0))
   229  
   230  		outputFile := filepath.Join(podmanTest.RunRoot, "pod.yaml")
   231  		kube := podmanTest.Podman([]string{"generate", "kube", "-f", outputFile, podName})
   232  		kube.WaitWithDefaultTimeout()
   233  		Expect(kube.ExitCode()).To(Equal(0))
   234  
   235  		session3 := podmanTest.Podman([]string{"pod", "rm", "-af"})
   236  		session3.WaitWithDefaultTimeout()
   237  		Expect(session3.ExitCode()).To(Equal(0))
   238  
   239  		session4 := podmanTest.Podman([]string{"play", "kube", outputFile})
   240  		session4.WaitWithDefaultTimeout()
   241  		Expect(session4.ExitCode()).To(Equal(0))
   242  
   243  		session5 := podmanTest.Podman([]string{"pod", "ps"})
   244  		session5.WaitWithDefaultTimeout()
   245  		Expect(session5.ExitCode()).To(Equal(0))
   246  		Expect(session5.OutputToString()).To(ContainSubstring(podName))
   247  
   248  		session6 := podmanTest.Podman([]string{"ps", "-a"})
   249  		session6.WaitWithDefaultTimeout()
   250  		Expect(session6.ExitCode()).To(Equal(0))
   251  		psOut := session6.OutputToString()
   252  		Expect(psOut).To(ContainSubstring("test1"))
   253  		Expect(psOut).To(ContainSubstring("test2"))
   254  	})
   255  
   256  	It("podman generate with user and reimport kube on pod", func() {
   257  		podName := "toppod"
   258  		_, rc, _ := podmanTest.CreatePod(podName)
   259  		Expect(rc).To(Equal(0))
   260  
   261  		session := podmanTest.Podman([]string{"create", "--pod", podName, "--name", "test1", "--user", "100:200", ALPINE, "top"})
   262  		session.WaitWithDefaultTimeout()
   263  		Expect(session.ExitCode()).To(Equal(0))
   264  
   265  		inspect := podmanTest.Podman([]string{"inspect", "--format", "{{.Config.User}}", "test1"})
   266  		inspect.WaitWithDefaultTimeout()
   267  		Expect(inspect.ExitCode()).To(Equal(0))
   268  		Expect(inspect.OutputToString()).To(ContainSubstring("100:200"))
   269  
   270  		outputFile := filepath.Join(podmanTest.RunRoot, "pod.yaml")
   271  		kube := podmanTest.Podman([]string{"generate", "kube", "-f", outputFile, podName})
   272  		kube.WaitWithDefaultTimeout()
   273  		Expect(kube.ExitCode()).To(Equal(0))
   274  
   275  		session = podmanTest.Podman([]string{"pod", "rm", "-af"})
   276  		session.WaitWithDefaultTimeout()
   277  		Expect(session.ExitCode()).To(Equal(0))
   278  
   279  		session = podmanTest.Podman([]string{"play", "kube", outputFile})
   280  		session.WaitWithDefaultTimeout()
   281  		Expect(session.ExitCode()).To(Equal(0))
   282  
   283  		inspect1 := podmanTest.Podman([]string{"inspect", "--format", "{{.Config.User}}", "test1"})
   284  		inspect1.WaitWithDefaultTimeout()
   285  		Expect(inspect1.ExitCode()).To(Equal(0))
   286  		Expect(inspect1.OutputToString()).To(ContainSubstring(inspect.OutputToString()))
   287  	})
   288  
   289  	It("podman generate kube with volume", func() {
   290  		vol1 := filepath.Join(podmanTest.TempDir, "vol-test1")
   291  		err := os.MkdirAll(vol1, 0755)
   292  		Expect(err).To(BeNil())
   293  
   294  		// we need a container name because IDs don't persist after rm/play
   295  		ctrName := "test-ctr"
   296  
   297  		session1 := podmanTest.Podman([]string{"run", "-d", "--pod", "new:test1", "--name", ctrName, "-v", vol1 + ":/volume/:z", "alpine", "top"})
   298  		session1.WaitWithDefaultTimeout()
   299  		Expect(session1.ExitCode()).To(Equal(0))
   300  
   301  		outputFile := filepath.Join(podmanTest.RunRoot, "pod.yaml")
   302  		kube := podmanTest.Podman([]string{"generate", "kube", "test1", "-f", outputFile})
   303  		kube.WaitWithDefaultTimeout()
   304  		Expect(kube.ExitCode()).To(Equal(0))
   305  
   306  		rm := podmanTest.Podman([]string{"pod", "rm", "-f", "test1"})
   307  		rm.WaitWithDefaultTimeout()
   308  		Expect(rm.ExitCode()).To(Equal(0))
   309  
   310  		play := podmanTest.Podman([]string{"play", "kube", outputFile})
   311  		play.WaitWithDefaultTimeout()
   312  		Expect(play.ExitCode()).To(Equal(0))
   313  
   314  		inspect := podmanTest.Podman([]string{"inspect", ctrName})
   315  		inspect.WaitWithDefaultTimeout()
   316  		Expect(inspect.ExitCode()).To(Equal(0))
   317  		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
   318  	})
   319  })