1package cmdparams
2
3import (
4 "fmt"
5 "net/url"
6 "strings"
7
8 "github.com/bnema/gordon/internal/common"
9 "github.com/bnema/gordon/internal/server"
10 "github.com/bnema/gordon/pkg/docker"
11)
12
13// FromYAMLStructToCmdParams converts a YAMLContainerParams struct to a ContainerCommandParams struct
14func FromPayloadStructToCmdParams(ppl *common.DeployPayload, a *server.App) (docker.ContainerCommandParams, error) {
15
16 imageID, err := docker.GetImageID(ppl.ImageName)
17 if err != nil {
18 return docker.ContainerCommandParams{}, err
19 }
20
21 // volume empty for now
22 volumeSlice := ParseVolumeSlice("")
23
24 environmentSlice := ParseEnvironmentSlice("")
25
26 portMappings, err := ParsePortMappingsSlice(ppl.Ports)
27 if err != nil {
28 return docker.ContainerCommandParams{}, err
29 }
30
31 // from ppl.TargetDomain, (eg. "https://test.example.com") get container_name (eg. "test"), get container_subdomain (eg. "test"), get container_domain (eg. "example.com") and get container_protocol (eg. "https")
32 // Parse TargetDomain to get the various components
33 parsedURL, err := url.Parse(ppl.TargetDomain)
34 if err != nil {
35 return docker.ContainerCommandParams{}, err
36 }
37
38 // Extract the subdomain and domain from the host
39 hostParts := strings.Split(parsedURL.Host, ".")
40 if len(hostParts) < 2 {
41 return docker.ContainerCommandParams{}, fmt.Errorf("invalid domain: %s", parsedURL.Host)
42 }
43
44 // Protocol (http/https), Container name, Container subdomain, and Container domain
45 protocol := parsedURL.Scheme
46 containerSubdomain := hostParts[0]
47 containerDomain := strings.Join(hostParts[1:], ".")
48
49 params := docker.ContainerCommandParams{
50 IsSSL: protocol == "https",
51 ContainerName: containerSubdomain,
52 ServiceName: containerSubdomain,
53 Domain: containerDomain,
54 ImageName: ppl.ImageName,
55 ImageID: imageID,
56 Restart: "always",
57 Volumes: volumeSlice,
58 Environment: environmentSlice,
59 Network: a.Config.ContainerEngine.Network,
60 PortMappings: portMappings,
61 }
62
63 CreateTraefikLabels(¶ms)
64
65 return params, nil
66}