Merge pull request #334 from surajssd/create_pod

support for raw pod output without controller
This commit is contained in:
Suraj Deshmukh 2016-12-15 11:57:13 +05:30 committed by GitHub
commit 78845d3954
12 changed files with 288 additions and 17 deletions

View File

@ -306,3 +306,27 @@ services:
labels: labels:
kompose.service.type: nodeport kompose.service.type: nodeport
``` ```
## Restart
If you want to create normal pods without controllers you can use `restart` construct of docker-compose to define that. Follow table below to see what heppens on the `restart` value.
| `docker-compose` `restart` | object created | Pod `restartPolicy` |
|----------------------------|-------------------|---------------------|
| `""` | controller object | `Always` |
| `always` | controller object | `Always` |
| `on-failure` | Pod | `OnFailure` |
| `no` | Pod | `Never` |
**Note**: controller object could be `deployment` or `replicationcontroller`, etc.
For e.g. `mariadb` service will become pod down here.
```yaml
version: "2"
services:
mariadb:
image: centos/mariadb
restart: "no"
```

View File

@ -185,6 +185,8 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
file = transformer.Print(t.Name, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateYaml, f) file = transformer.Print(t.Name, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateYaml, f)
case *api.PersistentVolumeClaim: case *api.PersistentVolumeClaim:
file = transformer.Print(t.Name, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateYaml, f) file = transformer.Print(t.Name, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateYaml, f)
case *api.Pod:
file = transformer.Print(t.Name, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateYaml, f)
} }
files = append(files, file) files = append(files, file)
} }

View File

@ -326,6 +326,27 @@ func (k *Kubernetes) CreateKubernetesObjects(name string, service kobject.Servic
return objects return objects
} }
func (k *Kubernetes) InitPod(name string, service kobject.ServiceConfig) *api.Pod {
pod := api.Pod{
TypeMeta: unversioned.TypeMeta{
Kind: "Pod",
APIVersion: "v1",
},
ObjectMeta: api.ObjectMeta{
Name: name,
},
Spec: api.PodSpec{
Containers: []api.Container{
{
Name: name,
Image: service.Image,
},
},
},
}
return &pod
}
// Transform maps komposeObject to k8s objects // Transform maps komposeObject to k8s objects
// returns object that are already sorted in the way that Services are first // returns object that are already sorted in the way that Services are first
func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []runtime.Object { func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []runtime.Object {
@ -333,12 +354,19 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
var allobjects []runtime.Object var allobjects []runtime.Object
for name, service := range komposeObject.ServiceConfigs { for name, service := range komposeObject.ServiceConfigs {
objects := k.CreateKubernetesObjects(name, service, opt) var objects []runtime.Object
// If ports not provided in configuration we will not make service // Generate pod only and nothing more
if k.PortsExist(name, service) { if service.Restart == "no" || service.Restart == "on-failure" {
svc := k.CreateService(name, service, objects) pod := k.InitPod(name, service)
objects = append(objects, svc) objects = append(objects, pod)
} else {
objects = k.CreateKubernetesObjects(name, service, opt)
// If ports not provided in configuration we will not make service
if k.PortsExist(name, service) {
svc := k.CreateService(name, service, objects)
objects = append(objects, svc)
}
} }
k.UpdateKubernetesObjects(name, service, &objects) k.UpdateKubernetesObjects(name, service, &objects)
@ -370,6 +398,14 @@ func (k *Kubernetes) UpdateController(obj runtime.Object, updateTemplate func(*a
case *deployapi.DeploymentConfig: case *deployapi.DeploymentConfig:
updateTemplate(t.Spec.Template) updateTemplate(t.Spec.Template)
updateMeta(&t.ObjectMeta) updateMeta(&t.ObjectMeta)
case *api.Pod:
p := api.PodTemplateSpec{
ObjectMeta: t.ObjectMeta,
Spec: t.Spec,
}
updateTemplate(&p)
t.Spec = p.Spec
t.ObjectMeta = p.ObjectMeta
} }
} }

View File

@ -319,3 +319,37 @@ func TestKomposeConvert(t *testing.T) {
} }
} }
} }
func TestConvertRestartOptions(t *testing.T) {
var opt kobject.ConvertOptions
var k Kubernetes
testCases := map[string]struct {
svc kobject.KomposeObject
restartPolicy api.RestartPolicy
}{
"'restart' is set to 'no'": {kobject.KomposeObject{ServiceConfigs: map[string]kobject.ServiceConfig{"app": kobject.ServiceConfig{Image: "foobar", Restart: "no"}}}, api.RestartPolicyNever},
"'restart' is set to 'on-failure'": {kobject.KomposeObject{ServiceConfigs: map[string]kobject.ServiceConfig{"app": kobject.ServiceConfig{Image: "foobar", Restart: "on-failure"}}}, api.RestartPolicyOnFailure},
}
for name, test := range testCases {
t.Log("Test Case:", name)
objs := k.Transform(test.svc, opt)
if len(objs) != 1 {
t.Errorf("Expected only one pod, more elements generated.")
}
for _, obj := range objs {
if pod, ok := obj.(*api.Pod); ok {
if pod.Spec.RestartPolicy != test.restartPolicy {
t.Errorf("Expected restartPolicy as %s, got %#v", test.restartPolicy, pod.Spec.RestartPolicy)
}
} else {
t.Errorf("Expected 'pod' object not found one")
}
}
}
}

View File

