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

Commit ed987db

Browse files
authored
Merge pull request #196 from carmark/fip
some improvements on fip
2 parents 96e0e37 + 1813756 commit ed987db

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

api/client/compose.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111

1212
"github.com/Sirupsen/logrus"
1313
"github.com/docker/engine-api/client"
14+
"github.com/docker/engine-api/types"
15+
"github.com/docker/engine-api/types/filters"
1416
Cli "github.com/hyperhq/hypercli/cli"
1517
"github.com/hyperhq/hypercli/pkg/jsonmessage"
1618
flag "github.com/hyperhq/hypercli/pkg/mflag"
@@ -21,6 +23,8 @@ import (
2123
"golang.org/x/net/context"
2224
)
2325

26+
const ComposeFipAuto = "auto"
27+
2428
// CmdCompose is the parent subcommand for all compose commands
2529
//
2630
// Usage: hyper compose <COMMAND> [OPTIONS]
@@ -152,6 +156,45 @@ func (cli *DockerCli) CmdComposeUp(args ...string) error {
152156
if *projectName == "" {
153157
*projectName = getBaseDir()
154158
}
159+
var fips = []string{}
160+
var newFipNum = 0
161+
for _, svconfig := range c.M {
162+
if svconfig.Fip == ComposeFipAuto {
163+
newFipNum++
164+
}
165+
}
166+
fipFilterArgs, _ := filters.FromParam("dangling=true")
167+
options := types.NetworkListOptions{
168+
Filters: fipFilterArgs,
169+
}
170+
fipList, err := cli.client.FipList(context.Background(), options)
171+
if err == nil {
172+
for _, fip := range fipList {
173+
if fip["container"] == "" && fip["service"] == "" {
174+
fips = append(fips, fip["fip"])
175+
}
176+
}
177+
}
178+
if newFipNum > len(fips) {
179+
if askForConfirmation(warnMessage) == true {
180+
newFips, err := cli.client.FipAllocate(context.Background(), fmt.Sprintf("%d", newFipNum-len(fips)))
181+
if err != nil {
182+
return err
183+
}
184+
fips = append(fips, newFips...)
185+
}
186+
}
187+
i := 0
188+
for _, svconfig := range c.M {
189+
if svconfig.Fip == ComposeFipAuto {
190+
if i >= newFipNum {
191+
svconfig.Fip = ""
192+
} else {
193+
svconfig.Fip = fips[i]
194+
i++
195+
}
196+
}
197+
}
155198
body, err := cli.client.ComposeUp(*projectName, services, c, vc, nc, cli.configFile.AuthConfigs, *forcerecreate, *norecreate)
156199
if err != nil {
157200
return err

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)