diff --git a/api/database/boltdb/json_test.go b/api/database/boltdb/json_test.go index 577aa2cfd..ba0863efd 100644 --- a/api/database/boltdb/json_test.go +++ b/api/database/boltdb/json_test.go @@ -10,7 +10,7 @@ import ( ) const ( - jsonobject = `{"LogoURL":"","BlackListedLabels":[],"AuthenticationMethod":1,"InternalAuthSettings": {"RequiredPasswordLength": 12}"LDAPSettings":{"AnonymousMode":true,"ReaderDN":"","URL":"","TLSConfig":{"TLS":false,"TLSSkipVerify":false},"StartTLS":false,"SearchSettings":[{"BaseDN":"","Filter":"","UserNameAttribute":""}],"GroupSearchSettings":[{"GroupBaseDN":"","GroupFilter":"","GroupAttribute":""}],"AutoCreateUsers":true},"OAuthSettings":{"ClientID":"","AccessTokenURI":"","AuthorizationURI":"","ResourceURI":"","RedirectURI":"","UserIdentifier":"","Scopes":"","OAuthAutoCreateUsers":false,"DefaultTeamID":0,"SSO":true,"LogoutURI":"","KubeSecretKey":"j0zLVtY/lAWBk62ByyF0uP80SOXaitsABP0TTJX8MhI="},"OpenAMTConfiguration":{"Enabled":false,"MPSServer":"","MPSUser":"","MPSPassword":"","MPSToken":"","CertFileContent":"","CertFileName":"","CertFilePassword":"","DomainName":""},"FeatureFlagSettings":{},"SnapshotInterval":"5m","TemplatesURL":"https://raw.githubusercontent.com/portainer/templates/master/templates-2.0.json","EdgeAgentCheckinInterval":5,"EnableEdgeComputeFeatures":false,"UserSessionTimeout":"8h","KubeconfigExpiry":"0","EnableTelemetry":true,"HelmRepositoryURL":"https://charts.bitnami.com/bitnami","KubectlShellImage":"portainer/kubectl-shell","DisplayDonationHeader":false,"DisplayExternalContributors":false,"EnableHostManagementFeatures":false,"AllowVolumeBrowserForRegularUsers":false,"AllowBindMountsForRegularUsers":false,"AllowPrivilegedModeForRegularUsers":false,"AllowHostNamespaceForRegularUsers":false,"AllowStackManagementForRegularUsers":false,"AllowDeviceMappingForRegularUsers":false,"AllowContainerCapabilitiesForRegularUsers":false}` + jsonobject = `{"LogoURL":"","BlackListedLabels":[],"AuthenticationMethod":1,"InternalAuthSettings": {"RequiredPasswordLength": 12}"LDAPSettings":{"AnonymousMode":true,"ReaderDN":"","URL":"","TLSConfig":{"TLS":false,"TLSSkipVerify":false},"StartTLS":false,"SearchSettings":[{"BaseDN":"","Filter":"","UserNameAttribute":""}],"GroupSearchSettings":[{"GroupBaseDN":"","GroupFilter":"","GroupAttribute":""}],"AutoCreateUsers":true},"OAuthSettings":{"ClientID":"","AccessTokenURI":"","AuthorizationURI":"","ResourceURI":"","RedirectURI":"","UserIdentifier":"","Scopes":"","OAuthAutoCreateUsers":false,"DefaultTeamID":0,"SSO":true,"LogoutURI":"","KubeSecretKey":"j0zLVtY/lAWBk62ByyF0uP80SOXaitsABP0TTJX8MhI="},"OpenAMTConfiguration":{"Enabled":false,"MPSServer":"","MPSUser":"","MPSPassword":"","MPSToken":"","CertFileContent":"","CertFileName":"","CertFilePassword":"","DomainName":""},"FeatureFlagSettings":{},"SnapshotInterval":"5m","TemplatesURL":"https://raw.githubusercontent.com/portainer/templates/master/templates-2.0.json","EdgeAgentCheckinInterval":5,"EnableEdgeComputeFeatures":false,"UserSessionTimeout":"8h","KubeconfigExpiry":"0","EnableTelemetry":true,"HelmRepositoryURL":"https://kubernetes.github.io/ingress-nginx","KubectlShellImage":"portainer/kubectl-shell","DisplayDonationHeader":false,"DisplayExternalContributors":false,"EnableHostManagementFeatures":false,"AllowVolumeBrowserForRegularUsers":false,"AllowBindMountsForRegularUsers":false,"AllowPrivilegedModeForRegularUsers":false,"AllowHostNamespaceForRegularUsers":false,"AllowStackManagementForRegularUsers":false,"AllowDeviceMappingForRegularUsers":false,"AllowContainerCapabilitiesForRegularUsers":false}` passphrase = "my secret key" ) diff --git a/api/datastore/test_data/output_24_to_latest.json b/api/datastore/test_data/output_24_to_latest.json index 43d872914..d9b9bf036 100644 --- a/api/datastore/test_data/output_24_to_latest.json +++ b/api/datastore/test_data/output_24_to_latest.json @@ -605,7 +605,7 @@ "GlobalDeploymentOptions": { "hideStacksFunctionality": false }, - "HelmRepositoryURL": "https://charts.bitnami.com/bitnami", + "HelmRepositoryURL": "", "InternalAuthSettings": { "RequiredPasswordLength": 12 }, diff --git a/api/http/handler/helm/helm_install_test.go b/api/http/handler/helm/helm_install_test.go index 869b80554..0b87d3a23 100644 --- a/api/http/handler/helm/helm_install_test.go +++ b/api/http/handler/helm/helm_install_test.go @@ -45,7 +45,7 @@ func Test_helmInstall(t *testing.T) { is.NotNil(h, "Handler should not fail") // Install a single chart. We expect to get these values back - options := options.InstallOptions{Name: "nginx-1", Chart: "nginx", Namespace: "default", Repo: "https://charts.bitnami.com/bitnami"} + options := options.InstallOptions{Name: "nginx-1", Chart: "nginx", Namespace: "default", Repo: "https://kubernetes.github.io/ingress-nginx"} optdata, err := json.Marshal(options) is.NoError(err) diff --git a/api/http/handler/helm/helm_repo_search_test.go b/api/http/handler/helm/helm_repo_search_test.go index 5fde5e642..a556908b9 100644 --- a/api/http/handler/helm/helm_repo_search_test.go +++ b/api/http/handler/helm/helm_repo_search_test.go @@ -20,7 +20,7 @@ func Test_helmRepoSearch(t *testing.T) { assert.NotNil(t, h, "Handler should not fail") - repos := []string{"https://charts.bitnami.com/bitnami", "https://portainer.github.io/k8s"} + repos := []string{"https://kubernetes.github.io/ingress-nginx", "https://portainer.github.io/k8s"} for _, repo := range repos { t.Run(repo, func(t *testing.T) { diff --git a/api/http/handler/helm/helm_show_test.go b/api/http/handler/helm/helm_show_test.go index dd3957c99..fed59388d 100644 --- a/api/http/handler/helm/helm_show_test.go +++ b/api/http/handler/helm/helm_show_test.go @@ -31,7 +31,7 @@ func Test_helmShow(t *testing.T) { t.Run(cmd, func(t *testing.T) { is.NotNil(h, "Handler should not fail") - repoUrlEncoded := url.QueryEscape("https://charts.bitnami.com/bitnami") + repoUrlEncoded := url.QueryEscape("https://kubernetes.github.io/ingress-nginx") chart := "nginx" req := httptest.NewRequest("GET", fmt.Sprintf("/templates/helm/%s?repo=%s&chart=%s", cmd, repoUrlEncoded, chart), nil) rr := httptest.NewRecorder() diff --git a/api/http/handler/settings/settings_update.go b/api/http/handler/settings/settings_update.go index 0b36dbc62..895da489c 100644 --- a/api/http/handler/settings/settings_update.go +++ b/api/http/handler/settings/settings_update.go @@ -46,7 +46,7 @@ type settingsUpdatePayload struct { // Whether telemetry is enabled EnableTelemetry *bool `example:"false"` // Helm repository URL - HelmRepositoryURL *string `example:"https://charts.bitnami.com/bitnami"` + HelmRepositoryURL *string `example:"https://kubernetes.github.io/ingress-nginx"` // Kubectl Shell Image KubectlShellImage *string `example:"portainer/kubectl-shell:latest"` // TrustOnFirstConnect makes Portainer accepting edge agent connection by default diff --git a/api/portainer.go b/api/portainer.go index 64ac47012..9a6d719e8 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -588,7 +588,7 @@ type ( // User identifier UserID UserID `json:"UserId" example:"1"` // Helm repository URL - URL string `json:"URL" example:"https://charts.bitnami.com/bitnami"` + URL string `json:"URL" example:"https://kubernetes.github.io/ingress-nginx"` } // QuayRegistryData represents data required for Quay registry to work @@ -984,8 +984,8 @@ type ( KubeconfigExpiry string `json:"KubeconfigExpiry" example:"24h"` // Whether telemetry is enabled EnableTelemetry bool `json:"EnableTelemetry" example:"false"` - // Helm repository URL, defaults to "https://charts.bitnami.com/bitnami" - HelmRepositoryURL string `json:"HelmRepositoryURL" example:"https://charts.bitnami.com/bitnami"` + // Helm repository URL, defaults to "" + HelmRepositoryURL string `json:"HelmRepositoryURL"` // KubectlImage, defaults to portainer/kubectl-shell KubectlShellImage string `json:"KubectlShellImage" example:"portainer/kubectl-shell"` // TrustOnFirstConnect makes Portainer accepting edge agent connection by default @@ -1672,8 +1672,8 @@ const ( DefaultEdgeAgentCheckinIntervalInSeconds = 5 // DefaultTemplatesURL represents the URL to the official templates supported by Portainer DefaultTemplatesURL = "https://raw.githubusercontent.com/portainer/templates/v3/templates.json" - // DefaultHelmrepositoryURL represents the URL to the official templates supported by Bitnami - DefaultHelmRepositoryURL = "https://charts.bitnami.com/bitnami" + // DefaultHelmrepositoryURL set to empty string until oci support is added + DefaultHelmRepositoryURL = "" // DefaultUserSessionTimeout represents the default timeout after which the user session is cleared DefaultUserSessionTimeout = "8h" // DefaultUserSessionTimeout represents the default timeout after which the user session is cleared diff --git a/app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html b/app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html index 8f3f2fb4a..504c53af3 100644 --- a/app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html +++ b/app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html @@ -31,10 +31,40 @@ >Select the Helm chart to use. Bring further Helm charts into your selection list via User settings - Helm repositories. - +
+
Select the Helm chart to use. Bring further Helm charts into your selection list via + User settings - Helm repositories.
+
+
+ + + + + +
+
+

Disclaimer

+
+ At present Portainer does not support OCI format Helm charts. Support for OCI charts will be available in a future release.
+ If you would like to provide feedback on OCI support or get access to early releases to test this functionality, + please get in touch. +
+
+
+
diff --git a/app/react/portainer/settings/SettingsView/KubeSettingsPanel/HelmSection.tsx b/app/react/portainer/settings/SettingsView/KubeSettingsPanel/HelmSection.tsx index 22790e781..e5d519174 100644 --- a/app/react/portainer/settings/SettingsView/KubeSettingsPanel/HelmSection.tsx +++ b/app/react/portainer/settings/SettingsView/KubeSettingsPanel/HelmSection.tsx @@ -4,6 +4,7 @@ import { TextTip } from '@@/Tip/TextTip'; import { FormControl } from '@@/form-components/FormControl'; import { FormSection } from '@@/form-components/FormSection'; import { Input } from '@@/form-components/Input'; +import { InsightsBox } from '@@/InsightsBox'; export function HelmSection() { const [{ name }, { error }] = useField('helmRepositoryUrl'); @@ -24,13 +25,34 @@ export function HelmSection() {
+ + At present Portainer does not support OCI format Helm charts. + Support for OCI charts will be available in a future release. If you + would like to provide feedback on OCI support or get access to early + releases to test this functionality,{' '} + + please get in touch + + . + + } + className="block w-fit mt-2 mb-1" + /> + diff --git a/pkg/libhelm/binary/install_test.go b/pkg/libhelm/binary/install_test.go index e3252e1f2..3d6c74707 100644 --- a/pkg/libhelm/binary/install_test.go +++ b/pkg/libhelm/binary/install_test.go @@ -53,11 +53,11 @@ func Test_Install(t *testing.T) { hbpm := NewHelmBinaryPackageManager(path) t.Run("successfully installs nginx chart with name test-nginx", func(t *testing.T) { - // helm install test-nginx --repo https://charts.bitnami.com/bitnami nginx + // helm install test-nginx --repo https://kubernetes.github.io/ingress-nginx nginx installOpts := options.InstallOptions{ Name: "test-nginx", Chart: "nginx", - Repo: "https://charts.bitnami.com/bitnami", + Repo: "https://kubernetes.github.io/ingress-nginx", } release, err := hbpm.Install(installOpts) @@ -67,10 +67,10 @@ func Test_Install(t *testing.T) { }) t.Run("successfully installs nginx chart with generated name", func(t *testing.T) { - // helm install --generate-name --repo https://charts.bitnami.com/bitnami nginx + // helm install --generate-name --repo https://kubernetes.github.io/ingress-nginx nginx installOpts := options.InstallOptions{ Chart: "nginx", - Repo: "https://charts.bitnami.com/bitnami", + Repo: "https://kubernetes.github.io/ingress-nginx", } release, err := hbpm.Install(installOpts) defer hbpm.run("uninstall", []string{release.Name}, nil) @@ -79,7 +79,7 @@ func Test_Install(t *testing.T) { }) t.Run("successfully installs nginx with values", func(t *testing.T) { - // helm install test-nginx-2 --repo https://charts.bitnami.com/bitnami nginx --values /tmp/helm-values3161785816 + // helm install test-nginx-2 --repo https://kubernetes.github.io/ingress-nginx nginx --values /tmp/helm-values3161785816 values, err := createValuesFile("service:\n port: 8081") is.NoError(err, "should create a values file") @@ -88,7 +88,7 @@ func Test_Install(t *testing.T) { installOpts := options.InstallOptions{ Name: "test-nginx-2", Chart: "nginx", - Repo: "https://charts.bitnami.com/bitnami", + Repo: "https://kubernetes.github.io/ingress-nginx", ValuesFile: values, } release, err := hbpm.Install(installOpts) diff --git a/pkg/libhelm/binary/search_repo_test.go b/pkg/libhelm/binary/search_repo_test.go index 4d5dd4d82..48786a0d7 100644 --- a/pkg/libhelm/binary/search_repo_test.go +++ b/pkg/libhelm/binary/search_repo_test.go @@ -22,7 +22,7 @@ func Test_SearchRepo(t *testing.T) { tests := []testCase{ {"not a helm repo", "https://portainer.io", true}, - {"bitnami helm repo", "https://charts.bitnami.com/bitnami", false}, + {"ingress helm repo", "https://kubernetes.github.io/ingress-nginx", false}, {"portainer helm repo", "https://portainer.github.io/k8s/", false}, {"gitlap helm repo with trailing slash", "https://charts.gitlab.io/", false}, {"elastic helm repo with trailing slash", "https://helm.elastic.co/", false}, diff --git a/pkg/libhelm/validate_repo_test.go b/pkg/libhelm/validate_repo_test.go index 7f81311ba..dce1257d0 100644 --- a/pkg/libhelm/validate_repo_test.go +++ b/pkg/libhelm/validate_repo_test.go @@ -26,7 +26,7 @@ func Test_ValidateHelmRepositoryURL(t *testing.T) { {"not helm repo", "http://google.com", true}, {"not valid repo with trailing slash", "http://google.com/", true}, {"not valid repo with trailing slashes", "http://google.com////", true}, - {"bitnami helm repo", "https://charts.bitnami.com/bitnami/", false}, + {"ingress helm repo", "https://kubernetes.github.io/ingress-nginx/", false}, {"gitlap helm repo", "https://charts.gitlab.io/", false}, {"portainer helm repo", "https://portainer.github.io/k8s/", false}, {"elastic helm repo", "https://helm.elastic.co/", false},