Skip to content
Snippets Groups Projects
Commit 2efa83f4 authored by Jason Plum's avatar Jason Plum :coffee:
Browse files

Merge branch 'hp-use-cluster-capabilities' into 'master'

Discover cluster capabilities and use them in chart

Closes #1304 and #1293

See merge request !644



Merged-by: default avatarJason Plum <jplum@gitlab.com>
Approved-by: default avatarJason Plum <jplum@gitlab.com>
Co-authored-by: default avatarHossein Pursultani <hpursultani@gitlab.com>

(cherry picked from commit 3a036e8d)

7daf0b8e Discover cluster capabilities and use them in chart
parent b036671f
No related branches found
No related tags found
1 merge request!646Merge branch 'hp-use-cluster-capabilities' into '0-21-stable'
Pipeline #923254984 waiting for manual action
...@@ -3,11 +3,16 @@ package settings ...@@ -3,11 +3,16 @@ package settings
import ( import (
"fmt" "fmt"
"github.com/pkg/errors"
"helm.sh/helm/v3/pkg/action"
"helm.sh/helm/v3/pkg/chartutil" "helm.sh/helm/v3/pkg/chartutil"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery" "k8s.io/client-go/discovery"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/client/config"
) )
...@@ -90,11 +95,30 @@ func IsGroupVersionKindSupported(groupVersion, kind string) bool { ...@@ -90,11 +95,30 @@ func IsGroupVersionKindSupported(groupVersion, kind string) bool {
return false return false
} }
func GetKubeAPIVersions() chartutil.VersionSet { func GetKubeCapabilities(actionCfg *action.Configuration) (*chartutil.Capabilities, error) {
// To force the Helm Chart to use `networking.k8s.io/v1` Ingress objects. dc, err := actionCfg.RESTClientGetter.ToDiscoveryClient()
networkingAPIVersion := "networking.k8s.io/v1/Ingress" if err != nil {
return nil, errors.Wrap(err, "could not get Kubernetes discovery client")
}
dc.Invalidate()
return chartutil.VersionSet{ kubeVersion, err := dc.ServerVersion()
networkingAPIVersion, if err != nil {
return nil, errors.Wrap(err, "could not get server version from Kubernetes")
} }
apiVersions, err := action.GetVersionSet(dc)
if err != nil && !discovery.IsGroupDiscoveryFailedError(err) {
return nil, errors.Wrap(err, "could not get apiVersions from Kubernetes")
}
return &chartutil.Capabilities{
APIVersions: apiVersions,
KubeVersion: chartutil.KubeVersion{
Version: kubeVersion.GitVersion,
Major: kubeVersion.Major,
Minor: kubeVersion.Minor,
},
}, nil
} }
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
"strings"
"helm.sh/helm/v3/pkg/chartutil" "helm.sh/helm/v3/pkg/chartutil"
) )
...@@ -54,7 +55,8 @@ var ( ...@@ -54,7 +55,8 @@ var (
HealthzCheck = func(_ *http.Request) error { return AliveStatus } HealthzCheck = func(_ *http.Request) error { return AliveStatus }
ReadyzCheck = func(_ *http.Request) error { return ReadyStatus } ReadyzCheck = func(_ *http.Request) error { return ReadyStatus }
KubeVersion *chartutil.KubeVersion = nil DefaultKubeVersion *chartutil.KubeVersion = nil
DefaultKubeAPIVersions chartutil.VersionSet = chartutil.VersionSet{}
) )
const ( const (
...@@ -64,6 +66,7 @@ const ( ...@@ -64,6 +66,7 @@ const (
envAppNonRootServiceAccount = "GITLAB_APP_NONROOT_SERVICE_ACCOUNT" envAppNonRootServiceAccount = "GITLAB_APP_NONROOT_SERVICE_ACCOUNT"
envNGINXServiceAccount = "NGINX_SERVICE_ACCOUNT" envNGINXServiceAccount = "NGINX_SERVICE_ACCOUNT"
envKubeVersion = "GITLAB_OPERATOR_KUBERNETES_VERSION" envKubeVersion = "GITLAB_OPERATOR_KUBERNETES_VERSION"
envKubeAPIVersions = "GITLAB_OPERATOR_KUBERNETES_API_VERSIONS"
) )
// Load reads Operator settings from environment variables. // Load reads Operator settings from environment variables.
...@@ -95,6 +98,11 @@ func Load() { ...@@ -95,6 +98,11 @@ func Load() {
kubeVersionStr := os.Getenv(envKubeVersion) kubeVersionStr := os.Getenv(envKubeVersion)
if kubeVersionStr != "" { if kubeVersionStr != "" {
KubeVersion, _ = chartutil.ParseKubeVersion(kubeVersionStr) DefaultKubeVersion, _ = chartutil.ParseKubeVersion(kubeVersionStr)
}
kubeAPIVersionsStr := os.Getenv(envKubeAPIVersions)
if kubeAPIVersionsStr != "" {
DefaultKubeAPIVersions = strings.Split(kubeAPIVersionsStr, ",")
} }
} }
...@@ -4,10 +4,12 @@ import ( ...@@ -4,10 +4,12 @@ import (
"fmt" "fmt"
"github.com/pkg/errors" "github.com/pkg/errors"
"helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/action"
"helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/cli"
"helm.sh/helm/v3/pkg/releaseutil" "helm.sh/helm/v3/pkg/releaseutil"
"k8s.io/kubectl/pkg/scheme" "k8s.io/kubectl/pkg/scheme"
"gitlab.com/gitlab-org/cloud-native/gitlab-operator/controllers/settings" "gitlab.com/gitlab-org/cloud-native/gitlab-operator/controllers/settings"
...@@ -63,12 +65,20 @@ func NewBuilder(charts charts.Catalog) (Builder, error) { ...@@ -63,12 +65,20 @@ func NewBuilder(charts charts.Catalog) (Builder, error) {
return nil, err return nil, err
} }
kubeVersion := settings.DefaultKubeVersion
kubeAPIVersions := settings.DefaultKubeAPIVersions
if capabilities, err := settings.GetKubeCapabilities(actionConfig); err == nil {
kubeVersion = &capabilities.KubeVersion
kubeAPIVersions = capabilities.APIVersions
}
client := action.NewInstall(actionConfig) client := action.NewInstall(actionConfig)
client.DryRun = true client.DryRun = true
client.Replace = true client.Replace = true
client.ClientOnly = true client.ClientOnly = true
client.KubeVersion = settings.KubeVersion client.KubeVersion = kubeVersion
client.APIVersions = settings.GetKubeAPIVersions() client.APIVersions = kubeAPIVersions
chart := charts.First() chart := charts.First()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment