Feat: support addon helm repo skip tls verify (#4122) (#4146)

* Feat: support addon helm repo skip tls verify (#4122)

Signed-off-by: damianqin <damianqin@tiedpag.club>

* Fix: mv http server to BeforeSuite

Signed-off-by: damianqin <damianqin@tiedpag.club>

* Fix: fix ci error

Signed-off-by: damianqin <damianqin@tiedpag.club>

* Fix: fix merge

Signed-off-by: damianqin <damianqin@tiedpag.club>

* Feat: support addon helm repo skip tls verify (#4122)

Signed-off-by: damianqin <damianqin@tiedpag.club>

* Fix: mv http server to BeforeSuite

Signed-off-by: damianqin <damianqin@tiedpag.club>

* Fix: fix ci error

Signed-off-by: damianqin <damianqin@tiedpag.club>

* Fix: fix ci

Signed-off-by: damianqin <damianqin@tiedpag.club>

Co-authored-by: damianqin <damianqin@tiedpag.club>
Co-authored-by: Jianbo Sun <jianbo.sjb@alibaba-inc.com>
This commit is contained in:
TIEDPAG
2022-07-19 18:00:28 +08:00
committed by GitHub
co-authored by damianqin Jianbo Sun
parent fd784e291c
commit e37b0276c8
16 changed files with 502 additions and 206 deletions
+116 -47
View File
@@ -1726,6 +1726,12 @@
"name": "policyName",
"in": "path",
"required": true
},
{
"type": "boolean",
"description": "Force delete the policy and all references",
"name": "force",
"in": "query"
}
],
"responses": {
@@ -6074,7 +6080,6 @@
},
"addon.DeployTo": {
"required": [
"runtime_cluster",
"disableControlPlane",
"runtimeCluster"
],
@@ -6134,6 +6139,9 @@
},
"addon.HelmSource": {
"properties": {
"insecureSkipTLS": {
"type": "boolean"
},
"password": {
"type": "string"
},
@@ -7192,8 +7200,8 @@
},
"model.ApplicationRevision": {
"required": [
"createTime",
"updateTime",
"createTime",
"appPrimaryKey",
"version",
"status",
@@ -8055,10 +8063,10 @@
"v1.ApplicationDeployResponse": {
"required": [
"version",
"status",
"note",
"envName",
"createTime",
"note",
"status",
"triggerType"
],
"properties": {
@@ -9252,14 +9260,23 @@
"v1.CreatePolicyRequest": {
"required": [
"name",
"alias",
"envName",
"description",
"type",
"properties"
"properties",
"workflowPolicyBind"
],
"properties": {
"alias": {
"type": "string"
},
"description": {
"type": "string"
},
"envName": {
"type": "string"
},
"name": {
"type": "string"
},
@@ -9268,6 +9285,12 @@
},
"type": {
"type": "string"
},
"workflowPolicyBind": {
"type": "array",
"items": {
"$ref": "#/definitions/v1.WorkflowPolicyBinding"
}
}
}
},
@@ -9486,11 +9509,11 @@
},
"v1.DetailAddonResponse": {
"required": [
"icon",
"name",
"description",
"icon",
"version",
"invisible",
"description",
"schema",
"uiSchema",
"definitions",
@@ -9570,10 +9593,10 @@
},
"v1.DetailApplicationResponse": {
"required": [
"name",
"alias",
"description",
"icon",
"name",
"alias",
"project",
"createTime",
"updateTime",
@@ -9633,20 +9656,20 @@
},
"v1.DetailClusterResponse": {
"required": [
"name",
"status",
"dashboardURL",
"createTime",
"status",
"kubeConfig",
"updateTime",
"dashboardURL",
"name",
"description",
"icon",
"labels",
"reason",
"alias",
"provider",
"apiServerURL",
"description",
"alias",
"icon",
"reason",
"kubeConfigSecret",
"updateTime",
"resourceInfo"
],
"properties": {
@@ -9705,13 +9728,13 @@
"v1.DetailComponentResponse": {
"required": [
"appPrimaryKey",
"creator",
"alias",
"name",
"main",
"createTime",
"updateTime",
"main",
"name",
"creator",
"type",
"updateTime",
"definition"
],
"properties": {
@@ -9799,13 +9822,13 @@
},
"v1.DetailDefinitionResponse": {
"required": [
"ownerAddon",
"name",
"description",
"status",
"alias",
"icon",
"alias",
"status",
"labels",
"ownerAddon",
"schema",
"uiSchema"
],
@@ -9862,16 +9885,20 @@
},
"v1.DetailPolicyResponse": {
"required": [
"type",
"description",
"creator",
"properties",
"createTime",
"updateTime",
"envName",
"name"
"name",
"alias",
"type",
"description",
"properties",
"createTime"
],
"properties": {
"alias": {
"type": "string"
},
"createTime": {
"type": "string",
"format": "date-time"
@@ -9897,22 +9924,28 @@
"updateTime": {
"type": "string",
"format": "date-time"
},
"workflowPolicyBind": {
"type": "array",
"items": {
"$ref": "#/definitions/v1.WorkflowPolicyBinding"
}
}
}
},
"v1.DetailRevisionResponse": {
"required": [
"workflowName",
"envName",
"status",
"deployUser",
"triggerType",
"updateTime",
"appPrimaryKey",
"version",
"createTime",
"version",
"reason",
"envName",
"appPrimaryKey",
"deployUser",
"note",
"reason"
"status",
"workflowName",
"triggerType"
],
"properties": {
"appPrimaryKey": {
@@ -10009,11 +10042,11 @@
},
"v1.DetailUserResponse": {
"required": [
"disabled",
"createTime",
"lastLoginTime",
"name",
"email",
"disabled",
"projects",
"roles"
],
@@ -10054,12 +10087,12 @@
},
"v1.DetailWorkflowRecordResponse": {
"required": [
"applicationRevision",
"status",
"name",
"namespace",
"workflowName",
"workflowAlias",
"applicationRevision",
"deployTime",
"deployUser",
"note",
@@ -10111,14 +10144,14 @@
},
"v1.DetailWorkflowResponse": {
"required": [
"alias",
"enable",
"envName",
"updateTime",
"name",
"alias",
"default",
"createTime",
"description"
"updateTime",
"description",
"enable",
"createTime"
],
"properties": {
"alias": {
@@ -10823,11 +10856,11 @@
},
"v1.LoginUserInfoResponse": {
"required": [
"createTime",
"lastLoginTime",
"name",
"email",
"disabled",
"createTime",
"lastLoginTime",
"projects",
"platformPermissions",
"projectPermissions"
@@ -11031,6 +11064,7 @@
"v1.PolicyBase": {
"required": [
"name",
"alias",
"type",
"description",
"creator",
@@ -11040,6 +11074,9 @@
"envName"
],
"properties": {
"alias": {
"type": "string"
},
"createTime": {
"type": "string",
"format": "date-time"
@@ -11468,19 +11505,34 @@
},
"v1.UpdatePolicyRequest": {
"required": [
"alias",
"envName",
"description",
"type",
"properties"
"properties",
"workflowPolicyBind"
],
"properties": {
"alias": {
"type": "string"
},
"description": {
"type": "string"
},
"envName": {
"type": "string"
},
"properties": {
"type": "string"
},
"type": {
"type": "string"
},
"workflowPolicyBind": {
"type": "array",
"items": {
"$ref": "#/definitions/v1.WorkflowPolicyBinding"
}
}
}
},
@@ -11659,6 +11711,23 @@
}
}
},
"v1.WorkflowPolicyBinding": {
"required": [
"name",
"steps"
],
"properties": {
"name": {
"type": "string"
},
"steps": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"v1.WorkflowRecord": {
"required": [
"name",
+3 -2
View File
@@ -1194,8 +1194,9 @@ func (h *Installer) loadInstallPackage(name, version string) (*InstallPackage, e
}
} else {
versionedRegistry := BuildVersionedRegistry(h.r.Name, h.r.Helm.URL, &common.HTTPOption{
Username: h.r.Helm.Username,
Password: h.r.Helm.Password,
Username: h.r.Helm.Username,
Password: h.r.Helm.Password,
InsecureSkipTLS: h.r.Helm.InsecureSkipTLS,
})
installPackage, err = versionedRegistry.GetAddonInstallPackage(context.Background(), name, version)
if err != nil {
+6 -4
View File
@@ -107,8 +107,9 @@ func (u *Cache) GetUIData(r Registry, addonName, version string) (*UIData, error
}
} else {
versionedRegistry := BuildVersionedRegistry(r.Name, r.Helm.URL, &common.HTTPOption{
Username: r.Helm.Username,
Password: r.Helm.Password,
Username: r.Helm.Username,
Password: r.Helm.Password,
InsecureSkipTLS: r.Helm.InsecureSkipTLS,
})
addon, err = versionedRegistry.GetAddonUIData(context.Background(), addonName, version)
if err != nil {
@@ -315,8 +316,9 @@ func (u *Cache) listUIDataAndCache(r Registry) ([]*UIData, error) {
func (u *Cache) listVersionRegistryUIDataAndCache(r Registry) ([]*UIData, error) {
versionedRegistry := BuildVersionedRegistry(r.Name, r.Helm.URL, &common.HTTPOption{
Username: r.Helm.Username,
Password: r.Helm.Password,
Username: r.Helm.Username,
Password: r.Helm.Password,
InsecureSkipTLS: r.Helm.InsecureSkipTLS,
})
uiDatas, err := versionedRegistry.ListAddon()
if err != nil {
+21 -16
View File
@@ -19,6 +19,8 @@ package addon
import (
"testing"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/stretchr/testify/assert"
)
@@ -52,23 +54,26 @@ func TestListCachedUIData(t *testing.T) {
assert.Equal(t, u.listCachedUIData(name), addons)
}
func testListUIData(t *testing.T) {
var _ = Describe("Test addon cache", func() {
vr := Registry{Name: "helm-repo", Helm: &HelmSource{URL: "http://127.0.0.1:18083/authReg", Username: "hello", Password: "hello"}}
uiData := UIData{Meta: Meta{
Name: "fluxcd",
Description: "Extended workload to do continuous and progressive delivery",
Icon: "https://raw.githubusercontent.com/fluxcd/flux/master/docs/_files/weave-flux.png",
Version: "1.0.0",
Tags: []string{"extended_workload", "gitops"},
},
AvailableVersions: []string{"1.0.0"},
RegistryName: "helm-repo"}
addons := []*UIData{&uiData}
u := NewCache(nil)
uiDatas, err := u.ListUIData(vr)
assert.NoError(t, err)
assert.Equal(t, uiDatas, addons)
}
It("Test list addon helm repo UI data", func() {
uiData := UIData{Meta: Meta{
Name: "fluxcd",
Description: "Extended workload to do continuous and progressive delivery",
Icon: "https://raw.githubusercontent.com/fluxcd/flux/master/docs/_files/weave-flux.png",
Version: "1.0.0",
Tags: []string{"extended_workload", "gitops"},
},
AvailableVersions: []string{"1.0.0"},
RegistryName: "helm-repo"}
addons := []*UIData{&uiData}
u := NewCache(nil)
uiDatas, err := u.ListUIData(vr)
Expect(err).NotTo(HaveOccurred())
Expect(uiDatas).To(Equal(addons))
})
})
func TestListVersionRegistryCachedUIData(t *testing.T) {
name := "fluxcd"
+5 -1
View File
@@ -326,7 +326,11 @@ func FindWholeAddonPackagesFromRegistry(ctx context.Context, k8sClient client.Cl
// Find matched addons in registries
for _, r := range registries {
if IsVersionRegistry(r) {
vr := BuildVersionedRegistry(r.Name, r.Helm.URL, &common.HTTPOption{Username: r.Helm.Username, Password: r.Helm.Password})
vr := BuildVersionedRegistry(r.Name, r.Helm.URL, &common.HTTPOption{
Username: r.Helm.Username,
Password: r.Helm.Password,
InsecureSkipTLS: r.Helm.InsecureSkipTLS,
})
for _, addonName := range addonNames {
wholePackage, err := vr.GetDetailedAddon(ctx, addonName, "")
if err != nil {
+4 -3
View File
@@ -78,9 +78,10 @@ type GitlabAddonSource struct {
// HelmSource defines the information about the helm repo addon source
type HelmSource struct {
URL string `json:"url,omitempty" validate:"required"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
URL string `json:"url,omitempty" validate:"required"`
InsecureSkipTLS bool `json:"insecureSkipTLS,omitempty"`
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
}
// SafeCopier is an interface to copy Struct without sensitive fields, such as Token, Username, Password
+10 -8
View File
@@ -21,20 +21,18 @@ import (
"testing"
"time"
"k8s.io/client-go/discovery"
ocmclusterv1 "open-cluster-management.io/api/cluster/v1"
ocmclusterv1alpha1 "open-cluster-management.io/api/cluster/v1alpha1"
ocmworkv1 "open-cluster-management.io/api/work/v1"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
v12 "k8s.io/api/core/v1"
crdv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/discovery"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
ocmclusterv1 "open-cluster-management.io/api/cluster/v1"
ocmclusterv1alpha1 "open-cluster-management.io/api/cluster/v1alpha1"
ocmworkv1 "open-cluster-management.io/api/work/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/envtest"
"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
@@ -42,6 +40,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log/zap"
coreoam "github.com/oam-dev/kubevela/apis/core.oam.dev"
"github.com/oam-dev/kubevela/pkg/cue/packages"
"github.com/oam-dev/kubevela/pkg/oam/discoverymapper"
// +kubebuilder:scaffold:imports
@@ -105,6 +104,9 @@ var _ = BeforeSuite(func(done Done) {
Name: testns,
}}))
err = stepHelmHttpServer()
Expect(err).Should(Succeed())
close(done)
}, 120)
+18
View File
@@ -0,0 +1,18 @@
-----BEGIN CERTIFICATE-----
MIIC0TCCAbmgAwIBAgIRAIAefqqN1aYngJpWZ9BBwyUwDQYJKoZIhvcNAQELBQAw
ADAeFw0yMjA2MDgxMTI0NDdaFw0zMjA2MDUxMTI0NDdaMAAwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDnBIMvpmPv3AsHTUKOQq/i4e6kgtDx4USQ7oE+
vElPDr2SxPQEEqjlazK1jktLZG/dtCRgHNWn5ZdNmgQOlRU1KOEVVw8BZd/BMtw3
i5O1fbnE1nmwRvAZ7li2IgzVUn7vjD5+CwBjnhbPQcbnH5tkO+5FTwT8JY1Ht7io
B9m+y2w3FgphohGEq8m9bmmWkN0VKhd2kBFaKhf42TkVAMdJ4Q6mdzZXQ6zNJ+4s
o2Eg+XPopZ2XA2ntUfjjSSpZcdPwXIyTruY51LkSR6Ak7gyrVY1mBw55qwoiMRZH
jyxwfisSwqiTrb09HYdP8eFSUyWTHHMVHdXO/nzbYidWp2spAgMBAAGjRjBEMA4G
A1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMCQGA1UdEQEB/wQaMBiCEGhlbG0u
a3ViZXZlbGEuaW+HBH8AAAEwDQYJKoZIhvcNAQELBQADggEBAJ/IadUmFK7awBxC
diYERDtUgZghhahVFcEr8sV94SsU1ojQLTZVgFAwbPt7I1NxBkaj77ZKAmOktc/m
rIAnMQdBN1wuAfM1Rwz0TDnrfO+gTuaIf9Op2SsaGpcf221lIu3T5n+DaLS6M5a1
BqCjhHLfrg+j1NLapMT1V6CtKqmkmDLWWh4MKruYG8odpShXfXtRsjhI/2IFf0eI
Nu4F7+lI2C4BoQ5qyv4kVZpOzqX6u82SNkp0028n7woUk28z+3juUmICGV4iDVGv
BzO1Im1LxFufZf1R2afhdz7EDfFhHCHj8LGkMGXDyfB9H9CXzPHfhatCPDFfdkB/
D5+Z5NY=
-----END CERTIFICATE-----
+27
View File
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA5wSDL6Zj79wLB01CjkKv4uHupILQ8eFEkO6BPrxJTw69ksT0
BBKo5WsytY5LS2Rv3bQkYBzVp+WXTZoEDpUVNSjhFVcPAWXfwTLcN4uTtX25xNZ5
sEbwGe5YtiIM1VJ+74w+fgsAY54Wz0HG5x+bZDvuRU8E/CWNR7e4qAfZvstsNxYK
YaIRhKvJvW5plpDdFSoXdpARWioX+Nk5FQDHSeEOpnc2V0OszSfuLKNhIPlz6KWd
lwNp7VH440kqWXHT8FyMk67mOdS5EkegJO4Mq1WNZgcOeasKIjEWR48scH4rEsKo
k629PR2HT/HhUlMlkxxzFR3Vzv5822InVqdrKQIDAQABAoIBAERcOHmkMhRrN7Q8
b4JrR2LK2nRB5ZR9xW1htksbKlJDmWNR9qcx4lqpAwNojO1NVjDzuoPaZHrfXItx
FNw/z1vAsgI/lcgjHjgsVa/2FIpzHsKZeL7p7uiteADFSKjjVX6LMH7ZwI653CQO
Yc5IsxHRDiviOyZl8k2TlwfZ8twbA//DL+mbKw9psE/3+8WoIGEeOXxwGXQsZyyf
oso2191jGfzJNlC6LNvyF/mx479b+wArUEAxIysgpHYrHFrWOrTnN3pMzWNvGmhj
0MwD8RD2EOFbAIYdxlDE0OyvOfuWH9U3BfnT42zrHFZVhDDs27DS9HeeN2gvn3Wd
BISW/dUCgYEA+KG/84Ej/Sz/KZxsMB606Vfrv8b0pLJSG4mXfm7Yni+wMkeg19C4
gDIBlK6i3bNCXX/cZvpYqHc2E/+yUONKhd7CPqUbjWgXgMJj7tsUpqw6ssel0XE6
me1jY/ZG8gKYPCXF2P0HYp+8pAyfepXLJWZX0OlkAJ9ITg4hSB3toacCgYEA7d0h
0bHyK5gmSUX0EEl11NwV3+UFuwmVR1WtKeSPpwvr4e3t/z6AVCqxtbOSbWt5g9c0
h2tsauNYxIYHXWOw+v7RupfAU11DbtZf5RcLHGd7CTK67NZnpBc+20JgaoxPoBLm
1E2WCN2h0X0yBsMQnoHuGyWoZPZhgWHBGeq0Bq8CgYEA6NO3h9ToGb7YV2QW39zx
dw4RQy6Ri+U9BHKNfiVZDpEDw6HV2iOnkszBNDVxaIDkZeBFSd2nxmKULpgkqKCf
+crHRZihu4K9d6MRp+xaY1YnRaG2AvKweNKXX1WRzDFn0/NfWbpg/xcstMbpVQcP
DD/Rfl4AeqCuOgH7Yqg8DkMCgYEA38cigf0/L/Q8UMMXEhuKV2+WxMTZ11T0s9/O
wZLd8vIsQKlvNqq+YHCqL595Kqfp8jcMnDpcDVNFt93AIAQiBICnHzyVG9iqECRu
o0BCm75e6hBn+1jauG2GHREdVCAc6SPfNeyoMj8Qdd2qquHpSLZEJBYRjqqcoPQu
jwtXwtECgYATq5EnWtcivAeHjmozInq31J876gRgCm4JFQtoSHVR550WKKGbrvtP
qj6b9IHZvK/vRBhmKyjyI1qpC2mHWlVSX52HgJZR5aBn1pbZj8sxtalED9NsxklN
t4BrFRWTVFv06mikMH1aQe+tQ/omvipNXRpKxEmpxgiqkxvU7aFHuQ==
-----END RSA PRIVATE KEY-----
+3 -2
View File
@@ -176,8 +176,9 @@ func findLegacyAddonDefs(ctx context.Context, k8sClient client.Client, addonName
}
} else {
versionedRegistry := BuildVersionedRegistry(registry.Name, registry.Helm.URL, &common.HTTPOption{
Username: registry.Helm.Username,
Password: registry.Helm.Password,
Username: registry.Helm.Username,
Password: registry.Helm.Password,
InsecureSkipTLS: registry.Helm.InsecureSkipTLS,
})
uiData, err = versionedRegistry.GetAddonUIData(ctx, addonName, "")
if err != nil {
+248
View File
@@ -0,0 +1,248 @@
/*
Copyright 2021 The KubeVela Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package addon
import (
"context"
"crypto/tls"
"fmt"
"net/http"
"time"
"github.com/pkg/errors"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/oam-dev/kubevela/pkg/utils/common"
)
var _ = Describe("Test Versioned Registry", func() {
registries := []Registry{
{
Name: "helm-repo",
Helm: &HelmSource{URL: "http://127.0.0.1:18083"},
},
{
Name: "auth-helm-repo",
Helm: &HelmSource{
URL: "http://127.0.0.1:18083",
Username: "kubevela",
Password: "versioned registry",
},
},
{
Name: "tls-helm-repo",
Helm: &HelmSource{URL: "https://127.0.0.1:18443", InsecureSkipTLS: true},
},
{
Name: "auth-tls-helm-repo",
Helm: &HelmSource{
URL: "https://127.0.0.1:18443",
Username: "kubevela",
Password: "versioned registry",
InsecureSkipTLS: true,
},
},
}
for _, registry := range registries {
registry := registry
r := BuildVersionedRegistry(registry.Name, registry.Helm.URL, &common.HTTPOption{
InsecureSkipTLS: registry.Helm.InsecureSkipTLS,
Username: registry.Helm.Username,
Password: registry.Helm.Password,
})
Context(fmt.Sprintf("Test %s", registry.Name), func() {
It("list addon", func() {
addon, err := r.ListAddon()
Expect(err).NotTo(HaveOccurred())
Expect(addon).To(HaveLen(1))
Expect(addon[0].Name).To(Equal("fluxcd"))
Expect(addon[0].AvailableVersions).To(HaveLen(1))
})
It("get addon ui data", func() {
addonUIData, err := r.GetAddonUIData(context.Background(), "fluxcd", "1.0.0")
Expect(err).NotTo(HaveOccurred())
Expect(addonUIData).NotTo(BeNil())
Expect(addonUIData.Definitions).NotTo(BeEmpty())
Expect(addonUIData.Icon).NotTo(BeEmpty())
})
It("get addon install pkg", func() {
addonsInstallPackage, err := r.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0")
Expect(err).NotTo(HaveOccurred())
Expect(addonsInstallPackage).NotTo(BeNil())
Expect(addonsInstallPackage.YAMLTemplates).NotTo(BeEmpty())
Expect(addonsInstallPackage.DefSchemas).NotTo(BeEmpty())
})
It("get addon detail", func() {
addonWholePackage, err := r.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0")
Expect(err).NotTo(HaveOccurred())
Expect(addonWholePackage).NotTo(BeNil())
Expect(addonWholePackage.YAMLTemplates).NotTo(BeEmpty())
Expect(addonWholePackage.DefSchemas).NotTo(BeEmpty())
Expect(addonWholePackage.RegistryName).NotTo(BeEmpty())
})
})
}
errRegistries := []Registry{
{
Name: "tls-err-helm-repo",
Helm: &HelmSource{URL: "https://127.0.0.1:18443", InsecureSkipTLS: false},
},
{
Name: "auth-tls-err-helm-repo",
Helm: &HelmSource{
URL: "https://127.0.0.1:18443",
Username: "kubevela",
Password: "versioned registry",
InsecureSkipTLS: false,
},
},
}
for _, registry := range errRegistries {
registry := registry
r := BuildVersionedRegistry(registry.Name, registry.Helm.URL, &common.HTTPOption{
InsecureSkipTLS: registry.Helm.InsecureSkipTLS,
Username: registry.Helm.Username,
Password: registry.Helm.Password,
})
Context(fmt.Sprintf("Test %s", registry.Name), func() {
It("list addon", func() {
addon, err := r.ListAddon()
Expect(err).To(HaveOccurred())
Expect(addon).To(BeEmpty())
})
It("get addon ui data", func() {
addonUIData, err := r.GetAddonUIData(context.Background(), "fluxcd", "1.0.0")
Expect(err).To(HaveOccurred())
Expect(addonUIData).To(BeNil())
})
It("get addon install pkg", func() {
addonsInstallPackage, err := r.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0")
Expect(err).To(HaveOccurred())
Expect(addonsInstallPackage).To(BeNil())
})
It("get addon detail", func() {
addonWholePackage, err := r.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0")
Expect(err).To(HaveOccurred())
Expect(addonWholePackage).To(BeNil())
})
})
}
Context("Test multiversion helm repo", func() {
const repoName = "multiversion-helm-repo"
mr := BuildVersionedRegistry(repoName, "http://127.0.0.1:18083/multi", nil)
It("list addon", func() {
addons, err := mr.ListAddon()
Expect(err).To(Succeed())
Expect(addons).To(HaveLen(2))
})
It("get addon ui data", func() {
addonUIData, err := mr.GetAddonUIData(context.Background(), "fluxcd", "2.0.0")
Expect(err).To(Succeed())
Expect(addonUIData.Definitions).NotTo(BeEmpty())
Expect(addonUIData.Icon).NotTo(BeEmpty())
Expect(addonUIData.Version).To(Equal("2.0.0"))
})
It("get addon install pkg", func() {
addonsInstallPackage, err := mr.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0")
Expect(err).To(Succeed())
Expect(addonsInstallPackage).NotTo(BeNil())
Expect(addonsInstallPackage.YAMLTemplates).NotTo(BeEmpty())
Expect(addonsInstallPackage.DefSchemas).NotTo(BeEmpty())
Expect(addonsInstallPackage.SystemRequirements.VelaVersion).To(HaveSuffix("1.3.0"))
Expect(addonsInstallPackage.SystemRequirements.KubernetesVersion).To(HaveSuffix("1.10.0"))
})
It("get addon detail", func() {
addonWholePackage, err := mr.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0")
Expect(err).To(Succeed())
Expect(addonWholePackage).NotTo(BeNil())
Expect(addonWholePackage.YAMLTemplates).NotTo(BeEmpty())
Expect(addonWholePackage.DefSchemas).NotTo(BeEmpty())
Expect(addonWholePackage.RegistryName).To(Equal(repoName))
Expect(addonWholePackage.SystemRequirements.VelaVersion).To(Equal(">=1.3.0"))
Expect(addonWholePackage.SystemRequirements.KubernetesVersion).To(Equal(">=1.10.0"))
})
It("get addon available version", func() {
version, err := mr.GetAddonAvailableVersion("fluxcd")
Expect(err).To(Succeed())
Expect(version).To(HaveLen(2))
})
})
})
func stepHelmHttpServer() error {
handler := &http.ServeMux{}
handler.HandleFunc("/", versionedHandler)
handler.HandleFunc("/authReg", basicAuthVersionedHandler)
handler.HandleFunc("/multi/", multiVersionHandler)
helmRepoHttpServer := &http.Server{
Addr: fmt.Sprintf(":%d", 18083),
Handler: handler,
}
helmRepoHttpsServer := &http.Server{
Addr: fmt.Sprintf(":%d", 18443),
Handler: handler,
}
go func() {
err := helmRepoHttpsServer.ListenAndServeTLS("./testdata/tls/local-selfsign.crt", "./testdata/tls/local-selfsign.key")
Expect(err).ShouldNot(HaveOccurred())
}()
go func() {
err := helmRepoHttpServer.ListenAndServe()
Expect(err).ShouldNot(HaveOccurred())
}()
err := checkHelmHttpServer("http://127.0.0.1:18083", 3, time.Second)
if err != nil {
return err
}
err = checkHelmHttpServer("http://127.0.0.1:18443", 3, time.Second)
if err != nil {
return err
}
return nil
}
func checkHelmHttpServer(url string, maxTryNum int, interval time.Duration) error {
client := http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}}
var err error
for cur := 0; cur < maxTryNum; cur++ {
_, err = client.Get(url)
if err != nil {
time.Sleep(interval)
continue
}
}
if err != nil {
return errors.Wrap(err, "exceeded maximum number of retries.")
}
return nil
}
-104
View File
@@ -17,125 +17,21 @@ limitations under the License.
package addon
import (
"context"
"encoding/base64"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/repo"
"github.com/stretchr/testify/assert"
"github.com/oam-dev/kubevela/pkg/utils/common"
"github.com/oam-dev/kubevela/pkg/utils/helm"
)
func TestVersionRegistry(t *testing.T) {
go func() {
http.HandleFunc("/", versionedHandler)
http.HandleFunc("/authReg", basicAuthVersionedHandler)
http.HandleFunc("/multi/", multiVersionHandler)
err := http.ListenAndServe(fmt.Sprintf(":%d", 18083), nil)
if err != nil {
log.Fatal("Setup server error:", err)
}
}()
// wait server setup
time.Sleep(3 * time.Second)
r := BuildVersionedRegistry("helm-repo", "http://127.0.0.1:18083", nil)
addons, err := r.ListAddon()
assert.NoError(t, err)
assert.Equal(t, len(addons), 1)
assert.Equal(t, addons[0].Name, "fluxcd")
assert.Equal(t, len(addons[0].AvailableVersions), 1)
addonUIData, err := r.GetAddonUIData(context.Background(), "fluxcd", "1.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonUIData.Definitions)
assert.NotEmpty(t, addonUIData.Icon)
addonsInstallPackage, err := r.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonsInstallPackage)
assert.NotEmpty(t, addonsInstallPackage.YAMLTemplates)
assert.NotEmpty(t, addonsInstallPackage.DefSchemas)
addonWholePackage, err := r.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonWholePackage)
assert.NotEmpty(t, addonWholePackage.YAMLTemplates)
assert.NotEmpty(t, addonWholePackage.DefSchemas)
assert.NotEmpty(t, addonWholePackage.RegistryName)
ar := BuildVersionedRegistry("auth-helm-repo", "http://127.0.0.1:18083/authReg", &common.HTTPOption{Username: "hello", Password: "hello"})
addons, err = ar.ListAddon()
assert.NoError(t, err)
assert.Equal(t, len(addons), 1)
assert.Equal(t, addons[0].Name, "fluxcd")
assert.Equal(t, len(addons[0].AvailableVersions), 1)
addonUIData, err = ar.GetAddonUIData(context.Background(), "fluxcd", "1.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonUIData.Definitions)
assert.NotEmpty(t, addonUIData.Icon)
addonsInstallPackage, err = ar.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonsInstallPackage)
assert.NotEmpty(t, addonsInstallPackage.YAMLTemplates)
assert.NotEmpty(t, addonsInstallPackage.DefSchemas)
addonWholePackage, err = ar.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonWholePackage)
assert.NotEmpty(t, addonWholePackage.YAMLTemplates)
assert.NotEmpty(t, addonWholePackage.DefSchemas)
assert.NotEmpty(t, addonWholePackage.RegistryName)
testListUIData(t)
mr := BuildVersionedRegistry("multiversion-helm-repo", "http://127.0.0.1:18083/multi", nil)
addons, err = mr.ListAddon()
assert.NoError(t, err)
assert.Equal(t, len(addons), 2)
addonUIData, err = mr.GetAddonUIData(context.Background(), "fluxcd", "2.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonUIData.Definitions)
assert.NotEmpty(t, addonUIData.Icon)
assert.Equal(t, addonUIData.Version, "2.0.0")
addonsInstallPackage, err = mr.GetAddonInstallPackage(context.Background(), "fluxcd", "1.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonsInstallPackage)
assert.NotEmpty(t, addonsInstallPackage.YAMLTemplates)
assert.NotEmpty(t, addonsInstallPackage.DefSchemas)
assert.NotEmpty(t, addonsInstallPackage.SystemRequirements.VelaVersion, "1.3.0")
assert.NotEmpty(t, addonsInstallPackage.SystemRequirements.KubernetesVersion, "1.10.0")
addonWholePackage, err = mr.GetDetailedAddon(context.Background(), "fluxcd", "1.0.0")
assert.NoError(t, err)
assert.NotEmpty(t, addonWholePackage)
assert.NotEmpty(t, addonWholePackage.YAMLTemplates)
assert.NotEmpty(t, addonWholePackage.DefSchemas)
assert.NotEmpty(t, addonWholePackage.RegistryName)
assert.Equal(t, addonWholePackage.RegistryName, "multiversion-helm-repo")
version, err := mr.GetAddonAvailableVersion("fluxcd")
assert.NoError(t, err)
assert.Equal(t, len(version), 2)
assert.Equal(t, addonWholePackage.SystemRequirements.VelaVersion, ">=1.3.0")
assert.Equal(t, addonWholePackage.SystemRequirements.KubernetesVersion, ">=1.10.0")
}
func TestChooseAddonVersion(t *testing.T) {
versions := []*repo.ChartVersion{
{
+12 -5
View File
@@ -80,6 +80,9 @@ import (
var (
// Scheme defines the default KubeVela schema
Scheme = k8sruntime.NewScheme()
//nolint:gosec
// insecureHTTPClient insecure http client
insecureHTTPClient = &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}}
)
const (
@@ -117,11 +120,12 @@ func init() {
// HTTPOption define the https options
type HTTPOption struct {
Username string
Password string
CaFile string
CertFile string
KeyFile string
Username string
Password string
CaFile string
CertFile string
KeyFile string
InsecureSkipTLS bool
}
// InitBaseRestConfig will return reset config for create controller runtime client
@@ -167,6 +171,9 @@ func HTTPGetResponse(ctx context.Context, url string, opts *HTTPOption) (*http.R
if opts != nil && len(opts.Username) != 0 && len(opts.Password) != 0 {
req.SetBasicAuth(opts.Username, opts.Password)
}
if opts != nil && opts.InsecureSkipTLS {
httpClient = insecureHTTPClient
}
// if specify the caFile, we cannot re-use the default httpClient, so create a new one.
if opts != nil && (len(opts.CaFile) != 0 || len(opts.KeyFile) != 0 || len(opts.CertFile) != 0) {
// must set MinVersion of TLS, otherwise will report GoSec error G402
+20 -13
View File
@@ -31,19 +31,20 @@ import (
)
const (
addonRegistryType = "type"
addonEndpoint = "endpoint"
addonOssBucket = "bucket"
addonPath = "path"
addonGitToken = "gitToken"
addonOssType = "OSS"
addonGitType = "git"
addonGiteeType = "gitee"
addonGitlabType = "gitlab"
addonHelmType = "helm"
addonUsername = "username"
addonPassword = "password"
addonRepoName = "repoName"
addonRegistryType = "type"
addonEndpoint = "endpoint"
addonOssBucket = "bucket"
addonPath = "path"
addonGitToken = "gitToken"
addonOssType = "OSS"
addonGitType = "git"
addonGiteeType = "gitee"
addonGitlabType = "gitlab"
addonHelmType = "helm"
addonUsername = "username"
addonPassword = "password"
addonRepoName = "repoName"
addonHelmInsecureSkipTLS = "insecureSkipTLS"
)
// NewAddonRegistryCommand return an addon registry command
@@ -297,6 +298,8 @@ func parseArgsFromFlag(cmd *cobra.Command) {
cmd.Flags().StringP(addonGitToken, "", "", "specify the github repo token")
cmd.Flags().StringP(addonUsername, "", "", "specify the Helm addon registry username")
cmd.Flags().StringP(addonPassword, "", "", "specify the Helm addon registry password")
cmd.Flags().BoolP(addonHelmInsecureSkipTLS, "", false,
"specify the Helm addon registry skip tls verify")
}
func getRegistryFromArgs(cmd *cobra.Command, args []string) (*pkgaddon.Registry, error) {
@@ -389,6 +392,10 @@ func getRegistryFromArgs(cmd *cobra.Command, args []string) (*pkgaddon.Registry,
if err != nil {
return nil, err
}
r.Helm.InsecureSkipTLS, err = cmd.Flags().GetBool(addonHelmInsecureSkipTLS)
if err != nil {
return nil, err
}
default:
return nil, errors.New("not support addon registry type")
+5 -1
View File
@@ -899,7 +899,11 @@ func listAddons(ctx context.Context, clt client.Client, registry string) (*uitab
continue
}
} else {
versionedRegistry := pkgaddon.BuildVersionedRegistry(r.Name, r.Helm.URL, &common.HTTPOption{Username: r.Helm.Username, Password: r.Helm.Password})
versionedRegistry := pkgaddon.BuildVersionedRegistry(r.Name, r.Helm.URL, &common.HTTPOption{
Username: r.Helm.Username,
Password: r.Helm.Password,
InsecureSkipTLS: r.Helm.InsecureSkipTLS,
})
addonList, err = versionedRegistry.ListAddon()
if err != nil {
continue
+4
View File
@@ -137,6 +137,7 @@ func testAddonRegistryAddCmd() {
testcase := []struct {
args []string
errMsg string
result *pkgaddon.Registry
}{
{
args: []string{"noAuthRegistry", "--type=helm", "--endpoint=http://127.0.0.1/chartrepo/oam"},
@@ -146,6 +147,9 @@ func testAddonRegistryAddCmd() {
args: []string{"basicAuthRegistry", "--type=helm", "--endpoint=http://127.0.0.1/chartrepo/oam", "--username=hello", "--password=word"},
errMsg: "fail to add basis auth addon registry",
},
{
args: []string{"skipTlsRegistry", "--type=helm", "--endpoint=https://127.0.0.1/chartrepo/oam", "--insecureSkipTLS=true"},
},
}
ioStream := util.IOStreams{}