@@ -35,13 +35,29 @@ func (cli *DockerCli) CmdFip(args ...string) error {
3535// Usage: docker fip create [OPTIONS] COUNT
3636func (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>
88104func (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