Add v3 support
This does a major refactor on the compose.go functions as well as brings in a new era of v3 support to Kompose. Similar to how we utilize libcompose, we utilize docker/cli's "stack deploy" code which has a built-in v3 parser. We convert the parsed structure to our own and then convert it to Kubernetes/OpenShift artifacts.
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
Copyright 2016 The Kubernetes Authors All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package compose
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/kubernetes-incubator/kompose/pkg/kobject"
|
||||
"github.com/pkg/errors"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
)
|
||||
|
||||
// load environment variables from compose file
|
||||
func loadEnvVars(envars []string) []kobject.EnvVar {
|
||||
envs := []kobject.EnvVar{}
|
||||
for _, e := range envars {
|
||||
character := ""
|
||||
equalPos := strings.Index(e, "=")
|
||||
colonPos := strings.Index(e, ":")
|
||||
switch {
|
||||
case equalPos == -1 && colonPos == -1:
|
||||
character = ""
|
||||
case equalPos == -1 && colonPos != -1:
|
||||
character = ":"
|
||||
case equalPos != -1 && colonPos == -1:
|
||||
character = "="
|
||||
case equalPos != -1 && colonPos != -1:
|
||||
if equalPos > colonPos {
|
||||
character = ":"
|
||||
} else {
|
||||
character = "="
|
||||
}
|
||||
}
|
||||
|
||||
if character == "" {
|
||||
envs = append(envs, kobject.EnvVar{
|
||||
Name: e,
|
||||
Value: os.Getenv(e),
|
||||
})
|
||||
} else {
|
||||
values := strings.SplitN(e, character, 2)
|
||||
// try to get value from os env
|
||||
if values[1] == "" {
|
||||
values[1] = os.Getenv(values[0])
|
||||
}
|
||||
envs = append(envs, kobject.EnvVar{
|
||||
Name: values[0],
|
||||
Value: values[1],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return envs
|
||||
}
|
||||
|
||||
// getComposeFileDir returns compose file directory
|
||||
// Assume all the docker-compose files are in the same directory
|
||||
// TODO: fix (check if file exists)
|
||||
func getComposeFileDir(inputFiles []string) (string, error) {
|
||||
inputFile := inputFiles[0]
|
||||
if strings.Index(inputFile, "/") != 0 {
|
||||
workDir, err := os.Getwd()
|
||||
if err != nil {
|
||||
return "", errors.Wrap(err, "Unable to retrieve compose file directory")
|
||||
}
|
||||
inputFile = filepath.Join(workDir, inputFile)
|
||||
}
|
||||
return filepath.Dir(inputFile), nil
|
||||
}
|
||||
|
||||
func handleServiceType(ServiceType string) (string, error) {
|
||||
switch strings.ToLower(ServiceType) {
|
||||
case "", "clusterip":
|
||||
return string(api.ServiceTypeClusterIP), nil
|
||||
case "nodeport":
|
||||
return string(api.ServiceTypeNodePort), nil
|
||||
case "loadbalancer":
|
||||
return string(api.ServiceTypeLoadBalancer), nil
|
||||
default:
|
||||
return "", errors.New("Unknown value " + ServiceType + " , supported values are 'NodePort, ClusterIP or LoadBalancer'")
|
||||
}
|
||||
}
|
||||
|
||||
func normalizeServiceNames(svcName string) string {
|
||||
return strings.Replace(svcName, "_", "-", -1)
|
||||
}
|
||||
Reference in New Issue
Block a user