forked from LaconicNetwork/kompose
Prepare up/down for other providers
This commit is contained in:
parent
c593ff8e44
commit
799345a6f9
@ -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 {
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
@ -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")
|
||||||
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user