diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/flores.iml b/.idea/flores.iml index 7ee078d..5e764c4 100644 --- a/.idea/flores.iml +++ b/.idea/flores.iml @@ -1,4 +1,9 @@ - + + + + + + \ No newline at end of file diff --git a/lib/http/containers/create.go b/lib/http/containers/create.go index 42e55ff..1b79d93 100644 --- a/lib/http/containers/create.go +++ b/lib/http/containers/create.go @@ -4,15 +4,18 @@ import ( "bytes" "encoding/json" "floares/config" - "fmt" - "io" "log" "net/http" + "strconv" + "strings" ) type Create struct { - Image string `json:"image,required"` - Name string `json:"name,omitempty"` + 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"` } type CreateJson struct { Cause string `json:"cause"` @@ -24,12 +27,53 @@ type CreateJson struct { 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"` +} +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, + }) + } + container.Networks = make(map[string]NetSettings) + container.Networks["podman"] = NetSettings{ + InterfaceName: "ens0", + } + 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) @@ -44,8 +88,6 @@ func (c *Create) Create() (string, error) { } defer resp.Body.Close() - b, err := io.ReadAll(resp.Body) - log.Println(string(b)) var createJson CreateJson err = json.NewDecoder(resp.Body).Decode(&createJson) if err != nil { @@ -54,15 +96,7 @@ func (c *Create) Create() (string, error) { return "", err } log.Println(createJson) - startContainer(createJson.Id) + //startContainer(createJson.Id) + Start(createJson.Id) return createJson.Id, nil } -func startContainer(id string) error { - post, err := http.Post(fmt.Sprintf("/%s/libpod/containers/%s/start", config.Entrypoint, id), "application/json", nil) - if err != nil { - return err - } - bytes, err := io.ReadAll(post.Body) - log.Println(string(bytes)) - return err -} diff --git a/lib/http/containers/delete.go b/lib/http/containers/delete.go new file mode 100644 index 0000000..50d6ad5 --- /dev/null +++ b/lib/http/containers/delete.go @@ -0,0 +1,26 @@ +package containers + +import ( + "floares/config" + "io" + "log" + "net/http" +) + +func Delete(id string) error { + ///libpod/containers/01fa88c29752b2f6fa6ed0df14868966e13b9ce460c4b71e070a44a59fd37218/start + req, err := http.NewRequest(http.MethodDelete, config.Entrypoint+"/containers/"+id+"?force=true&depend=true", nil) + if err != nil { + log.Println("request for containers list error:", err) + return err + } + res, err := http.DefaultClient.Do(req) + if err != nil { + log.Println("request for containers list error:", err) + return err + } + defer res.Body.Close() + str, err := io.ReadAll(res.Body) + log.Println(string(str)) + return nil +} diff --git a/lib/http/containers/list.go b/lib/http/containers/list.go index a6dfb5a..b38de37 100644 --- a/lib/http/containers/list.go +++ b/lib/http/containers/list.go @@ -3,19 +3,30 @@ package containers import ( "encoding/json" "floares/config" + "github.com/samber/lo" "log" "net/http" "strings" "time" ) +type Ports struct { + PrivatePort int `json:"container_port"` + PublicPort int `json:"host_port"` +} +type Port struct { + PrivatePort int `json:"PrivatePort"` + PublicPort int `json:"PublicPort"` + Type string `json:"Type"` +} type ListContainers struct { - Id string `json:"id"` - Name string `json:"name"` - Image string `json:"image"` - Created string `json:"created"` - Ports []interface{} `json:"ports"` - State string `json:"state"` + Id string `json:"id"` + Name string `json:"name"` + Image string `json:"image"` + Created string `json:"created"` + Ports []Ports `json:"ports"` + Network []string `json:"network"` + State string `json:"state"` } type Containers struct { Id string `json:"Id"` @@ -24,7 +35,10 @@ type Containers struct { ImageID string `json:"ImageID"` Command string `json:"Command"` Created int `json:"Created"` - //Ports []interface{} `json:"Ports"` + Ports []Port `json:"Ports"` + Network struct { + Networks map[string]any `json:"Networks"` + } `json:"NetworkSettings"` State string `json:"State"` Status string `json:"Status"` } @@ -45,15 +59,25 @@ func List() []ListContainers { if err != nil { log.Println("json decode container list error:", err) } - var list []ListContainers + list := make([]ListContainers, 0) for _, container := range containers { + var p []Ports + for _, containerPort := range container.Ports { + p = append(p, Ports{ + PrivatePort: containerPort.PrivatePort, + PublicPort: containerPort.PublicPort, + }) + } list = append(list, ListContainers{ Id: container.Id, Name: strings.TrimPrefix(container.Names[0], "/"), Image: container.Image, Created: time.Unix(int64(container.Created), 0).Format(time.DateTime), State: container.State, + Network: lo.Keys(container.Network.Networks), + Ports: append([]Ports{}, p...), }) } + return list } diff --git a/lib/http/containers/start.go b/lib/http/containers/start.go new file mode 100644 index 0000000..209d169 --- /dev/null +++ b/lib/http/containers/start.go @@ -0,0 +1,26 @@ +package containers + +import ( + "floares/config" + "io" + "log" + "net/http" +) + +func Start(id string) error { + ///libpod/containers/01fa88c29752b2f6fa6ed0df14868966e13b9ce460c4b71e070a44a59fd37218/start + req, err := http.NewRequest(http.MethodPost, config.Entrypoint+"/v2.2.2/libpod/containers/"+id+"/start", nil) + if err != nil { + log.Println("request for containers list error:", err) + return err + } + res, err := http.DefaultClient.Do(req) + if err != nil { + log.Println("request for containers list error:", err) + return err + } + defer res.Body.Close() + str, err := io.ReadAll(res.Body) + log.Println(string(str)) + return nil +} diff --git a/lib/http/network/connected.go b/lib/http/network/connected.go new file mode 100644 index 0000000..81f241a --- /dev/null +++ b/lib/http/network/connected.go @@ -0,0 +1,59 @@ +package network + +import ( + "encoding/json" + "floares/config" + "log" + "net/http" + "time" +) + +type Inspect struct { + Name string `json:"Name"` + Id string `json:"Id"` + Created time.Time `json:"Created"` + Scope string `json:"Scope"` + Driver string `json:"Driver"` + EnableIPv6 bool `json:"EnableIPv6"` + IPAM struct { + Driver string `json:"Driver"` + Options struct { + Driver string `json:"driver"` + } `json:"Options"` + Config []struct { + Subnet string `json:"Subnet"` + Gateway string `json:"Gateway"` + } `json:"Config"` + } `json:"IPAM"` + Internal bool `json:"Internal"` + Attachable bool `json:"Attachable"` + Ingress bool `json:"Ingress"` + ConfigFrom struct { + Network string `json:"Network"` + } `json:"ConfigFrom"` + ConfigOnly bool `json:"ConfigOnly"` + Containers struct { + C8E63Bfb95Cf391126C4B7A13327Cd781Af0Dd080B858Cdb7A2B26B4304E02C struct { + Name string `json:"Name"` + EndpointID string `json:"EndpointID"` + MacAddress string `json:"MacAddress"` + IPv4Address string `json:"IPv4Address"` + IPv6Address string `json:"IPv6Address"` + } `json:"9c8e63bfb95cf391126c4b7a13327cd781af0dd080b858cdb7a2b26b4304e02c"` + } `json:"Containers"` + Options struct { + } `json:"Options"` + Labels struct { + } `json:"Labels"` +} + +func GetInspect(ns string) (net Inspect) { + req, _ := http.NewRequest("GET", config.Entrypoint+"/networks/"+ns, nil) + res, err := http.DefaultClient.Do(req) + if err != nil { + log.Println("request for network list error:", err) + return + } + err = json.NewDecoder(res.Body).Decode(&net) + return +} diff --git a/service/containers/pods.go b/service/containers/pods.go index 4c73bb3..4bb921b 100644 --- a/service/containers/pods.go +++ b/service/containers/pods.go @@ -3,6 +3,7 @@ package containers import ( "floares/lib/http/containers" "github.com/gin-gonic/gin" + "net/http" ) func ListContainers(c *gin.Context) { @@ -31,5 +32,15 @@ func CreateContainer(c *gin.Context) { } c.JSON(200, gin.H{ "data": id, + "err": "", }) } +func StartContainer(c *gin.Context) { + containers.Start(c.Query("id")) + c.Writer.WriteHeader(http.StatusNoContent) + return +} +func DeleteContainer(c *gin.Context) { + containers.Delete(c.Query("id")) + c.Writer.WriteHeader(http.StatusNoContent) +} diff --git a/service/containers/router.go b/service/containers/router.go index 909b0dc..d87e48b 100644 --- a/service/containers/router.go +++ b/service/containers/router.go @@ -5,5 +5,7 @@ import "github.com/gin-gonic/gin" func RegisterRouter(r *gin.RouterGroup) { r.GET("/all", ListContainers) r.POST("/create", CreateContainer) + r.POST("/start", StartContainer) + r.DELETE("/delete", DeleteContainer) } diff --git a/service/network/inspect.go b/service/network/inspect.go new file mode 100644 index 0000000..f97a21e --- /dev/null +++ b/service/network/inspect.go @@ -0,0 +1,20 @@ +package network + +import ( + "floares/lib/http/network" + "github.com/gin-gonic/gin" + "net/http" +) + +func ListConnect(c *gin.Context) { + ns := c.Param("ns") + if ns == "" { + c.JSON(http.StatusBadRequest, gin.H{ + "code": http.StatusBadRequest, + "msg": "namespace is required", + }) + } + inspect := network.GetInspect(ns) + c.JSON(http.StatusOK, inspect) + +} diff --git a/service/network/router.go b/service/network/router.go index 85e64ba..ac2b439 100644 --- a/service/network/router.go +++ b/service/network/router.go @@ -4,4 +4,5 @@ import "github.com/gin-gonic/gin" func RegisterRouter(r *gin.RouterGroup) { r.GET("/", ListNetwork) + r.GET("/:ns/containers", ListConnect) } diff --git a/tmp/runner-build b/tmp/runner-build index f57da9b..118b8e5 100755 Binary files a/tmp/runner-build and b/tmp/runner-build differ