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
_ "k8s.io/kubernetes/pkg/api/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
_ "github.com/openshift/origin/pkg/deploy/api/install"
"github.com/skippbox/kompose/pkg/kobject"
"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/kubernetes"
"github.com/skippbox/kompose/pkg/transformer/openshift"
@ -151,14 +147,9 @@ func Convert(c *cli.Context) {
validateFlags(opt, singleOutput, dabFile, inputFile)
// loader parses input from file into komposeObject.
var l loader.Loader
switch inputFormat {
case "bundle":
l = new(bundle.Bundle)
case "compose":
l = new(compose.Compose)
default:
logrus.Fatalf("Input file format is not supported")
l, err := loader.GetLoader(inputFormat)
if err != nil {
logrus.Fatal(err)
}
komposeObject = l.LoadFile(file)
@ -179,20 +170,6 @@ func Convert(c *cli.Context) {
// Up brings up deployment, svc.
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")
dabFile := c.GlobalString("bundle")
@ -214,35 +191,25 @@ func Up(c *cli.Context) {
validateFlags(opt, false, dabFile, inputFile)
// loader parses input from file into komposeObject.
var l loader.Loader
switch inputFormat {
case "bundle":
l = new(bundle.Bundle)
case "compose":
l = new(compose.Compose)
default:
logrus.Fatalf("Input file format is not supported")
l, err := loader.GetLoader(inputFormat)
if err != nil {
logrus.Fatal(err)
}
komposeObject = l.LoadFile(file)
//get transfomer
t := new(kubernetes.Kubernetes)
//Convert komposeObject to K8S controllers
objects := t.Transform(komposeObject, opt)
//Submit objects to K8s endpoint
kubernetes.CreateObjects(client, namespace, objects)
//Submit objects provider
errDeploy := t.Deploy(komposeObject, opt)
if errDeploy != nil {
logrus.Fatalf("Error while deploying application: %s", err)
}
}
// Down deletes all deployment, svc.
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")
dabFile := c.GlobalString("bundle")
@ -256,25 +223,30 @@ func Down(c *cli.Context) {
file = dabFile
}
opt := kobject.ConvertOptions{}
opt := kobject.ConvertOptions{
Replicas: 1,
CreateD: true,
}
validateFlags(opt, false, dabFile, inputFile)
// loader parses input from file into komposeObject.
var l loader.Loader
switch inputFormat {
case "bundle":
l = new(bundle.Bundle)
case "compose":
l = new(compose.Compose)
default:
logrus.Fatalf("Input file format is not supported")
l, err := loader.GetLoader(inputFormat)
if err != nil {
logrus.Fatal(err)
}
komposeObject = l.LoadFile(file)
for k := range komposeObject.ServiceConfigs {
kubernetes.DeleteObjects(client, k)
// get transformer
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 {

View File

@ -16,8 +16,32 @@ limitations under the License.
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 {
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/transformer"
// install kubernetes api
"k8s.io/kubernetes/pkg/api"
_ "k8s.io/kubernetes/pkg/api/install"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions"
_ "k8s.io/kubernetes/pkg/apis/extensions/install"
client "k8s.io/kubernetes/pkg/client/unversioned"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/intstr"
//"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
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 {
switch t := v.(type) {
case *extensions.Deployment:
_, err := client.Deployments(namespace).Create(t)
if err != nil {
logrus.Fatalf("Error: '%v' while creating deployment: %s", err, t.Name)
return err
}
logrus.Infof("Successfully created deployment: %s", t.Name)
case *api.Service:
_, err := client.Services(namespace).Create(t)
if err != nil {
logrus.Fatalf("Error: '%v' while creating service: %s", err, t.Name)
return err
}
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.")
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
rpService, err := kubectl.ReaperFor(api.Kind("Service"), client)
if err != nil {
logrus.Warningf("Can't get reaper for service due to '%v'", err)
return err
}
//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 {
logrus.Warningf("Can't delete service: %s due to '%v'", name, err)
return err
} else {
logrus.Infof("Successfully deleted service: %s", name)
}
@ -318,13 +356,15 @@ func DeleteObjects(client *client.Client, name string) {
//delete deployment
rpDeployment, err := kubectl.ReaperFor(extensions.Kind("Deployment"), client)
if err != nil {
logrus.Warningf("Can't get reaper for deployment due to '%v'", err)
return err
}
//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 {
logrus.Warningf("Can't delete deployment: %s due to '%v'", name, err)
return err
} else {
logrus.Infof("Successfully deleted deployment: %s", name)
}
}
return nil
}

View File

@ -17,6 +17,8 @@ limitations under the License.
package openshift
import (
"errors"
deployapi "github.com/openshift/origin/pkg/deploy/api"
"github.com/skippbox/kompose/pkg/kobject"
"github.com/skippbox/kompose/pkg/transformer/kubernetes"
@ -89,3 +91,11 @@ func (k *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
kubernetes.SortServicesFirst(&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 {
// Transform converts KomposeObject to transformer specific objects.
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
}