update list containers
This commit is contained in:
parent
38333b2338
commit
d09608088f
8
.idea/.gitignore
generated
vendored
8
.idea/.gitignore
generated
vendored
@ -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
7
.idea/flores.iml
generated
@ -1,4 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module version="4">
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="Go" enabled="true" />
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
@ -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"`
|
||||
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
|
||||
}
|
||||
|
||||
26
lib/http/containers/delete.go
Normal file
26
lib/http/containers/delete.go
Normal 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
|
||||
}
|
||||
@ -3,18 +3,29 @@ 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"`
|
||||
Ports []Ports `json:"ports"`
|
||||
Network []string `json:"network"`
|
||||
State string `json:"state"`
|
||||
}
|
||||
type Containers struct {
|
||||
@ -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
|
||||
}
|
||||
|
||||
26
lib/http/containers/start.go
Normal file
26
lib/http/containers/start.go
Normal 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
|
||||
}
|
||||
59
lib/http/network/connected.go
Normal file
59
lib/http/network/connected.go
Normal 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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
}
|
||||
|
||||
20
service/network/inspect.go
Normal file
20
service/network/inspect.go
Normal 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)
|
||||
|
||||
}
|
||||
@ -4,4 +4,5 @@ import "github.com/gin-gonic/gin"
|
||||
|
||||
func RegisterRouter(r *gin.RouterGroup) {
|
||||
r.GET("/", ListNetwork)
|
||||
r.GET("/:ns/containers", ListConnect)
|
||||
}
|
||||
|
||||
BIN
tmp/runner-build
BIN
tmp/runner-build
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user