service.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package kubemodel
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. )
  7. // @bingen:generate:ServiceType
  8. type ServiceType string
  9. const (
  10. ServiceTypeClusterIP ServiceType = "ClusterIP"
  11. ServiceTypeNodePort ServiceType = "NodePort"
  12. ServiceTypeLoadBalancer ServiceType = "LoadBalancer"
  13. ServiceTypeExternalName ServiceType = "ExternalName"
  14. )
  15. // ParseServiceType converts a string to a ServiceType, performing case-insensitive matching.
  16. // Returns ServiceTypeClusterIP (the default) if the service type string is not recognized.
  17. func ParseServiceType(serviceType string) ServiceType {
  18. switch strings.ToLower(serviceType) {
  19. case "clusterip":
  20. return ServiceTypeClusterIP
  21. case "nodeport":
  22. return ServiceTypeNodePort
  23. case "loadbalancer", "lb":
  24. return ServiceTypeLoadBalancer
  25. case "externalname":
  26. return ServiceTypeExternalName
  27. default:
  28. return ServiceTypeClusterIP
  29. }
  30. }
  31. // @bingen:generate:Service
  32. type Service struct {
  33. UID string `json:"uid"`
  34. NamespaceUID string `json:"namespaceUid"`
  35. Name string `json:"name"`
  36. Type ServiceType `json:"type"`
  37. Start time.Time `json:"start"`
  38. End time.Time `json:"end"`
  39. // Label selector to identify pods/containers targeted by this service
  40. // Maps label keys to values (e.g., {"app": "nginx", "tier": "frontend"})
  41. // Pods with matching labels will receive traffic from this service
  42. Selector map[string]string `json:"selector,omitempty"`
  43. LBIngressAddress string `json:"lbIngressAddress,omitempty"`
  44. }
  45. func (s *Service) ValidateService(window Window) error {
  46. if s.UID == "" {
  47. return fmt.Errorf("UID is missing for Service with name '%s'", s.Name)
  48. }
  49. if s.Name == "" {
  50. return fmt.Errorf("Name is missing for Service '%s'", s.UID)
  51. }
  52. if s.NamespaceUID == "" {
  53. return fmt.Errorf("NamespaceUID is missing for Service '%s'", s.UID)
  54. }
  55. if err := checkWindow(window, s.Start, s.End); err != nil {
  56. return err
  57. }
  58. return nil
  59. }
  60. func (kms *KubeModelSet) RegisterService(service *Service) error {
  61. if err := service.ValidateService(kms.Window); err != nil {
  62. err = fmt.Errorf("RegisterService: invalid service: %w", err)
  63. kms.Error(err)
  64. return err
  65. }
  66. if _, ok := kms.Services[service.UID]; !ok {
  67. kms.Services[service.UID] = service
  68. kms.Metadata.ObjectCount++
  69. }
  70. return nil
  71. }