Refactor Docker bridge handling: consolidate bridge name and subnet methods into BridgeInfo for simplified logic and enhanced structure

This commit is contained in:
2026-01-11 00:23:49 +05:00
parent a10d56df79
commit 8798811806
3 changed files with 38 additions and 46 deletions

View File

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

View File

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

View File

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