forked from LaconicNetwork/kompose
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:
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user