add docker image search api
Signed-off-by: soulseen <sunzhu@yunify.com>
This commit is contained in:
@@ -20,20 +20,37 @@ package registries
|
||||
import (
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/docker/client"
|
||||
"github.com/golang/glog"
|
||||
log "github.com/golang/glog"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"kubesphere.io/kubesphere/pkg/informers"
|
||||
)
|
||||
|
||||
type AuthInfo struct {
|
||||
Username string `json:"username" description:"username"`
|
||||
Password string `json:"password" description:"password"`
|
||||
ServerHost string `json:"serverhost" description:"registry server host"`
|
||||
const (
|
||||
loginSuccess = "Login Succeeded"
|
||||
StatusFailed = "failed"
|
||||
StatusSuccess = "succeeded"
|
||||
)
|
||||
|
||||
type DockerConfigJson struct {
|
||||
Auths DockerConfigMap `json:"auths"`
|
||||
}
|
||||
|
||||
const loginSuccess = "Login Succeeded"
|
||||
// DockerConfig represents the config file used by the docker CLI.
|
||||
// This config that represents the credentials that should be used
|
||||
// when pulling images from specific image repositories.
|
||||
type DockerConfigMap map[string]DockerConfigEntry
|
||||
|
||||
type DockerConfigEntry struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
Email string `json:"email"`
|
||||
ServerAddress string `json:"serverAddress,omitempty"`
|
||||
}
|
||||
|
||||
func RegistryVerify(authInfo AuthInfo) error {
|
||||
auth := base64.StdEncoding.EncodeToString([]byte(authInfo.Username + ":" + authInfo.Password))
|
||||
@@ -64,3 +81,45 @@ func RegistryVerify(authInfo AuthInfo) error {
|
||||
return fmt.Errorf(resp.Status)
|
||||
}
|
||||
}
|
||||
|
||||
func GetEntryBySecret(namespace, secretName string) (dockerConfigEntry *DockerConfigEntry, err error) {
|
||||
if namespace == "" || secretName == "" {
|
||||
return &DockerConfigEntry{}, nil
|
||||
}
|
||||
secret, err := informers.SharedInformerFactory().Core().V1().Secrets().Lister().Secrets(namespace).Get(secretName)
|
||||
if err != nil {
|
||||
log.Errorf("%+v", err)
|
||||
return nil, err
|
||||
}
|
||||
entry, err := getDockerEntryFromDockerSecret(secret)
|
||||
if err != nil {
|
||||
log.Errorf("%+v", err)
|
||||
return nil, err
|
||||
}
|
||||
return entry, nil
|
||||
}
|
||||
|
||||
func getDockerEntryFromDockerSecret(instance *corev1.Secret) (dockerConfigEntry *DockerConfigEntry, err error) {
|
||||
|
||||
if instance.Type != corev1.SecretTypeDockerConfigJson {
|
||||
return nil, fmt.Errorf("secret %s in ns %s type should be %s",
|
||||
instance.Namespace, instance.Name, corev1.SecretTypeDockerConfigJson)
|
||||
}
|
||||
dockerConfigBytes, ok := instance.Data[corev1.DockerConfigJsonKey]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("could not get data %s", corev1.DockerConfigJsonKey)
|
||||
}
|
||||
dockerConfig := &DockerConfigJson{}
|
||||
err = json.Unmarshal(dockerConfigBytes, dockerConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(dockerConfig.Auths) == 0 {
|
||||
return nil, fmt.Errorf("docker config auth len should not be 0")
|
||||
}
|
||||
for registryAddress, dockerConfigEntry := range dockerConfig.Auths {
|
||||
dockerConfigEntry.ServerAddress = registryAddress
|
||||
return &dockerConfigEntry, nil
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user