Просмотр исходного кода

add pods generated by controllers during manifest parsing

sunguroku 5 лет назад
Родитель
Сommit
5b46ece0d2

+ 38 - 5
internal/helm/grapher/object.go

@@ -1,21 +1,54 @@
 package grapher
 
+import (
+	"encoding/json"
+	"strconv"
+)
+
 // Object contains information about each k8s component in the chart.
 type Object struct {
 	Kind      string
 	Name      string
-	RawYAML   map[string]interface{}
+	RawYAML   string
 	Relations []Relation
 }
 
-// ParseObj aggregates objects in multi-document yaml into an array of objects.
-func ParseObj(obj map[string]interface{}) Object {
+// ParseObj parses a k8s object from a single-document yaml
+// and returns an array of objects that includes its children.
+func ParseObj(obj map[string]interface{}) []Object {
 	kind := getField(obj, "kind").(string)
 	name := getField(obj, "metadata", "name").(string)
-	return Object{
+	js, _ := json.Marshal(obj)
+
+	// First add the object that appears on the YAML
+	parent := Object{
 		Kind:      kind,
 		Name:      name,
-		RawYAML:   obj,
+		RawYAML:   string(js),
 		Relations: make([]Relation, 0),
 	}
+	objArr := []Object{}
+	objArr = append(objArr, parent)
+
+	switch kind {
+	case "Deployment", "StatefulSet", "ReplicaSet", "DaemonSet", "Job":
+
+		rs := getField(obj, "spec", "replicas")
+		if rs == nil {
+			rs = 0
+		}
+
+		// Add Pods for controller objects
+		template, _ := json.Marshal(getField(obj, "spec", "template"))
+		for i := 0; i < rs.(int); i++ {
+			pod := Object{
+				Kind:      "Pod",
+				Name:      name + "-" + strconv.Itoa(i+1),
+				RawYAML:   string(template),
+				Relations: make([]Relation, 0),
+			}
+			objArr = append(objArr, pod)
+		}
+	}
+	return objArr
 }

+ 28 - 4
internal/helm/grapher/object_test.go

@@ -32,6 +32,18 @@ var c4 = grapher.Object{
 	Relations: make([]grapher.Relation, 0),
 }
 
+var c5 = grapher.Object{
+	Kind:      "Pod",
+	Name:      "my-release-cassandra-1",
+	Relations: make([]grapher.Relation, 0),
+}
+
+var c6 = grapher.Object{
+	Kind:      "Pod",
+	Name:      "my-release-cassandra-2",
+	Relations: make([]grapher.Relation, 0),
+}
+
 // Expected objects for helm Cassandra chart
 var k1 = grapher.Object{
 	Kind:      "ServiceAccount",
@@ -76,18 +88,30 @@ var k7 = grapher.Object{
 }
 
 var k8 = grapher.Object{
+	Kind:      "Pod",
+	Name:      "my-release-zookeeper-1",
+	Relations: make([]grapher.Relation, 0),
+}
+
+var k9 = grapher.Object{
 	Kind:      "StatefulSet",
 	Name:      "my-release-kafka",
 	Relations: make([]grapher.Relation, 0),
 }
 
+var k10 = grapher.Object{
+	Kind:      "Pod",
+	Name:      "my-release-kafka-1",
+	Relations: make([]grapher.Relation, 0),
+}
+
 var expObjs1 = []grapher.Object{
-	c1, c2, c3, c4,
+	c1, c2, c3, c4, c5, c6,
 }
 
 var expObjs2 = []grapher.Object{
-	k1, k2, k3, k4,
-	k5, k6, k7, k8,
+	k1, k2, k3, k4, k5,
+	k6, k7, k8, k9, k10,
 }
 
 type k8sObj struct {
@@ -120,7 +144,7 @@ func TestParseObj(t *testing.T) {
 
 		for _, y := range yamlArr {
 			strmap := grapher.ConvertYAMLToStringKeys(y)
-			objects = append(objects, grapher.ParseObj(strmap))
+			objects = append(objects, grapher.ParseObj(strmap)...)
 		}
 
 		for i, o := range objects {

+ 1 - 1
internal/helm/grapher/test_yaml/cassandra.yaml

@@ -95,7 +95,7 @@ spec:
       app.kubernetes.io/instance: my-release
   serviceName: my-release-cassandra-headless
   podManagementPolicy: OrderedReady
-  replicas: 1
+  replicas: 2
   updateStrategy:
     type: RollingUpdate
   template: