Skip to content

Commit 10d197c

Browse files
authored
Merge pull request #16 from cllunsford/feature/restart-policy
Adding support for restart policies
2 parents f5e5061 + 900831d commit 10d197c

File tree

4 files changed

+119
-7
lines changed

4 files changed

+119
-7
lines changed

fixtures/full.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ web:
1717
privileged: True
1818
tty: True
1919
working_dir: /var/lib/work
20-
20+
restart: always
21+
net: host

kumpose/kumpose.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ func CompToDeployment(proj *project.Project) ([]byte, error) {
1818
for _, name := range proj.ServiceConfigs.Keys() {
1919
s, _ := proj.ServiceConfigs.Get(name)
2020

21+
podSpec, _ := kubePodSpec(name, s)
22+
2123
con, _ := kubeContainer(name, s)
24+
podSpec.Containers = []api.Container{con}
2225

2326
dep := &extensions.Deployment{
2427
TypeMeta: unversioned.TypeMeta{
@@ -35,12 +38,7 @@ func CompToDeployment(proj *project.Project) ([]byte, error) {
3538
ObjectMeta: api.ObjectMeta{
3639
Labels: map[string]string{"service": name},
3740
},
38-
Spec: api.PodSpec{
39-
Containers: []api.Container{
40-
con,
41-
},
42-
Hostname: s.Hostname,
43-
},
41+
Spec: podSpec,
4442
},
4543
},
4644
}

kumpose/pod.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package kumpose
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/docker/libcompose/config"
8+
"k8s.io/kubernetes/pkg/api"
9+
)
10+
11+
func kubePodSpec(name string, sc *config.ServiceConfig) (api.PodSpec, error) {
12+
ps := api.PodSpec{
13+
Hostname: sc.Hostname,
14+
}
15+
16+
if sc.Restart != "" {
17+
if rp, err := kubeRestartPolicy(sc.Restart); err == nil {
18+
ps.RestartPolicy = rp
19+
}
20+
}
21+
22+
if psc, err := kubePodSecurityContext(sc); err == nil {
23+
ps.SecurityContext = &psc
24+
}
25+
26+
return ps, nil
27+
}
28+
29+
func kubePodSecurityContext(sc *config.ServiceConfig) (api.PodSecurityContext, error) {
30+
ctx := api.PodSecurityContext{}
31+
32+
if sc.NetworkMode != "" {
33+
switch sc.NetworkMode {
34+
case "host":
35+
ctx.HostNetwork = true
36+
default:
37+
return ctx, fmt.Errorf("NetworkMode not implemented: %s", sc.NetworkMode)
38+
}
39+
}
40+
41+
return ctx, nil
42+
}
43+
44+
func kubeRestartPolicy(r string) (api.RestartPolicy, error) {
45+
switch strings.Split(r, ":")[0] {
46+
case "always":
47+
return api.RestartPolicyAlways, nil
48+
case "on-failure":
49+
return api.RestartPolicyOnFailure, nil
50+
case "no":
51+
return api.RestartPolicyNever, nil
52+
default:
53+
return api.RestartPolicyNever, fmt.Errorf("Restart policy not implemented: %s", r)
54+
}
55+
}

kumpose/pod_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package kumpose
2+
3+
import (
4+
"testing"
5+
6+
"github.com/docker/libcompose/config"
7+
"github.com/stretchr/testify/assert"
8+
"k8s.io/kubernetes/pkg/api"
9+
)
10+
11+
func TestKubePodSpec(t *testing.T) {
12+
assert := assert.New(t)
13+
14+
sc := &config.ServiceConfig{
15+
Restart: "always",
16+
}
17+
18+
ps, err := kubePodSpec("name", sc)
19+
assert.NoError(err)
20+
assert.Equal(api.RestartPolicyAlways, ps.RestartPolicy)
21+
}
22+
23+
func TestKubePodSecurityContext(t *testing.T) {
24+
assert := assert.New(t)
25+
26+
sc := &config.ServiceConfig{
27+
NetworkMode: "host",
28+
}
29+
30+
psc, err := kubePodSecurityContext(sc)
31+
assert.NoError(err)
32+
assert.True(psc.HostNetwork)
33+
34+
sc.NetworkMode = "bridge"
35+
psc, err = kubePodSecurityContext(sc)
36+
assert.NotNil(err)
37+
assert.False(psc.HostNetwork)
38+
}
39+
40+
func TestKubeRestartPolicy(t *testing.T) {
41+
assert := assert.New(t)
42+
43+
r, err := kubeRestartPolicy("always")
44+
assert.NoError(err)
45+
assert.Equal(api.RestartPolicyAlways, r)
46+
47+
r, err = kubeRestartPolicy("on-failure")
48+
assert.NoError(err)
49+
assert.Equal(api.RestartPolicyOnFailure, r)
50+
51+
r, err = kubeRestartPolicy("no")
52+
assert.NoError(err)
53+
assert.Equal(api.RestartPolicyNever, r)
54+
55+
r, err = kubeRestartPolicy("foo")
56+
assert.NotNil(err)
57+
assert.Equal(api.RestartPolicyNever, r)
58+
}

0 commit comments

Comments
 (0)