diff --git a/pkg/action/validate.go b/pkg/action/validate.go index 81ca08dc0..5c8b91f70 100644 --- a/pkg/action/validate.go +++ b/pkg/action/validate.go @@ -23,12 +23,26 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/cli-runtime/pkg/resource" "helm.sh/helm/v3/pkg/kube" ) -var accessor = meta.NewAccessor() +var ( + accessor = meta.NewAccessor() + + provisioningClusterGVK = schema.GroupVersionKind{ + Group: "provisioning.cattle.io", + Version: "v1", + Kind: "Cluster", + } + + MachineConfigGV = schema.GroupVersion{ + Group: "rke-machine-config.cattle.io", + Version: "v1", + } +) const ( appManagedByLabel = "app.kubernetes.io/managed-by" @@ -73,7 +87,7 @@ func existingResourceConflict(resources kube.ResourceList, releaseName, releaseN helper := resource.NewHelper(info.Client, info.Mapping) existing, err := helper.Get(info.Namespace, info.Name) if err != nil { - if apierrors.IsNotFound(err) { + if apierrors.IsNotFound(err) || shouldIgnore(info, err) { return nil } return errors.Wrapf(err, "could not get information about the resource %s", resourceString(info)) @@ -93,6 +107,20 @@ func existingResourceConflict(resources kube.ResourceList, releaseName, releaseN return requireUpdate, err } +// If resource is cluster.provisioning.cattle.io or *.rke-machine-config.cattle.io, we should ignore permission error. +// This is because standard user in rancher won't have the permission to check it until they have created it. Issue: https://github.com/rancher/rancher/issues/34277#issuecomment-901308458 +func shouldIgnore(info *resource.Info, err error) bool { + if info.Mapping != nil { + if info.Mapping.GroupVersionKind == provisioningClusterGVK || info.Mapping.GroupVersionKind.GroupVersion() == MachineConfigGV { + if apierrors.IsForbidden(err) { + return true + } + } + } + + return false +} + func checkOwnership(obj runtime.Object, releaseName, releaseNamespace string) error { lbls, err := accessor.Labels(obj) if err != nil {