object.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package grapher
  2. // Object contains information about each k8s component in the chart.
  3. type Object struct {
  4. ID int
  5. Kind string
  6. Name string
  7. Namespace string
  8. RawYAML map[string]interface{}
  9. Relations Relations
  10. }
  11. // ParseObjs parses a k8s object from a single-document yaml
  12. // and returns an array of objects that includes its children.
  13. func ParseObjs(objs []map[string]interface{}, releaseNamespace string) []Object {
  14. objArr := []Object{}
  15. for i, obj := range objs {
  16. kind := getField(obj, "kind")
  17. // ignore block comments
  18. if kind == nil {
  19. continue
  20. }
  21. name := getField(obj, "metadata", "name")
  22. namespace := getField(obj, "metadata", "namespace")
  23. if namespace == nil {
  24. namespace = releaseNamespace
  25. }
  26. if name == nil {
  27. name = ""
  28. }
  29. // First add the object that appears on the YAML
  30. parsedObj := Object{
  31. ID: i,
  32. Kind: kind.(string),
  33. Name: name.(string),
  34. Namespace: namespace.(string),
  35. RawYAML: obj,
  36. Relations: Relations{
  37. ControlRels: []ControlRel{},
  38. LabelRels: []LabelRel{},
  39. SpecRels: []SpecRel{},
  40. },
  41. }
  42. objArr = append(objArr, parsedObj)
  43. }
  44. return objArr
  45. }
  46. // ParseControllers parses a k8s object from a single-document yaml
  47. // and returns an array of controllers.
  48. func ParseControllers(objs []map[string]interface{}, releaseNamespace string) []Object {
  49. objArr := []Object{}
  50. for i, obj := range objs {
  51. kind := getField(obj, "kind")
  52. // ignore block comments
  53. if kind == nil {
  54. continue
  55. }
  56. switch kind.(string) {
  57. // Parse for all possible controller types
  58. case "Deployment", "StatefulSet", "ReplicaSet", "DaemonSet", "Job", "CronJob":
  59. name := getField(obj, "metadata", "name")
  60. namespace := getField(obj, "metadata", "namespace")
  61. if namespace == nil {
  62. namespace = releaseNamespace
  63. }
  64. if name == nil {
  65. name = ""
  66. }
  67. // First add the object that appears on the YAML
  68. parsedObj := Object{
  69. ID: i,
  70. Kind: kind.(string),
  71. Name: name.(string),
  72. Namespace: namespace.(string),
  73. }
  74. objArr = append(objArr, parsedObj)
  75. }
  76. }
  77. return objArr
  78. }