Skip to content

Commit 281ac3f

Browse files
committed
fix: allow multiple namespace deploy
1 parent 8f166b4 commit 281ac3f

13 files changed

Lines changed: 132 additions & 44 deletions

File tree

e2e/tests/deploy/deploy.go

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,51 @@ var _ = DevSpaceDescribe("deploy", func() {
3636
})
3737

3838
ginkgo.It("should deploy kustomize application", func() {
39-
// TODO
39+
tempDir, err := framework.CopyToTempDir("tests/deploy/testdata/kustomize")
40+
framework.ExpectNoError(err)
41+
defer framework.CleanupTempDir(initialDir, tempDir)
42+
43+
ns, err := kubeClient.CreateNamespace("deploy")
44+
framework.ExpectNoError(err)
45+
defer func() {
46+
err := kubeClient.DeleteNamespace(ns)
47+
framework.ExpectNoError(err)
48+
}()
49+
50+
// create a new deploy command
51+
deployCmd := &cmd.RunPipelineCmd{
52+
GlobalFlags: &flags.GlobalFlags{
53+
NoWarn: true,
54+
Namespace: ns,
55+
},
56+
Pipeline: "deploy",
57+
}
58+
59+
// run the command
60+
err = deployCmd.RunDefault(f)
61+
framework.ExpectNoError(err)
62+
63+
// check if services are there
64+
service, err := kubeClient.RawClient().CoreV1().Services(ns).Get(context.TODO(), "my-service", metav1.GetOptions{})
65+
framework.ExpectNoError(err)
66+
framework.ExpectEqual(service.Labels["kustomize-app"], "devspace")
67+
68+
// create a new purge command
69+
purgeCmd := &cmd.RunPipelineCmd{
70+
GlobalFlags: &flags.GlobalFlags{
71+
NoWarn: true,
72+
Namespace: ns,
73+
},
74+
Pipeline: "purge",
75+
}
76+
77+
// run the command
78+
err = purgeCmd.RunDefault(f)
79+
framework.ExpectNoError(err)
80+
81+
// check if services are there
82+
_, err = kubeClient.RawClient().CoreV1().Services(ns).Get(context.TODO(), "my-service", metav1.GetOptions{})
83+
framework.ExpectError(err)
4084
})
4185

