Feat add ns generation (#1667)

* feat: add ns generation for k8s

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>

* feat: add ns generation for openshift

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>

* test: add functional tests

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>

* fix: remove some code nits

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>

---------

Signed-off-by: AhmedGrati <ahmedgrati1999@gmail.com>
This commit is contained in:
AhmedGrati
2023-07-16 22:59:16 +01:00
committed by GitHub
parent 071451dfdf
commit b6b708b637
14 changed files with 291 additions and 1 deletions
+2
View File
@@ -219,6 +219,8 @@ func Convert(opt kobject.ConvertOptions) {
log.Fatalf(err.Error())
}
komposeObject.Namespace = opt.Namespace
// Get a transformer that maps komposeObject to provider's primitives
t := getTransformer(opt)
+3
View File
@@ -38,6 +38,9 @@ type KomposeObject struct {
LoadedFrom string
Secrets types.Secrets
// Namespace is the namespace where all the generated objects would be assigned to
Namespace string
}
// ConvertOptions holds all options that controls transformation process
+7
View File
@@ -1447,6 +1447,12 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
allobjects = append(allobjects, item)
}
}
if komposeObject.Namespace != "" {
ns := transformer.CreateNamespace(komposeObject.Namespace)
allobjects = append(allobjects, ns)
}
if opt.ServiceGroupMode != "" {
log.Debugf("Service group mode is: %s", opt.ServiceGroupMode)
komposeObjectToServiceConfigGroupMapping := KomposeObjectToServiceConfigGroupMapping(&komposeObject, opt)
@@ -1596,6 +1602,7 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
// sort all object so Services are first
k.SortServicesFirst(&allobjects)
k.RemoveDupObjects(&allobjects)
transformer.AssignNamespaceToObjects(&allobjects, komposeObject.Namespace)
// k.FixWorkloadVersion(&allobjects)
return allobjects, nil
}
@@ -1094,3 +1094,28 @@ func TestServiceGroupModeImagePullSecrets(t *testing.T) {
}
}
}
func TestNamespaceGeneration(t *testing.T) {
ns := "app"
komposeObject := kobject.KomposeObject{
ServiceConfigs: map[string]kobject.ServiceConfig{"app": newServiceConfig()},
Namespace: ns,
}
k := Kubernetes{}
objs, err := k.Transform(komposeObject, kobject.ConvertOptions{})
if err != nil {
t.Error(errors.Wrap(err, "k.Transform failed"))
}
for _, obj := range objs {
if namespace, ok := obj.(*api.Namespace); ok {
if strings.ToLower(ns) != strings.ToLower(namespace.ObjectMeta.Name) {
t.Errorf("Expected namespace name %v, got %v", ns, namespace.ObjectMeta.Name)
}
}
if dep, ok := obj.(*appsv1.Deployment); ok {
if dep.ObjectMeta.Namespace != ns {
t.Errorf("Expected deployment namespace %v, got %v", ns, dep.ObjectMeta.Namespace)
}
}
}
}
+7
View File
@@ -259,6 +259,12 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
}
// this will hold all the converted data
var allobjects []runtime.Object
if komposeObject.Namespace != "" {
ns := transformer.CreateNamespace(komposeObject.Namespace)
allobjects = append(allobjects, ns)
}
var err error
var composeFileDir string
buildRepo := opt.BuildRepo
@@ -422,6 +428,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
// sort all object so Services are first
o.SortServicesFirst(&allobjects)
o.RemoveDupObjects(&allobjects)
transformer.AssignNamespaceToObjects(&allobjects, komposeObject.Namespace)
// o.FixWorkloadVersion(&allobjects)
return allobjects, nil
@@ -29,6 +29,7 @@ import (
"github.com/kubernetes/kompose/pkg/transformer/kubernetes"
deployapi "github.com/openshift/api/apps/v1"
"github.com/pkg/errors"
api "k8s.io/api/core/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
)
@@ -465,3 +466,28 @@ func TestServiceExternalTrafficPolicy(t *testing.T) {
}
}
}
func TestNamespaceGeneration(t *testing.T) {
ns := "app"
komposeObject := kobject.KomposeObject{
ServiceConfigs: map[string]kobject.ServiceConfig{"app": newServiceConfig()},
Namespace: ns,
}
o := OpenShift{}
objs, err := o.Transform(komposeObject, kobject.ConvertOptions{})
if err != nil {
t.Error(errors.Wrap(err, "k.Transform failed"))
}
for _, obj := range objs {
if namespace, ok := obj.(*api.Namespace); ok {
if strings.ToLower(ns) != strings.ToLower(namespace.ObjectMeta.Name) {
t.Errorf("Expected namespace name %v, got %v", ns, namespace.ObjectMeta.Name)
}
}
if dep, ok := obj.(*deployapi.DeploymentConfig); ok {
if dep.ObjectMeta.Namespace != ns {
t.Errorf("Expected deployment namespace %v, got %v", ns, dep.ObjectMeta.Namespace)
}
}
}
}
+32
View File
@@ -31,6 +31,8 @@ import (
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
api "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
)
// Selector used as labels and selector
@@ -443,3 +445,33 @@ func PushDockerImageWithOpt(service kobject.ServiceConfig, serviceName string, o
return nil
}
// CreateNamespace creates a Kubernetes namespace, which can be used in both:
// Openshift and Kubernetes
func CreateNamespace(namespace string) *api.Namespace {
return &api.Namespace{
TypeMeta: metav1.TypeMeta{
Kind: "Namespace",
APIVersion: "v1",
},
ObjectMeta: metav1.ObjectMeta{
Name: namespace,
},
}
}
// AssignNamespaceToObjects will add the namespace metadata to each object
func AssignNamespaceToObjects(objs *[]runtime.Object, namespace string) {
ns := "default"
if namespace != "" {
ns = namespace
}
var result []runtime.Object
for _, obj := range *objs {
if us, ok := obj.(metav1.Object); ok {
us.SetNamespace(ns)
}
result = append(result, obj)
}
*objs = result
}