mirror of
https://github.com/containers/podman.git
synced 2025-05-20 16:47:39 +08:00
Merge pull request #5233 from QiWang19/login/out-parameter
fix mandatory parameter in login/logout
This commit is contained in:
@ -12,6 +12,7 @@ import (
|
|||||||
"github.com/containers/image/v5/types"
|
"github.com/containers/image/v5/types"
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/libpod/image"
|
"github.com/containers/libpod/libpod/image"
|
||||||
|
"github.com/containers/libpod/pkg/registries"
|
||||||
"github.com/docker/docker-credential-helpers/credentials"
|
"github.com/docker/docker-credential-helpers/credentials"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
@ -67,10 +68,19 @@ func loginCmd(c *cliconfig.LoginValues) error {
|
|||||||
if len(args) > 1 {
|
if len(args) > 1 {
|
||||||
return errors.Errorf("too many arguments, login takes only 1 argument")
|
return errors.Errorf("too many arguments, login takes only 1 argument")
|
||||||
}
|
}
|
||||||
|
var server string
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
return errors.Errorf("please specify a registry to login to")
|
registriesFromFile, err := registries.GetRegistries()
|
||||||
|
if err != nil || len(registriesFromFile) == 0 {
|
||||||
|
return errors.Errorf("please specify a registry to login to")
|
||||||
|
}
|
||||||
|
|
||||||
|
server = registriesFromFile[0]
|
||||||
|
logrus.Debugf("registry not specified, default to the first registry %q from registries.conf", server)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
server = registryFromFullName(scrubServer(args[0]))
|
||||||
}
|
}
|
||||||
server := registryFromFullName(scrubServer(args[0]))
|
|
||||||
|
|
||||||
sc := image.GetSystemContext("", c.Authfile, false)
|
sc := image.GetSystemContext("", c.Authfile, false)
|
||||||
if c.Flag("tls-verify").Changed {
|
if c.Flag("tls-verify").Changed {
|
||||||
|
@ -8,7 +8,9 @@ import (
|
|||||||
"github.com/containers/image/v5/pkg/docker/config"
|
"github.com/containers/image/v5/pkg/docker/config"
|
||||||
"github.com/containers/libpod/cmd/podman/cliconfig"
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
||||||
"github.com/containers/libpod/cmd/podman/shared"
|
"github.com/containers/libpod/cmd/podman/shared"
|
||||||
|
"github.com/containers/libpod/pkg/registries"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -51,10 +53,16 @@ func logoutCmd(c *cliconfig.LogoutValues) error {
|
|||||||
if len(args) > 1 {
|
if len(args) > 1 {
|
||||||
return errors.Errorf("too many arguments, logout takes at most 1 argument")
|
return errors.Errorf("too many arguments, logout takes at most 1 argument")
|
||||||
}
|
}
|
||||||
if len(args) == 0 && !c.All {
|
|
||||||
return errors.Errorf("registry must be given")
|
|
||||||
}
|
|
||||||
var server string
|
var server string
|
||||||
|
if len(args) == 0 && !c.All {
|
||||||
|
registriesFromFile, err := registries.GetRegistries()
|
||||||
|
if err != nil || len(registriesFromFile) == 0 {
|
||||||
|
return errors.Errorf("no registries found in registries.conf, a registry must be provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
server = registriesFromFile[0]
|
||||||
|
logrus.Debugf("registry not specified, default to the first registry %q from registries.conf", server)
|
||||||
|
}
|
||||||
if len(args) == 1 {
|
if len(args) == 1 {
|
||||||
server = scrubServer(args[0])
|
server = scrubServer(args[0])
|
||||||
}
|
}
|
||||||
|
@ -4,11 +4,12 @@
|
|||||||
podman\-login - Login to a container registry
|
podman\-login - Login to a container registry
|
||||||
|
|
||||||
## SYNOPSIS
|
## SYNOPSIS
|
||||||
**podman login** [*options*] *registry*
|
**podman login** [*options*] [*registry*]
|
||||||
|
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
**podman login** logs into a specified registry server with the correct username
|
**podman login** logs into a specified registry server with the correct username
|
||||||
and password. **podman login** reads in the username and password from STDIN.
|
and password. If the registry is not specified, the first registry under [registries.search]
|
||||||
|
from registries.conf will be used. **podman login** reads in the username and password from STDIN.
|
||||||
The username and password can also be set using the **username** and **password** flags.
|
The username and password can also be set using the **username** and **password** flags.
|
||||||
The path of the authentication file can be specified by the user by setting the **authfile**
|
The path of the authentication file can be specified by the user by setting the **authfile**
|
||||||
flag. The default path used is **${XDG\_RUNTIME\_DIR}/containers/auth.json**.
|
flag. The default path used is **${XDG\_RUNTIME\_DIR}/containers/auth.json**.
|
||||||
@ -17,7 +18,7 @@ flag. The default path used is **${XDG\_RUNTIME\_DIR}/containers/auth.json**.
|
|||||||
|
|
||||||
**podman login [GLOBAL OPTIONS]**
|
**podman login [GLOBAL OPTIONS]**
|
||||||
|
|
||||||
**podman login [OPTIONS] REGISTRY [GLOBAL OPTIONS]**
|
**podman login [OPTIONS] [REGISTRY] [GLOBAL OPTIONS]**
|
||||||
|
|
||||||
## OPTIONS
|
## OPTIONS
|
||||||
|
|
||||||
|
@ -8,7 +8,8 @@ podman\-logout - Logout of a container registry
|
|||||||
|
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
**podman logout** logs out of a specified registry server by deleting the cached credentials
|
**podman logout** logs out of a specified registry server by deleting the cached credentials
|
||||||
stored in the **auth.json** file. The path of the authentication file can be overridden by the user by setting the **authfile** flag.
|
stored in the **auth.json** file. If the registry is not specified, the first registry under [registries.search]
|
||||||
|
from registries.conf will be used. The path of the authentication file can be overridden by the user by setting the **authfile** flag.
|
||||||
The default path used is **${XDG\_RUNTIME\_DIR}/containers/auth.json**.
|
The default path used is **${XDG\_RUNTIME\_DIR}/containers/auth.json**.
|
||||||
All the cached credentials can be removed by setting the **all** flag.
|
All the cached credentials can be removed by setting the **all** flag.
|
||||||
|
|
||||||
|
@ -19,14 +19,15 @@ import (
|
|||||||
|
|
||||||
var _ = Describe("Podman login and logout", func() {
|
var _ = Describe("Podman login and logout", func() {
|
||||||
var (
|
var (
|
||||||
tempdir string
|
tempdir string
|
||||||
err error
|
err error
|
||||||
podmanTest *PodmanTestIntegration
|
podmanTest *PodmanTestIntegration
|
||||||
authPath string
|
authPath string
|
||||||
certPath string
|
certPath string
|
||||||
port int
|
port int
|
||||||
server string
|
server string
|
||||||
testImg string
|
testImg string
|
||||||
|
registriesConfWithSearch []byte
|
||||||
)
|
)
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
@ -64,6 +65,9 @@ var _ = Describe("Podman login and logout", func() {
|
|||||||
f.Sync()
|
f.Sync()
|
||||||
port = 4999 + config.GinkgoConfig.ParallelNode
|
port = 4999 + config.GinkgoConfig.ParallelNode
|
||||||
server = strings.Join([]string{"localhost", strconv.Itoa(port)}, ":")
|
server = strings.Join([]string{"localhost", strconv.Itoa(port)}, ":")
|
||||||
|
|
||||||
|
registriesConfWithSearch = []byte(fmt.Sprintf("[registries.search]\nregistries = ['%s']", server))
|
||||||
|
|
||||||
testImg = strings.Join([]string{server, "test-apline"}, "/")
|
testImg = strings.Join([]string{server, "test-apline"}, "/")
|
||||||
|
|
||||||
os.MkdirAll(filepath.Join("/etc/containers/certs.d", server), os.ModePerm)
|
os.MkdirAll(filepath.Join("/etc/containers/certs.d", server), os.ModePerm)
|
||||||
@ -113,6 +117,38 @@ var _ = Describe("Podman login and logout", func() {
|
|||||||
Expect(session).To(ExitWithError())
|
Expect(session).To(ExitWithError())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman login and logout without registry parameter", func() {
|
||||||
|
SkipIfRootless()
|
||||||
|
|
||||||
|
registriesConf, err := ioutil.TempFile("", "TestLoginWithoutParameter")
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
defer registriesConf.Close()
|
||||||
|
defer os.Remove(registriesConf.Name())
|
||||||
|
|
||||||
|
err = ioutil.WriteFile(registriesConf.Name(), []byte(registriesConfWithSearch), os.ModePerm)
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
|
||||||
|
// Environment is per-process, so this looks very unsafe; actually it seems fine because tests are not
|
||||||
|
// run in parallel unless they opt in by calling t.Parallel(). So don’t do that.
|
||||||
|
oldRCP, hasRCP := os.LookupEnv("REGISTRIES_CONFIG_PATH")
|
||||||
|
defer func() {
|
||||||
|
if hasRCP {
|
||||||
|
os.Setenv("REGISTRIES_CONFIG_PATH", oldRCP)
|
||||||
|
} else {
|
||||||
|
os.Unsetenv("REGISTRIES_CONFIG_PATH")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
os.Setenv("REGISTRIES_CONFIG_PATH", registriesConf.Name())
|
||||||
|
|
||||||
|
session := podmanTest.Podman([]string{"login", "-u", "podmantest", "-p", "test"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To((Equal(0)))
|
||||||
|
|
||||||
|
session = podmanTest.Podman([]string{"logout"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
})
|
||||||
|
|
||||||
It("podman login and logout with flag --authfile", func() {
|
It("podman login and logout with flag --authfile", func() {
|
||||||
SkipIfRootless()
|
SkipIfRootless()
|
||||||
authFile := filepath.Join(podmanTest.TempDir, "auth.json")
|
authFile := filepath.Join(podmanTest.TempDir, "auth.json")
|
||||||
|
Reference in New Issue
Block a user