Merge pull request #440 from runcom/image-pull-secret

server: add auth info to image pull
This commit is contained in:
Mrunal Patel 2017-04-10 09:42:22 -07:00 committed by GitHub
commit 32750cd3f3

View file

@ -1,8 +1,12 @@
package server package server
import ( import (
"encoding/base64"
"strings"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/containers/image/copy" "github.com/containers/image/copy"
"github.com/containers/image/types"
"golang.org/x/net/context" "golang.org/x/net/context"
pb "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime" pb "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
) )
@ -17,7 +21,32 @@ func (s *Server) PullImage(ctx context.Context, req *pb.PullImageRequest) (*pb.P
if img != nil { if img != nil {
image = img.Image image = img.Image
} }
var (
username string
password string
)
if req.GetAuth() != nil {
username = req.GetAuth().Username
password = req.GetAuth().Password
if req.GetAuth().Auth != "" {
var err error
username, password, err = decodeDockerAuth(req.GetAuth().Auth)
if err != nil {
return nil, err
}
}
}
options := &copy.Options{} options := &copy.Options{}
// a not empty username should be sufficient to decide whether to send auth
// or not I guess
if username != "" {
options.SourceCtx = &types.SystemContext{
DockerAuthConfig: &types.DockerAuthConfig{
Username: username,
Password: password,
},
}
}
_, err := s.images.PullImage(s.imageContext, image, options) _, err := s.images.PullImage(s.imageContext, image, options)
if err != nil { if err != nil {
return nil, err return nil, err
@ -28,3 +57,18 @@ func (s *Server) PullImage(ctx context.Context, req *pb.PullImageRequest) (*pb.P
logrus.Debugf("PullImageResponse: %+v", resp) logrus.Debugf("PullImageResponse: %+v", resp)
return resp, nil return resp, nil
} }
func decodeDockerAuth(s string) (string, string, error) {
decoded, err := base64.StdEncoding.DecodeString(s)
if err != nil {
return "", "", err
}
parts := strings.SplitN(string(decoded), ":", 2)
if len(parts) != 2 {
// if it's invalid just skip, as docker does
return "", "", nil
}
user := parts[0]
password := strings.Trim(parts[1], "\x00")
return user, password, nil
}