114 lines
2.7 KiB
Go
114 lines
2.7 KiB
Go
package containers
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"floares/config"
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type Create struct {
|
|
Image string `json:"image,required"`
|
|
Name string `json:"name,omitempty"`
|
|
Network string `json:"network,required"`
|
|
Port string `json:"port,omitempty"`
|
|
Start bool `json:"start,omitempty"`
|
|
Volume string `json:"volume,omitzero"`
|
|
Source string `json:"source,omitzero"`
|
|
}
|
|
type CreateJson struct {
|
|
Cause string `json:"cause"`
|
|
Message string `json:"message"`
|
|
Response int `json:"response"`
|
|
Id string `json:"Id,omitempty"`
|
|
Warning []string `json:"Warnings,omitempty"`
|
|
}
|
|
|
|
type create struct {
|
|
Image string `json:"image"`
|
|
Name string `json:"name"`
|
|
Netns struct {
|
|
Mode string `json:"nsmode"`
|
|
} `json:"netns"`
|
|
Port []PortMapping `json:"portmappings"`
|
|
Networks map[string]NetSettings `json:"networks"`
|
|
Volumes []VolumeMap `json:"volumes,omitzero"`
|
|
}
|
|
type VolumeMap struct {
|
|
Name string `json:"name"`
|
|
Dest string `json:"dest"`
|
|
}
|
|
type NetSettings struct {
|
|
Aliases []string `json:"aliases,omitempty"`
|
|
InterfaceName string `json:"interface_name"`
|
|
}
|
|
type PortMapping struct {
|
|
HostPort int `json:"host_port"`
|
|
ContainerPort int `json:"container_port"`
|
|
}
|
|
|
|
func (c *Create) Create() (string, error) {
|
|
var container create
|
|
container.Image = c.Image
|
|
container.Name = c.Name
|
|
var port []PortMapping
|
|
for _, v := range strings.Split(c.Port, ",") {
|
|
p := strings.Split(v, ":")
|
|
if len(p) != 2 {
|
|
continue
|
|
}
|
|
port1, _ := strconv.Atoi(p[0])
|
|
port2, _ := strconv.Atoi(p[1])
|
|
port = append(port, PortMapping{
|
|
HostPort: port1,
|
|
ContainerPort: port2,
|
|
})
|
|
}
|
|
if c.Source != c.Volume {
|
|
container.Volumes = append(container.Volumes, VolumeMap{
|
|
Name: c.Volume,
|
|
Dest: c.Source,
|
|
})
|
|
}
|
|
container.Networks = make(map[string]NetSettings)
|
|
container.Networks["podman"] = NetSettings{}
|
|
for k, v := range strings.Split(c.Network, ",") {
|
|
log.Println(v)
|
|
container.Networks[v] = NetSettings{
|
|
InterfaceName: "ens" + strconv.Itoa(k),
|
|
}
|
|
}
|
|
container.Port = port
|
|
container.Netns = struct {
|
|
Mode string `json:"nsmode"`
|
|
}{Mode: "bridge"}
|
|
str, err := json.Marshal(container)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return "", err
|
|
}
|
|
log.Println(string(str))
|
|
req, _ := http.NewRequest(http.MethodPost, config.Entrypoint+"/v2.1.2/libpod/containers/create", bytes.NewBuffer(str))
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return "", err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
var createJson CreateJson
|
|
err = json.NewDecoder(resp.Body).Decode(&createJson)
|
|
if err != nil {
|
|
log.Println(createJson)
|
|
log.Println(err)
|
|
return "", err
|
|
}
|
|
log.Println(createJson)
|
|
//startContainer(createJson.Id)
|
|
Start(createJson.Id)
|
|
return createJson.Id, nil
|
|
}
|