|
|
|
@ -30,6 +30,7 @@ import (
|
|
|
|
|
"github.com/Masterminds/sprig"
|
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
|
|
|
"k8s.io/cli-runtime/pkg/resource"
|
|
|
|
|
|
|
|
|
|
"helm.sh/helm/pkg/chart"
|
|
|
|
|
"helm.sh/helm/pkg/chartutil"
|
|
|
|
@ -104,19 +105,15 @@ func NewInstall(cfg *Configuration) *Install {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i *Install) installCRDs(crds []*chart.File) error {
|
|
|
|
|
// We do these one at a time in the order they were read.
|
|
|
|
|
// We do these one file at a time in the order they were read.
|
|
|
|
|
totalItems := []*resource.Info{}
|
|
|
|
|
for _, obj := range crds {
|
|
|
|
|
// Read in the resources
|
|
|
|
|
res, err := i.cfg.KubeClient.Build(bytes.NewBuffer(obj.Data))
|
|
|
|
|
if err != nil {
|
|
|
|
|
// We bail out immediately
|
|
|
|
|
return errors.Wrapf(err, "failed to install CRD %s", obj.Name)
|
|
|
|
|
}
|
|
|
|
|
// On dry run, bail here
|
|
|
|
|
if i.DryRun {
|
|
|
|
|
i.cfg.Log("WARNING: This chart or one of its subcharts contains CRDs. Rendering may fail or contain inaccuracies.")
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Send them to Kube
|
|
|
|
|
if _, err := i.cfg.KubeClient.Create(res); err != nil {
|
|
|
|
|
// If the error is CRD already exists, continue.
|
|
|
|
@ -127,23 +124,22 @@ func (i *Install) installCRDs(crds []*chart.File) error {
|
|
|
|
|
}
|
|
|
|
|
return errors.Wrapf(err, "failed to instal CRD %s", obj.Name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Invalidate the local cache.
|
|
|
|
|
if discoveryClient, err := i.cfg.RESTClientGetter.ToDiscoveryClient(); err != nil {
|
|
|
|
|
// On error, we don't want to bail out, since this is unlikely
|
|
|
|
|
// to impact the majority of charts.
|
|
|
|
|
i.cfg.Log("Could not clear the discovery cache: %s", err)
|
|
|
|
|
} else {
|
|
|
|
|
i.cfg.Log("Clearing discovery cache")
|
|
|
|
|
discoveryClient.Invalidate()
|
|
|
|
|
// Give time for the CRD to be recognized.
|
|
|
|
|
if err := i.cfg.KubeClient.Wait(res, 60*time.Second); err != nil {
|
|
|
|
|
i.cfg.Log("Error waiting for CRD. Continuing blindly. %s", err)
|
|
|
|
|
}
|
|
|
|
|
// Make sure to force a rebuild of the cache.
|
|
|
|
|
discoveryClient.ServerGroups()
|
|
|
|
|
}
|
|
|
|
|
totalItems = append(totalItems, res...)
|
|
|
|
|
}
|
|
|
|
|
// Invalidate the local cache, since it will not have the new CRDs
|
|
|
|
|
// present.
|
|
|
|
|
discoveryClient, err := i.cfg.RESTClientGetter.ToDiscoveryClient()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
i.cfg.Log("Clearing discovery cache")
|
|
|
|
|
discoveryClient.Invalidate()
|
|
|
|
|
// Give time for the CRD to be recognized.
|
|
|
|
|
if err := i.cfg.KubeClient.Wait(totalItems, 60*time.Second); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
// Make sure to force a rebuild of the cache.
|
|
|
|
|
discoveryClient.ServerGroups()
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -158,7 +154,10 @@ func (i *Install) Run(chrt *chart.Chart, vals map[string]interface{}) (*release.
|
|
|
|
|
// Pre-install anything in the crd/ directory. We do this before Helm
|
|
|
|
|
// contacts the upstream server and builds the capabilities object.
|
|
|
|
|
if crds := chrt.CRDs(); !i.ClientOnly && !i.SkipCRDs && len(crds) > 0 {
|
|
|
|
|
if err := i.installCRDs(crds); err != nil {
|
|
|
|
|
// On dry run, bail here
|
|
|
|
|
if i.DryRun {
|
|
|
|
|
i.cfg.Log("WARNING: This chart or one of its subcharts contains CRDs. Rendering may fail or contain inaccuracies.")
|
|
|
|
|
} else if err := i.installCRDs(crds); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|