4286
ginkgo.It("should deploy multiple namespaces", func() {

e2e/tests/deploy/testdata/different_namespaces/devspace.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ vars:
77

88
deployments:
99
helm:
10-
namespace: ""
1110
helm:
1211
chart:
1312
path: chart
@@ -16,7 +15,6 @@ deployments:
1615
namespace2: ${NAMESPACE2}
1716

1817
kubectl:
19-
namespace: ""
2018
kubectl:
2119
manifests:
2220
- kube
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
version: v2beta1
2+
3+
deployments:
4+
my-deployment:
5+
kubectl:
6+
kustomize: true
7+
manifests:
8+
- kube
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
commonLabels:
2+
kustomize-app: devspace
3+
4+
resources:
5+
- service.yaml
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
kind: Service
2+
apiVersion: v1
3+
metadata:
4+
name: my-service
5+
spec:
6+
selector:
7+
app.kubernetes.io/component: default
8+
ports:
9+
- protocol: TCP
10+
port: 3000

pkg/devspace/config/versions/latest/schema.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ type DeploymentConfig struct {
587587
// Name of the deployment
588588
Name string `yaml:"name,omitempty" json:"name,omitempty"`
589589
// Namespace where to deploy this deployment
590-
Namespace *string `yaml:"namespace,omitempty" json:"namespace,omitempty"`
590+
Namespace string `yaml:"namespace,omitempty" json:"namespace,omitempty"`
591591
// UpdateImageTags lets you define if DevSpace should update the tags of the images defined in the
592592
// images section with their most recent built tag.
593593
UpdateImageTags *bool `yaml:"updateImageTags,omitempty" json:"updateImageTags,omitempty"`

pkg/devspace/config/versions/v1beta11/upgrade.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,8 @@ func (c *Config) Upgrade(log log.Logger) (config.Config, error) {
415415

416416
name := encoding.Convert(deployment.Name)
417417
nextConfig.Deployments[name] = &next.DeploymentConfig{
418-
Name: name,
419-
}
420-
if deployment.Namespace != "" {
421-
nextConfig.Deployments[name].Namespace = &deployment.Namespace
418+
Name: name,
419+
Namespace: deployment.Namespace,
422420
}
423421
if deployment.Helm != nil {
424422
nextConfig.Deployments[name].Helm = &next.HelmConfig{

pkg/devspace/deploy/deploy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ func (c *controller) deployOne(ctx devspacecontext.Context, deployConfig *latest
171171
method string
172172
)
173173

174-
if !options.Render && deployConfig.Namespace != nil && *deployConfig.Namespace != "" {
175-
err = kubectlclient.EnsureNamespace(ctx.Context(), ctx.KubeClient(), *deployConfig.Namespace, ctx.Log())
174+
if !options.Render && deployConfig.Namespace != "" {
175+
err = kubectlclient.EnsureNamespace(ctx.Context(), ctx.KubeClient(), deployConfig.Namespace, ctx.Log())
176176
if err != nil {
177177
return false, err
178178
}

pkg/devspace/deploy/deployer/helm/deploy.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ func (d *DeployConfig) Deploy(ctx devspacecontext.Context, forceDeploy bool) (bo
3333
)
3434

3535
releaseNamespace := ctx.KubeClient().Namespace()
36-
if d.DeploymentConfig.Namespace != nil && *d.DeploymentConfig.Namespace != "" {
37-
releaseNamespace = *d.DeploymentConfig.Namespace
36+
if d.DeploymentConfig.Namespace != "" {
37+
releaseNamespace = d.DeploymentConfig.Namespace
3838
}
3939

4040
// Hash the chart directory if there is any
@@ -155,8 +155,8 @@ func (d *DeployConfig) internalDeploy(ctx devspacecontext.Context, overwriteValu
155155
releaseName = d.DeploymentConfig.Name
156156
)
157157
releaseNamespace := ctx.KubeClient().Namespace()
158-
if d.DeploymentConfig.Namespace != nil && *d.DeploymentConfig.Namespace != "" {
159-
releaseNamespace = *d.DeploymentConfig.Namespace
158+
if d.DeploymentConfig.Namespace != "" {
159+
releaseNamespace = d.DeploymentConfig.Namespace
160160
}
161161

162162
if out != nil {

pkg/devspace/deploy/deployer/kubectl/builder.go

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ package kubectl
33
import (
44
"context"
55
"fmt"
6+
"io/ioutil"
7+
"k8s.io/client-go/tools/clientcmd"
8+
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
9+
"os"
610
"os/exec"
711
"regexp"
812
"strings"
@@ -56,21 +60,17 @@ func (k *kustomizeBuilder) Build(ctx context.Context, dir, manifest string) ([]*
5660
}
5761

5862
type kubectlBuilder struct {
59-
path string
60-
config *latest.DeploymentConfig
61-
context string
62-
namespace string
63-
isInCluster bool
63+
path string
64+
config *latest.DeploymentConfig
65+
kubeConfig clientcmdapi.Config
6466
}
6567

6668
// NewKubectlBuilder creates a new kubectl manifest builder
67-
func NewKubectlBuilder(path string, config *latest.DeploymentConfig, context, namespace string, isInCluster bool) Builder {
69+
func NewKubectlBuilder(path string, config *latest.DeploymentConfig, kubeConfig clientcmdapi.Config) Builder {
6870
return &kubectlBuilder{
69-
path: path,
70-
config: config,
71-
context: context,
72-
namespace: namespace,
73-
isInCluster: isInCluster,
71+
path: path,
72+
config: config,
73+
kubeConfig: kubeConfig,
7474
}
7575
}
7676

@@ -102,14 +102,25 @@ var useOldDryRun = func(ctx context.Context, dir, path string) (bool, error) {
102102
}
103103

104104
func (k *kubectlBuilder) Build(ctx context.Context, dir, manifest string) ([]*unstructured.Unstructured, error) {
105-
args := []string{"create"}
106-
if k.context != "" && !k.isInCluster {
107-
args = append(args, "--context", k.context)
105+
tempFile, err := ioutil.TempFile("", "")
106+
if err != nil {
107+
return nil, err
108108
}
109-
if k.namespace != "" {
110-
args = append(args, "--namespace", k.namespace)
109+
defer os.Remove(tempFile.Name())
110+
111+
data, err := clientcmd.Write(k.kubeConfig)
112+
if err != nil {
113+
return nil, err
111114
}
112115

116+
_, err = tempFile.Write(data)
117+
if err != nil {
118+
return nil, err
119+
}
120+
_ = tempFile.Close()
121+
122+
args := []string{"create"}
123+
113124
// decides which --dry-run value is to be used
114125
uodr, err := useOldDryRun(ctx, dir, k.path)
115126
if err != nil {
@@ -132,7 +143,9 @@ func (k *kubectlBuilder) Build(ctx context.Context, dir, manifest string) ([]*un
132143
args = append(args, k.config.Kubectl.CreateArgs...)
133144

134145
// Execute command
135-
output, err := command.Output(ctx, dir, k.path, args...)
146+
output, err := command.OutputWithEnv(ctx, dir, map[string]string{
147+
"KUBECONFIG": tempFile.Name(),
148+
}, k.path, args...)
136149
if err != nil {
137150
exitError, ok := err.(*exec.ExitError)
138151
if ok {

0 commit comments

Comments
 (0)