diff --git a/client.go b/client.go index 166ad656..ac0f9c9f 100644 --- a/client.go +++ b/client.go @@ -10,6 +10,8 @@ import ( "reflect" "strings" + "k8s.io/apimachinery/pkg/api/errors" + "github.com/spf13/pflag" "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/chart" @@ -573,14 +575,37 @@ func (c *HelmClient) upgradeCRD(ctx context.Context, k8sClient *clientset.Client } } +func (c *HelmClient) createCRDV1(ctx context.Context, cl *clientset.Clientset, crd *v1.CustomResourceDefinition) error { + if _, err := cl.ApiextensionsV1().CustomResourceDefinitions().Create(ctx, crd, metav1.CreateOptions{}); err != nil { + return err + } + + c.DebugLog("create ran successful for CRD: %s", crd.Name) + return nil +} + +func (c *HelmClient) createCRDV1Beta1(ctx context.Context, cl *clientset.Clientset, crd *v1beta1.CustomResourceDefinition) error { + if _, err := cl.ApiextensionsV1beta1().CustomResourceDefinitions().Create(ctx, crd, metav1.CreateOptions{}); err != nil { + return err + } + + c.DebugLog("create ran successful for CRD: %s", crd.Name) + return nil +} + // upgradeCRDV1Beta1 upgrades a CRD of the v1beta1 API version using the provided k8s client and CRD yaml. func (c *HelmClient) upgradeCRDV1Beta1(ctx context.Context, cl *clientset.Clientset, rawCRD []byte) error { var crdObj v1beta1.CustomResourceDefinition if err := json.Unmarshal(rawCRD, &crdObj); err != nil { return err } + existingCRDObj, err := cl.ApiextensionsV1beta1().CustomResourceDefinitions().Get(ctx, crdObj.Name, metav1.GetOptions{}) if err != nil { + if errors.IsNotFound(err) { + return c.createCRDV1Beta1(ctx, cl, &crdObj) + } + return err } @@ -635,6 +660,10 @@ func (c *HelmClient) upgradeCRDV1(ctx context.Context, cl *clientset.Clientset, existingCRDObj, err := cl.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, crdObj.Name, metav1.GetOptions{}) if err != nil { + if errors.IsNotFound(err) { + return c.createCRDV1(ctx, cl, &crdObj) + } + return err } diff --git a/client_test.go b/client_test.go index 7fc5a3b7..3020a315 100644 --- a/client_test.go +++ b/client_test.go @@ -3,6 +3,7 @@ package helmclient import ( "bytes" "context" + "helm.sh/helm/v3/pkg/repo" "k8s.io/client-go/rest" )