diff --git a/pkg/k8s/deployer.go b/pkg/k8s/deployer.go index 1412d7ba96..1341515ac8 100644 --- a/pkg/k8s/deployer.go +++ b/pkg/k8s/deployer.go @@ -147,11 +147,19 @@ func (d *Deployer) Deploy(ctx context.Context, f fn.Function) (fn.DeploymentResu var status fn.Status if err == nil { // Update the existing function - deployment, err := d.generateDeployment(f, namespace, daprInstalled) + referencedSecrets := sets.New[string]() + referencedConfigMaps := sets.New[string]() + referencedPVCs := sets.New[string]() + + deployment, err := d.generateDeployment(f, namespace, daprInstalled, &referencedSecrets, &referencedConfigMaps, &referencedPVCs) if err != nil { return fn.DeploymentResult{}, fmt.Errorf("failed to generate deployment resources: %w", err) } + if err = CheckResourcesArePresent(ctx, namespace, &referencedSecrets, &referencedConfigMaps, &referencedPVCs, f.Deploy.ServiceAccountName, f.Deploy.ImagePullSecret); err != nil { + return fn.DeploymentResult{}, fmt.Errorf("failed to validate referenced resources: %w", err) + } + svc, err := d.generateService(f, namespace, daprInstalled, existingDeployment) if err != nil { return fn.DeploymentResult{}, fmt.Errorf("failed to generate service resources: %w", err) @@ -188,11 +196,19 @@ func (d *Deployer) Deploy(ctx context.Context, f fn.Function) (fn.DeploymentResu return fn.DeploymentResult{}, fmt.Errorf("failed to check for existing deployment: %w", err) } - deployment, err := d.generateDeployment(f, namespace, daprInstalled) + referencedSecrets := sets.New[string]() + referencedConfigMaps := sets.New[string]() + referencedPVCs := sets.New[string]() + + deployment, err := d.generateDeployment(f, namespace, daprInstalled, &referencedSecrets, &referencedConfigMaps, &referencedPVCs) if err != nil { return fn.DeploymentResult{}, fmt.Errorf("failed to generate deployment resources: %w", err) } + if err = CheckResourcesArePresent(ctx, namespace, &referencedSecrets, &referencedConfigMaps, &referencedPVCs, f.Deploy.ServiceAccountName, f.Deploy.ImagePullSecret); err != nil { + return fn.DeploymentResult{}, fmt.Errorf("failed to validate referenced resources: %w", err) + } + deployment, err = deploymentClient.Create(ctx, deployment, metav1.CreateOptions{}) if err != nil { return fn.DeploymentResult{}, fmt.Errorf("failed to create deployment: %w", err) @@ -363,7 +379,7 @@ func deleteStaleTriggers(ctx context.Context, eventingClient clienteventingv1.Kn return nil } -func (d *Deployer) generateDeployment(f fn.Function, namespace string, daprInstalled bool) (*appsv1.Deployment, error) { +func (d *Deployer) generateDeployment(f fn.Function, namespace string, daprInstalled bool, referencedSecrets, referencedConfigMaps, referencedPVCs *sets.Set[string]) (*appsv1.Deployment, error) { labels, err := deployer.GenerateCommonLabels(f, d.decorator) if err != nil { return nil, err @@ -375,17 +391,12 @@ func (d *Deployer) generateDeployment(f fn.Function, namespace string, daprInsta podAnnotations := make(map[string]string) maps.Copy(podAnnotations, annotations) - // Process environment variables and volumes - referencedSecrets := sets.New[string]() - referencedConfigMaps := sets.New[string]() - referencedPVCs := sets.New[string]() - - envVars, envFrom, err := ProcessEnvs(f.Run.Envs, &referencedSecrets, &referencedConfigMaps) + envVars, envFrom, err := ProcessEnvs(f.Run.Envs, referencedSecrets, referencedConfigMaps) if err != nil { return nil, fmt.Errorf("failed to process environment variables: %w", err) } - volumes, volumeMounts, err := ProcessVolumes(f.Run.Volumes, &referencedSecrets, &referencedConfigMaps, &referencedPVCs) + volumes, volumeMounts, err := ProcessVolumes(f.Run.Volumes, referencedSecrets, referencedConfigMaps, referencedPVCs) if err != nil { return nil, fmt.Errorf("failed to process volumes: %w", err) } diff --git a/pkg/k8s/deployer_int_test.go b/pkg/k8s/deployer_int_test.go index fdc4d6ab8f..950d7822d0 100644 --- a/pkg/k8s/deployer_int_test.go +++ b/pkg/k8s/deployer_int_test.go @@ -59,3 +59,11 @@ func TestInt_EnvsUpdate(t *testing.T) { k8s.NewDescriber(false), k8s.KubernetesDeployerName) } + +func TestInt_ResourceValidationOnFirstDeploy(t *testing.T) { + deployertesting.TestInt_ResourceValidationOnFirstDeploy(t, + k8s.NewDeployer(k8s.WithDeployerVerbose(false)), + k8s.NewRemover(false), + k8s.NewDescriber(false), + k8s.KubernetesDeployerName) +} diff --git a/pkg/k8s/deployer_test.go b/pkg/k8s/deployer_test.go index 52611baaa3..ec48829493 100644 --- a/pkg/k8s/deployer_test.go +++ b/pkg/k8s/deployer_test.go @@ -5,6 +5,7 @@ import ( "testing" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/sets" fn "knative.dev/func/pkg/functions" ) @@ -120,7 +121,8 @@ func Test_generateDeployment_ImagePullSecret(t *testing.T) { ImagePullSecret: "my-registry-secret", }, } - deployment, err := d.generateDeployment(f, "default", false) + rs, rcm, rpvc := sets.New[string](), sets.New[string](), sets.New[string]() + deployment, err := d.generateDeployment(f, "default", false, &rs, &rcm, &rpvc) if err != nil { t.Fatal(err) } @@ -137,7 +139,8 @@ func Test_generateDeployment_ImagePullSecret(t *testing.T) { Image: "registry.example.com/test:latest", }, } - deployment, err := d.generateDeployment(f, "default", false) + rs, rcm, rpvc := sets.New[string](), sets.New[string](), sets.New[string]() + deployment, err := d.generateDeployment(f, "default", false, &rs, &rcm, &rpvc) if err != nil { t.Fatal(err) } diff --git a/pkg/keda/deployer_int_test.go b/pkg/keda/deployer_int_test.go index b21f191612..72277df803 100644 --- a/pkg/keda/deployer_int_test.go +++ b/pkg/keda/deployer_int_test.go @@ -59,3 +59,11 @@ func TestInt_EnvsUpdate(t *testing.T) { keda.NewDescriber(false), keda.KedaDeployerName) } + +func TestInt_ResourceValidationOnFirstDeploy(t *testing.T) { + deployertesting.TestInt_ResourceValidationOnFirstDeploy(t, + keda.NewDeployer(keda.WithDeployerVerbose(false)), + keda.NewRemover(false), + keda.NewDescriber(false), + keda.KedaDeployerName) +}