package graph
import (
"fmt"
"testing"
"github.com/gonum/graph"
kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/runtime"
osgraph "github.com/openshift/origin/pkg/api/graph"
kubegraph "github.com/openshift/origin/pkg/api/kubegraph/nodes"
"github.com/openshift/origin/pkg/deploy/api"
nodes "github.com/openshift/origin/pkg/deploy/graph/nodes"
)
type objectifier interface {
Object() interface{}
}
func TestNamespaceEdgeMatching(t *testing.T) {
g := osgraph.New()
fn := func(namespace string, g osgraph.Interface) {
dc := &api.DeploymentConfig{}
dc.Namespace = namespace
dc.Name = "the-dc"
dc.Spec.Selector = map[string]string{"a": "1"}
nodes.EnsureDeploymentConfigNode(g, dc)
rc := &kapi.ReplicationController{}
rc.Namespace = namespace
rc.Name = "the-rc"
rc.Annotations = map[string]string{api.DeploymentConfigAnnotation: "the-dc"}
kubegraph.EnsureReplicationControllerNode(g, rc)
}
fn("ns", g)
fn("other", g)
AddAllDeploymentEdges(g)
if len(g.Edges()) != 4 {
t.Fatal(g)
}
for _, edge := range g.Edges() {
nsTo, err := namespaceFor(edge.To())
if err != nil {
t.Fatal(err)
}
nsFrom, err := namespaceFor(edge.From())
if err != nil {
t.Fatal(err)
}
if nsFrom != nsTo {
t.Errorf("edge %#v crosses namespace: %s %s", edge, nsFrom, nsTo)
}
}
}
func namespaceFor(node graph.Node) (string, error) {
obj := node.(objectifier).Object()
switch t := obj.(type) {
case runtime.Object:
meta, err := kapi.ObjectMetaFor(t)
if err != nil {
return "", err
}
return meta.Namespace, nil
case *kapi.PodSpec:
return node.(*kubegraph.PodSpecNode).Namespace, nil
case *kapi.ReplicationControllerSpec:
return node.(*kubegraph.ReplicationControllerSpecNode).Namespace, nil
default:
return "", fmt.Errorf("unknown object: %#v", obj)
}
}