Network Key Translation Feature and test cases (#1195)

This commit is contained in:
Mudit Verma
2019-12-01 10:19:23 +08:00
committed by Hang Yan
parent c13d50ee17
commit ac2b852955
18 changed files with 606 additions and 40 deletions
+1 -1
View File
@@ -501,7 +501,7 @@ func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.Servic
template.Spec.SecurityContext = podSecurityContext
}
template.Spec.Containers[0].Ports = ports
template.ObjectMeta.Labels = transformer.ConfigLabels(name)
template.ObjectMeta.Labels = transformer.ConfigLabelsWithNetwork(name, service.Network)
// Configure the image pull policy
switch service.ImagePullPolicy {
+54 -1
View File
@@ -49,11 +49,12 @@ import (
"sort"
"strings"
"path/filepath"
"github.com/kubernetes/kompose/pkg/loader/compose"
"github.com/pkg/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/labels"
"path/filepath"
)
// Kubernetes implements Transformer interface and represents Kubernetes transformer
@@ -303,14 +304,18 @@ func (k *Kubernetes) InitD(name string, service kobject.ServiceConfig, replicas
},
Spec: extensions.DeploymentSpec{
Replicas: int32(replicas),
Template: api.PodTemplateSpec{
ObjectMeta: api.ObjectMeta{
//Labels: transformer.ConfigLabels(name),
Annotations: transformer.ConfigAnnotations(service),
},
Spec: podSpec,
},
},
}
dc.Spec.Template.Labels = transformer.ConfigLabels(name)
return dc
}
@@ -823,6 +828,36 @@ func (k *Kubernetes) InitPod(name string, service kobject.ServiceConfig) *api.Po
return &pod
}
// CreateNetworkPolicy initializes Network policy
func (k *Kubernetes) CreateNetworkPolicy(name string, networkName string) (*extensions.NetworkPolicy, error) {
str := "true"
np := &extensions.NetworkPolicy{
TypeMeta: unversioned.TypeMeta{
Kind: "NetworkPolicy",
APIVersion: "extensions/v1beta1",
},
ObjectMeta: api.ObjectMeta{
Name: networkName,
//Labels: transformer.ConfigLabels(name)(name),
},
Spec: extensions.NetworkPolicySpec{
PodSelector: unversioned.LabelSelector{
MatchLabels: map[string]string{"io.kompose.network/" + networkName: str},
},
Ingress: []extensions.NetworkPolicyIngressRule{{
From: []extensions.NetworkPolicyPeer{{
PodSelector: &unversioned.LabelSelector{
MatchLabels: map[string]string{"io.kompose.network/" + networkName: str},
},
}},
}},
},
}
return np, 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) {
@@ -906,11 +941,29 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
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)
}
}
allobjects = append(allobjects, objects...)
}
// sort all object so Services are first
k.SortServicesFirst(&allobjects)
return allobjects, nil
}
+14 -13
View File
@@ -42,7 +42,7 @@ func newServiceConfig() kobject.ServiceConfig {
WorkingDir: "dir",
Args: []string{"arg1", "arg2"},
VolList: []string{"/tmp/volume"},
Network: []string{"network1", "network2"}, // not supported
Network: []string{"network1", "network2"}, // supported
Labels: nil,
Annotations: map[string]string{"abc": "def"},
CPUQuota: 1, // not supported
@@ -278,15 +278,15 @@ func TestKomposeConvert(t *testing.T) {
opt kobject.ConvertOptions
expectedNumObjs int
}{
// objects generated are deployment, service and pvc
"Convert to Deployments (D)": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, Replicas: replicas, IsReplicaSetFlag: true}, 3},
"Convert to Deployments (D) with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true}, 3},
"Convert to DaemonSets (DS)": {newKomposeObject(), kobject.ConvertOptions{CreateDS: true}, 3},
"Convert to ReplicationController(RC)": {newKomposeObject(), kobject.ConvertOptions{CreateRC: true, Replicas: replicas, IsReplicaSetFlag: true}, 3},
"Convert to ReplicationController(RC) with v3 replicas ": {newKomposeObject(), kobject.ConvertOptions{CreateRC: true}, 3},
// objects generated are deployment, service nework policies (2) and pvc
"Convert to Deployments (D)": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, Replicas: replicas, IsReplicaSetFlag: true}, 5},
"Convert to Deployments (D) with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true}, 5},
"Convert to DaemonSets (DS)": {newKomposeObject(), kobject.ConvertOptions{CreateDS: true}, 5},
"Convert to ReplicationController(RC)": {newKomposeObject(), kobject.ConvertOptions{CreateRC: true, Replicas: replicas, IsReplicaSetFlag: true}, 5},
"Convert to ReplicationController(RC) with v3 replicas ": {newKomposeObject(), kobject.ConvertOptions{CreateRC: true}, 5},
// objects generated are deployment, daemonset, ReplicationController, service and pvc
"Convert to D, DS, and RC": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true, Replicas: replicas, IsReplicaSetFlag: true}, 5},
"Convert to D, DS, and RC with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true}, 5},
"Convert to D, DS, and RC": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true, Replicas: replicas, IsReplicaSetFlag: true}, 7},
"Convert to D, DS, and RC with v3 replicas": {newKomposeObject(), kobject.ConvertOptions{CreateD: true, CreateDS: true, CreateRC: true}, 7},
// TODO: add more tests
}
@@ -306,6 +306,7 @@ func TestKomposeConvert(t *testing.T) {
name := "app"
labels := transformer.ConfigLabels(name)
config := test.komposeObject.ServiceConfigs[name]
labelsWithNetwork := transformer.ConfigLabelsWithNetwork(name, config.Network)
// Check results
for _, obj := range objs {
if svc, ok := obj.(*api.Service); ok {
@@ -319,7 +320,7 @@ func TestKomposeConvert(t *testing.T) {
}
if test.opt.CreateD {
if d, ok := obj.(*extensions.Deployment); ok {
if err := checkPodTemplate(config, d.Spec.Template, labels); err != nil {
if err := checkPodTemplate(config, d.Spec.Template, labelsWithNetwork); err != nil {
t.Errorf("%v", err)
}
if err := checkMeta(config, d.ObjectMeta, name, true); err != nil {
@@ -345,7 +346,7 @@ func TestKomposeConvert(t *testing.T) {
}
if test.opt.CreateDS {
if ds, ok := obj.(*extensions.DaemonSet); ok {
if err := checkPodTemplate(config, ds.Spec.Template, labels); err != nil {
if err := checkPodTemplate(config, ds.Spec.Template, labelsWithNetwork); err != nil {
t.Errorf("%v", err)
}
if err := checkMeta(config, ds.ObjectMeta, name, true); err != nil {
@@ -359,7 +360,7 @@ func TestKomposeConvert(t *testing.T) {
}
if test.opt.CreateRC {
if rc, ok := obj.(*api.ReplicationController); ok {
if err := checkPodTemplate(config, *rc.Spec.Template, labels); err != nil {
if err := checkPodTemplate(config, *rc.Spec.Template, labelsWithNetwork); err != nil {
t.Errorf("%v", err)
}
if err := checkMeta(config, rc.ObjectMeta, name, true); err != nil {
@@ -386,7 +387,7 @@ func TestKomposeConvert(t *testing.T) {
// TODO: k8s & openshift transformer is now separated; either separate the test or combine the transformer
if test.opt.CreateDeploymentConfig {
if dc, ok := obj.(*deployapi.DeploymentConfig); ok {
if err := checkPodTemplate(config, *dc.Spec.Template, labels); err != nil {
if err := checkPodTemplate(config, *dc.Spec.Template, labelsWithNetwork); err != nil {
t.Errorf("%v", err)
}
if err := checkMeta(config, dc.ObjectMeta, name, true); err != nil {