Code Refactor (#1438)

* Code refactor
Signed-off-by: Hang Yan <hang.yan@hotmail.com>
This commit is contained in:
Hang Yan 2021-10-03 17:33:43 +08:00 committed by GitHub
parent 9a6a24cb16
commit 5d7ed192a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 149 additions and 214 deletions

View File

@ -156,7 +156,7 @@ func normalizeVolumes(svcName string) string {
func normalizeNetworkNames(netName string) (string, error) {
netval := strings.ToLower(strings.Replace(netName, "_", "-", -1))
regString := ("[^A-Za-z0-9.-]+")
regString := "[^A-Za-z0-9.-]+"
reg, err := regexp.Compile(regString)
if err != nil {
return "", err

View File

@ -231,7 +231,7 @@ func libComposeToKomposeMapping(composeObject *project.Project) (kobject.Kompose
}
// convert compose labels to annotations
serviceConfig.Annotations = map[string]string(composeServiceConfig.Labels)
serviceConfig.Annotations = composeServiceConfig.Labels
serviceConfig.CPUQuota = int64(composeServiceConfig.CPUQuota)
serviceConfig.CapAdd = composeServiceConfig.CapAdd
serviceConfig.CapDrop = composeServiceConfig.CapDrop

View File

@ -382,7 +382,7 @@ func dockerComposeToKomposeMapping(composeObject *types.Config) (kobject.Kompose
serviceConfig.Name = name
serviceConfig.Image = composeServiceConfig.Image
serviceConfig.WorkingDir = composeServiceConfig.WorkingDir
serviceConfig.Annotations = map[string]string(composeServiceConfig.Labels)
serviceConfig.Annotations = composeServiceConfig.Labels
serviceConfig.CapAdd = composeServiceConfig.CapAdd
serviceConfig.CapDrop = composeServiceConfig.CapDrop
serviceConfig.Expose = composeServiceConfig.Expose

View File

@ -199,7 +199,7 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
list := &api.List{}
// convert objects to versioned and add them to list
for _, object := range objects {
versionedObject, err := convertToVersion(object, metav1.GroupVersion{})
versionedObject, err := convertToVersion(object)
if err != nil {
return err
}
@ -207,10 +207,9 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
list.Items = append(list.Items, objectToRaw(versionedObject))
}
// version list itself
listVersion := metav1.GroupVersion{Group: "", Version: "v1"}
list.Kind = "List"
list.APIVersion = "v1"
convertedList, err := convertToVersion(list, listVersion)
convertedList, err := convertToVersion(list)
if err != nil {
return err
}
@ -236,7 +235,7 @@ func PrintList(objects []runtime.Object, opt kobject.ConvertOptions) error {
var file string
// create a separate file for each provider
for _, v := range objects {
versionedObject, err := convertToVersion(v, metav1.GroupVersion{})
versionedObject, err := convertToVersion(v)
if err != nil {
return err
}
@ -340,7 +339,7 @@ func marshalWithIndent(o interface{}, indent int) ([]byte, error) {
// Convert object to versioned object
// if groupVersion is empty (metav1.GroupVersion{}), use version from original object (obj)
func convertToVersion(obj runtime.Object, groupVersion metav1.GroupVersion) (runtime.Object, error) {
func convertToVersion(obj runtime.Object) (runtime.Object, error) {
// ignore unstruct object
if _, ok := obj.(*unstructured.Unstructured); ok {
return obj, nil
@ -368,20 +367,6 @@ func (k *Kubernetes) PortsExist(service kobject.ServiceConfig) bool {
return len(service.Port) != 0
}
func (k *Kubernetes) CreateLBService(name string, service kobject.ServiceConfig, objects []runtime.Object) []*api.Service {
var svcs []*api.Service
tcpPorts, udpPorts := k.ConfigLBServicePorts(name, service)
if tcpPorts != nil {
svc := k.initSvcObject(name+"-tcp", service, tcpPorts)
svcs = append(svcs, svc)
}
if udpPorts != nil {
svc := k.initSvcObject(name+"-udp", service, udpPorts)
svcs = append(svcs, svc)
}
return svcs
}
func (k *Kubernetes) initSvcObject(name string, service kobject.ServiceConfig, ports []api.ServicePort) *api.Service {
svc := k.InitSvc(name, service)
svc.Spec.Ports = ports
@ -395,12 +380,26 @@ func (k *Kubernetes) initSvcObject(name string, service kobject.ServiceConfig, p
return svc
}
func (k *Kubernetes) CreateLBService(name string, service kobject.ServiceConfig) []*api.Service {
var svcs []*api.Service
tcpPorts, udpPorts := k.ConfigLBServicePorts(service)
if tcpPorts != nil {
svc := k.initSvcObject(name+"-tcp", service, tcpPorts)
svcs = append(svcs, svc)
}
if udpPorts != nil {
svc := k.initSvcObject(name+"-udp", service, udpPorts)
svcs = append(svcs, svc)
}
return svcs
}
// CreateService creates a k8s service
func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, objects []runtime.Object) *api.Service {
func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig) *api.Service {
svc := k.InitSvc(name, service)
// Configure the service ports.
servicePorts := k.ConfigServicePorts(name, service)
servicePorts := k.ConfigServicePorts(service)
svc.Spec.Ports = servicePorts
if service.ServiceType == "Headless" {
@ -422,10 +421,10 @@ func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, o
// and without Service Pods can't find each other using DNS names.
// Instead of regular Kubernetes Service we create Headless Service. DNS of such service points directly to Pod IP address.
// You can find more about Headless Services in Kubernetes documentation https://kubernetes.io/docs/user-guide/services/#headless-services
func (k *Kubernetes) CreateHeadlessService(name string, service kobject.ServiceConfig, objects []runtime.Object) *api.Service {
func (k *Kubernetes) CreateHeadlessService(name string, service kobject.ServiceConfig) *api.Service {
svc := k.InitSvc(name, service)
servicePorts := []api.ServicePort{}
var servicePorts []api.ServicePort
// Configure a dummy port: https://github.com/kubernetes/kubernetes/issues/32766.
servicePorts = append(servicePorts, api.ServicePort{
Name: "headless",
@ -441,7 +440,7 @@ func (k *Kubernetes) CreateHeadlessService(name string, service kobject.ServiceC
return svc
}
func (k *Kubernetes) UpdateKubernetesObjectsMultipleContainers(name string, service kobject.ServiceConfig, opt kobject.ConvertOptions, objects *[]runtime.Object, podSpec PodSpec) error {
func (k *Kubernetes) UpdateKubernetesObjectsMultipleContainers(name string, service kobject.ServiceConfig, objects *[]runtime.Object, podSpec PodSpec) error {
// Configure annotations
annotations := transformer.ConfigAnnotations(service)
@ -478,7 +477,7 @@ func (k *Kubernetes) UpdateKubernetesObjectsMultipleContainers(name string, serv
// UpdateKubernetesObjects loads configurations to k8s objects
func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.ServiceConfig, opt kobject.ConvertOptions, objects *[]runtime.Object) error {
// Configure the environment variables.
envs, err := ConfigEnvs(name, service, opt)
envs, err := ConfigEnvs(service, opt)
if err != nil {
return errors.Wrap(err, "Unable to load env variables")
}
@ -491,9 +490,7 @@ func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.Servic
// Configure Tmpfs
if len(service.TmpFs) > 0 {
TmpVolumesMount, TmpVolumes := k.ConfigTmpfs(name, service)
volumes = append(volumes, TmpVolumes...)
volumesMount = append(volumesMount, TmpVolumesMount...)
}
@ -513,7 +510,7 @@ func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.Servic
}
// Configure the container ports.
ports := ConfigPorts(name, service)
ports := ConfigPorts(service)
// Configure capabilities
capabilities := ConfigCapabilities(service)
@ -798,7 +795,7 @@ func (k *Kubernetes) SortServicesFirst(objs *[]runtime.Object) {
}
// RemoveDupObjects remove objects that are dups...eg. configmaps from env.
// since we know for sure that the duplication can only happens on ConfigMap, so
// since we know for sure that the duplication can only happen on ConfigMap, so
// this code will looks like this for now.
// + NetworkPolicy
func (k *Kubernetes) RemoveDupObjects(objs *[]runtime.Object) {

View File

@ -61,13 +61,13 @@ func TestCreateService(t *testing.T) {
ServiceConfigs: map[string]kobject.ServiceConfig{"app": service},
}
k := Kubernetes{}
objects, err := k.Transform(komposeObject, kobject.ConvertOptions{CreateD: true, Replicas: 3})
_, err := k.Transform(komposeObject, kobject.ConvertOptions{CreateD: true, Replicas: 3})
if err != nil {
t.Error(errors.Wrap(err, "k.Transform failed"))
}
// Test the creation of the service
svc := k.CreateService("foo", service, objects)
svc := k.CreateService("foo", service)
if svc.Spec.Ports[0].Port != 123 {
t.Errorf("Expected port 123 upon conversion, actual %d", svc.Spec.Ports[0].Port)

View File

@ -55,10 +55,6 @@ type Kubernetes struct {
Opt kobject.ConvertOptions
}
// 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
// PVCRequestSize (Persistent Volume Claim) has default size
const PVCRequestSize = "100Mi"
@ -67,8 +63,6 @@ const (
DeploymentController = "deployment"
// DaemonSetController is controller type for DaemonSet
DaemonSetController = "daemonset"
// ReplicationController is controller type for ReplicationController
ReplicationController = "replicationcontroller"
)
// CheckUnsupportedKey checks if given komposeObject contains
@ -218,7 +212,7 @@ func (k *Kubernetes) InitSvc(name string, service kobject.ServiceConfig) *api.Se
}
// InitConfigMapForEnv initializes a ConfigMap object
func (k *Kubernetes) InitConfigMapForEnv(name string, service kobject.ServiceConfig, opt kobject.ConvertOptions, envFile string) *api.ConfigMap {
func (k *Kubernetes) InitConfigMapForEnv(name string, opt kobject.ConvertOptions, envFile string) *api.ConfigMap {
envs, err := GetEnvsFromFile(envFile, opt)
if err != nil {
log.Fatalf("Unable to retrieve env file: %s", err)
@ -575,7 +569,7 @@ func (k *Kubernetes) CreatePVC(name string, mode string, size string, selectorVa
}
// ConfigPorts configures the container ports.
func ConfigPorts(name string, service kobject.ServiceConfig) []api.ContainerPort {
func ConfigPorts(service kobject.ServiceConfig) []api.ContainerPort {
ports := []api.ContainerPort{}
exist := map[string]bool{}
for _, port := range service.Port {
@ -598,7 +592,7 @@ func ConfigPorts(name string, service kobject.ServiceConfig) []api.ContainerPort
return ports
}
func (k *Kubernetes) ConfigLBServicePorts(name string, service kobject.ServiceConfig) ([]api.ServicePort, []api.ServicePort) {
func (k *Kubernetes) ConfigLBServicePorts(service kobject.ServiceConfig) ([]api.ServicePort, []api.ServicePort) {
var tcpPorts []api.ServicePort
var udpPorts []api.ServicePort
for _, port := range service.Port {
@ -627,7 +621,7 @@ func (k *Kubernetes) ConfigLBServicePorts(name string, service kobject.ServiceCo
}
// ConfigServicePorts configure the container service ports.
func (k *Kubernetes) ConfigServicePorts(name string, service kobject.ServiceConfig) []api.ServicePort {
func (k *Kubernetes) ConfigServicePorts(service kobject.ServiceConfig) []api.ServicePort {
servicePorts := []api.ServicePort{}
seenPorts := make(map[int]struct{}, len(service.Port))
@ -987,7 +981,7 @@ func (k *Kubernetes) ConfigPVCVolumeSource(name string, readonly bool) *api.Volu
}
// ConfigEnvs configures the environment variables.
func ConfigEnvs(name string, service kobject.ServiceConfig, opt kobject.ConvertOptions) ([]api.EnvVar, error) {
func ConfigEnvs(service kobject.ServiceConfig, opt kobject.ConvertOptions) ([]api.EnvVar, error) {
envs := transformer.EnvSort{}
keysFromEnvFile := make(map[string]bool)
@ -1078,8 +1072,8 @@ func configConstrains(constrains map[string]string, operator api.NodeSelectorOpe
return rs
}
// CreateKubernetesObjects generates a Kubernetes artifact for each input type service
func (k *Kubernetes) CreateKubernetesObjects(name string, service kobject.ServiceConfig, opt kobject.ConvertOptions) []runtime.Object {
// CreateWorkloadAndConfigMapObjects generates a Kubernetes artifact for each input type service
func (k *Kubernetes) CreateWorkloadAndConfigMapObjects(name string, service kobject.ServiceConfig, opt kobject.ConvertOptions) []runtime.Object {
var objects []runtime.Object
var replica int
@ -1112,7 +1106,7 @@ func (k *Kubernetes) CreateKubernetesObjects(name string, service kobject.Servic
}
if len(service.Configs) > 0 {
objects = k.createConfigMapFromComposeConfig(name, opt, service, objects)
objects = k.createConfigMapFromComposeConfig(name, service, objects)
}
if opt.CreateD || opt.Controller == DeploymentController {
@ -1125,7 +1119,7 @@ func (k *Kubernetes) CreateKubernetesObjects(name string, service kobject.Servic
if len(service.EnvFile) > 0 {
for _, envFile := range service.EnvFile {
configMap := k.InitConfigMapForEnv(name, service, opt, envFile)
configMap := k.InitConfigMapForEnv(name, opt, envFile)
objects = append(objects, configMap)
}
}
@ -1133,7 +1127,7 @@ func (k *Kubernetes) CreateKubernetesObjects(name string, service kobject.Servic
return objects
}
func (k *Kubernetes) createConfigMapFromComposeConfig(name string, opt kobject.ConvertOptions, service kobject.ServiceConfig, objects []runtime.Object) []runtime.Object {
func (k *Kubernetes) createConfigMapFromComposeConfig(name string, service kobject.ServiceConfig, objects []runtime.Object) []runtime.Object {
for _, config := range service.Configs {
currentConfigName := config.Source
currentConfigObj := service.ConfigsMetaData[currentConfigName]
@ -1165,7 +1159,7 @@ func (k *Kubernetes) InitPod(name string, service kobject.ServiceConfig) *api.Po
}
// CreateNetworkPolicy initializes Network policy
func (k *Kubernetes) CreateNetworkPolicy(name string, networkName string) (*networkingv1.NetworkPolicy, error) {
func (k *Kubernetes) CreateNetworkPolicy(networkName string) (*networkingv1.NetworkPolicy, error) {
str := "true"
np := &networkingv1.NetworkPolicy{
TypeMeta: metav1.TypeMeta{
@ -1193,6 +1187,81 @@ func (k *Kubernetes) CreateNetworkPolicy(name string, networkName string) (*netw
return np, nil
}
func buildServiceImage(opt kobject.ConvertOptions, service kobject.ServiceConfig, name string) error {
// Must build the images before conversion (got to add service.Image in case 'image' key isn't provided
// Check that --build is set to true
// Check to see if there is an InputFile (required!) before we build the container
// Check that there's actually a Build key
// Lastly, we must have an Image name to continue
if opt.Build == "local" && opt.InputFiles != nil && service.Build != "" {
// If there's no "image" key, use the name of the container that's built
if service.Image == "" {
service.Image = name
}
if service.Image == "" {
return fmt.Errorf("image key required within build parameters in order to build and push service '%s'", name)
}
log.Infof("Build key detected. Attempting to build image '%s'", service.Image)
// Build the image!
err := transformer.BuildDockerImage(service, name)
if err != nil {
return errors.Wrapf(err, "Unable to build Docker image for service %v", name)
}
// Push the built image to the repo!
err = transformer.PushDockerImageWithOpt(service, name, opt)
if err != nil {
return errors.Wrapf(err, "Unable to push Docker image for service %v", name)
}
}
return nil
}
func (k *Kubernetes) configKubeServiceAndIngressForService(service kobject.ServiceConfig, name string, objects *[]runtime.Object) {
if k.PortsExist(service) {
if service.ServiceType == "LoadBalancer" {
svcs := k.CreateLBService(name, service)
for _, svc := range svcs {
*objects = append(*objects, svc)
}
if len(svcs) > 1 {
log.Warningf("Create multiple service to avoid using mixed protocol in the same service when it's loadbalander type")
}
} else {
svc := k.CreateService(name, service)
*objects = append(*objects, svc)
if service.ExposeService != "" {
*objects = append(*objects, k.initIngress(name, service, svc.Spec.Ports[0].Port))
}
}
} else {
if service.ServiceType == "Headless" {
svc := k.CreateHeadlessService(name, service)
*objects = append(*objects, svc)
} else {
log.Warnf("Service %q won't be created because 'ports' is not specified", name)
}
}
}
func (k *Kubernetes) configNetworkPolicyForService(service kobject.ServiceConfig, name string, objects *[]runtime.Object) error {
if len(service.Network) > 0 {
for _, net := range service.Network {
log.Infof("Network %s is detected at Source, shall be converted to equivalent NetworkPolicy at Destination", net)
np, err := k.CreateNetworkPolicy(net)
if err != nil {
return errors.Wrapf(err, "Unable to create Network Policy for network %v for service %v", net, name)
}
*objects = append(*objects, np)
}
}
return nil
}
// Transform maps komposeObject to k8s objects
// returns object that are already sorted in the way that Services are first
func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.ConvertOptions) ([]runtime.Object, error) {
@ -1212,80 +1281,28 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
if opt.MultipleContainerMode {
komposeObjectToServiceConfigGroupMapping := KomposeObjectToServiceConfigGroupMapping(komposeObject)
for name, group := range komposeObjectToServiceConfigGroupMapping {
service := komposeObject.ServiceConfigs[name]
var objects []runtime.Object
service.WithKomposeAnnotation = opt.WithKomposeAnnotation
// Must build the images before conversion (got to add service.Image in case 'image' key isn't provided
// Check that --build is set to true
// Check to see if there is an InputFile (required!) before we build the container
// Check that there's actually a Build key
// Lastly, we must have an Image name to continue
if opt.Build == "local" && opt.InputFiles != nil && service.Build != "" {
// If there's no "image" key, use the name of the container that's built
if service.Image == "" {
service.Image = name
}
if service.Image == "" {
return nil, fmt.Errorf("image key required within build parameters in order to build and push service '%s'", name)
}
log.Infof("Build key detected. Attempting to build image '%s'", service.Image)
// Build the image!
err := transformer.BuildDockerImage(service, name)
if err != nil {
return nil, errors.Wrapf(err, "Unable to build Docker image for service %v", name)
}
// Push the built image to the repo!
err = transformer.PushDockerImageWithOpt(service, name, opt)
if err != nil {
return nil, errors.Wrapf(err, "Unable to push Docker image for service %v", name)
}
}
podSpec := PodSpec{}
// added a container
for _, service := range group {
service.WithKomposeAnnotation = opt.WithKomposeAnnotation
podSpec.Append(AddContainer(service, opt))
if err := buildServiceImage(opt, service, service.Name); err != nil {
return nil, err
}
// Generate pod only and nothing more
if (service.Restart == "no" || service.Restart == "on-failure") && !opt.IsPodController() {
log.Infof("Create kubernetes pod instead of pod controller due to restart policy: %s", service.Restart)
pod := k.InitPod(name, service)
objects = append(objects, pod)
} else {
objects = k.CreateKubernetesObjects(name, service, opt)
objects = k.CreateWorkloadAndConfigMapObjects(name, service, opt)
}
if k.PortsExist(service) {
if service.ServiceType == "LoadBalancer" {
svcs := k.CreateLBService(name, service, objects)
for _, svc := range svcs {
objects = append(objects, svc)
}
if len(svcs) > 1 {
log.Warningf("Create multiple service to avoid using mixed protocol in the same service when it's loadbalander type")
}
} else {
svc := k.CreateService(name, service, objects)
objects = append(objects, svc)
if service.ExposeService != "" {
objects = append(objects, k.initIngress(name, service, svc.Spec.Ports[0].Port))
}
}
} else {
if service.ServiceType == "Headless" {
svc := k.CreateHeadlessService(name, service, objects)
objects = append(objects, svc)
} else {
log.Warnf("Service %q won't be created because 'ports' is not specified", name)
}
}
k.configKubeServiceAndIngressForService(service, name, &objects)
// Configure the container volumes.
volumesMount, volumes, pvc, cms, err := k.ConfigVolumes(name, service)
@ -1322,7 +1339,7 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
}
podSpec.Append(
SetPorts(name, service),
SetPorts(service),
ImagePullPolicy(name, service),
RestartPolicy(name, service),
SecurityContext(name, service),
@ -1339,21 +1356,13 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
podSpec.Append(ServiceAccountName(serviceAccountName))
}
err = k.UpdateKubernetesObjectsMultipleContainers(name, service, opt, &objects, podSpec)
err = k.UpdateKubernetesObjectsMultipleContainers(name, service, &objects, podSpec)
if err != nil {
return nil, errors.Wrap(err, "Error transforming Kubernetes objects")
}
}
if len(service.Network) > 0 {
for _, net := range service.Network {
log.Infof("Network %s is detected at Source, shall be converted to equivalent NetworkPolicy at Destination", net)
np, err := k.CreateNetworkPolicy(name, net)
if err != nil {
return nil, errors.Wrapf(err, "Unable to create Network Policy for network %v for service %v", net, name)
}
objects = append(objects, np)
if err = k.configNetworkPolicyForService(service, service.Name, &objects); err != nil {
return nil, err
}
}
@ -1367,34 +1376,8 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
service.WithKomposeAnnotation = opt.WithKomposeAnnotation
// Must build the images before conversion (got to add service.Image in case 'image' key isn't provided
// Check that --build is set to true
// Check to see if there is an InputFile (required!) before we build the container
// Check that there's actually a Build key
// Lastly, we must have an Image name to continue
if opt.Build == "local" && opt.InputFiles != nil && service.Build != "" {
// If there's no "image" key, use the name of the container that's built
if service.Image == "" {
service.Image = name
}
if service.Image == "" {
return nil, fmt.Errorf("image key required within build parameters in order to build and push service '%s'", name)
}
log.Infof("Build key detected. Attempting to build image '%s'", service.Image)
// Build the image!
err := transformer.BuildDockerImage(service, name)
if err != nil {
return nil, errors.Wrapf(err, "Unable to build Docker image for service %v", name)
}
// Push the built image to the repo!
err = transformer.PushDockerImageWithOpt(service, name, opt)
if err != nil {
return nil, errors.Wrapf(err, "Unable to push Docker image for service %v", name)
}
if err := buildServiceImage(opt, service, name); err != nil {
return nil, err
}
// Generate pod only and nothing more
@ -1403,51 +1386,19 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
pod := k.InitPod(name, service)
objects = append(objects, pod)
} else {
objects = k.CreateKubernetesObjects(name, service, opt)
objects = k.CreateWorkloadAndConfigMapObjects(name, service, opt)
}
if k.PortsExist(service) {
if service.ServiceType == "LoadBalancer" {
svcs := k.CreateLBService(name, service, objects)
for _, svc := range svcs {
objects = append(objects, svc)
}
if len(svcs) > 1 {
log.Warningf("Create multiple service to avoid using mixed protocol in the same service when it's loadbalander type")
}
} else {
svc := k.CreateService(name, service, objects)
objects = append(objects, svc)
if service.ExposeService != "" {
objects = append(objects, k.initIngress(name, service, svc.Spec.Ports[0].Port))
}
}
} else {
if service.ServiceType == "Headless" {
svc := k.CreateHeadlessService(name, service, objects)
objects = append(objects, svc)
} else {
log.Warnf("Service %q won't be created because 'ports' is not specified", name)
}
}
k.configKubeServiceAndIngressForService(service, name, &objects)
err := k.UpdateKubernetesObjects(name, service, opt, &objects)
if err != nil {
return nil, errors.Wrap(err, "Error transforming Kubernetes objects")
}
if len(service.Network) > 0 {
for _, net := range service.Network {
log.Infof("Network %s is detected at Source, shall be converted to equivalent NetworkPolicy at Destination", net)
np, err := k.CreateNetworkPolicy(name, net)
if err != nil {
return nil, errors.Wrapf(err, "Unable to create Network Policy for network %v for service %v", net, name)
}
objects = append(objects, np)
}
if err := k.configNetworkPolicyForService(service, name, &objects); err != nil {
return nil, err
}
allobjects = append(allobjects, objects...)
}
}

View File

@ -606,6 +606,7 @@ func TestMultipleContainersInPod(t *testing.T) {
createConfig := func(name string, containerName *string) kobject.ServiceConfig {
config := newServiceConfig()
config.Network = nil
config.Labels = map[string]string{compose.LabelServiceGroup: groupName}
config.Name = name
if containerName != nil {

View File

@ -33,7 +33,7 @@ func AddContainer(service kobject.ServiceConfig, opt kobject.ConvertOptions) Pod
name = FormatContainerName(service.ContainerName)
}
envs, err := ConfigEnvs(name, service, opt)
envs, err := ConfigEnvs(service, opt)
if err != nil {
panic("Unable to load env variables")
}
@ -53,16 +53,6 @@ func AddContainer(service kobject.ServiceConfig, opt kobject.ConvertOptions) Pod
}
}
func ImagePullSecrets(pullSecret string) PodSpecOption {
return func(podSpec *PodSpec) {
podSpec.ImagePullSecrets = append(podSpec.ImagePullSecrets,
api.LocalObjectReference{
Name: pullSecret,
},
)
}
}
func TerminationGracePeriodSeconds(name string, service kobject.ServiceConfig) PodSpecOption {
return func(podSpec *PodSpec) {
var err error
@ -75,7 +65,7 @@ func TerminationGracePeriodSeconds(name string, service kobject.ServiceConfig) P
}
}
// Configure the resource limits
// ResourcesLimits Configure the resource limits
func ResourcesLimits(service kobject.ServiceConfig) PodSpecOption {
return func(podSpec *PodSpec) {
if service.MemLimit != 0 || service.CPULimit != 0 {
@ -96,7 +86,7 @@ func ResourcesLimits(service kobject.ServiceConfig) PodSpecOption {
}
}
// Configure the resource requests
// ResourcesRequests Configure the resource requests
func ResourcesRequests(service kobject.ServiceConfig) PodSpecOption {
return func(podSpec *PodSpec) {
if service.MemReservation != 0 || service.CPUReservation != 0 {
@ -117,7 +107,7 @@ func ResourcesRequests(service kobject.ServiceConfig) PodSpecOption {
}
}
// Configure SecurityContext
// SecurityContext Configure SecurityContext
func SecurityContext(name string, service kobject.ServiceConfig) PodSpecOption {
return func(podSpec *PodSpec) {
// Configure resource reservations
@ -217,11 +207,11 @@ func SetVolumeMounts(volumesMount []api.VolumeMount) PodSpecOption {
}
}
// Configure ports
func SetPorts(name string, service kobject.ServiceConfig) PodSpecOption {
// SetPorts Configure ports
func SetPorts(service kobject.ServiceConfig) PodSpecOption {
return func(podSpec *PodSpec) {
// Configure the container ports.
ports := ConfigPorts(name, service)
ports := ConfigPorts(service)
for i := range podSpec.Containers {
podSpec.Containers[i].Ports = ports
@ -229,7 +219,7 @@ func SetPorts(name string, service kobject.ServiceConfig) PodSpecOption {
}
}
// Configure the image pull policy
// ImagePullPolicy Configure the image pull policy
func ImagePullPolicy(name string, service kobject.ServiceConfig) PodSpecOption {
return func(podSpec *PodSpec) {
if policy, err := GetImagePullPolicy(name, service.ImagePullPolicy); err != nil {
@ -242,7 +232,7 @@ func ImagePullPolicy(name string, service kobject.ServiceConfig) PodSpecOption {
}
}
// Configure the container restart policy.
// RestartPolicy Configure the container restart policy.
func RestartPolicy(name string, service kobject.ServiceConfig) PodSpecOption {
return func(podSpec *PodSpec) {
if restart, err := GetRestartPolicy(name, service.Restart); err != nil {

View File

@ -44,10 +44,6 @@ type OpenShift struct {
kubernetes.Kubernetes
}
// 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
// list of all unsupported keys for this transformer
// Keys are names of variables in kobject struct.
// this is map to make searching for keys easier
@ -333,7 +329,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
pod := o.InitPod(name, service)
objects = append(objects, pod)
} else {
objects = o.CreateKubernetesObjects(name, service, opt)
objects = o.CreateWorkloadAndConfigMapObjects(name, service, opt)
if opt.CreateDeploymentConfig {
objects = append(objects, o.initDeploymentConfig(name, service, replica)) // OpenShift DeploymentConfigs
@ -389,7 +385,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
if o.PortsExist(service) {
if service.ServiceType == "LoadBalancer" {
svcs := o.CreateLBService(name, service, objects)
svcs := o.CreateLBService(name, service)
for _, svc := range svcs {
objects = append(objects, svc)
}
@ -397,7 +393,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
log.Warningf("Create multiple service to avoid using mixed protocol in the same service when it's loadbalander type")
}
} else {
svc := o.CreateService(name, service, objects)
svc := o.CreateService(name, service)
objects = append(objects, svc)
if service.ExposeService != "" {
@ -405,7 +401,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
}
}
} else if service.ServiceType == "Headless" {
svc := o.CreateHeadlessService(name, service, objects)
svc := o.CreateHeadlessService(name, service)
objects = append(objects, svc)
}

View File

@ -322,7 +322,7 @@ func (env EnvSort) Less(i, j int) bool {
return env[i].Name < env[j].Name
}
// swaps the elements with indexes i and j.
// Swap swaps the elements with indexes i and j.
func (env EnvSort) Swap(i, j int) {
env[i], env[j] = env[j], env[i]
}