mirror of
https://github.com/containers/podman.git
synced 2025-12-12 09:50:25 +08:00
add support for podman-remote image scp as well as direct access via the API. This entailed a full rework of the layering of image scp functions as well as the usual API plugging and type creation also, implemented podman image scp tagging. which makes the syntax much more readable and allows users t tag the new image they are loading to the local/remote machine: allow users to pass a "new name" for the image they are transferring `podman tag` as implemented creates a new image im `image list` when tagging, so this does the same meaning that when transferring images with tags, podman on the remote machine/user will load two images ex: `podman image scp computer1::alpine computer2::foobar` creates alpine:latest and localhost/foobar on the remote host implementing tags means removal of the flexible syntax. In the currently released podman image scp, the user can either specify `podman image scp source::img dest::` or `podman image scp dest:: source::img`. However, with tags this task becomes really hard to check which is the image (src) and which is the new tag (dst). Removal of that streamlines the arg parsing process Signed-off-by: Charlie Doern <cdoern@redhat.com>
91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
package integration
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
|
|
"github.com/containers/common/pkg/config"
|
|
. "github.com/containers/podman/v4/test/utils"
|
|
. "github.com/onsi/ginkgo"
|
|
. "github.com/onsi/gomega"
|
|
. "github.com/onsi/gomega/gexec"
|
|
)
|
|
|
|
var _ = Describe("podman image scp", func() {
|
|
ConfPath := struct {
|
|
Value string
|
|
IsSet bool
|
|
}{}
|
|
var (
|
|
tempdir string
|
|
podmanTest *PodmanTestIntegration
|
|
)
|
|
|
|
BeforeEach(func() {
|
|
ConfPath.Value, ConfPath.IsSet = os.LookupEnv("CONTAINERS_CONF")
|
|
conf, err := ioutil.TempFile("", "containersconf")
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
os.Setenv("CONTAINERS_CONF", conf.Name())
|
|
tempdir, err = CreateTempDirInTempDir()
|
|
if err != nil {
|
|
os.Exit(1)
|
|
}
|
|
podmanTest = PodmanTestCreate(tempdir)
|
|
podmanTest.Setup()
|
|
})
|
|
|
|
AfterEach(func() {
|
|
podmanTest.Cleanup()
|
|
|
|
os.Remove(os.Getenv("CONTAINERS_CONF"))
|
|
if ConfPath.IsSet {
|
|
os.Setenv("CONTAINERS_CONF", ConfPath.Value)
|
|
} else {
|
|
os.Unsetenv("CONTAINERS_CONF")
|
|
}
|
|
f := CurrentGinkgoTestDescription()
|
|
processTestResult(f)
|
|
|
|
})
|
|
|
|
It("podman image scp bogus image", func() {
|
|
scp := podmanTest.Podman([]string{"image", "scp", "FOOBAR"})
|
|
scp.WaitWithDefaultTimeout()
|
|
Expect(scp).Should(ExitWithError())
|
|
})
|
|
|
|
It("podman image scp with proper connection", func() {
|
|
cmd := []string{"system", "connection", "add",
|
|
"--default",
|
|
"QA",
|
|
"ssh://root@podman.test:2222/run/podman/podman.sock",
|
|
}
|
|
session := podmanTest.Podman(cmd)
|
|
session.WaitWithDefaultTimeout()
|
|
Expect(session).Should(Exit(0))
|
|
|
|
cfg, err := config.ReadCustomConfig()
|
|
Expect(err).ShouldNot(HaveOccurred())
|
|
Expect(cfg.Engine).Should(HaveField("ActiveService", "QA"))
|
|
Expect(cfg.Engine.ServiceDestinations).To(HaveKeyWithValue("QA",
|
|
config.Destination{
|
|
URI: "ssh://root@podman.test:2222/run/podman/podman.sock",
|
|
},
|
|
))
|
|
|
|
scp := podmanTest.Podman([]string{"image", "scp", ALPINE, "QA::"})
|
|
scp.WaitWithDefaultTimeout()
|
|
// exit with error because we cannot make an actual ssh connection
|
|
// This tests that the input we are given is validated and prepared correctly
|
|
// The error given should either be a missing image (due to testing suite complications) or a no such host timeout on ssh
|
|
Expect(scp).Should(ExitWithError())
|
|
// podman-remote exits with a different error
|
|
if !IsRemote() {
|
|
Expect(scp.ErrorToString()).Should(ContainSubstring("no such host"))
|
|
}
|
|
|
|
})
|
|
|
|
})
|