application.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package validate
  2. import (
  3. "fmt"
  4. )
  5. type ServiceDiff struct {
  6. Name string
  7. current Service
  8. previous Service
  9. }
  10. func HydrateApplication(current, previous Application) (Application, error) {
  11. application := Application{}
  12. // handle service validation
  13. serviceDiffs := mergeApplicationsServices(current, previous)
  14. application.Services = make(map[string]Service)
  15. for _, serviceDiff := range serviceDiffs {
  16. service, err := HydrateService(serviceDiff.current, serviceDiff.previous, serviceDiff.Name)
  17. if err != nil {
  18. return application, err
  19. }
  20. application.Services[serviceDiff.Name] = service
  21. }
  22. if current.Image != nil {
  23. return application, nil
  24. }
  25. // handle build validation
  26. build, err := validateBuild(current.Build, previous.Build)
  27. if err != nil {
  28. return application, err
  29. }
  30. application.Build = build
  31. // handle env merge
  32. env := mergeEnv(current.Env, previous.Env)
  33. application.Env = env
  34. // handle release validation
  35. release, err := validateRelease(current.Release, previous.Release)
  36. if err != nil {
  37. return application, err
  38. }
  39. application.Release = release
  40. return application, nil
  41. }
  42. func validateBuild(current, previous *Build) (*Build, error) {
  43. // if current and previous are nil, return nil
  44. if current == nil && previous == nil {
  45. return nil, fmt.Errorf("Build settings must exist to create application")
  46. }
  47. // if current is nil and previous is not, return previous
  48. if current == nil && previous != nil {
  49. return previous, nil
  50. }
  51. return current, nil
  52. }
  53. func validateRelease(current, previous *Service) (*Service, error) {
  54. // handle release validation
  55. if current != nil && previous != nil {
  56. release, err := HydrateService(*current, *previous, "release")
  57. if err != nil {
  58. return nil, err
  59. }
  60. return &release, nil
  61. }
  62. if current != nil && previous == nil {
  63. release, err := HydrateService(*current, Service{}, "release")
  64. if err != nil {
  65. return nil, err
  66. }
  67. return &release, nil
  68. }
  69. if current == nil && previous != nil {
  70. release, err := HydrateService(Service{}, *previous, "release")
  71. if err != nil {
  72. return nil, err
  73. }
  74. return &release, nil
  75. }
  76. return nil, nil
  77. }
  78. func mergeApplicationsServices(current Application, previous Application) []ServiceDiff {
  79. serviceDiffs := []ServiceDiff{}
  80. for serviceName, serviceInCurrent := range current.Services {
  81. serviceInPrev, found := previous.Services[serviceName]
  82. if !found {
  83. serviceDiffs = append(serviceDiffs, ServiceDiff{
  84. Name: serviceName,
  85. current: serviceInCurrent,
  86. previous: Service{},
  87. })
  88. } else {
  89. serviceDiffs = append(serviceDiffs, ServiceDiff{
  90. Name: serviceName,
  91. current: serviceInCurrent,
  92. previous: serviceInPrev,
  93. })
  94. }
  95. }
  96. for serviceName, serviceInPrev := range previous.Services {
  97. if _, found := current.Services[serviceName]; !found {
  98. serviceDiffs = append(serviceDiffs, ServiceDiff{
  99. Name: serviceName,
  100. current: Service{},
  101. previous: serviceInPrev,
  102. })
  103. }
  104. }
  105. return serviceDiffs
  106. }
  107. func mergeEnv(current map[string]string, previous map[string]string) map[string]string {
  108. env := map[string]string{}
  109. for key, value := range previous {
  110. env[key] = value
  111. }
  112. for key, value := range current {
  113. env[key] = value
  114. }
  115. return env
  116. }