diff --git a/pkg/deploy/deployment.go b/pkg/deploy/deployment.go index 7b5066d84..8340d9ae8 100644 --- a/pkg/deploy/deployment.go +++ b/pkg/deploy/deployment.go @@ -59,9 +59,16 @@ func SyncDeploymentSpecToCluster( done, err := Sync(deployContext, deploymentSpec, deploymentDiffOpts) if err != nil || !done { + // Failed to sync (update), let's delete and create instead + if err != nil && strings.Contains(err.Error(), "field is immutable") { + if _, err := DeleteNamespacedObject(deployContext, deploymentSpec.Name, &appsv1.Deployment{}); err != nil { + return false, err + } + + // Deleted successfully, return original error + return false, err + } return false, err - } else if !done { - return util.IsTestMode(), nil } // always return true for tests diff --git a/pkg/deploy/gateway/gateway.go b/pkg/deploy/gateway/gateway.go index e9d8999d0..cd5de7c3b 100644 --- a/pkg/deploy/gateway/gateway.go +++ b/pkg/deploy/gateway/gateway.go @@ -16,6 +16,7 @@ import ( "encoding/base64" "fmt" "io/ioutil" + "strings" "k8s.io/apimachinery/pkg/api/resource" @@ -138,6 +139,15 @@ func syncAll(deployContext *deploy.DeployContext) error { depl := getGatewayDeploymentSpec(deployContext) if _, err := deploy.Sync(deployContext, &depl, deploy.DefaultDeploymentDiffOpts); err != nil { + // Failed to sync (update), let's delete and create instead + if strings.Contains(err.Error(), "field is immutable") { + if _, err := deploy.DeleteNamespacedObject(deployContext, depl.Name, &appsv1.Deployment{}); err != nil { + return err + } + + // Deleted successfully, return original error + return err + } return err }