mirror of
https://github.com/helm/helm.git
synced 2026-05-28 04:35:48 -04:00
fix(action): avoid nil REST client getter panic when installing CRDs
Signed-off-by: sergiochan <yuheng9211@qq.com>
This commit is contained in:
parent
6d809b20f1
commit
711a4eaf40
2 changed files with 47 additions and 23 deletions
|
|
@ -186,32 +186,34 @@ func (i *Install) installCRDs(crds []chart.CRD) error {
|
|||
return err
|
||||
}
|
||||
|
||||
// If we have already gathered the capabilities, we need to invalidate
|
||||
// the cache so that the new CRDs are recognized. This should only be
|
||||
// the case when an action configuration is reused for multiple actions,
|
||||
// as otherwise it is later loaded by ourselves when getCapabilities
|
||||
// is called later on in the installation process.
|
||||
if i.cfg.Capabilities != nil {
|
||||
discoveryClient, err := i.cfg.RESTClientGetter.ToDiscoveryClient()
|
||||
if i.cfg.RESTClientGetter != nil {
|
||||
// If we have already gathered the capabilities, we need to invalidate
|
||||
// the cache so that the new CRDs are recognized. This should only be
|
||||
// the case when an action configuration is reused for multiple actions,
|
||||
// as otherwise it is later loaded by ourselves when getCapabilities
|
||||
// is called later on in the installation process.
|
||||
if i.cfg.Capabilities != nil {
|
||||
discoveryClient, err := i.cfg.RESTClientGetter.ToDiscoveryClient()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if discoveryClient != nil {
|
||||
i.cfg.Log("Clearing discovery cache")
|
||||
discoveryClient.Invalidate()
|
||||
_, _ = discoveryClient.ServerGroups()
|
||||
}
|
||||
}
|
||||
|
||||
// Invalidate the REST mapper, since it will not have the new CRDs
|
||||
// present.
|
||||
restMapper, err := i.cfg.RESTClientGetter.ToRESTMapper()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
i.cfg.Log("Clearing discovery cache")
|
||||
discoveryClient.Invalidate()
|
||||
|
||||
_, _ = discoveryClient.ServerGroups()
|
||||
}
|
||||
|
||||
// Invalidate the REST mapper, since it will not have the new CRDs
|
||||
// present.
|
||||
restMapper, err := i.cfg.RESTClientGetter.ToRESTMapper()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if resettable, ok := restMapper.(meta.ResettableRESTMapper); ok {
|
||||
i.cfg.Log("Clearing REST mapper cache")
|
||||
resettable.Reset()
|
||||
if resettable, ok := restMapper.(meta.ResettableRESTMapper); ok {
|
||||
i.cfg.Log("Clearing REST mapper cache")
|
||||
resettable.Reset()
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
|
|
|||
|
|
@ -894,6 +894,28 @@ func TestNameAndChartGenerateName(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestInstallCRDsWithNilRESTClientGetter(t *testing.T) {
|
||||
config := actionConfigFixture(t)
|
||||
failingKubeClient := kubefake.FailingKubeClient{PrintingKubeClient: kubefake.PrintingKubeClient{Out: io.Discard}, BuildDummy: true}
|
||||
config.KubeClient = &failingKubeClient
|
||||
config.RESTClientGetter = nil
|
||||
instAction := NewInstall(config)
|
||||
|
||||
crds := []chart.CRD{{
|
||||
Name: "test-crd",
|
||||
File: &chart.File{
|
||||
Name: "crds/test-crd.yaml",
|
||||
Data: []byte("kind: CustomResourceDefinition"),
|
||||
},
|
||||
}}
|
||||
|
||||
var err error
|
||||
require.NotPanics(t, func() {
|
||||
err = instAction.installCRDs(crds)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestInstallWithLabels(t *testing.T) {
|
||||
is := assert.New(t)
|
||||
instAction := installAction(t)
|
||||
|
|
|
|||
Loading…
Reference in a new issue