@ -155,20 +155,27 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
var allobjects []runtime.Object var allobjects []runtime.Object
for name, service := range komposeObject.ServiceConfigs { for name, service := range komposeObject.ServiceConfigs {
objects := o.CreateKubernetesObjects(name, service, opt) var objects []runtime.Object
if opt.CreateDeploymentConfig { // Generate pod only and nothing more
objects = append(objects, o.initDeploymentConfig(name, service, opt.Replicas)) // OpenShift DeploymentConfigs if service.Restart == "no" || service.Restart == "on-failure" {
// create ImageStream after deployment (creating IS will trigger new deployment) pod := o.InitPod(name, service)
objects = append(objects, o.initImageStream(name, service)) objects = append(objects, pod)
} else {
objects = o.CreateKubernetesObjects(name, service, opt)
if opt.CreateDeploymentConfig {
objects = append(objects, o.initDeploymentConfig(name, service, opt.Replicas)) // OpenShift DeploymentConfigs
// create ImageStream after deployment (creating IS will trigger new deployment)
objects = append(objects, o.initImageStream(name, service))
}
// If ports not provided in configuration we will not make service
if o.PortsExist(name, service) {
svc := o.CreateService(name, service, objects)
objects = append(objects, svc)
}
} }
// If ports not provided in configuration we will not make service
if o.PortsExist(name, service) {
svc := o.CreateService(name, service, objects)
objects = append(objects, svc)
}
o.UpdateKubernetesObjects(name, service, &objects) o.UpdateKubernetesObjects(name, service, &objects)
allobjects = append(allobjects, objects...) allobjects = append(allobjects, objects...)

View File

@ -103,4 +103,14 @@ convert::expect_success "kompose --bundle $KOMPOSE_ROOT/script/test/fixtures/bun
# Test related to kompose --bundle convert to ensure that DSB bundles are converted properly # Test related to kompose --bundle convert to ensure that DSB bundles are converted properly
convert::expect_success_and_warning "kompose --bundle $KOMPOSE_ROOT/script/test/fixtures/bundles/dsb/docker-voting-bundle.dsb convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/bundles/dsb/output-k8s.json" "Service cannot be created because of missing port." convert::expect_success_and_warning "kompose --bundle $KOMPOSE_ROOT/script/test/fixtures/bundles/dsb/docker-voting-bundle.dsb convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/bundles/dsb/output-k8s.json" "Service cannot be created because of missing port."
######
# Test related to restart options in docker-compose
# kubernetes test
convert::expect_success "kompose -f $KOMPOSE_ROOT/script/test/fixtures/restart-options/docker-compose-restart-no.yml convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/restart-options/output-k8s-restart-no.json"
convert::expect_success "kompose -f $KOMPOSE_ROOT/script/test/fixtures/restart-options/docker-compose-restart-onfail.yml convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/restart-options/output-k8s-restart-onfail.json"
# openshift test
convert::expect_success "kompose -f $KOMPOSE_ROOT/script/test/fixtures/restart-options/docker-compose-restart-no.yml --provider openshift convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/restart-options/output-os-restart-no.json"
convert::expect_success "kompose -f $KOMPOSE_ROOT/script/test/fixtures/restart-options/docker-compose-restart-onfail.yml --provider openshift convert --stdout" "$KOMPOSE_ROOT/script/test/fixtures/restart-options/output-os-restart-onfail.json"
exit $EXIT_STATUS exit $EXIT_STATUS

View File

@ -0,0 +1,9 @@
version: "2"
services:
foo:
image: "foobar"
restart: "no"
environment:
GITHUB: surajssd

View File

@ -0,0 +1,9 @@
version: "2"
services:
foo:
image: "foobar"
restart: "on-failure"
environment:
GITHUB: surajssd

View File

@ -0,0 +1,35 @@
{
"kind": "List",
"apiVersion": "v1",
"metadata": {},
"items": [
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "foo",
"creationTimestamp": null,
"labels": {
"service": "foo"
}
},
"spec": {
"containers": [
{
"name": "foo",
"image": "foobar",
"env": [
{
"name": "GITHUB",
"value": "surajssd"
}
],
"resources": {}
}
],
"restartPolicy": "Never"
},
"status": {}
}
]
}

View File

@ -0,0 +1,35 @@
{
"kind": "List",
"apiVersion": "v1",
"metadata": {},
"items": [
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "foo",
"creationTimestamp": null,
"labels": {
"service": "foo"
}
},
"spec": {
"containers": [
{
"name": "foo",
"image": "foobar",
"env": [
{
"name": "GITHUB",
"value": "surajssd"
}
],
"resources": {}
}
],
"restartPolicy": "OnFailure"
},
"status": {}
}
]
}

View File

@ -0,0 +1,35 @@
{
"kind": "List",
"apiVersion": "v1",
"metadata": {},
"items": [
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "foo",
"creationTimestamp": null,
"labels": {
"service": "foo"
}
},
"spec": {
"containers": [
{
"name": "foo",
"image": "foobar",
"env": [
{
"name": "GITHUB",
"value": "surajssd"
}
],
"resources": {}
}
],
"restartPolicy": "Never"
},
"status": {}
}
]
}

View File

@ -0,0 +1,35 @@
{
"kind": "List",
"apiVersion": "v1",
"metadata": {},
"items": [
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "foo",
"creationTimestamp": null,
"labels": {
"service": "foo"
}
},
"spec": {
"containers": [
{
"name": "foo",
"image": "foobar",
"env": [
{
"name": "GITHUB",
"value": "surajssd"
}
],
"resources": {}
}
],
"restartPolicy": "OnFailure"
},
"status": {}
}
]
}