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"?>
|
<?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>
|
||||||
@ -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
|
|
||||||
}
|
|
||||||
|
|||||||
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,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
|
||||||
}
|
}
|
||||||
|
|||||||
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 (
|
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)
|
||||||
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
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) {
|
func RegisterRouter(r *gin.RouterGroup) {
|
||||||
r.GET("/", ListNetwork)
|
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