Remove up and down cmd (#1297)

* Remove up and down cmd
This commit is contained in:
Hang Yan
2020-08-01 16:01:34 +08:00
committed by GitHub
parent 6bf75ae11b
commit 47e6015f50
459 changed files with 14 additions and 105335 deletions
+6 -396
View File
@@ -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
}