podman/pkg/bindings/test/auth_test.go

126 lines
3.6 KiB
Go

package test_bindings
import (
"io/ioutil"
"os"
"time"
"github.com/containers/common/pkg/auth"
"github.com/containers/image/v5/types"
podmanRegistry "github.com/containers/podman/v3/hack/podman-registry-go"
"github.com/containers/podman/v3/pkg/bindings/images"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/onsi/gomega/gexec"
)
var _ = Describe("Podman images", func() {
var (
registry *podmanRegistry.Registry
bt *bindingTest
s *gexec.Session
err error
)
BeforeEach(func() {
// Note: we need to start the registry **before** setting up
// the test. Otherwise, the registry is not reachable for
// currently unknown reasons.
registry, err = podmanRegistry.Start()
Expect(err).To(BeNil())
bt = newBindingTest()
bt.RestoreImagesFromCache()
s = bt.startAPIService()
time.Sleep(1 * time.Second)
err := bt.NewConnection()
Expect(err).To(BeNil())
})
AfterEach(func() {
s.Kill()
bt.cleanup()
registry.Stop()
})
// Test using credentials.
It("tag + push + pull (with credentials)", func() {
imageRep := "localhost:" + registry.Port + "/test"
imageTag := "latest"
imageRef := imageRep + ":" + imageTag
// Tag the alpine image and verify it has worked.
err = images.Tag(bt.conn, alpine.shortName, imageTag, imageRep, nil)
Expect(err).To(BeNil())
_, err = images.GetImage(bt.conn, imageRef, nil)
Expect(err).To(BeNil())
// Now push the image.
pushOpts := new(images.PushOptions)
err = images.Push(bt.conn, imageRef, imageRef, pushOpts.WithUsername(registry.User).WithPassword(registry.Password).WithSkipTLSVerify(true))
Expect(err).To(BeNil())
// Now pull the image.
pullOpts := new(images.PullOptions)
_, err = images.Pull(bt.conn, imageRef, pullOpts.WithSkipTLSVerify(true).WithPassword(registry.Password).WithUsername(registry.User))
Expect(err).To(BeNil())
})
// Test using authfile.
It("tag + push + pull + search (with authfile)", func() {
imageRep := "localhost:" + registry.Port + "/test"
imageTag := "latest"
imageRef := imageRep + ":" + imageTag
// Create a temporary authentication file.
tmpFile, err := ioutil.TempFile("", "auth.json.")
Expect(err).To(BeNil())
_, err = tmpFile.Write([]byte{'{', '}'})
Expect(err).To(BeNil())
err = tmpFile.Close()
Expect(err).To(BeNil())
authFilePath := tmpFile.Name()
// Now login to a) test the credentials and to b) store them in
// the authfile for later use.
sys := types.SystemContext{
AuthFilePath: authFilePath,
DockerInsecureSkipTLSVerify: types.OptionalBoolTrue,
}
loginOptions := auth.LoginOptions{
Username: registry.User,
Password: registry.Password,
AuthFile: authFilePath,
Stdin: os.Stdin,
Stdout: os.Stdout,
}
err = auth.Login(bt.conn, &sys, &loginOptions, []string{imageRep})
Expect(err).To(BeNil())
// Tag the alpine image and verify it has worked.
err = images.Tag(bt.conn, alpine.shortName, imageTag, imageRep, nil)
Expect(err).To(BeNil())
_, err = images.GetImage(bt.conn, imageRef, nil)
Expect(err).To(BeNil())
// Now push the image.
pushOpts := new(images.PushOptions)
err = images.Push(bt.conn, imageRef, imageRef, pushOpts.WithAuthfile(authFilePath).WithSkipTLSVerify(true))
Expect(err).To(BeNil())
// Now pull the image.
pullOpts := new(images.PullOptions)
_, err = images.Pull(bt.conn, imageRef, pullOpts.WithAuthfile(authFilePath).WithSkipTLSVerify(true))
Expect(err).To(BeNil())
// Last, but not least, exercise search.
searchOptions := new(images.SearchOptions)
_, err = images.Search(bt.conn, imageRef, searchOptions.WithSkipTLSVerify(true).WithAuthfile(authFilePath))
Expect(err).To(BeNil())
})
})