This prepares the next release. We need to support the compose v2 syntax as soon as possible to avoid accumulating technical debt.
98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
package generator
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"katenary.io/internal/utils"
|
|
|
|
"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) {
|
|
var name string
|
|
var finalport intstr.IntOrString
|
|
|
|
if targetPort := utils.GetServiceNameByPort(int(port.Target)); targetPort == "" {
|
|
finalport = intstr.FromInt(int(port.Target))
|
|
name = fmt.Sprintf("port-%d", 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.SplitSeq(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
|
|
}
|