Prepare up/down for other providers

This commit is contained in:
Tomas Kral 2016-09-23 14:47:04 +02:00
parent c593ff8e44
commit 799345a6f9
No known key found for this signature in database
GPG Key ID: E690DA7E4F291FA6
5 changed files with 133 additions and 82 deletions

View File

@ -25,16 +25,12 @@ import (
// install kubernetes api // install kubernetes api
_ "k8s.io/kubernetes/pkg/api/install" _ "k8s.io/kubernetes/pkg/api/install"
_ "k8s.io/kubernetes/pkg/apis/extensions/install" _ "k8s.io/kubernetes/pkg/apis/extensions/install"
client "k8s.io/kubernetes/pkg/client/unversioned"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
// install OpenShift apis // install OpenShift apis
_ "github.com/openshift/origin/pkg/deploy/api/install" _ "github.com/openshift/origin/pkg/deploy/api/install"
"github.com/skippbox/kompose/pkg/kobject" "github.com/skippbox/kompose/pkg/kobject"
"github.com/skippbox/kompose/pkg/loader" "github.com/skippbox/kompose/pkg/loader"
"github.com/skippbox/kompose/pkg/loader/bundle"
"github.com/skippbox/kompose/pkg/loader/compose"
"github.com/skippbox/kompose/pkg/transformer" "github.com/skippbox/kompose/pkg/transformer"
"github.com/skippbox/kompose/pkg/transformer/kubernetes" "github.com/skippbox/kompose/pkg/transformer/kubernetes"
"github.com/skippbox/kompose/pkg/transformer/openshift" "github.com/skippbox/kompose/pkg/transformer/openshift"
@ -151,14 +147,9 @@ func Convert(c *cli.Context) {
validateFlags(opt, singleOutput, dabFile, inputFile) validateFlags(opt, singleOutput, dabFile, inputFile)
// loader parses input from file into komposeObject. // loader parses input from file into komposeObject.
var l loader.Loader l, err := loader.GetLoader(inputFormat)
switch inputFormat { if err != nil {
case "bundle": logrus.Fatal(err)
l = new(bundle.Bundle)
case "compose":
l = new(compose.Compose)
default:
logrus.Fatalf("Input file format is not supported")
} }
komposeObject = l.LoadFile(file) komposeObject = l.LoadFile(file)
@ -179,20 +170,6 @@ func Convert(c *cli.Context) {
// Up brings up deployment, svc. // Up brings up deployment, svc.
func Up(c *cli.Context) { func Up(c *cli.Context) {
fmt.Println("We are going to create Kubernetes deployments and services for your Dockerized application. \n" +
"If you need different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead. \n")
factory := cmdutil.NewFactory(nil)
clientConfig, err := factory.ClientConfig()
if err != nil {
logrus.Fatalf("Failed to access the Kubernetes cluster. Make sure you have a Kubernetes cluster running: %v", err)
}
namespace, _, err := factory.DefaultNamespace()
if err != nil {
logrus.Fatalf("Failed to get Namespace")
}
client := client.NewOrDie(clientConfig)
inputFile := c.GlobalString("file") inputFile := c.GlobalString("file")
dabFile := c.GlobalString("bundle") dabFile := c.GlobalString("bundle")
@ -214,35 +191,25 @@ func Up(c *cli.Context) {
validateFlags(opt, false, dabFile, inputFile) validateFlags(opt, false, dabFile, inputFile)
// loader parses input from file into komposeObject. // loader parses input from file into komposeObject.
var l loader.Loader l, err := loader.GetLoader(inputFormat)
switch inputFormat { if err != nil {
case "bundle": logrus.Fatal(err)
l = new(bundle.Bundle)
case "compose":
l = new(compose.Compose)
default:
logrus.Fatalf("Input file format is not supported")
} }
komposeObject = l.LoadFile(file) komposeObject = l.LoadFile(file)
//get transfomer
t := new(kubernetes.Kubernetes) t := new(kubernetes.Kubernetes)
//Convert komposeObject to K8S controllers //Submit objects provider
objects := t.Transform(komposeObject, opt) errDeploy := t.Deploy(komposeObject, opt)
if errDeploy != nil {
//Submit objects to K8s endpoint logrus.Fatalf("Error while deploying application: %s", err)
kubernetes.CreateObjects(client, namespace, objects) }
} }
// Down deletes all deployment, svc. // Down deletes all deployment, svc.
func Down(c *cli.Context) { func Down(c *cli.Context) {
factory := cmdutil.NewFactory(nil)
clientConfig, err := factory.ClientConfig()
if err != nil {
logrus.Fatalf("Failed to access the Kubernetes cluster. Make sure you have a Kubernetes running: %v", err)
}
client := client.NewOrDie(clientConfig)
inputFile := c.GlobalString("file") inputFile := c.GlobalString("file")
dabFile := c.GlobalString("bundle") dabFile := c.GlobalString("bundle")
@ -256,25 +223,30 @@ func Down(c *cli.Context) {
file = dabFile file = dabFile
} }
opt := kobject.ConvertOptions{} opt := kobject.ConvertOptions{
Replicas: 1,
CreateD: true,
}
validateFlags(opt, false, dabFile, inputFile) validateFlags(opt, false, dabFile, inputFile)
// loader parses input from file into komposeObject. // loader parses input from file into komposeObject.
var l loader.Loader l, err := loader.GetLoader(inputFormat)
switch inputFormat { if err != nil {
case "bundle": logrus.Fatal(err)
l = new(bundle.Bundle)
case "compose":
l = new(compose.Compose)
default:
logrus.Fatalf("Input file format is not supported")
} }
komposeObject = l.LoadFile(file) komposeObject = l.LoadFile(file)
for k := range komposeObject.ServiceConfigs { // get transformer
kubernetes.DeleteObjects(client, k) t := new(kubernetes.Kubernetes)
//Remove deployed application
errUndeploy := t.Undeploy(komposeObject, opt)
if errUndeploy != nil {
logrus.Fatalf("Error while deleting application: %s", err)
} }
} }
func askForConfirmation() bool { func askForConfirmation() bool {

View File

@ -16,8 +16,32 @@ limitations under the License.
package loader package loader
import "github.com/skippbox/kompose/pkg/kobject" import (
"errors"
"fmt"
"github.com/skippbox/kompose/pkg/kobject"
"github.com/skippbox/kompose/pkg/loader/bundle"
"github.com/skippbox/kompose/pkg/loader/compose"
)
type Loader interface { type Loader interface {
LoadFile(file string) kobject.KomposeObject LoadFile(file string) kobject.KomposeObject
} }
// GetLoader returns loader for given format
func GetLoader(format string) (Loader, error) {
var l Loader
switch format {
case "bundle":
l = new(bundle.Bundle)
case "compose":
l = new(compose.Compose)
default:
return nil, errors.New(fmt.Sprintf("Input file format %s is not supported", format))
}
return l, nil
}

View File

@ -25,10 +25,15 @@ import (
"github.com/skippbox/kompose/pkg/kobject" "github.com/skippbox/kompose/pkg/kobject"
"github.com/skippbox/kompose/pkg/transformer" "github.com/skippbox/kompose/pkg/transformer"
// install kubernetes api
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
_ "k8s.io/kubernetes/pkg/api/install"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
_ "k8s.io/kubernetes/pkg/apis/extensions/install"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/intstr"
//"k8s.io/kubernetes/pkg/controller/daemon" //"k8s.io/kubernetes/pkg/controller/daemon"
@ -281,36 +286,69 @@ func UpdateController(obj runtime.Object, updateTemplate func(*api.PodTemplateSp
} }
// Submit deployment and svc to k8s endpoint // Submit deployment and svc to k8s endpoint
func CreateObjects(client *client.Client, namespace string, objects []runtime.Object) { func (k *Kubernetes) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error {
//Convert komposeObject
objects := k.Transform(komposeObject, opt)
fmt.Println("We are going to create Kubernetes deployments and services for your Dockerized application. \n" +
"If you need different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead. \n")
factory := cmdutil.NewFactory(nil)
clientConfig, err := factory.ClientConfig()
if err != nil {
return err
}
namespace, _, err := factory.DefaultNamespace()
if err != nil {
return err
}
client := client.NewOrDie(clientConfig)
for _, v := range objects { for _, v := range objects {
switch t := v.(type) { switch t := v.(type) {
case *extensions.Deployment: case *extensions.Deployment:
_, err := client.Deployments(namespace).Create(t) _, err := client.Deployments(namespace).Create(t)
if err != nil { if err != nil {
logrus.Fatalf("Error: '%v' while creating deployment: %s", err, t.Name) return err
} }
logrus.Infof("Successfully created deployment: %s", t.Name) logrus.Infof("Successfully created deployment: %s", t.Name)
case *api.Service: case *api.Service:
_, err := client.Services(namespace).Create(t) _, err := client.Services(namespace).Create(t)
if err != nil { if err != nil {
logrus.Fatalf("Error: '%v' while creating service: %s", err, t.Name) return err
} }
logrus.Infof("Successfully created service: %s", t.Name) logrus.Infof("Successfully created service: %s", t.Name)
} }
} }
fmt.Println("\nYour application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc,pods' for details.") fmt.Println("\nYour application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc,pods' for details.")
return nil
} }
func DeleteObjects(client *client.Client, name string) { func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error {
factory := cmdutil.NewFactory(nil)
clientConfig, err := factory.ClientConfig()
if err != nil {
return err
}
namespace, _, err := factory.DefaultNamespace()
if err != nil {
return err
}
client := client.NewOrDie(clientConfig)
// delete objects from kubernetes
for name := range komposeObject.ServiceConfigs {
//delete svc //delete svc
rpService, err := kubectl.ReaperFor(api.Kind("Service"), client) rpService, err := kubectl.ReaperFor(api.Kind("Service"), client)
if err != nil { if err != nil {
logrus.Warningf("Can't get reaper for service due to '%v'", err) return err
} }
//FIXME: timeout = 300s, gracePeriod is nil //FIXME: timeout = 300s, gracePeriod is nil
err = rpService.Stop(api.NamespaceDefault, name, 300*time.Second, nil) err = rpService.Stop(namespace, name, 300*time.Second, nil)
if err != nil { if err != nil {
logrus.Warningf("Can't delete service: %s due to '%v'", name, err) return err
} else { } else {
logrus.Infof("Successfully deleted service: %s", name) logrus.Infof("Successfully deleted service: %s", name)
} }
@ -318,13 +356,15 @@ func DeleteObjects(client *client.Client, name string) {
//delete deployment //delete deployment
rpDeployment, err := kubectl.ReaperFor(extensions.Kind("Deployment"), client) rpDeployment, err := kubectl.ReaperFor(extensions.Kind("Deployment"), client)
if err != nil { if err != nil {
logrus.Warningf("Can't get reaper for deployment due to '%v'", err) return err
} }
//FIXME: timeout = 300s, gracePeriod is nil //FIXME: timeout = 300s, gracePeriod is nil
err = rpDeployment.Stop(api.NamespaceDefault, name, 300*time.Second, nil) err = rpDeployment.Stop(namespace, name, 300*time.Second, nil)
if err != nil { if err != nil {
logrus.Warningf("Can't delete deployment: %s due to '%v'", name, err) return err
} else { } else {
logrus.Infof("Successfully deleted deployment: %s", name) logrus.Infof("Successfully deleted deployment: %s", name)
} }
} }
return nil
}

View File

@ -17,6 +17,8 @@ limitations under the License.
package openshift package openshift
import ( import (
"errors"
deployapi "github.com/openshift/origin/pkg/deploy/api" deployapi "github.com/openshift/origin/pkg/deploy/api"
"github.com/skippbox/kompose/pkg/kobject" "github.com/skippbox/kompose/pkg/kobject"
"github.com/skippbox/kompose/pkg/transformer/kubernetes" "github.com/skippbox/kompose/pkg/transformer/kubernetes"
@ -89,3 +91,11 @@ func (k *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
kubernetes.SortServicesFirst(&allobjects) kubernetes.SortServicesFirst(&allobjects)
return allobjects return allobjects
} }
func (k *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error {
return errors.New("Not Implemented")
}
func (k *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error {
return errors.New("Not Implemented")
}

View File

@ -22,5 +22,10 @@ import (
) )
type Transformer interface { type Transformer interface {
// Transform converts KomposeObject to transformer specific objects.
Transform(kobject.KomposeObject, kobject.ConvertOptions) []runtime.Object Transform(kobject.KomposeObject, kobject.ConvertOptions) []runtime.Object
// Deploy deploys KomposeObject to provider
Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error
// Undeploy deletes/undeploys KomposeObject from provider
Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error
} }