mirror of
https://github.com/containers/podman.git
synced 2025-06-22 09:58:10 +08:00

`podman play kube` tries to build images even if `--build` is set to false so lets honor that and make `--build` , `true` by default so it matches the original behviour. Signed-off-by: Aditya R <arajan@redhat.com>
310 lines
9.8 KiB
Go
310 lines
9.8 KiB
Go
// +build !remote
|
|
|
|
// build for play kube is not supported on remote yet.
|
|
|
|
package integration
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
|
|
. "github.com/containers/podman/v4/test/utils"
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/gomega"
|
|
. "github.com/onsi/gomega/gexec"
|
|
)
|
|
|
|
var _ = Describe("Podman play kube with build", func() {
|
|
var (
|
|
tempdir string
|
|
err error
|
|
podmanTest *PodmanTestIntegration
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
tempdir, err = CreateTempDirInTempDir()
|
|
if err != nil {
|
|
os.Exit(1)
|
|
}
|
|
podmanTest = PodmanTestCreate(tempdir)
|
|
podmanTest.Setup()
|
|
podmanTest.SeedImages()
|
|
})
|
|
|
|
AfterEach(func() {
|
|
podmanTest.Cleanup()
|
|
f := CurrentGinkgoTestDescription()
|
|
processTestResult(f)
|
|
|
|
})
|
|
|
|
var testYAML = `
|
|
apiVersion: v1
|
|
kind: Pod
|
|
metadata:
|
|
creationTimestamp: "2021-08-05T17:55:51Z"
|
|
labels:
|
|
app: foobar
|
|
name: top_pod
|
|
spec:
|
|
containers:
|
|
- command:
|
|
- top
|
|
env:
|
|
- name: PATH
|
|
value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
- name: TERM
|
|
value: xterm
|
|
- name: container
|
|
value: podman
|
|
image: foobar
|
|
name: foobar
|
|
resources: {}
|
|
securityContext:
|
|
allowPrivilegeEscalation: true
|
|
capabilities:
|
|
drop:
|
|
- CAP_MKNOD
|
|
- CAP_NET_RAW
|
|
- CAP_AUDIT_WRITE
|
|
privileged: false
|
|
readOnlyRootFilesystem: false
|
|
seLinuxOptions: {}
|
|
tty: true
|
|
workingDir: /
|
|
dnsConfig: {}
|
|
status: {}
|
|
`
|
|
|
|
var playBuildFile = `
|
|
FROM quay.io/libpod/alpine_nginx:latest
|
|
RUN apk update && apk add strace
|
|
LABEL homer=dad
|
|
COPY copyfile /copyfile
|
|
`
|
|
var prebuiltImage = `
|
|
FROM quay.io/libpod/alpine_nginx:latest
|
|
RUN apk update && apk add strace
|
|
LABEL marge=mom
|
|
`
|
|
|
|
var copyFile = `just a text file
|
|
`
|
|
|
|
It("Check that image is built using Dockerfile", func() {
|
|
// Setup
|
|
yamlDir := filepath.Join(tempdir, RandomString(12))
|
|
err := os.Mkdir(yamlDir, 0755)
|
|
Expect(err).To(BeNil(), "mkdir "+yamlDir)
|
|
err = writeYaml(testYAML, filepath.Join(yamlDir, "top.yaml"))
|
|
Expect(err).To(BeNil())
|
|
app1Dir := filepath.Join(yamlDir, "foobar")
|
|
err = os.Mkdir(app1Dir, 0755)
|
|
Expect(err).To(BeNil())
|
|
err = writeYaml(playBuildFile, filepath.Join(app1Dir, "Dockerfile"))
|
|
Expect(err).To(BeNil())
|
|
// Write a file to be copied
|
|
err = writeYaml(copyFile, filepath.Join(app1Dir, "copyfile"))
|
|
Expect(err).To(BeNil())
|
|
// Switch to temp dir and restore it afterwards
|
|
cwd, err := os.Getwd()
|
|
Expect(err).To(BeNil())
|
|
Expect(os.Chdir(yamlDir)).To(BeNil())
|
|
defer func() { (Expect(os.Chdir(cwd)).To(BeNil())) }()
|
|
|
|
session := podmanTest.Podman([]string{"play", "kube", "top.yaml"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
exists := podmanTest.Podman([]string{"image", "exists", "foobar"})
|
|
exists.WaitWithDefaultTimeout()
|
|
Expect(exists).Should(Exit(0))
|
|
|
|
inspect := podmanTest.Podman([]string{"container", "inspect", "top_pod-foobar"})
|
|
inspect.WaitWithDefaultTimeout()
|
|
Expect(inspect).Should(Exit(0))
|
|
inspectData := inspect.InspectContainerToJSON()
|
|
Expect(len(inspectData)).To(BeNumerically(">", 0))
|
|
Expect(inspectData[0].Config.Labels).To(HaveKeyWithValue("homer", "dad"))
|
|
})
|
|
|
|
It("Check that image is built using Containerfile", func() {
|
|
// Setup
|
|
yamlDir := filepath.Join(tempdir, RandomString(12))
|
|
err := os.Mkdir(yamlDir, 0755)
|
|
Expect(err).To(BeNil(), "mkdir "+yamlDir)
|
|
err = writeYaml(testYAML, filepath.Join(yamlDir, "top.yaml"))
|
|
Expect(err).To(BeNil())
|
|
app1Dir := filepath.Join(yamlDir, "foobar")
|
|
err = os.Mkdir(app1Dir, 0755)
|
|
Expect(err).To(BeNil())
|
|
err = writeYaml(playBuildFile, filepath.Join(app1Dir, "Containerfile"))
|
|
Expect(err).To(BeNil())
|
|
// Write a file to be copied
|
|
err = writeYaml(copyFile, filepath.Join(app1Dir, "copyfile"))
|
|
Expect(err).To(BeNil())
|
|
// Switch to temp dir and restore it afterwards
|
|
cwd, err := os.Getwd()
|
|
Expect(err).To(BeNil())
|
|
Expect(os.Chdir(yamlDir)).To(BeNil())
|
|
defer func() { (Expect(os.Chdir(cwd)).To(BeNil())) }()
|
|
|
|
session := podmanTest.Podman([]string{"play", "kube", "top.yaml"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
exists := podmanTest.Podman([]string{"image", "exists", "foobar"})
|
|
exists.WaitWithDefaultTimeout()
|
|
Expect(exists).Should(Exit(0))
|
|
|
|
inspect := podmanTest.Podman([]string{"container", "inspect", "top_pod-foobar"})
|
|
inspect.WaitWithDefaultTimeout()
|
|
Expect(inspect).Should(Exit(0))
|
|
inspectData := inspect.InspectContainerToJSON()
|
|
Expect(len(inspectData)).To(BeNumerically(">", 0))
|
|
Expect(inspectData[0].Config.Labels).To(HaveKeyWithValue("homer", "dad"))
|
|
})
|
|
|
|
It("Do not build image if already in the local store", func() {
|
|
// Setup
|
|
yamlDir := filepath.Join(tempdir, RandomString(12))
|
|
err := os.Mkdir(yamlDir, 0755)
|
|
Expect(err).To(BeNil(), "mkdir "+yamlDir)
|
|
err = writeYaml(testYAML, filepath.Join(yamlDir, "top.yaml"))
|
|
Expect(err).To(BeNil())
|
|
|
|
// build an image called foobar but make sure it doesn't have
|
|
// the same label as the yaml buildfile, so we can check that
|
|
// the image is NOT rebuilt.
|
|
err = writeYaml(prebuiltImage, filepath.Join(yamlDir, "Containerfile"))
|
|
Expect(err).To(BeNil())
|
|
|
|
app1Dir := filepath.Join(yamlDir, "foobar")
|
|
err = os.Mkdir(app1Dir, 0755)
|
|
Expect(err).To(BeNil())
|
|
err = writeYaml(playBuildFile, filepath.Join(app1Dir, "Containerfile"))
|
|
Expect(err).To(BeNil())
|
|
// Write a file to be copied
|
|
err = writeYaml(copyFile, filepath.Join(app1Dir, "copyfile"))
|
|
Expect(err).To(BeNil())
|
|
|
|
// Switch to temp dir and restore it afterwards
|
|
cwd, err := os.Getwd()
|
|
Expect(err).To(BeNil())
|
|
Expect(os.Chdir(yamlDir)).To(BeNil())
|
|
defer func() { (Expect(os.Chdir(cwd)).To(BeNil())) }()
|
|
|
|
// Build the image into the local store
|
|
build := podmanTest.Podman([]string{"build", "-t", "foobar", "-f", "Containerfile"})
|
|
build.WaitWithDefaultTimeout()
|
|
Expect(build).Should(Exit(0))
|
|
|
|
session := podmanTest.Podman([]string{"play", "kube", "top.yaml"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
inspect := podmanTest.Podman([]string{"container", "inspect", "top_pod-foobar"})
|
|
inspect.WaitWithDefaultTimeout()
|
|
Expect(inspect).Should(Exit(0))
|
|
inspectData := inspect.InspectContainerToJSON()
|
|
Expect(len(inspectData)).To(BeNumerically(">", 0))
|
|
Expect(inspectData[0].Config.Labels).To(Not(HaveKey("homer")))
|
|
Expect(inspectData[0].Config.Labels).To(HaveKeyWithValue("marge", "mom"))
|
|
})
|
|
|
|
It("Do not build image at all if --build=false", func() {
|
|
// Setup
|
|
yamlDir := filepath.Join(tempdir, RandomString(12))
|
|
err := os.Mkdir(yamlDir, 0755)
|
|
Expect(err).To(BeNil(), "mkdir "+yamlDir)
|
|
err = writeYaml(testYAML, filepath.Join(yamlDir, "top.yaml"))
|
|
Expect(err).To(BeNil())
|
|
|
|
// build an image called foobar but make sure it doesn't have
|
|
// the same label as the yaml buildfile, so we can check that
|
|
// the image is NOT rebuilt.
|
|
err = writeYaml(prebuiltImage, filepath.Join(yamlDir, "Containerfile"))
|
|
Expect(err).To(BeNil())
|
|
|
|
app1Dir := filepath.Join(yamlDir, "foobar")
|
|
err = os.Mkdir(app1Dir, 0755)
|
|
Expect(err).To(BeNil())
|
|
err = writeYaml(playBuildFile, filepath.Join(app1Dir, "Containerfile"))
|
|
Expect(err).To(BeNil())
|
|
// Write a file to be copied
|
|
err = writeYaml(copyFile, filepath.Join(app1Dir, "copyfile"))
|
|
Expect(err).To(BeNil())
|
|
|
|
// Switch to temp dir and restore it afterwards
|
|
cwd, err := os.Getwd()
|
|
Expect(err).To(BeNil())
|
|
Expect(os.Chdir(yamlDir)).To(BeNil())
|
|
defer func() { (Expect(os.Chdir(cwd)).To(BeNil())) }()
|
|
|
|
// Build the image into the local store
|
|
build := podmanTest.Podman([]string{"build", "-t", "foobar", "-f", "Containerfile"})
|
|
build.WaitWithDefaultTimeout()
|
|
Expect(build).Should(Exit(0))
|
|
|
|
session := podmanTest.Podman([]string{"play", "kube", "--build=false", "top.yaml"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
inspect := podmanTest.Podman([]string{"container", "inspect", "top_pod-foobar"})
|
|
inspect.WaitWithDefaultTimeout()
|
|
Expect(inspect).Should(Exit(0))
|
|
inspectData := inspect.InspectContainerToJSON()
|
|
Expect(len(inspectData)).To(BeNumerically(">", 0))
|
|
Expect(inspectData[0].Config.Labels).To(Not(HaveKey("homer")))
|
|
Expect(inspectData[0].Config.Labels).To(HaveKeyWithValue("marge", "mom"))
|
|
})
|
|
|
|
It("--build should override image in store", func() {
|
|
// Setup
|
|
yamlDir := filepath.Join(tempdir, RandomString(12))
|
|
err := os.Mkdir(yamlDir, 0755)
|
|
Expect(err).To(BeNil(), "os.Mkdir "+yamlDir)
|
|
err = writeYaml(testYAML, filepath.Join(yamlDir, "top.yaml"))
|
|
Expect(err).To(BeNil())
|
|
|
|
// build an image called foobar but make sure it doesn't have
|
|
// the same label as the yaml buildfile, so we can check that
|
|
// the image is NOT rebuilt.
|
|
err = writeYaml(prebuiltImage, filepath.Join(yamlDir, "Containerfile"))
|
|
Expect(err).To(BeNil())
|
|
|
|
app1Dir := filepath.Join(yamlDir, "foobar")
|
|
err = os.Mkdir(app1Dir, 0755)
|
|
Expect(err).To(BeNil())
|
|
err = writeYaml(playBuildFile, filepath.Join(app1Dir, "Containerfile"))
|
|
Expect(err).To(BeNil())
|
|
// Write a file to be copied
|
|
err = writeYaml(copyFile, filepath.Join(app1Dir, "copyfile"))
|
|
Expect(err).To(BeNil())
|
|
|
|
// Switch to temp dir and restore it afterwards
|
|
cwd, err := os.Getwd()
|
|
Expect(err).To(BeNil())
|
|
Expect(os.Chdir(yamlDir)).To(BeNil())
|
|
defer func() { (Expect(os.Chdir(cwd)).To(BeNil())) }()
|
|
|
|
// Build the image into the local store
|
|
build := podmanTest.Podman([]string{"build", "-t", "foobar", "-f", "Containerfile"})
|
|
build.WaitWithDefaultTimeout()
|
|
Expect(build).Should(Exit(0))
|
|
|
|
session := podmanTest.Podman([]string{"play", "kube", "--build", "top.yaml"})
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
inspect := podmanTest.Podman([]string{"container", "inspect", "top_pod-foobar"})
|
|
inspect.WaitWithDefaultTimeout()
|
|
Expect(inspect).Should(Exit(0))
|
|
inspectData := inspect.InspectContainerToJSON()
|
|
Expect(len(inspectData)).To(BeNumerically(">", 0))
|
|
Expect(inspectData[0].Config.Labels).To(HaveKeyWithValue("homer", "dad"))
|
|
Expect(inspectData[0].Config.Labels).To(Not(HaveKey("marge")))
|
|
})
|
|
|
|
})
|