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, imageID string) (docker.ContainerCommandParams, error) {
15
16 // volume empty for now
17 volumeSlice := ParseVolumeSlice("")
18
19 environmentSlice := ParseEnvironmentSlice("")
20
21 portMappings, err := ParsePortMappingsSlice(ppl.Ports)
22 if err != nil {
23 return docker.ContainerCommandParams{}, err
24 }
25
26 // 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")
27 // Parse TargetDomain to get the various components
28 parsedURL, err := url.Parse(ppl.TargetDomain)
29 if err != nil {
30 return docker.ContainerCommandParams{}, err
31 }
32
33 // Extract the subdomain and domain from the host
34 hostParts := strings.Split(parsedURL.Host, ".")
35 if len(hostParts) < 2 {
36 return docker.ContainerCommandParams{}, fmt.Errorf("invalid domain: %s", parsedURL.Host)
37 }
38
39 // Protocol (http/https), Container name, Container subdomain, and Container domain
40 protocol := parsedURL.Scheme
41 containerSubdomain := hostParts[0]
42 containerDomain := strings.Join(hostParts[1:], ".")
43
44 params := docker.ContainerCommandParams{
45 IsSSL: protocol == "https",
46 ContainerName: containerSubdomain,
47 ServiceName: containerSubdomain,
48 Domain: containerDomain,
49 ImageName: ppl.ImageName,
50 ImageID: imageID,
51 Restart: "always",
52 Volumes: volumeSlice,
53 Environment: environmentSlice,
54 Network: a.Config.ContainerEngine.Network,
55 PortMappings: portMappings,
56 }
57
58 CreateTraefikLabels(¶ms)
59
60 return params, nil
61}