Skip to content

Commit d2d5bc2

Browse files
committed
fix(profile): use server-side apply for namespace creation
Operators may pre-create namespaces during startup, causing Pulumi NewNamespace to fail with already exists. Switch all profile namespace creation to NewNamespacePatch (SSA) which handles both cases and extract a shared newNamespace helper to reduce duplication.
1 parent 4b39885 commit d2d5bc2

5 files changed

Lines changed: 19 additions & 43 deletions

File tree

pkg/target/service/snc/profile/operator.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"time"
66

77
"github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/apiextensions"
8-
corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
98
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
109
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
1110
)
@@ -69,13 +68,7 @@ func installOperator(ctx *pulumi.Context, args *DeployArgs, oi operatorInstall)
6968
if nsName == nil {
7069
nsName = pulumi.String(oi.namespace)
7170
}
72-
ns, err := corev1.NewNamespace(ctx, oi.resourcePrefix+"ns",
73-
&corev1.NamespaceArgs{
74-
Metadata: &metav1.ObjectMetaArgs{
75-
Name: nsName,
76-
},
77-
},
78-
args.k8sOpts(pulumi.DependsOn(deps))...)
71+
ns, err := args.newNamespace(ctx, oi.resourcePrefix+"ns", nsName, pulumi.DependsOn(deps))
7972
if err != nil {
8073
return pulumi.StringOutput{}, err
8174
}

pkg/target/service/snc/profile/profile.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"slices"
77

88
"github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes"
9+
corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
10+
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
911
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
1012
)
1113

@@ -180,6 +182,18 @@ func GPUManufacturer(profiles []string) string {
180182
return ""
181183
}
182184

185+
// newNamespace creates (or adopts) a Kubernetes namespace using server-side
186+
// apply so the call succeeds even if the namespace already exists.
187+
func (a *DeployArgs) newNamespace(ctx *pulumi.Context, name string, nsName pulumi.StringInput, extra ...pulumi.ResourceOption) (*corev1.NamespacePatch, error) {
188+
return corev1.NewNamespacePatch(ctx, name,
189+
&corev1.NamespacePatchArgs{
190+
Metadata: &metav1.ObjectMetaPatchArgs{
191+
Name: nsName,
192+
},
193+
},
194+
a.k8sOpts(extra...)...)
195+
}
196+
183197
// k8sOpts returns the common Pulumi resource options for K8s resources:
184198
// the K8s provider and (when set) the DeletedWith option. Extra options
185199
// (e.g. DependsOn) can be appended.

pkg/target/service/snc/profile/serverless.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"time"
66

77
"github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/apiextensions"
8-
corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
98
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
109
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
1110
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -96,14 +95,7 @@ func deployKnativeCR(ctx *pulumi.Context, args *DeployArgs, operatorReady pulumi
9695
return cr.namespace
9796
}).(pulumi.StringOutput)
9897

99-
// Create target namespace
100-
ns, err := corev1.NewNamespace(ctx, rn(cr.suffix+"-ns"),
101-
&corev1.NamespaceArgs{
102-
Metadata: &metav1.ObjectMetaArgs{
103-
Name: nsName,
104-
},
105-
},
106-
args.k8sOpts(pulumi.DependsOn(args.Deps))...)
98+
ns, err := args.newNamespace(ctx, rn(cr.suffix+"-ns"), nsName, pulumi.DependsOn(args.Deps))
10799
if err != nil {
108100
return nil, pulumi.StringOutput{}, err
109101
}

pkg/target/service/snc/profile/servicemesh.go

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"time"
66

77
"github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/apiextensions"
8-
corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
98
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
109
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
1110
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -35,26 +34,12 @@ func deployServiceMesh(ctx *pulumi.Context, args *DeployArgs) (pulumi.Resource,
3534
return fmt.Sprintf("%s-smesh-%s", args.Prefix, suffix)
3635
}
3736

38-
// Create istio-system namespace
39-
nsSystem, err := corev1.NewNamespace(ctx, rn("ns-system"),
40-
&corev1.NamespaceArgs{
41-
Metadata: &metav1.ObjectMetaArgs{
42-
Name: pulumi.String(istioSystemNamespace),
43-
},
44-
},
45-
args.k8sOpts(pulumi.DependsOn(args.Deps))...)
37+
nsSystem, err := args.newNamespace(ctx, rn("ns-system"), pulumi.String(istioSystemNamespace), pulumi.DependsOn(args.Deps))
4638
if err != nil {
4739
return nil, err
4840
}
4941

50-
// Create istio-cni namespace
51-
nsCNI, err := corev1.NewNamespace(ctx, rn("ns-cni"),
52-
&corev1.NamespaceArgs{
53-
Metadata: &metav1.ObjectMetaArgs{
54-
Name: pulumi.String(istioCNINamespace),
55-
},
56-
},
57-
args.k8sOpts(pulumi.DependsOn(args.Deps))...)
42+
nsCNI, err := args.newNamespace(ctx, rn("ns-cni"), pulumi.String(istioCNINamespace), pulumi.DependsOn(args.Deps))
5843
if err != nil {
5944
return nil, err
6045
}

pkg/target/service/snc/profile/servicemesh_v2.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"time"
66

77
"github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/apiextensions"
8-
corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
98
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
109
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
1110
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -29,14 +28,7 @@ func deployServiceMeshV2(ctx *pulumi.Context, args *DeployArgs) (pulumi.Resource
2928
return fmt.Sprintf("%s-smeshv2-%s", args.Prefix, suffix)
3029
}
3130

32-
// Create istio-system namespace
33-
ns, err := corev1.NewNamespace(ctx, rn("ns"),
34-
&corev1.NamespaceArgs{
35-
Metadata: &metav1.ObjectMetaArgs{
36-
Name: pulumi.String(istioSystemNamespace),
37-
},
38-
},
39-
args.k8sOpts(pulumi.DependsOn(args.Deps))...)
31+
ns, err := args.newNamespace(ctx, rn("ns"), pulumi.String(istioSystemNamespace), pulumi.DependsOn(args.Deps))
4032
if err != nil {
4133
return nil, pulumi.StringOutput{}, err
4234
}

0 commit comments

Comments
 (0)