forked from LaconicNetwork/kompose
@@ -18,22 +18,18 @@ package kubernetes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/spf13/pflag"
|
||||
"io/ioutil"
|
||||
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/fatih/structs"
|
||||
"github.com/kubernetes/kompose/pkg/kobject"
|
||||
"github.com/kubernetes/kompose/pkg/transformer"
|
||||
buildapi "github.com/openshift/origin/pkg/build/api"
|
||||
deployapi "github.com/openshift/origin/pkg/deploy/api"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strconv"
|
||||
|
||||
// install kubernetes api
|
||||
_ "k8s.io/kubernetes/pkg/api/install"
|
||||
@@ -44,10 +40,6 @@ import (
|
||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||
|
||||
client "k8s.io/kubernetes/pkg/client/unversioned"
|
||||
"k8s.io/kubernetes/pkg/kubectl"
|
||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||
|
||||
"k8s.io/kubernetes/pkg/runtime"
|
||||
"k8s.io/kubernetes/pkg/util/intstr"
|
||||
|
||||
@@ -60,10 +52,6 @@ import (
|
||||
"github.com/kubernetes/kompose/pkg/loader/compose"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cast"
|
||||
"k8s.io/kubernetes/pkg/api/meta"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
|
||||
utilflag "k8s.io/kubernetes/pkg/util/flag"
|
||||
)
|
||||
|
||||
// Kubernetes implements Transformer interface and represents Kubernetes transformer
|
||||
@@ -1296,381 +1284,3 @@ func (k *Kubernetes) UpdateController(obj runtime.Object, updateTemplate func(*a
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DefaultClientConfig get default client config.
|
||||
// This function is copied from library , we just overrides the apiserver url
|
||||
func (k *Kubernetes) DefaultClientConfig(flags *pflag.FlagSet) clientcmd.ClientConfig {
|
||||
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
|
||||
// use the standard defaults for this client command
|
||||
// DEPRECATED: remove and replace with something more accurate
|
||||
loadingRules.DefaultClientConfig = &clientcmd.DefaultClientConfig
|
||||
|
||||
flags.StringVar(&loadingRules.ExplicitPath, "kubeconfig", "", "Path to the kubeconfig file to use for CLI requests.")
|
||||
|
||||
clusterDefaults := clientcmd.ClusterDefaults
|
||||
clusterDefaults.Server = "https://127.0.0.1:6443"
|
||||
if k.Opt.Server != "" {
|
||||
clusterDefaults.Server = k.Opt.Server
|
||||
}
|
||||
|
||||
overrides := &clientcmd.ConfigOverrides{ClusterDefaults: clusterDefaults}
|
||||
|
||||
flagNames := clientcmd.RecommendedConfigOverrideFlags("")
|
||||
// short flagnames are disabled by default. These are here for compatibility with existing scripts
|
||||
flagNames.ClusterOverrideFlags.APIServer.ShortName = "s"
|
||||
|
||||
clientcmd.BindOverrideFlags(overrides, flags, flagNames)
|
||||
clientConfig := clientcmd.NewInteractiveDeferredLoadingClientConfig(loadingRules, overrides, os.Stdin)
|
||||
|
||||
return clientConfig
|
||||
}
|
||||
|
||||
// GetKubernetesClient creates the k8s Client, returns k8s client and namespace
|
||||
func (k *Kubernetes) GetKubernetesClient() (*client.Client, string, error) {
|
||||
|
||||
// generate a new client config
|
||||
flags := pflag.NewFlagSet("", pflag.ContinueOnError)
|
||||
flags.SetNormalizeFunc(utilflag.WarnWordSepNormalizeFunc) // Warn for "_" flags
|
||||
oc := k.DefaultClientConfig(flags)
|
||||
|
||||
// initialize Kubernetes client
|
||||
factory := cmdutil.NewFactory(oc)
|
||||
clientConfig, err := factory.ClientConfig()
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
client := client.NewOrDie(clientConfig)
|
||||
|
||||
// get namespace from config
|
||||
namespace, _, err := factory.DefaultNamespace()
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
return client, namespace, nil
|
||||
}
|
||||
|
||||
// Deploy submits deployment and svc to k8s endpoint
|
||||
func (k *Kubernetes) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error {
|
||||
//Convert komposeObject
|
||||
objects, err := k.Transform(komposeObject, opt)
|
||||
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "k.Transform failed")
|
||||
}
|
||||
|
||||
if opt.StoreManifest {
|
||||
log.Info("Store manifest to disk")
|
||||
if err := PrintList(objects, opt); err != nil {
|
||||
return errors.Wrap(err, "Store manifest failed")
|
||||
}
|
||||
}
|
||||
|
||||
pvcStr := " "
|
||||
if !opt.EmptyVols || opt.Volumes != "emptyDir" {
|
||||
pvcStr = " and PersistentVolumeClaims "
|
||||
}
|
||||
log.Info("We are going to create Kubernetes Deployments, Services" + pvcStr + "for your Dockerized application. " +
|
||||
"If you need different kind of resources, use the 'kompose convert' and 'kubectl create -f' commands instead. \n")
|
||||
|
||||
client, ns, err := k.GetKubernetesClient()
|
||||
namespace := ns
|
||||
if opt.IsNamespaceFlag {
|
||||
namespace = opt.Namespace
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pvcCreatedSet := make(map[string]bool)
|
||||
|
||||
log.Infof("Deploying application in %q namespace", namespace)
|
||||
|
||||
for _, v := range objects {
|
||||
switch t := v.(type) {
|
||||
case *extensions.Deployment:
|
||||
_, err := client.Deployments(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created Deployment: %s", t.Name)
|
||||
|
||||
case *extensions.DaemonSet:
|
||||
_, err := client.DaemonSets(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created DaemonSet: %s", t.Name)
|
||||
|
||||
case *api.ReplicationController:
|
||||
_, err := client.ReplicationControllers(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created ReplicationController: %s", t.Name)
|
||||
|
||||
case *api.Service:
|
||||
_, err := client.Services(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created Service: %s", t.Name)
|
||||
case *api.PersistentVolumeClaim:
|
||||
if pvcCreatedSet[t.Name] {
|
||||
log.Infof("Skip creation of PersistentVolumeClaim as it is already created: %s", t.Name)
|
||||
} else {
|
||||
_, err := client.PersistentVolumeClaims(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pvcCreatedSet[t.Name] = true
|
||||
storage := t.Spec.Resources.Requests[api.ResourceStorage]
|
||||
capacity := storage.String()
|
||||
log.Infof("Successfully created PersistentVolumeClaim: %s of size %s. If your cluster has dynamic storage provisioning, you don't have to do anything. Otherwise you have to create PersistentVolume to make PVC work", t.Name, capacity)
|
||||
}
|
||||
case *extensions.Ingress:
|
||||
_, err := client.Ingress(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created Ingress: %s", t.Name)
|
||||
case *api.Pod:
|
||||
_, err := client.Pods(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created Pod: %s", t.Name)
|
||||
case *api.ConfigMap:
|
||||
_, err := client.ConfigMaps(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created Config Map: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
if !opt.EmptyVols || opt.Volumes != "emptyDir" {
|
||||
pvcStr = ",pvc"
|
||||
} else {
|
||||
pvcStr = ""
|
||||
}
|
||||
fmt.Println("\nYour application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc,pods" + pvcStr + "' for details.")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Undeploy deletes deployed objects from Kubernetes cluster
|
||||
func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []error {
|
||||
var errorList []error
|
||||
//Convert komposeObject
|
||||
objects, err := k.Transform(komposeObject, opt)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
return errorList
|
||||
}
|
||||
|
||||
client, ns, err := k.GetKubernetesClient()
|
||||
namespace := ns
|
||||
if opt.IsNamespaceFlag {
|
||||
namespace = opt.Namespace
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
return errorList
|
||||
}
|
||||
|
||||
log.Infof("Deleting application in %q namespace", namespace)
|
||||
|
||||
for _, v := range objects {
|
||||
label := labels.SelectorFromSet(labels.Set(map[string]string{transformer.Selector: v.(meta.Object).GetName()}))
|
||||
options := api.ListOptions{LabelSelector: label}
|
||||
komposeLabel := map[string]string{transformer.Selector: v.(meta.Object).GetName()}
|
||||
switch t := v.(type) {
|
||||
case *extensions.Deployment:
|
||||
//delete deployment
|
||||
deployment, err := client.Deployments(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range deployment.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
rpDeployment, err := kubectl.ReaperFor(extensions.Kind("Deployment"), client)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
//FIXME: gracePeriod is nil
|
||||
err = rpDeployment.Stop(namespace, t.Name, TIMEOUT*time.Second, nil)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted Deployment: %s", t.Name)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
case *extensions.DaemonSet:
|
||||
//delete deployment
|
||||
daemonset, err := client.DaemonSets(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range daemonset.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
rpDaemonset, err := kubectl.ReaperFor(extensions.Kind("DaemonSet"), client)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
//FIXME: gracePeriod is nil
|
||||
err = rpDaemonset.Stop(namespace, t.Name, TIMEOUT*time.Second, nil)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted DaemonSet: %s", t.Name)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
case *api.ReplicationController:
|
||||
//delete deployment
|
||||
replicationController, err := client.ReplicationControllers(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range replicationController.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
rpReplicationController, err := kubectl.ReaperFor(api.Kind("ReplicationController"), client)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
//FIXME: gracePeriod is nil
|
||||
err = rpReplicationController.Stop(namespace, t.Name, TIMEOUT*time.Second, nil)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted ReplicationController: %s", t.Name)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
case *api.Service:
|
||||
//delete svc
|
||||
svc, err := client.Services(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range svc.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
rpService, err := kubectl.ReaperFor(api.Kind("Service"), client)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
//FIXME: gracePeriod is nil
|
||||
err = rpService.Stop(namespace, t.Name, TIMEOUT*time.Second, nil)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted Service: %s", t.Name)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
case *api.PersistentVolumeClaim:
|
||||
// delete pvc
|
||||
pvc, err := client.PersistentVolumeClaims(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range pvc.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
err = client.PersistentVolumeClaims(namespace).Delete(t.Name)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
case *extensions.Ingress:
|
||||
// delete ingress
|
||||
ingDeleteOptions := &api.DeleteOptions{
|
||||
TypeMeta: unversioned.TypeMeta{
|
||||
Kind: "Ingress",
|
||||
APIVersion: "extensions/v1beta1",
|
||||
},
|
||||
}
|
||||
ingress, err := client.Ingress(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range ingress.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
|
||||
err = client.Ingress(namespace).Delete(t.Name, ingDeleteOptions)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted Ingress: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
case *api.Pod:
|
||||
//delete pod
|
||||
pod, err := client.Pods(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
}
|
||||
for _, l := range pod.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
rpPod, err := kubectl.ReaperFor(api.Kind("Pod"), client)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
//FIXME: gracePeriod is nil
|
||||
err = rpPod.Stop(namespace, t.Name, TIMEOUT*time.Second, nil)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted Pod: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
case *api.ConfigMap:
|
||||
// delete ConfigMap
|
||||
configMap, err := client.ConfigMaps(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range configMap.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
err = client.ConfigMaps(namespace).Delete(t.Name)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted ConfigMap: %s", t.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return errorList
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user