Skip to content
This repository was archived by the owner on Feb 8, 2021. It is now read-only.

Commit 1813756

Browse files
committed
force attach fip to antoher container & use available fip instead of allocating a new
1 parent ee7020e commit 1813756

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

api/client/fip.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,29 @@ func (cli *DockerCli) CmdFip(args ...string) error {
3535
// Usage: docker fip create [OPTIONS] COUNT
3636
func (cli *DockerCli) CmdFipAllocate(args ...string) error {
3737
cmd := Cli.Subcmd("fip allocate", []string{"COUNT"}, "Creates some new floating IPs by the user", false)
38+
flAvailable := cmd.Bool([]string{"-pick"}, false, "Pick an available floating IP if have")
3839
flForce := cmd.Bool([]string{"y", "-yes"}, false, "Agree to allocate floating IP, will not show prompt")
3940

4041
cmd.Require(flag.Exact, 1)
4142
err := cmd.ParseFlags(args, true)
4243
if err != nil {
4344
return err
4445
}
46+
if *flAvailable == true {
47+
fipFilterArgs, _ := filters.FromParam("dangling=true")
48+
options := types.NetworkListOptions{
49+
Filters: fipFilterArgs,
50+
}
51+
fips, err := cli.client.FipList(context.Background(), options)
52+
if err == nil {
53+
for _, fip := range fips {
54+
if fip["container"] == "" && fip["service"] == "" {
55+
fmt.Fprintf(cli.out, "%s\n", fip["fip"])
56+
return nil
57+
}
58+
}
59+
}
60+
}
4561
if *flForce == false {
4662
if askForConfirmation(warnMessage) == false {
4763
return nil
@@ -87,10 +103,36 @@ func (cli *DockerCli) CmdFipRelease(args ...string) error {
87103
// Usage: docker fip attach [OPTIONS] <FIP> <CONTAINER>
88104
func (cli *DockerCli) CmdFipAttach(args ...string) error {
89105
cmd := Cli.Subcmd("fip attach", []string{"FIP CONTAINER"}, "Connects a container to a floating IP", false)
106+
flForce := cmd.Bool([]string{"f", "-force"}, false, "Deattach that FIP and attach it to this container")
90107
cmd.Require(flag.Min, 2)
91108
if err := cmd.ParseFlags(args, true); err != nil {
92109
return err
93110
}
111+
if *flForce {
112+
filter, _ := filters.FromParam("dangling=false")
113+
options := types.NetworkListOptions{
114+
Filters: filter,
115+
}
116+
117+
fips, err := cli.client.FipList(context.Background(), options)
118+
if err != nil {
119+
return err
120+
}
121+
for _, fip := range fips {
122+
if ip := fip["fip"]; ip == cmd.Arg(0) {
123+
if fip["container"] != "" {
124+
cli.client.FipDetach(context.Background(), fip["container"])
125+
} else if fip["service"] != "" {
126+
ip = ""
127+
sv := types.ServiceUpdate{
128+
FIP: &ip,
129+
}
130+
cli.client.ServiceUpdate(context.Background(), fip["service"], sv)
131+
}
132+
break
133+
}
134+
}
135+
}
94136
return cli.client.FipAttach(context.Background(), cmd.Arg(0), cmd.Arg(1))
95137
}
96138

0 commit comments

Comments
 (0)