forked from LaconicNetwork/kompose
@@ -27,29 +27,16 @@ import (
|
||||
|
||||
kapi "k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
||||
"k8s.io/kubernetes/pkg/runtime"
|
||||
|
||||
oclient "github.com/openshift/origin/pkg/client"
|
||||
ocliconfig "github.com/openshift/origin/pkg/cmd/cli/config"
|
||||
|
||||
"time"
|
||||
|
||||
"reflect"
|
||||
|
||||
"sort"
|
||||
|
||||
"github.com/kubernetes/kompose/pkg/transformer"
|
||||
buildapi "github.com/openshift/origin/pkg/build/api"
|
||||
buildconfigreaper "github.com/openshift/origin/pkg/build/cmd"
|
||||
deployapi "github.com/openshift/origin/pkg/deploy/api"
|
||||
deploymentconfigreaper "github.com/openshift/origin/pkg/deploy/cmd"
|
||||
imageapi "github.com/openshift/origin/pkg/image/api"
|
||||
routeapi "github.com/openshift/origin/pkg/route/api"
|
||||
"github.com/pkg/errors"
|
||||
"k8s.io/kubernetes/pkg/api/meta"
|
||||
"k8s.io/kubernetes/pkg/kubectl"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
"k8s.io/kubernetes/pkg/util/intstr"
|
||||
)
|
||||
|
||||
@@ -439,281 +426,3 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
|
||||
|
||||
return allobjects, nil
|
||||
}
|
||||
|
||||
// Create OpenShift client, returns OpenShift client
|
||||
func (o *OpenShift) getOpenShiftClient() (*oclient.Client, error) {
|
||||
// initialize OpenShift Client
|
||||
loadingRules := ocliconfig.NewOpenShiftClientConfigLoadingRules()
|
||||
overrides := &clientcmd.ConfigOverrides{}
|
||||
oclientConfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, overrides).ClientConfig()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
oc := oclient.NewOrDie(oclientConfig)
|
||||
return oc, nil
|
||||
}
|
||||
|
||||
// Deploy transforms and deploys kobject to OpenShift
|
||||
func (o *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error {
|
||||
//Convert komposeObject
|
||||
objects, err := o.Transform(komposeObject, opt)
|
||||
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "o.Transform failed")
|
||||
}
|
||||
|
||||
pvcStr := " "
|
||||
if !opt.EmptyVols || opt.Volumes != "emptyDir" {
|
||||
pvcStr = " and PersistentVolumeClaims "
|
||||
}
|
||||
log.Info("We are going to create OpenShift DeploymentConfigs, Services" + pvcStr + "for your Dockerized application. \n" +
|
||||
"If you need different kind of resources, use the 'kompose convert' and 'oc create -f' commands instead. \n")
|
||||
|
||||
oc, err := o.getOpenShiftClient()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
kclient, ns, err := o.GetKubernetesClient()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
namespace := ns
|
||||
if opt.IsNamespaceFlag {
|
||||
namespace = opt.Namespace
|
||||
}
|
||||
|
||||
log.Infof("Deploying application in %q namespace", namespace)
|
||||
|
||||
for _, v := range objects {
|
||||
switch t := v.(type) {
|
||||
case *imageapi.ImageStream:
|
||||
_, err := oc.ImageStreams(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created ImageStream: %s", t.Name)
|
||||
case *buildapi.BuildConfig:
|
||||
_, err := oc.BuildConfigs(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created BuildConfig: %s", t.Name)
|
||||
case *deployapi.DeploymentConfig:
|
||||
_, err := oc.DeploymentConfigs(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created DeploymentConfig: %s", t.Name)
|
||||
case *kapi.Service:
|
||||
_, err := kclient.Services(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created Service: %s", t.Name)
|
||||
case *kapi.PersistentVolumeClaim:
|
||||
_, err := kclient.PersistentVolumeClaims(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
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, kubernetes.PVCRequestSize)
|
||||
case *routeapi.Route:
|
||||
_, err := oc.Routes(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created Route: %s", t.Name)
|
||||
case *kapi.Pod:
|
||||
_, err := kclient.Pods(namespace).Create(t)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("Successfully created Pod: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
if !opt.EmptyVols || opt.Volumes != "emptyDir" {
|
||||
pvcStr = ",pvc"
|
||||
} else {
|
||||
pvcStr = ""
|
||||
}
|
||||
fmt.Println("\nYour application has been deployed to OpenShift. You can run 'oc get dc,svc,is" + pvcStr + "' for details.")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
//Undeploy removes deployed artifacts from OpenShift cluster
|
||||
func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) []error {
|
||||
var errorList []error
|
||||
//Convert komposeObject
|
||||
objects, err := o.Transform(komposeObject, opt)
|
||||
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
return errorList
|
||||
}
|
||||
oc, err := o.getOpenShiftClient()
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
return errorList
|
||||
}
|
||||
kclient, ns, err := o.GetKubernetesClient()
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
return errorList
|
||||
}
|
||||
namespace := ns
|
||||
if opt.IsNamespaceFlag {
|
||||
namespace = opt.Namespace
|
||||
}
|
||||
|
||||
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 := kapi.ListOptions{LabelSelector: label}
|
||||
komposeLabel := map[string]string{transformer.Selector: v.(meta.Object).GetName()}
|
||||
switch t := v.(type) {
|
||||
case *imageapi.ImageStream:
|
||||
//delete imageStream
|
||||
imageStream, err := oc.ImageStreams(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range imageStream.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
err = oc.ImageStreams(namespace).Delete(t.Name)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted ImageStream: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
case *buildapi.BuildConfig:
|
||||
buildConfig, err := oc.BuildConfigs(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range buildConfig.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
bcreaper := buildconfigreaper.NewBuildConfigReaper(oc)
|
||||
err := bcreaper.Stop(namespace, t.Name, TIMEOUT*time.Second, nil)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted BuildConfig: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
case *deployapi.DeploymentConfig:
|
||||
// delete deploymentConfig
|
||||
deploymentConfig, err := oc.DeploymentConfigs(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range deploymentConfig.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
dcreaper := deploymentconfigreaper.NewDeploymentConfigReaper(oc, kclient)
|
||||
err := dcreaper.Stop(namespace, t.Name, TIMEOUT*time.Second, nil)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted DeploymentConfig: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
case *kapi.Service:
|
||||
//delete svc
|
||||
svc, err := kclient.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(kapi.Kind("Service"), kclient)
|
||||
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 *kapi.PersistentVolumeClaim:
|
||||
// delete pvc
|
||||
pvc, err := kclient.PersistentVolumeClaims(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range pvc.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
err = kclient.PersistentVolumeClaims(namespace).Delete(t.Name)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
case *routeapi.Route:
|
||||
// delete route
|
||||
route, err := oc.Routes(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range route.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
err = oc.Routes(namespace).Delete(t.Name)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
log.Infof("Successfully deleted Route: %s", t.Name)
|
||||
}
|
||||
}
|
||||
|
||||
case *kapi.Pod:
|
||||
//delete pods
|
||||
pod, err := kclient.Pods(namespace).List(options)
|
||||
if err != nil {
|
||||
errorList = append(errorList, err)
|
||||
break
|
||||
}
|
||||
for _, l := range pod.Items {
|
||||
if reflect.DeepEqual(l.Labels, komposeLabel) {
|
||||
rpPod, err := kubectl.ReaperFor(kapi.Kind("Pod"), kclient)
|
||||
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)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return errorList
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user