bootstrap registry code

Signed-off-by: Antonio Murdaca <runcom@redhat.com>
This commit is contained in:
Antonio Murdaca 2016-01-18 18:57:40 +01:00
parent 4c5fa92f6e
commit ec4847a50d
2 changed files with 93 additions and 20 deletions

View File

@ -1,12 +1,18 @@
package main package main
import ( import (
"fmt"
"github.com/codegangsta/cli"
"github.com/docker/docker/api"
"github.com/docker/docker/reference" "github.com/docker/docker/reference"
"github.com/docker/docker/registry"
engineTypes "github.com/docker/engine-api/types" engineTypes "github.com/docker/engine-api/types"
containerTypes "github.com/docker/engine-api/types/container" containerTypes "github.com/docker/engine-api/types/container"
) )
type ImageInspect struct { type imageInspect struct {
// I shouldn't need json tag here...
ID string `json:"Id"` ID string `json:"Id"`
RepoTags []string RepoTags []string
RepoDigests []string RepoDigests []string
@ -24,6 +30,86 @@ type ImageInspect struct {
Registry string Registry string
} }
func inspect(ref reference.Named, authConfig engineTypes.AuthConfig) (string, error) { func inspect(c *cli.Context) (*imageInspect, error) {
return "", nil ref, err := reference.ParseNamed(c.Args().First())
if err != nil {
return nil, err
}
var (
ii *imageInspect
)
if ref.Hostname() != "" {
ii, err = getData(ref)
if err != nil {
return nil, err
}
return ii, nil
}
authConfig, err := getAuthConfig(c, ref)
if err != nil {
return nil, err
}
_ = authConfig
return nil, nil
}
func getData(ref reference.Named) (*imageInspect, error) {
repoInfo, err := registry.ParseRepositoryInfo(ref)
if err != nil {
return nil, err
}
if err := validateRepoName(repoInfo.Name()); err != nil {
return nil, err
}
registryService := registry.NewService(nil)
// FATA[0000] open /etc/docker/certs.d/myreg.com:4000: permission denied
// need to be run as root, really? :(
// just pass tlsconfig via cli?!?!?!
//
// TODO(runcom): do not assume docker is installed on the system!
// just fallback as for getAuthConfig
endpoints, err := registryService.LookupPullEndpoints(repoInfo)
if err != nil {
return nil, err
}
return nil, nil
}
func getAuthConfig(c *cli.Context, ref reference.Named) (engineTypes.AuthConfig, error) {
// use docker/cliconfig
// if no /.docker -> docker not installed fallback to require username|password
// maybe prompt user:passwd?
//var (
//authConfig engineTypes.AuthConfig
//username = c.GlobalString("username")
//password = c.GlobalString("password")
//)
//if username != "" && password != "" {
//authConfig = engineTypes.AuthConfig{
//Username: username,
//Password: password,
//}
//}
return engineTypes.AuthConfig{}, nil
}
func validateRepoName(name string) error {
if name == "" {
return fmt.Errorf("Repository name can't be empty")
}
if name == api.NoBaseImageSpecifier {
return fmt.Errorf("'%s' is a reserved name", api.NoBaseImageSpecifier)
}
return nil
} }

21
main.go
View File

@ -1,13 +1,12 @@
package main package main
import ( import (
"encoding/json"
"fmt" "fmt"
"os" "os"
"github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
"github.com/codegangsta/cli" "github.com/codegangsta/cli"
"github.com/docker/docker/reference"
engineTypes "github.com/docker/engine-api/types"
) )
const ( const (
@ -16,27 +15,15 @@ const (
) )
var inspectCmd = func(c *cli.Context) { var inspectCmd = func(c *cli.Context) {
ref, err := reference.ParseNamed(c.Args().First()) imgInspect, err := inspect(c)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
data, err := json.Marshal(imgInspect)
var (
authConfig engineTypes.AuthConfig
username = c.GlobalString("username")
password = c.GlobalString("password")
)
if username != "" && password != "" {
authConfig = engineTypes.AuthConfig{
Username: username,
Password: password,
}
}
imgInspect, err := inspect(ref, authConfig)
if err != nil { if err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
fmt.Println(imgInspect) fmt.Println(string(data))
} }
func main() { func main() {