Refactor Docker bridge handling: consolidate bridge name and subnet methods into BridgeInfo for simplified logic and enhanced structure
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
@@ -25,42 +26,17 @@ func (d *docker) Bridges() ([]string, error) {
|
||||
return lines, nil
|
||||
}
|
||||
|
||||
func (d *docker) BridgeNames() ([]string, error) {
|
||||
bridges, err := d.Bridges()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var names []string
|
||||
|
||||
for _, bridge := range bridges {
|
||||
bridgeName, err := d.BridgeName(bridge)
|
||||
if err != nil {
|
||||
d.logger.Error(err.Error())
|
||||
continue
|
||||
}
|
||||
names = append(names, bridgeName)
|
||||
}
|
||||
|
||||
return names, nil
|
||||
}
|
||||
|
||||
func (d *docker) BridgeName(bridgeID string) (string, error) {
|
||||
format := fmt.Sprintf(`{{"br-%s" | or (index .Options "com.docker.network.bridge.name")}}`, bridgeID)
|
||||
args := []string{"network", "inspect", "-f", format, bridgeID}
|
||||
func (d *docker) BridgeInfo(bridgeID string) (DockerBridgeInspect, error) {
|
||||
args := []string{"network", "inspect", bridgeID}
|
||||
result, err := d.command(args...)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to get bridge name: %s", err.Error())
|
||||
return DockerBridgeInspect{}, fmt.Errorf("failed to get bridge name: %s", err.Error())
|
||||
}
|
||||
return strings.TrimSpace(string(result)), nil
|
||||
}
|
||||
|
||||
func (d *docker) BridgeSubnet(bridgeID string) (string, error) {
|
||||
format := fmt.Sprintf(`{{range .IPAM.Config}}{{.Subnet}}{{end}}`)
|
||||
args := []string{"network", "inspect", "-f", format, bridgeID}
|
||||
result, err := d.command(args...)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to get bridge subnet: %s", err.Error())
|
||||
var info []DockerBridgeInspect
|
||||
if err := json.Unmarshal(result, &info); err != nil {
|
||||
return DockerBridgeInspect{}, err
|
||||
}
|
||||
return strings.TrimSpace(string(result)), nil
|
||||
|
||||
return info[0], nil
|
||||
}
|
||||
|
||||
@@ -16,9 +16,7 @@ type Docker interface {
|
||||
FetchContainers(bridgeID string) (Containers, error)
|
||||
|
||||
Bridges() ([]string, error)
|
||||
BridgeNames() ([]string, error)
|
||||
BridgeName(bridgeID string) (string, error)
|
||||
BridgeSubnet(bridgeID string) (string, error)
|
||||
BridgeInfo(bridgeID string) (DockerBridgeInspect, error)
|
||||
|
||||
Containers(bridgeID string) ([]string, error)
|
||||
ContainerNetworks(containerID string) (DockerContainerInspect, error)
|
||||
@@ -52,13 +50,7 @@ func (d *docker) FetchBridges() (Bridges, error) {
|
||||
}
|
||||
|
||||
for _, bridgeId := range list {
|
||||
bridgeName, err := d.BridgeName(bridgeId)
|
||||
if err != nil {
|
||||
d.logger.Error(err.Error())
|
||||
continue
|
||||
}
|
||||
|
||||
bridgeSubnet, err := d.BridgeSubnet(bridgeId)
|
||||
bridgeInfo, err := d.BridgeInfo(bridgeId)
|
||||
if err != nil {
|
||||
d.logger.Error(err.Error())
|
||||
continue
|
||||
@@ -70,10 +62,22 @@ func (d *docker) FetchBridges() (Bridges, error) {
|
||||
d.logger.Error(err.Error())
|
||||
}
|
||||
|
||||
bridgeName := fmt.Sprintf("br-%s", bridgeId)
|
||||
if bridgeInfo.Options.Name != "" {
|
||||
bridgeName = bridgeInfo.Options.Name
|
||||
}
|
||||
|
||||
var bridgeSubnet []string
|
||||
if bridgeInfo.IPAM.Config != nil {
|
||||
for _, config := range bridgeInfo.IPAM.Config {
|
||||
bridgeSubnet = append(bridgeSubnet, config.Subnet)
|
||||
}
|
||||
}
|
||||
|
||||
bridges = append(bridges, Bridge{
|
||||
ID: bridgeId,
|
||||
ID: bridgeInfo.ID,
|
||||
Name: bridgeName,
|
||||
Subnet: bridgeSubnet,
|
||||
Subnets: bridgeSubnet,
|
||||
Containers: containers,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -14,10 +14,22 @@ type Bridges []Bridge
|
||||
type Bridge struct {
|
||||
ID string
|
||||
Name string
|
||||
Subnet string
|
||||
Subnets []string
|
||||
Containers Containers
|
||||
}
|
||||
|
||||
type DockerBridgeInspect struct {
|
||||
ID string `json:"Id"`
|
||||
Options struct {
|
||||
Name string `json:"com.docker.network.bridge.name"`
|
||||
} `json:"Options"`
|
||||
IPAM struct {
|
||||
Config []struct {
|
||||
Subnet string `json:"Subnet"`
|
||||
} `json:"Config"`
|
||||
} `json:"IPAM"`
|
||||
}
|
||||
|
||||
type Containers []Container
|
||||
|
||||
type Container struct {
|
||||
|
||||
Reference in New Issue
Block a user