From 502157a0785c853fd22b213fd89c39b7d765c142 Mon Sep 17 00:00:00 2001 From: Tomas Kral Date: Wed, 4 Jan 2017 13:56:17 +0100 Subject: [PATCH 1/2] add golint to `make validate` and install it in travis --- .travis.yml | 2 ++ Makefile | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b9134a523..091098a50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,8 @@ before_install: - go get github.com/modocache/gover - go get github.com/Masterminds/glide - go get github.com/sgotti/glide-vc + - go get github.com/golang/lint/golint + install: - true diff --git a/Makefile b/Makefile index c5b7bab8f..76c54bce1 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ test-cmd: test-unit-cover: ./script/make.sh test-unit-cover -validate: gofmt vet +validate: gofmt vet lint vet: ./script/make.sh validate-vet From 4f176b847ec75f61ab69bcc03f2b759a178df991 Mon Sep 17 00:00:00 2001 From: Tomas Kral Date: Wed, 4 Jan 2017 18:19:24 +0100 Subject: [PATCH 2/2] fix golint errors --- cmd/convert.go | 30 ++++++--- cmd/down.go | 1 + cmd/root.go | 12 +++- cmd/up.go | 1 + cmd/version.go | 4 +- pkg/app/app.go | 7 ++- pkg/kobject/kobject.go | 3 +- pkg/loader/bundle/bundle.go | 5 +- pkg/loader/compose/compose.go | 3 +- pkg/loader/loader.go | 4 +- pkg/testutils/git.go | 10 ++- pkg/transformer/kubernetes/k8sutils.go | 41 ++++++------ pkg/transformer/kubernetes/k8sutils_test.go | 9 +-- pkg/transformer/kubernetes/kubernetes.go | 63 ++++++++++--------- pkg/transformer/kubernetes/kubernetes_test.go | 18 +++--- pkg/transformer/openshift/openshift.go | 35 ++++++----- pkg/transformer/openshift/openshift_test.go | 2 +- pkg/transformer/transformer.go | 1 + pkg/transformer/utils.go | 24 +++---- 19 files changed, 159 insertions(+), 114 deletions(-) diff --git a/cmd/convert.go b/cmd/convert.go index 2b65b7672..8a5c301b1 100644 --- a/cmd/convert.go +++ b/cmd/convert.go @@ -25,16 +25,28 @@ import ( "github.com/spf13/viper" ) +// TODO: comment var ( - ConvertSource, ConvertOut, ConvertBuildRepo, ConvertBuildBranch string - ConvertChart, ConvertDeployment, ConvertDaemonSet bool - ConvertReplicationController, ConvertYaml, ConvertStdout, ConvertJson bool - ConvertEmptyVols, ConvertDeploymentConfig, ConvertBuildConfig bool - ConvertReplicas int - ConvertOpt kobject.ConvertOptions + ConvertSource string + ConvertOut string + ConvertBuildRepo string + ConvertBuildBranch string + ConvertChart bool + ConvertDeployment bool + ConvertDaemonSet bool + ConvertReplicationController bool + ConvertYaml bool + ConvertJSON bool + ConvertStdout bool + ConvertEmptyVols bool + ConvertDeploymentConfig bool + ConvertBuildConfig bool + ConvertReplicas int + ConvertOpt kobject.ConvertOptions ) -var ConvertProvider string = GlobalProvider +// ConvertProvider TODO: comment +var ConvertProvider = GlobalProvider var convertCmd = &cobra.Command{ Use: "convert [file]", @@ -46,7 +58,7 @@ var convertCmd = &cobra.Command{ ToStdout: ConvertStdout, CreateChart: ConvertChart, GenerateYaml: ConvertYaml, - GenerateJson: ConvertJson, + GenerateJSON: ConvertJSON, Replicas: ConvertReplicas, InputFiles: GlobalFiles, OutFile: ConvertOut, @@ -96,7 +108,7 @@ func init() { convertCmd.Flags().BoolVarP(&ConvertYaml, "yaml", "y", false, "Generate resource files into YAML format") convertCmd.Flags().MarkDeprecated("yaml", "YAML is the default format now.") convertCmd.Flags().MarkShorthandDeprecated("y", "YAML is the default format now.") - convertCmd.Flags().BoolVarP(&ConvertJson, "json", "j", false, "Generate resource files into JSON format") + convertCmd.Flags().BoolVarP(&ConvertJSON, "json", "j", false, "Generate resource files into JSON format") convertCmd.Flags().BoolVar(&ConvertStdout, "stdout", false, "Print converted objects to stdout") convertCmd.Flags().BoolVar(&ConvertEmptyVols, "emptyvols", false, "Use Empty Volumes. Do not generate PVCs") convertCmd.Flags().StringVarP(&ConvertOut, "out", "o", "", "Specify a file name to save objects to") diff --git a/cmd/down.go b/cmd/down.go index 22b93cc8b..b7cc49820 100644 --- a/cmd/down.go +++ b/cmd/down.go @@ -24,6 +24,7 @@ import ( "github.com/spf13/cobra" ) +// TODO: comment var ( DownReplicas int DownEmptyVols bool diff --git a/cmd/root.go b/cmd/root.go index 93e2cd17f..ad87e71e8 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -39,12 +39,17 @@ func (errorOnWarningHook) Fire(entry *logrus.Entry) error { return nil } +// TODO: comment var ( - GlobalBundle, GlobalProvider string - GlobalVerbose, GlobalSuppressWarnings, GlobalErrorOnWarning bool - GlobalFiles []string + GlobalBundle string + GlobalProvider string + GlobalVerbose bool + GlobalSuppressWarnings bool + GlobalErrorOnWarning bool + GlobalFiles []string ) +// RootCmd root level flags and commands var RootCmd = &cobra.Command{ Use: "kompose", Short: "A tool helping Docker Compose users move to Kubernetes", @@ -76,6 +81,7 @@ var RootCmd = &cobra.Command{ }, } +// Execute TODO: comment func Execute() { if err := RootCmd.Execute(); err != nil { fmt.Println(err) diff --git a/cmd/up.go b/cmd/up.go index 36f4dca04..cb1c77b35 100644 --- a/cmd/up.go +++ b/cmd/up.go @@ -24,6 +24,7 @@ import ( "github.com/spf13/cobra" ) +// TODO: comment var ( UpReplicas int UpEmptyVols bool diff --git a/cmd/version.go b/cmd/version.go index 71c7f5cdb..621f83101 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -23,7 +23,9 @@ import ( ) var ( - VERSION = "0.1.2" + // VERSION is version number that wil be displayed when running ./kompose version + VERSION = "0.1.2" + // GITCOMMIT is hash of the commit that wil be displayed when running ./kompose version GITCOMMIT = "HEAD" ) diff --git a/pkg/app/app.go b/pkg/app/app.go index 66cb5a70e..73021226b 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -41,12 +41,15 @@ import ( ) const ( + // DefaultComposeFile name of the file that kompose will use if no file is explicitly set DefaultComposeFile = "docker-compose.yml" - DefaultProvider = "kubernetes" + // DefaultProvider - provider that will be used if there is no provider was explicitly set + DefaultProvider = "kubernetes" ) var inputFormat = "compose" +// ValidateFlags validates all command line flags func ValidateFlags(bundle string, args []string, cmd *cobra.Command, opt *kobject.ConvertOptions) { // Check to see if the "file" has changed from the default flag value @@ -125,7 +128,7 @@ func ValidateFlags(bundle string, args []string, cmd *cobra.Command, opt *kobjec logrus.Fatal("Unknown Argument(s): ", strings.Join(args, ",")) } - if opt.GenerateJson && opt.GenerateYaml { + if opt.GenerateJSON && opt.GenerateYaml { logrus.Fatalf("YAML and JSON format cannot be provided at the same time") } } diff --git a/pkg/kobject/kobject.go b/pkg/kobject/kobject.go index 6df5a0c21..80b89e726 100644 --- a/pkg/kobject/kobject.go +++ b/pkg/kobject/kobject.go @@ -27,6 +27,7 @@ type KomposeObject struct { LoadedFrom string } +// ConvertOptions holds all options that controls transformation process type ConvertOptions struct { ToStdout bool CreateD bool @@ -37,7 +38,7 @@ type ConvertOptions struct { BuildBranch string CreateChart bool GenerateYaml bool - GenerateJson bool + GenerateJSON bool EmptyVols bool Replicas int InputFiles []string diff --git a/pkg/loader/bundle/bundle.go b/pkg/loader/bundle/bundle.go index b4894760e..132cf6966 100644 --- a/pkg/loader/bundle/bundle.go +++ b/pkg/loader/bundle/bundle.go @@ -31,6 +31,7 @@ import ( "github.com/kubernetes-incubator/kompose/pkg/kobject" ) +// Bundle is docker bundle file loader, implements Loader interface type Bundle struct { } @@ -172,7 +173,7 @@ func loadPorts(service Service) ([]kobject.Ports, string) { return ports, "" } -// load dab file into KomposeObject +// LoadFile loads dab file into KomposeObject func (b *Bundle) LoadFile(files []string) kobject.KomposeObject { komposeObject := kobject.KomposeObject{ ServiceConfigs: make(map[string]kobject.ServiceConfig), @@ -244,7 +245,7 @@ func loadFile(reader io.Reader) (*Bundlefile, error) { jsonErr.Error()) case *json.UnmarshalTypeError: return nil, fmt.Errorf( - "Unexpected type at byte %v. Expected %s but received %s.", + "unexpected type at byte %v. expected %s but received %s", jsonErr.Offset, jsonErr.Type, jsonErr.Value) diff --git a/pkg/loader/compose/compose.go b/pkg/loader/compose/compose.go index f8e4d59b1..550187550 100644 --- a/pkg/loader/compose/compose.go +++ b/pkg/loader/compose/compose.go @@ -34,6 +34,7 @@ import ( "github.com/kubernetes-incubator/kompose/pkg/kobject" ) +// Compose is docker compose file loader, implements Loader interface type Compose struct { } @@ -220,7 +221,7 @@ func loadPorts(composePorts []string) ([]kobject.Ports, error) { return ports, nil } -// load compose file into KomposeObject +// LoadFile loads compose file into KomposeObject func (c *Compose) LoadFile(files []string) kobject.KomposeObject { komposeObject := kobject.KomposeObject{ ServiceConfigs: make(map[string]kobject.ServiceConfig), diff --git a/pkg/loader/loader.go b/pkg/loader/loader.go index 6069f15bc..9f96082c3 100644 --- a/pkg/loader/loader.go +++ b/pkg/loader/loader.go @@ -17,7 +17,6 @@ limitations under the License. package loader import ( - "errors" "fmt" "github.com/kubernetes-incubator/kompose/pkg/kobject" @@ -25,6 +24,7 @@ import ( "github.com/kubernetes-incubator/kompose/pkg/loader/compose" ) +// Loader interface defines loader that loads files and converts it to kobject representation type Loader interface { LoadFile(files []string) kobject.KomposeObject ///Name() string @@ -40,7 +40,7 @@ func GetLoader(format string) (Loader, error) { case "compose": l = new(compose.Compose) default: - return nil, errors.New(fmt.Sprintf("Input file format %s is not supported", format)) + return nil, fmt.Errorf("Input file format %s is not supported", format) } return l, nil diff --git a/pkg/testutils/git.go b/pkg/testutils/git.go index 333164026..e446ebffe 100644 --- a/pkg/testutils/git.go +++ b/pkg/testutils/git.go @@ -8,10 +8,12 @@ import ( "testing" ) +// NewCommand TODO: comment func NewCommand(cmd string) *exec.Cmd { return exec.Command("sh", "-c", cmd) } +// CreateLocalDirectory TODO: comment func CreateLocalDirectory(t *testing.T) string { dir, err := ioutil.TempDir(os.TempDir(), "kompose-test-") if err != nil { @@ -20,6 +22,7 @@ func CreateLocalDirectory(t *testing.T) string { return dir } +// CreateLocalGitDirectory TODO: comment func CreateLocalGitDirectory(t *testing.T) string { dir := CreateLocalDirectory(t) cmd := NewCommand( @@ -35,8 +38,9 @@ func CreateLocalGitDirectory(t *testing.T) string { return dir } -func SetGitRemote(t *testing.T, dir string, remote string, remoteUrl string) { - cmd := NewCommand(fmt.Sprintf("git remote add %s %s", remote, remoteUrl)) +// SetGitRemote TODO: comment +func SetGitRemote(t *testing.T, dir string, remote string, remoteURL string) { + cmd := NewCommand(fmt.Sprintf("git remote add %s %s", remote, remoteURL)) cmd.Dir = dir _, err := cmd.Output() if err != nil { @@ -45,6 +49,7 @@ func SetGitRemote(t *testing.T, dir string, remote string, remoteUrl string) { } } +// CreateGitRemoteBranch TODO: comment func CreateGitRemoteBranch(t *testing.T, dir string, branch string, remote string) { cmd := NewCommand( fmt.Sprintf(`git checkout -b %s && @@ -60,6 +65,7 @@ func CreateGitRemoteBranch(t *testing.T, dir string, branch string, remote strin } } +// CreateSubdir TODO: comment func CreateSubdir(t *testing.T, dir string, subdir string) { cmd := NewCommand(fmt.Sprintf("mkdir -p %s", subdir)) cmd.Dir = dir diff --git a/pkg/transformer/kubernetes/k8sutils.go b/pkg/transformer/kubernetes/k8sutils.go index 16630c699..0d0423153 100644 --- a/pkg/transformer/kubernetes/k8sutils.go +++ b/pkg/transformer/kubernetes/k8sutils.go @@ -186,11 +186,11 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error { if err != nil { return err } - data, err := marshal(convertedList, opt.GenerateJson) + data, err := marshal(convertedList, opt.GenerateJSON) if err != nil { return fmt.Errorf("Error in marshalling the List: %v", err) } - files = append(files, transformer.Print("", dirName, "", data, opt.ToStdout, opt.GenerateJson, f)) + files = append(files, transformer.Print("", dirName, "", data, opt.ToStdout, opt.GenerateJSON, f)) } else { var file string // create a separate file for each provider @@ -199,33 +199,33 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error { if err != nil { return err } - data, err := marshal(versionedObject, opt.GenerateJson) + data, err := marshal(versionedObject, opt.GenerateJSON) if err != nil { return err } switch t := v.(type) { case *api.ReplicationController: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *extensions.Deployment: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *extensions.DaemonSet: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *deployapi.DeploymentConfig: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *buildapi.BuildConfig: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *imageapi.ImageStream: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *api.Service: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *api.PersistentVolumeClaim: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *api.Pod: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *routeapi.Route: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) case *extensions.Ingress: - file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJson, f) + file = transformer.Print(t.Name, dirName, strings.ToLower(t.Kind), data, opt.ToStdout, opt.GenerateJSON, f) } files = append(files, file) @@ -270,16 +270,17 @@ func convertToVersion(obj runtime.Object, groupVersion unversioned.GroupVersion) return convertedObject, nil } +// PortsExist checks if service has ports defined func (k *Kubernetes) PortsExist(name string, service kobject.ServiceConfig) bool { if len(service.Port) == 0 { logrus.Warningf("[%s] Service cannot be created because of missing port.", name) return false - } else { - return true } + return true + } -// create a k8s service +// CreateService creates a k8s service func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, objects []runtime.Object) *api.Service { svc := k.InitSvc(name, service) @@ -296,7 +297,7 @@ func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, o return svc } -// load configurations to k8s objects +// UpdateKubernetesObjects loads configurations to k8s objects func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.ServiceConfig, objects *[]runtime.Object) { // Configure the environment variables. envs := k.ConfigEnvs(name, service) @@ -376,7 +377,7 @@ func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.Servic } } -// the objects that we get can be in any order this keeps services first +// SortServicesFirst - the objects that we get can be in any order this keeps services first // according to best practice kubernetes services should be created first // http://kubernetes.io/docs/user-guide/config-best-practices/ func (k *Kubernetes) SortServicesFirst(objs *[]runtime.Object) { @@ -408,8 +409,8 @@ func (k *Kubernetes) findDependentVolumes(svcname string, komposeObject kobject. return } +// VolumesFrom creates volums and volumeMounts for volumes_from func (k *Kubernetes) VolumesFrom(objects *[]runtime.Object, komposeObject kobject.KomposeObject) { - for _, obj := range *objects { switch t := obj.(type) { case *api.ReplicationController: diff --git a/pkg/transformer/kubernetes/k8sutils_test.go b/pkg/transformer/kubernetes/k8sutils_test.go index 190db589c..548b1f2b6 100644 --- a/pkg/transformer/kubernetes/k8sutils_test.go +++ b/pkg/transformer/kubernetes/k8sutils_test.go @@ -20,11 +20,12 @@ import ( "strconv" "testing" + "os" + "path/filepath" + "github.com/kubernetes-incubator/kompose/pkg/kobject" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" - "os" - "path/filepath" ) /* @@ -57,11 +58,11 @@ func TestCreateService(t *testing.T) { } // An example object generated via k8s runtime.Objects() - kompose_object := kobject.KomposeObject{ + komposeObject := kobject.KomposeObject{ ServiceConfigs: map[string]kobject.ServiceConfig{"app": service}, } k := Kubernetes{} - objects := k.Transform(kompose_object, kobject.ConvertOptions{CreateD: true, Replicas: 3}) + objects := k.Transform(komposeObject, kobject.ConvertOptions{CreateD: true, Replicas: 3}) // Test the creation of the service svc := k.CreateService("foo", service, objects) diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index eebc03db7..aadaf0b09 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -31,12 +31,14 @@ import ( deployapi "github.com/openshift/origin/pkg/deploy/api" // install kubernetes api - "k8s.io/kubernetes/pkg/api" _ "k8s.io/kubernetes/pkg/api/install" + _ "k8s.io/kubernetes/pkg/apis/extensions/install" + + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/resource" "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" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -46,12 +48,13 @@ import ( //"k8s.io/kubernetes/pkg/controller/daemon" ) +// Kubernetes implements Transformer interface and represents Kubernetes transformer type Kubernetes struct { // the user provided options from the command line Opt kobject.ConvertOptions } -// timeout is how long we'll wait for the termination of kubernetes resource to be successful +// TIMEOUT is how long we'll wait for the termination of kubernetes resource to be successful // used when undeploying resources from kubernetes const TIMEOUT = 300 @@ -64,7 +67,7 @@ var unsupportedKey = map[string]bool{ "Build": false, } -// checkUnsupportedKey checks if given komposeObject contains +// CheckUnsupportedKey checks if given komposeObject contains // keys that are not supported by this tranfomer. // list of all unsupported keys are stored in unsupportedKey variable // returns list of TODO: .... @@ -101,7 +104,7 @@ func (k *Kubernetes) CheckUnsupportedKey(komposeObject *kobject.KomposeObject, u return keysFound } -// Init RC object +// InitRC initializes Kubernetes ReplicationController object func (k *Kubernetes) InitRC(name string, service kobject.ServiceConfig, replicas int) *api.ReplicationController { rc := &api.ReplicationController{ TypeMeta: unversioned.TypeMeta{ @@ -131,7 +134,7 @@ func (k *Kubernetes) InitRC(name string, service kobject.ServiceConfig, replicas return rc } -// Init Svc object +// InitSvc initializes Kubernets Service object func (k *Kubernetes) InitSvc(name string, service kobject.ServiceConfig) *api.Service { svc := &api.Service{ TypeMeta: unversioned.TypeMeta{ @@ -149,7 +152,7 @@ func (k *Kubernetes) InitSvc(name string, service kobject.ServiceConfig) *api.Se return svc } -// Init Deployment +// InitD initializes Kubernetes Deployment object func (k *Kubernetes) InitD(name string, service kobject.ServiceConfig, replicas int) *extensions.Deployment { dc := &extensions.Deployment{ TypeMeta: unversioned.TypeMeta{ @@ -176,7 +179,7 @@ func (k *Kubernetes) InitD(name string, service kobject.ServiceConfig, replicas return dc } -// Init DS object +// InitDS initializes Kubernetes DaemonSet object func (k *Kubernetes) InitDS(name string, service kobject.ServiceConfig) *extensions.DaemonSet { ds := &extensions.DaemonSet{ TypeMeta: unversioned.TypeMeta{ @@ -241,7 +244,7 @@ func (k *Kubernetes) initIngress(name string, service kobject.ServiceConfig, por return ingress } -// Initialize PersistentVolumeClaim +// CreatePVC initializes PersistentVolumeClaim func (k *Kubernetes) CreatePVC(name string, mode string) *api.PersistentVolumeClaim { size, err := resource.ParseQuantity("100Mi") if err != nil { @@ -273,7 +276,7 @@ func (k *Kubernetes) CreatePVC(name string, mode string) *api.PersistentVolumeCl return pvc } -// Configure the container ports. +// ConfigPorts configures the container ports. func (k *Kubernetes) ConfigPorts(name string, service kobject.ServiceConfig) []api.ContainerPort { ports := []api.ContainerPort{} for _, port := range service.Port { @@ -286,7 +289,7 @@ func (k *Kubernetes) ConfigPorts(name string, service kobject.ServiceConfig) []a return ports } -// Configure the container service ports. +// ConfigServicePorts configure the container service ports. func (k *Kubernetes) ConfigServicePorts(name string, service kobject.ServiceConfig) []api.ServicePort { servicePorts := []api.ServicePort{} for _, port := range service.Port { @@ -306,7 +309,7 @@ func (k *Kubernetes) ConfigServicePorts(name string, service kobject.ServiceConf return servicePorts } -// Configure the container volumes. +// ConfigVolumes configure the container volumes. func (k *Kubernetes) ConfigVolumes(name string, service kobject.ServiceConfig) ([]api.VolumeMount, []api.Volume, []*api.PersistentVolumeClaim) { volumeMounts := []api.VolumeMount{} volumes := []api.Volume{} @@ -368,14 +371,14 @@ func (k *Kubernetes) ConfigVolumes(name string, service kobject.ServiceConfig) ( return volumeMounts, volumes, PVCs } -// helper function to create an EmptyDir api.VolumeSource +// ConfigEmptyVolumeSource is helper function to create an EmptyDir api.VolumeSource func (k *Kubernetes) ConfigEmptyVolumeSource() *api.VolumeSource { return &api.VolumeSource{ EmptyDir: &api.EmptyDirVolumeSource{}, } } -// helper function to create an api.VolumeSource with a PVC +// ConfigPVCVolumeSource is helper function to create an api.VolumeSource with a PVC func (k *Kubernetes) ConfigPVCVolumeSource(name string, readonly bool) *api.VolumeSource { return &api.VolumeSource{ PersistentVolumeClaim: &api.PersistentVolumeClaimVolumeSource{ @@ -385,7 +388,7 @@ func (k *Kubernetes) ConfigPVCVolumeSource(name string, readonly bool) *api.Volu } } -// Configure the environment variables. +// ConfigEnvs configures the environment variables. func (k *Kubernetes) ConfigEnvs(name string, service kobject.ServiceConfig) []api.EnvVar { envs := []api.EnvVar{} for _, v := range service.Environment { @@ -398,7 +401,7 @@ func (k *Kubernetes) ConfigEnvs(name string, service kobject.ServiceConfig) []ap return envs } -// Generate a Kubernetes artifact for each input type service +// CreateKubernetesObjects generates a Kubernetes artifact for each input type service func (k *Kubernetes) CreateKubernetesObjects(name string, service kobject.ServiceConfig, opt kobject.ConvertOptions) []runtime.Object { var objects []runtime.Object @@ -415,6 +418,7 @@ func (k *Kubernetes) CreateKubernetesObjects(name string, service kobject.Servic return objects } +// InitPod initializes Kubernetes Pod object func (k *Kubernetes) InitPod(name string, service kobject.ServiceConfig) *api.Pod { pod := api.Pod{ TypeMeta: unversioned.TypeMeta{ @@ -450,7 +454,7 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject. // Need to ensure the kubernetes objects are in a consistent order var sortedKeys []string - for name, _ := range komposeObject.ServiceConfigs { + for name := range komposeObject.ServiceConfigs { sortedKeys = append(sortedKeys, name) } sort.Strings(sortedKeys) @@ -487,7 +491,7 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject. return allobjects } -// Updates the given object with the given pod template update function and ObjectMeta update function +// UpdateController updates the given object with the given pod template update function and ObjectMeta update function func (k *Kubernetes) UpdateController(obj runtime.Object, updateTemplate func(*api.PodTemplateSpec), updateMeta func(meta *api.ObjectMeta)) { switch t := obj.(type) { case *api.ReplicationController: @@ -518,8 +522,8 @@ func (k *Kubernetes) UpdateController(obj runtime.Object, updateTemplate func(*a } } -// Creates the k8s Client, returns k8s client and namespace -func (o *Kubernetes) GetKubernetesClient() (*client.Client, string, error) { +// GetKubernetesClient creates the k8s Client, returns k8s client and namespace +func (k *Kubernetes) GetKubernetesClient() (*client.Client, string, error) { // initialize Kubernetes client factory := cmdutil.NewFactory(nil) clientConfig, err := factory.ClientConfig() @@ -536,7 +540,7 @@ func (o *Kubernetes) GetKubernetesClient() (*client.Client, string, error) { return client, namespace, nil } -// Submit deployment and svc to k8s endpoint +// Deploy submits deployment and svc to k8s endpoint func (k *Kubernetes) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { //Convert komposeObject objects := k.Transform(komposeObject, opt) @@ -592,6 +596,7 @@ func (k *Kubernetes) Deploy(komposeObject kobject.KomposeObject, opt kobject.Con return nil } +// Undeploy deletes deployed objects from Kubernetes cluster func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { //Convert komposeObject objects := k.Transform(komposeObject, opt) @@ -613,9 +618,9 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C err = rpDeployment.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { return err - } else { - logrus.Infof("Successfully deleted Deployment: %s", t.Name) } + logrus.Infof("Successfully deleted Deployment: %s", t.Name) + case *api.Service: //delete svc rpService, err := kubectl.ReaperFor(api.Kind("Service"), client) @@ -626,17 +631,17 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C err = rpService.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { return err - } else { - logrus.Infof("Successfully deleted Service: %s", t.Name) } + logrus.Infof("Successfully deleted Service: %s", t.Name) + case *api.PersistentVolumeClaim: // delete pvc err = client.PersistentVolumeClaims(namespace).Delete(t.Name) if err != nil { return err - } else { - logrus.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name) } + logrus.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name) + case *extensions.Ingress: // delete ingress ingDeleteOptions := &api.DeleteOptions{ @@ -648,9 +653,9 @@ func (k *Kubernetes) Undeploy(komposeObject kobject.KomposeObject, opt kobject.C err = client.Ingress(namespace).Delete(t.Name, ingDeleteOptions) if err != nil { return err - } else { - logrus.Infof("Successfully deleted Ingress: %s", t.Name) } + logrus.Infof("Successfully deleted Ingress: %s", t.Name) + } } return nil diff --git a/pkg/transformer/kubernetes/kubernetes_test.go b/pkg/transformer/kubernetes/kubernetes_test.go index 3bde5ffba..e6dcd32d0 100644 --- a/pkg/transformer/kubernetes/kubernetes_test.go +++ b/pkg/transformer/kubernetes/kubernetes_test.go @@ -76,14 +76,14 @@ func equalStringSlice(s1, s2 []string) bool { return true } -func equalEnv(kEnvs []kobject.EnvVar, k8sEnvs []api.EnvVar) bool { - if len(kEnvs) != len(k8sEnvs) { +func equalEnv(kobjectEnvs []kobject.EnvVar, k8sEnvs []api.EnvVar) bool { + if len(kobjectEnvs) != len(k8sEnvs) { return false } - for _, kEnv := range kEnvs { + for _, env := range kobjectEnvs { found := false for _, k8sEnv := range k8sEnvs { - if kEnv.Name == k8sEnv.Name && kEnv.Value == k8sEnv.Value { + if env.Name == k8sEnv.Name && env.Value == k8sEnv.Value { found = true } } @@ -94,16 +94,16 @@ func equalEnv(kEnvs []kobject.EnvVar, k8sEnvs []api.EnvVar) bool { return true } -func equalPorts(kPorts []kobject.Ports, k8sPorts []api.ContainerPort) bool { - if len(kPorts) != len(k8sPorts) { +func equalPorts(kobjectPorts []kobject.Ports, k8sPorts []api.ContainerPort) bool { + if len(kobjectPorts) != len(k8sPorts) { return false } - for _, kPort := range kPorts { + for _, port := range kobjectPorts { found := false for _, k8sPort := range k8sPorts { // FIXME: HostPort should be copied to container port - //if kPort.HostPort == k8sPort.HostPort && kPort.Protocol == k8sPort.Protocol && kPort.ContainerPort == k8sPort.ContainerPort { - if kPort.Protocol == k8sPort.Protocol && kPort.ContainerPort == k8sPort.ContainerPort { + //if port.HostPort == k8sPort.HostPort && port.Protocol == k8sPort.Protocol && port.ContainerPort == k8sPort.ContainerPort { + if port.Protocol == k8sPort.Protocol && port.ContainerPort == k8sPort.ContainerPort { found = true } // Name and HostIp shouldn't be set diff --git a/pkg/transformer/openshift/openshift.go b/pkg/transformer/openshift/openshift.go index 7c7e35b97..b8bfef566 100644 --- a/pkg/transformer/openshift/openshift.go +++ b/pkg/transformer/openshift/openshift.go @@ -48,6 +48,7 @@ import ( "k8s.io/kubernetes/pkg/util/intstr" ) +// OpenShift implements Transformer interface and represents OpenShift transformer type OpenShift struct { // Anonymous field allows for inheritance. We are basically inheriting // all of kubernetes.Kubernetes Methods and variables here. We'll overwite @@ -55,7 +56,7 @@ type OpenShift struct { kubernetes.Kubernetes } -// timeout is how long we'll wait for the termination of OpenShift resource to be successful +// TIMEOUT is how long we'll wait for the termination of OpenShift resource to be successful // used when undeploying resources from OpenShift const TIMEOUT = 300 @@ -72,9 +73,9 @@ func getImageTag(image string) string { p := strings.Split(image, ":") if len(p) == 2 { return p[1] - } else { - return "latest" } + return "latest" + } // hasGitBinary checks if the 'git' binary is available on the system @@ -83,8 +84,8 @@ func hasGitBinary() bool { return err == nil } -// getGitCurrentRemoteUrl gets current git remote URI for the current git repo -func getGitCurrentRemoteUrl(composeFileDir string) (string, error) { +// getGitCurrentRemoteURL gets current git remote URI for the current git repo +func getGitCurrentRemoteURL(composeFileDir string) (string, error) { cmd := exec.Command("git", "ls-remote", "--get-url") cmd.Dir = composeFileDir out, err := cmd.Output() @@ -352,7 +353,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C if err != nil { logrus.Fatalf("Buildconfig cannot be created because remote for current git branch couldn't be detected.") } - buildRepo, err = getGitCurrentRemoteUrl(composeFileDir) + buildRepo, err = getGitCurrentRemoteURL(composeFileDir) if err != nil { logrus.Fatalf("Buildconfig cannot be created because git remote origin repo couldn't be detected.") } @@ -400,6 +401,7 @@ func (o *OpenShift) getOpenShiftClient() (*oclient.Client, error) { return oclient, nil } +// Deploy transofrms and deploys kobject to OpenShift func (o *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { //Convert komposeObject objects := o.Transform(komposeObject, opt) @@ -470,6 +472,7 @@ func (o *OpenShift) Deploy(komposeObject kobject.KomposeObject, opt kobject.Conv return nil } +//Undeploy removes deployed artifacts from OpenShift cluster func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) error { //Convert komposeObject objects := o.Transform(komposeObject, opt) @@ -490,18 +493,18 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co err = oclient.ImageStreams(namespace).Delete(t.Name) if err != nil { return err - } else { - logrus.Infof("Successfully deleted ImageStream: %s", t.Name) } + logrus.Infof("Successfully deleted ImageStream: %s", t.Name) + case *deployapi.DeploymentConfig: // delete deploymentConfig dcreaper := deploymentconfigreaper.NewDeploymentConfigReaper(oclient, kclient) err := dcreaper.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { return err - } else { - logrus.Infof("Successfully deleted DeploymentConfig: %s", t.Name) } + logrus.Infof("Successfully deleted DeploymentConfig: %s", t.Name) + case *api.Service: //delete svc rpService, err := kubectl.ReaperFor(api.Kind("Service"), kclient) @@ -512,25 +515,25 @@ func (o *OpenShift) Undeploy(komposeObject kobject.KomposeObject, opt kobject.Co err = rpService.Stop(namespace, t.Name, TIMEOUT*time.Second, nil) if err != nil { return err - } else { - logrus.Infof("Successfully deleted service: %s", t.Name) } + logrus.Infof("Successfully deleted service: %s", t.Name) + case *api.PersistentVolumeClaim: // delete pvc err = kclient.PersistentVolumeClaims(namespace).Delete(t.Name) if err != nil { return err - } else { - logrus.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name) } + logrus.Infof("Successfully deleted PersistentVolumeClaim: %s", t.Name) + case *routeapi.Route: // delete route err = oclient.Routes(namespace).Delete(t.Name) if err != nil { return err - } else { - logrus.Infof("Successfully deleted Route: %s", t.Name) } + logrus.Infof("Successfully deleted Route: %s", t.Name) + } } return nil diff --git a/pkg/transformer/openshift/openshift_test.go b/pkg/transformer/openshift/openshift_test.go index adb7e7b42..77c345e57 100644 --- a/pkg/transformer/openshift/openshift_test.go +++ b/pkg/transformer/openshift/openshift_test.go @@ -150,7 +150,7 @@ func TestGetGitRemote(t *testing.T) { for name, test := range testCases { t.Log("Test case: ", name) - output, err = getGitCurrentRemoteUrl(test.dir) + output, err = getGitCurrentRemoteURL(test.dir) if test.expectError { if err == nil { diff --git a/pkg/transformer/transformer.go b/pkg/transformer/transformer.go index c5d484b2f..3ae765a54 100644 --- a/pkg/transformer/transformer.go +++ b/pkg/transformer/transformer.go @@ -21,6 +21,7 @@ import ( "k8s.io/kubernetes/pkg/runtime" ) +// Transformer interface defines transformer that is converting kobject to other resources type Transformer interface { // Transform converts KomposeObject to transformer specific objects. Transform(kobject.KomposeObject, kobject.ConvertOptions) []runtime.Object diff --git a/pkg/transformer/utils.go b/pkg/transformer/utils.go index 188382770..104337977 100644 --- a/pkg/transformer/utils.go +++ b/pkg/transformer/utils.go @@ -28,10 +28,11 @@ import ( "github.com/ghodss/yaml" "github.com/kubernetes-incubator/kompose/pkg/kobject" + "path/filepath" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/runtime" - "path/filepath" ) const letterBytes = "abcdefghijklmnopqrstuvwxyz0123456789" @@ -45,7 +46,7 @@ func RandStringBytes(n int) string { return string(b) } -// Create the file to write to if --out is specified +// CreateOutFile creates the file to write to if --out is specified func CreateOutFile(out string) *os.File { var f *os.File var err error @@ -58,7 +59,7 @@ func CreateOutFile(out string) *os.File { return f } -// parseVolume parse a given volume, which might be [name:][host:]container[:access_mode] +// ParseVolume parses a given volume, which might be [name:][host:]container[:access_mode] func ParseVolume(volume string) (name, host, container, mode string, err error) { separator := ":" volumeStrings := strings.Split(volume, separator) @@ -94,12 +95,12 @@ func isPath(substring string) bool { return strings.Contains(substring, "/") } -// Configure label +// ConfigLabels configures label func ConfigLabels(name string) map[string]string { return map[string]string{"service": name} } -// Configure annotations +// ConfigAnnotations configures annotations func ConfigAnnotations(service kobject.ServiceConfig) map[string]string { annotations := map[string]string{} for key, value := range service.Annotations { @@ -109,8 +110,8 @@ func ConfigAnnotations(service kobject.ServiceConfig) map[string]string { return annotations } -// Transform data to json/yaml -func TransformData(obj runtime.Object, GenerateJson bool) ([]byte, error) { +// TransformData transforms data to json/yaml +func TransformData(obj runtime.Object, GenerateJSON bool) ([]byte, error) { // Convert to versioned object objectVersion := obj.GetObjectKind().GroupVersionKind() version := unversioned.GroupVersion{Group: objectVersion.Group, Version: objectVersion.Version} @@ -121,7 +122,7 @@ func TransformData(obj runtime.Object, GenerateJson bool) ([]byte, error) { // convert data to json / yaml data, err := yaml.Marshal(versionedObj) - if GenerateJson == true { + if GenerateJSON == true { data, err = json.MarshalIndent(versionedObj, "", " ") } if err != nil { @@ -131,11 +132,10 @@ func TransformData(obj runtime.Object, GenerateJson bool) ([]byte, error) { return data, nil } -// Either print to stdout or to file/s -func Print(name, path string, trailing string, data []byte, toStdout, generateJson bool, f *os.File) string { - +// Print either prints to stdout or to file/s +func Print(name, path string, trailing string, data []byte, toStdout, generateJSON bool, f *os.File) string { file := "" - if generateJson { + if generateJSON { file = fmt.Sprintf("%s-%s.json", name, trailing) } else { file = fmt.Sprintf("%s-%s.yaml", name, trailing)