未验证 提交 2f490470 编写于 作者: K KubeSphere CI Bot 提交者: GitHub

Merge pull request #3317 from shaowenchen/fix_query_image

add parameter to allow ignore cert
...@@ -18,6 +18,10 @@ package v1alpha2 ...@@ -18,6 +18,10 @@ package v1alpha2
import ( import (
"fmt" "fmt"
"net/http"
"strconv"
"strings"
"github.com/emicklei/go-restful" "github.com/emicklei/go-restful"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
k8serr "k8s.io/apimachinery/pkg/api/errors" k8serr "k8s.io/apimachinery/pkg/api/errors"
...@@ -37,9 +41,6 @@ import ( ...@@ -37,9 +41,6 @@ import (
"kubesphere.io/kubesphere/pkg/models/routers" "kubesphere.io/kubesphere/pkg/models/routers"
"kubesphere.io/kubesphere/pkg/server/errors" "kubesphere.io/kubesphere/pkg/server/errors"
"kubesphere.io/kubesphere/pkg/server/params" "kubesphere.io/kubesphere/pkg/server/params"
"net/http"
"strconv"
"strings"
) )
type resourceHandler struct { type resourceHandler struct {
...@@ -325,8 +326,9 @@ func (r *resourceHandler) handleGetRegistryEntry(request *restful.Request, respo ...@@ -325,8 +326,9 @@ func (r *resourceHandler) handleGetRegistryEntry(request *restful.Request, respo
imageName := request.QueryParameter("image") imageName := request.QueryParameter("image")
namespace := request.QueryParameter("namespace") namespace := request.QueryParameter("namespace")
secretName := request.QueryParameter("secret") secretName := request.QueryParameter("secret")
insecure := request.QueryParameter("insecure") == "true"
detail, err := r.registryGetter.GetEntry(namespace, secretName, imageName) detail, err := r.registryGetter.GetEntry(namespace, secretName, imageName, insecure)
if err != nil { if err != nil {
api.HandleBadRequest(response, nil, err) api.HandleBadRequest(response, nil, err)
return return
......
...@@ -17,8 +17,10 @@ limitations under the License. ...@@ -17,8 +17,10 @@ limitations under the License.
package v1alpha2 package v1alpha2
import ( import (
"net/http"
"github.com/emicklei/go-restful" "github.com/emicklei/go-restful"
"github.com/emicklei/go-restful-openapi" restfulspec "github.com/emicklei/go-restful-openapi"
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
...@@ -33,7 +35,6 @@ import ( ...@@ -33,7 +35,6 @@ import (
registriesmodel "kubesphere.io/kubesphere/pkg/models/registries" registriesmodel "kubesphere.io/kubesphere/pkg/models/registries"
"kubesphere.io/kubesphere/pkg/server/errors" "kubesphere.io/kubesphere/pkg/server/errors"
"kubesphere.io/kubesphere/pkg/server/params" "kubesphere.io/kubesphere/pkg/server/params"
"net/http"
) )
const ( const (
...@@ -145,6 +146,9 @@ func AddToContainer(c *restful.Container, k8sClient kubernetes.Interface, factor ...@@ -145,6 +146,9 @@ func AddToContainer(c *restful.Container, k8sClient kubernetes.Interface, factor
Param(webservice.QueryParameter("secret", "secret name"). Param(webservice.QueryParameter("secret", "secret name").
Required(false). Required(false).
DataFormat("secret=%s")). DataFormat("secret=%s")).
Param(webservice.QueryParameter("insecure", "whether verify cert if using https repo").
Required(false).
DataFormat("insecure=%s")).
Metadata(restfulspec.KeyOpenAPITags, []string{constants.RegistryTag}). Metadata(restfulspec.KeyOpenAPITags, []string{constants.RegistryTag}).
Doc("Retrieve the blob from the registry identified"). Doc("Retrieve the blob from the registry identified").
Writes(registriesmodel.ImageDetails{}). Writes(registriesmodel.ImageDetails{}).
......
...@@ -23,7 +23,7 @@ import ( ...@@ -23,7 +23,7 @@ import (
func TestDigestFromDockerHub(t *testing.T) { func TestDigestFromDockerHub(t *testing.T) {
testImage := Image{Domain: "docker.io", Path: "library/alpine", Tag: "latest"} testImage := Image{Domain: "docker.io", Path: "library/alpine", Tag: "latest"}
r, err := CreateRegistryClient("", "", "docker.io", true) r, err := CreateRegistryClient("", "", "docker.io", true, false)
if err != nil { if err != nil {
t.Fatalf("Could not get client: %s", err) t.Fatalf("Could not get client: %s", err)
} }
......
...@@ -21,6 +21,8 @@ import ( ...@@ -21,6 +21,8 @@ import (
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"fmt" "fmt"
"strings"
"github.com/docker/docker/api/types" "github.com/docker/docker/api/types"
"github.com/docker/docker/client" "github.com/docker/docker/client"
"github.com/emicklei/go-restful" "github.com/emicklei/go-restful"
...@@ -28,7 +30,6 @@ import ( ...@@ -28,7 +30,6 @@ import (
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/klog" "k8s.io/klog"
"kubesphere.io/kubesphere/pkg/api" "kubesphere.io/kubesphere/pkg/api"
"strings"
) )
const ( const (
...@@ -55,7 +56,7 @@ type DockerConfigEntry struct { ...@@ -55,7 +56,7 @@ type DockerConfigEntry struct {
type RegistryGetter interface { type RegistryGetter interface {
VerifyRegistryCredential(credential api.RegistryCredential) error VerifyRegistryCredential(credential api.RegistryCredential) error
GetEntry(namespace, secretName, imageName string) (ImageDetails, error) GetEntry(namespace, secretName, imageName string, insecure bool) (ImageDetails, error)
} }
type registryGetter struct { type registryGetter struct {
...@@ -96,8 +97,8 @@ func (c *registryGetter) VerifyRegistryCredential(credential api.RegistryCredent ...@@ -96,8 +97,8 @@ func (c *registryGetter) VerifyRegistryCredential(credential api.RegistryCredent
} }
} }
func (c *registryGetter) GetEntry(namespace, secretName, imageName string) (ImageDetails, error) { func (c *registryGetter) GetEntry(namespace, secretName, imageName string, insecure bool) (ImageDetails, error) {
imageDetails, err := c.getEntryBySecret(namespace, secretName, imageName) imageDetails, err := c.getEntryBySecret(namespace, secretName, imageName, insecure)
if imageDetails.Status == StatusFailed { if imageDetails.Status == StatusFailed {
imageDetails.Message = err.Error() imageDetails.Message = err.Error()
} }
...@@ -105,7 +106,7 @@ func (c *registryGetter) GetEntry(namespace, secretName, imageName string) (Imag ...@@ -105,7 +106,7 @@ func (c *registryGetter) GetEntry(namespace, secretName, imageName string) (Imag
return imageDetails, err return imageDetails, err
} }
func (c *registryGetter) getEntryBySecret(namespace, secretName, imageName string) (ImageDetails, error) { func (c *registryGetter) getEntryBySecret(namespace, secretName, imageName string, insecure bool) (ImageDetails, error) {
failedImageDetails := ImageDetails{ failedImageDetails := ImageDetails{
Status: StatusFailed, Status: StatusFailed,
Message: "", Message: "",
...@@ -152,7 +153,7 @@ func (c *registryGetter) getEntryBySecret(namespace, secretName, imageName strin ...@@ -152,7 +153,7 @@ func (c *registryGetter) getEntryBySecret(namespace, secretName, imageName strin
useSSL := checkSSl(config.ServerAddress) useSSL := checkSSl(config.ServerAddress)
// Create the registry client. // Create the registry client.
r, err := CreateRegistryClient(config.Username, config.Password, image.Domain, useSSL) r, err := CreateRegistryClient(config.Username, config.Password, image.Domain, useSSL, insecure)
if err != nil { if err != nil {
return failedImageDetails, err return failedImageDetails, err
} }
......
...@@ -18,17 +18,19 @@ package registries ...@@ -18,17 +18,19 @@ package registries
import ( import (
"compress/gzip" "compress/gzip"
"crypto/tls"
"errors" "errors"
"fmt" "fmt"
"github.com/docker/docker/api/types"
"io" "io"
"io/ioutil" "io/ioutil"
log "k8s.io/klog"
"net/http" "net/http"
"net/url" "net/url"
"regexp" "regexp"
"strings" "strings"
"time" "time"
"github.com/docker/docker/api/types"
log "k8s.io/klog"
) )
const ( const (
...@@ -63,10 +65,11 @@ type Registry struct { ...@@ -63,10 +65,11 @@ type Registry struct {
// Opt holds the options for a new registry. // Opt holds the options for a new registry.
type RegistryOpt struct { type RegistryOpt struct {
Domain string Domain string
Timeout time.Duration Timeout time.Duration
Headers map[string]string Headers map[string]string
UseSSL bool UseSSL bool
Insecure bool
} }
type authToken struct { type authToken struct {
...@@ -80,7 +83,7 @@ type authService struct { ...@@ -80,7 +83,7 @@ type authService struct {
Scope []string Scope []string
} }
func CreateRegistryClient(username, password, domain string, useSSL bool) (*Registry, error) { func CreateRegistryClient(username, password, domain string, useSSL bool, insecure bool) (*Registry, error) {
authDomain := domain authDomain := domain
auth, err := GetAuthConfig(username, password, authDomain) auth, err := GetAuthConfig(username, password, authDomain)
if err != nil { if err != nil {
...@@ -90,8 +93,9 @@ func CreateRegistryClient(username, password, domain string, useSSL bool) (*Regi ...@@ -90,8 +93,9 @@ func CreateRegistryClient(username, password, domain string, useSSL bool) (*Regi
// Create the registry client. // Create the registry client.
return New(auth, RegistryOpt{ return New(auth, RegistryOpt{
Domain: domain, Domain: domain,
UseSSL: useSSL, UseSSL: useSSL,
Insecure: insecure,
}) })
} }
...@@ -135,11 +139,16 @@ func newFromTransport(auth types.AuthConfig, opt RegistryOpt) (*Registry, error) ...@@ -135,11 +139,16 @@ func newFromTransport(auth types.AuthConfig, opt RegistryOpt) (*Registry, error)
} }
registryURL, _ := url.Parse(registryUrl) registryURL, _ := url.Parse(registryUrl)
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: opt.Insecure},
}
registry := &Registry{ registry := &Registry{
URL: registryURL.String(), URL: registryURL.String(),
Domain: registryURL.Host, Domain: registryURL.Host,
Client: &http.Client{ Client: &http.Client{
Timeout: DefaultTimeout, Timeout: DefaultTimeout,
Transport: tr,
}, },
Username: auth.Username, Username: auth.Username,
Password: auth.Password, Password: auth.Password,
......
...@@ -41,7 +41,7 @@ func TestCreateRegistryClient(t *testing.T) { ...@@ -41,7 +41,7 @@ func TestCreateRegistryClient(t *testing.T) {
} }
for _, testImage := range testImages { for _, testImage := range testImages {
reg, err := CreateRegistryClient(testImage.Username, testImage.Password, testImage.Domain, testImage.UseSSL) reg, err := CreateRegistryClient(testImage.Username, testImage.Password, testImage.Domain, testImage.UseSSL, false)
if err != nil { if err != nil {
t.Fatalf("Get err %s", err) t.Fatalf("Get err %s", err)
} }
...@@ -57,7 +57,7 @@ func TestCreateRegistryClient(t *testing.T) { ...@@ -57,7 +57,7 @@ func TestCreateRegistryClient(t *testing.T) {
} }
testImage := Image{Domain: DockerHub, Path: "library/alpine", Tag: "latest"} testImage := Image{Domain: DockerHub, Path: "library/alpine", Tag: "latest"}
r, err := CreateRegistryClient("", "", DockerHub, true) r, err := CreateRegistryClient("", "", DockerHub, true, false)
if err != nil { if err != nil {
t.Fatalf("Could not get client: %s", err) t.Fatalf("Could not get client: %s", err)
} }
......
...@@ -48,7 +48,7 @@ func (asm authServiceMock) equalTo(v *authService) bool { ...@@ -48,7 +48,7 @@ func (asm authServiceMock) equalTo(v *authService) bool {
func TestToken(t *testing.T) { func TestToken(t *testing.T) {
testImage := Image{Domain: "docker.io", Path: "library/alpine", Tag: "latest"} testImage := Image{Domain: "docker.io", Path: "library/alpine", Tag: "latest"}
r, err := CreateRegistryClient("", "", "docker.io", true) r, err := CreateRegistryClient("", "", "docker.io", true, false)
if err != nil { if err != nil {
t.Fatalf("Could not get registry client: %s", err) t.Fatalf("Could not get registry client: %s", err)
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册