As explained in #102, the compose-go package changes types and needs massive changes. This branches is OK for now, but needs some tests. It MUST be quickly fixed to be integrated in main branch.
99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
package generator
|
|
|
|
import (
|
|
"katenary/utils"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/compose-spec/compose-go/v2/types"
|
|
v1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/util/intstr"
|
|
)
|
|
|
|
var _ Yaml = (*Service)(nil)
|
|
|
|
// Service is a kubernetes Service.
|
|
type Service struct {
|
|
*v1.Service `yaml:",inline"`
|
|
service *types.ServiceConfig `yaml:"-"`
|
|
}
|
|
|
|
// NewService creates a new Service from a compose service.
|
|
func NewService(service types.ServiceConfig, appName string) *Service {
|
|
ports := []v1.ServicePort{}
|
|
|
|
s := &Service{
|
|
service: &service,
|
|
Service: &v1.Service{
|
|
TypeMeta: metav1.TypeMeta{
|
|
Kind: "Service",
|
|
APIVersion: "v1",
|
|
},
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: utils.TplName(service.Name, appName),
|
|
Labels: GetLabels(service.Name, appName),
|
|
Annotations: Annotations,
|
|
},
|
|
Spec: v1.ServiceSpec{
|
|
Selector: GetMatchLabels(service.Name, appName),
|
|
Ports: ports,
|
|
},
|
|
},
|
|
}
|
|
for _, port := range service.Ports {
|
|
s.AddPort(port)
|
|
}
|
|
|
|
return s
|
|
}
|
|
|
|
// AddPort adds a port to the service.
|
|
func (s *Service) AddPort(port types.ServicePortConfig, serviceName ...string) {
|
|
name := s.service.Name
|
|
if len(serviceName) > 0 {
|
|
name = serviceName[0]
|
|
}
|
|
|
|
var finalport intstr.IntOrString
|
|
|
|
if targetPort := utils.GetServiceNameByPort(int(port.Target)); targetPort == "" {
|
|
finalport = intstr.FromInt(int(port.Target))
|
|
} else {
|
|
finalport = intstr.FromString(targetPort)
|
|
name = targetPort
|
|
}
|
|
|
|
s.Spec.Ports = append(s.Spec.Ports, v1.ServicePort{
|
|
Protocol: v1.ProtocolTCP,
|
|
Port: int32(port.Target),
|
|
TargetPort: finalport,
|
|
Name: name,
|
|
})
|
|
}
|
|
|
|
// Filename returns the filename of the service.
|
|
func (s *Service) Filename() string {
|
|
return s.service.Name + ".service.yaml"
|
|
}
|
|
|
|
// Yaml returns the yaml representation of the service.
|
|
func (s *Service) Yaml() ([]byte, error) {
|
|
var y []byte
|
|
var err error
|
|
if y, err = ToK8SYaml(s); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
lines := []string{}
|
|
for _, line := range strings.Split(string(y), "\n") {
|
|
if regexp.MustCompile(`^\s*loadBalancer:\s*`).MatchString(line) {
|
|
continue
|
|
}
|
|
lines = append(lines, line)
|
|
}
|
|
y = []byte(strings.Join(lines, "\n"))
|
|
|
|
return y, err
|
|
}
|