update list containers

This commit is contained in:
sianao 2025-04-11 18:00:46 +08:00
parent 38333b2338
commit d09608088f
12 changed files with 234 additions and 34 deletions

8
.idea/.gitignore generated vendored
View File

@ -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

7
.idea/flores.iml generated
View File

@ -1,4 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module version="4"> <module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" /> <component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module> </module>

View File

@ -4,15 +4,18 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"floares/config" "floares/config"
"fmt"
"io"
"log" "log"
"net/http" "net/http"
"strconv"
"strings"
) )
type Create struct { type Create struct {
Image string `json:"image,required"` Image string `json:"image,required"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Network string `json:"network,required"`
Port string `json:"port,omitempty"`
Start bool `json:"start,omitempty"`
} }
type CreateJson struct { type CreateJson struct {
Cause string `json:"cause"` Cause string `json:"cause"`
@ -24,12 +27,53 @@ type CreateJson struct {
type create struct { type create struct {
Image string `json:"image"` 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) { func (c *Create) Create() (string, error) {
var container create var container create
container.Image = c.Image 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) str, err := json.Marshal(container)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@ -44,8 +88,6 @@ func (c *Create) Create() (string, error) {
} }
defer resp.Body.Close() defer resp.Body.Close()
b, err := io.ReadAll(resp.Body)
log.Println(string(b))
var createJson CreateJson var createJson CreateJson
err = json.NewDecoder(resp.Body).Decode(&createJson) err = json.NewDecoder(resp.Body).Decode(&createJson)
if err != nil { if err != nil {
@ -54,15 +96,7 @@ func (c *Create) Create() (string, error) {
return "", err return "", err
} }
log.Println(createJson) log.Println(createJson)
startContainer(createJson.Id) //startContainer(createJson.Id)
Start(createJson.Id)
return createJson.Id, nil 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
}

View File

@ -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
}

View File

@ -3,19 +3,30 @@ package containers
import ( import (
"encoding/json" "encoding/json"
"floares/config" "floares/config"
"github.com/samber/lo"
"log" "log"
"net/http" "net/http"
"strings" "strings"
"time" "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 { type ListContainers struct {
Id string `json:"id"` Id string `json:"id"`
Name string `json:"name"` Name string `json:"name"`
Image string `json:"image"` Image string `json:"image"`
Created string `json:"created"` Created string `json:"created"`
Ports []interface{} `json:"ports"` Ports []Ports `json:"ports"`
State string `json:"state"` Network []string `json:"network"`
State string `json:"state"`
} }
type Containers struct { type Containers struct {
Id string `json:"Id"` Id string `json:"Id"`
@ -24,7 +35,10 @@ type Containers struct {
ImageID string `json:"ImageID"` ImageID string `json:"ImageID"`
Command string `json:"Command"` Command string `json:"Command"`
Created int `json:"Created"` 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"` State string `json:"State"`
Status string `json:"Status"` Status string `json:"Status"`
} }
@ -45,15 +59,25 @@ func List() []ListContainers {
if err != nil { if err != nil {
log.Println("json decode container list error:", err) log.Println("json decode container list error:", err)
} }
var list []ListContainers list := make([]ListContainers, 0)
for _, container := range containers { 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{ list = append(list, ListContainers{
Id: container.Id, Id: container.Id,
Name: strings.TrimPrefix(container.Names[0], "/"), Name: strings.TrimPrefix(container.Names[0], "/"),
Image: container.Image, Image: container.Image,
Created: time.Unix(int64(container.Created), 0).Format(time.DateTime), Created: time.Unix(int64(container.Created), 0).Format(time.DateTime),
State: container.State, State: container.State,
Network: lo.Keys(container.Network.Networks),
Ports: append([]Ports{}, p...),
}) })
} }
return list return list
} }

View File

@ -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
}

View File

@ -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
}

View File

@ -3,6 +3,7 @@ package containers
import ( import (
"floares/lib/http/containers" "floares/lib/http/containers"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"net/http"
) )
func ListContainers(c *gin.Context) { func ListContainers(c *gin.Context) {
@ -31,5 +32,15 @@ func CreateContainer(c *gin.Context) {
} }
c.JSON(200, gin.H{ c.JSON(200, gin.H{
"data": id, "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)
}

View File

@ -5,5 +5,7 @@ import "github.com/gin-gonic/gin"
func RegisterRouter(r *gin.RouterGroup) { func RegisterRouter(r *gin.RouterGroup) {
r.GET("/all", ListContainers) r.GET("/all", ListContainers)
r.POST("/create", CreateContainer) r.POST("/create", CreateContainer)
r.POST("/start", StartContainer)
r.DELETE("/delete", DeleteContainer)
} }

View File

@ -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)
}

View File

@ -4,4 +4,5 @@ import "github.com/gin-gonic/gin"
func RegisterRouter(r *gin.RouterGroup) { func RegisterRouter(r *gin.RouterGroup) {
r.GET("/", ListNetwork) r.GET("/", ListNetwork)
r.GET("/:ns/containers", ListConnect)
} }

Binary file not shown.