forked from LaconicNetwork/kompose
250 lines
8.6 KiB
Go
250 lines
8.6 KiB
Go
package client
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/kubernetes/kompose/pkg/app"
|
|
"github.com/kubernetes/kompose/pkg/kobject"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
)
|
|
|
|
func (k *Kompose) Convert(options ConvertOptions) ([]runtime.Object, error) {
|
|
options = k.setDefaultValues(options)
|
|
err := k.validateOptions(options)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
kobjectConvertOptions := kobject.ConvertOptions{
|
|
ToStdout: options.ToStdout,
|
|
CreateChart: k.createChart(options),
|
|
GenerateYaml: true,
|
|
GenerateJSON: options.GenerateJson,
|
|
Replicas: *options.Replicas,
|
|
InputFiles: options.InputFiles,
|
|
OutFile: options.OutFile,
|
|
Provider: k.getProvider(options),
|
|
CreateD: k.createDeployment(options),
|
|
CreateDS: k.createDaemonSet(options),
|
|
CreateRC: k.createReplicationController(options),
|
|
Build: *options.Build,
|
|
BuildRepo: k.buildRepo(options),
|
|
BuildBranch: k.buildBranch(options),
|
|
PushImage: options.PushImage,
|
|
PushImageRegistry: options.PushImageRegistry,
|
|
CreateDeploymentConfig: k.createDeploymentConfig(options),
|
|
EmptyVols: false,
|
|
Profiles: options.Profiles,
|
|
Volumes: *options.VolumeType,
|
|
PVCRequestSize: options.PvcRequestSize,
|
|
InsecureRepository: k.insecureRepository(options),
|
|
IsDeploymentFlag: k.createDeployment(options),
|
|
IsDaemonSetFlag: k.createDaemonSet(options),
|
|
IsReplicationControllerFlag: k.createReplicationController(options),
|
|
Controller: k.getController(options),
|
|
IsReplicaSetFlag: *options.Replicas != 0,
|
|
IsDeploymentConfigFlag: k.createDeploymentConfig(options),
|
|
YAMLIndent: 2,
|
|
WithKomposeAnnotation: *options.WithKomposeAnnotations,
|
|
MultipleContainerMode: k.multiContainerMode(options),
|
|
ServiceGroupMode: k.serviceGroupMode(options),
|
|
ServiceGroupName: k.serviceGroupName(options),
|
|
SecretsAsFiles: k.secretsAsFiles(options),
|
|
GenerateNetworkPolicies: options.GenerateNetworkPolicies,
|
|
}
|
|
err = app.ValidateComposeFile(&kobjectConvertOptions)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
objects, err := app.Convert(kobjectConvertOptions)
|
|
return objects, err
|
|
}
|
|
|
|
func (k *Kompose) setDefaultValues(options ConvertOptions) ConvertOptions {
|
|
replicasDefaultValue := 1
|
|
buildDefaultValue := "none"
|
|
volumeTypeDefaultValue := "persistentVolumeClaim"
|
|
withKomposeAnnotationsDefaultValue := true
|
|
kubernetesControllerDefaultValue := "deployment"
|
|
kubernetesServiceGroupModeDefaultValue := ""
|
|
|
|
if options.Replicas == nil {
|
|
options.Replicas = &replicasDefaultValue
|
|
}
|
|
if options.Build == nil {
|
|
options.Build = &buildDefaultValue
|
|
}
|
|
if options.VolumeType == nil {
|
|
options.VolumeType = &volumeTypeDefaultValue
|
|
}
|
|
if options.WithKomposeAnnotations == nil {
|
|
options.WithKomposeAnnotations = &withKomposeAnnotationsDefaultValue
|
|
}
|
|
if options.Provider == nil {
|
|
options.Provider = Kubernetes{
|
|
Controller: &kubernetesControllerDefaultValue,
|
|
}
|
|
}
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
if kubernetesProvider.Controller == nil {
|
|
options.Provider = Kubernetes{
|
|
Controller: &kubernetesControllerDefaultValue,
|
|
Chart: options.Provider.(Kubernetes).Chart,
|
|
MultiContainerMode: options.Provider.(Kubernetes).MultiContainerMode,
|
|
ServiceGroupMode: options.Provider.(Kubernetes).ServiceGroupMode,
|
|
ServiceGroupName: options.Provider.(Kubernetes).ServiceGroupName,
|
|
SecretsAsFiles: options.Provider.(Kubernetes).SecretsAsFiles,
|
|
}
|
|
}
|
|
if kubernetesProvider.ServiceGroupMode == nil {
|
|
options.Provider = Kubernetes{
|
|
Controller: options.Provider.(Kubernetes).Controller,
|
|
Chart: options.Provider.(Kubernetes).Chart,
|
|
MultiContainerMode: options.Provider.(Kubernetes).MultiContainerMode,
|
|
ServiceGroupMode: &kubernetesServiceGroupModeDefaultValue,
|
|
ServiceGroupName: options.Provider.(Kubernetes).ServiceGroupName,
|
|
SecretsAsFiles: options.Provider.(Kubernetes).SecretsAsFiles,
|
|
}
|
|
}
|
|
}
|
|
return options
|
|
}
|
|
|
|
func (k *Kompose) validateOptions(options ConvertOptions) error {
|
|
build := options.Build
|
|
if *build != string(LOCAL) && *build != string(BUILD_CONFIG) && *build != string(NONE) {
|
|
return fmt.Errorf(
|
|
"unexpected Value for Build field. Possible values are: %v, %v, and %v", string(LOCAL), string(BUILD_CONFIG), string(NONE),
|
|
)
|
|
}
|
|
|
|
volumeType := options.VolumeType
|
|
if *volumeType != string(PVC) && *volumeType != string(EMPTYDIR) && *volumeType != string(HOSTPATH) && *volumeType != string(CONFIGMAP) {
|
|
return fmt.Errorf(
|
|
"unexpected Value for VolumeType field. Possible values are: %v, %v, %v, %v", string(PVC), string(EMPTYDIR), string(HOSTPATH), string(CONFIGMAP),
|
|
)
|
|
}
|
|
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
kubernetesController := kubernetesProvider.Controller
|
|
if *kubernetesController != string(DEPLOYMENT) && *kubernetesController != string(DAEMONSET) && *kubernetesController != string(REPLICATION_CONTROLLER) {
|
|
return fmt.Errorf(
|
|
"unexpected Value for Kubernetes Controller field. Possible values are: %v, %v, and %v", string(DEPLOYMENT), string(DAEMONSET), string(REPLICATION_CONTROLLER),
|
|
)
|
|
}
|
|
|
|
kubernetesServiceGroupMode := kubernetesProvider.ServiceGroupMode
|
|
if *kubernetesServiceGroupMode != string(LABEL) && *kubernetesServiceGroupMode != string(VOLUME) && *kubernetesServiceGroupMode != "" {
|
|
return fmt.Errorf(
|
|
"unexpected Value for Kubernetes Service Groupe Mode field. Possible values are: %v, %v, ''", string(LABEL), string(VOLUME),
|
|
)
|
|
}
|
|
|
|
if *build == string(BUILD_CONFIG) {
|
|
return fmt.Errorf("the build value %v is only supported for Openshift provider", string(BUILD_CONFIG))
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (k *Kompose) createDeployment(options ConvertOptions) bool {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return *kubernetesProvider.Controller == string(DEPLOYMENT)
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (k *Kompose) createDaemonSet(options ConvertOptions) bool {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return *kubernetesProvider.Controller == string(DAEMONSET)
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (k *Kompose) createReplicationController(options ConvertOptions) bool {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return *kubernetesProvider.Controller == string(REPLICATION_CONTROLLER)
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (k *Kompose) createChart(options ConvertOptions) bool {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return kubernetesProvider.Chart
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (k *Kompose) multiContainerMode(options ConvertOptions) bool {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return kubernetesProvider.MultiContainerMode
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (k *Kompose) serviceGroupMode(options ConvertOptions) string {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return *kubernetesProvider.ServiceGroupMode
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (k *Kompose) serviceGroupName(options ConvertOptions) string {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return kubernetesProvider.ServiceGroupName
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (k *Kompose) secretsAsFiles(options ConvertOptions) bool {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return kubernetesProvider.SecretsAsFiles
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (k *Kompose) createDeploymentConfig(options ConvertOptions) bool {
|
|
if _, ok := options.Provider.(Openshift); ok {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (k *Kompose) insecureRepository(options ConvertOptions) bool {
|
|
if openshiftProvider, ok := options.Provider.(Openshift); ok {
|
|
return openshiftProvider.InsecureRepository
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (k *Kompose) buildRepo(options ConvertOptions) string {
|
|
if openshiftProvider, ok := options.Provider.(Openshift); ok {
|
|
return openshiftProvider.BuildRepo
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (k *Kompose) buildBranch(options ConvertOptions) string {
|
|
if openshiftProvider, ok := options.Provider.(Openshift); ok {
|
|
return openshiftProvider.BuildRepo
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (k *Kompose) getProvider(options ConvertOptions) string {
|
|
if _, ok := options.Provider.(Openshift); ok {
|
|
return "openshift"
|
|
}
|
|
if _, ok := options.Provider.(Kubernetes); ok {
|
|
return "kubernetes"
|
|
}
|
|
return "kubernetes"
|
|
}
|
|
|
|
func (k *Kompose) getController(options ConvertOptions) string {
|
|
if kubernetesProvider, ok := options.Provider.(Kubernetes); ok {
|
|
return *kubernetesProvider.Controller
|
|
}
|
|
return ""
|
|
}
|