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

Commit 8c33a57

Browse files
committed
Merge branch 'master' into integration-test
2 parents e810e99 + 302a6b5 commit 8c33a57

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+14754
-214
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.10.0
1+
1.10.2

api/client/compose.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,15 @@ func (cli *DockerCli) CmdComposeUp(args ...string) error {
152152
if *projectName == "" {
153153
*projectName = getBaseDir()
154154
}
155-
body, err := cli.client.ComposeUp(*projectName, services, c, vc, nc, *forcerecreate, *norecreate)
155+
body, err := cli.client.ComposeUp(*projectName, services, c, vc, nc, cli.configFile.AuthConfigs, *forcerecreate, *norecreate)
156156
if err != nil {
157157
return err
158158
}
159159
defer body.Close()
160-
jsonmessage.DisplayJSONMessagesStream(body, cli.out, cli.outFd, cli.isTerminalOut, nil)
160+
err = jsonmessage.DisplayJSONMessagesStream(body, cli.out, cli.outFd, cli.isTerminalOut, nil)
161+
if err != nil {
162+
return err
163+
}
161164
if !*detach {
162165
signalChan := make(chan os.Signal, 1)
163166
cleanupDone := make(chan bool)
@@ -266,7 +269,7 @@ func (cli *DockerCli) CmdComposeCreate(args ...string) error {
266269
if *projectName == "" {
267270
*projectName = getBaseDir()
268271
}
269-
body, err := cli.client.ComposeCreate(*projectName, services, c, vc, nc, *forcerecreate, *norecreate)
272+
body, err := cli.client.ComposeCreate(*projectName, services, c, vc, nc, cli.configFile.AuthConfigs, *forcerecreate, *norecreate)
270273
if err != nil {
271274
return err
272275
}

api/client/create.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"io"
66
"os"
7+
"strings"
78

89
"golang.org/x/net/context"
910

@@ -72,8 +73,36 @@ func newCIDFile(path string) (*cidFile, error) {
7273
return &cidFile{path: path, file: f}, nil
7374
}
7475

76+
func parseProtoAndLocalBind(bind string) (string, string, bool) {
77+
switch {
78+
case strings.HasPrefix(bind, "git://"):
79+
fallthrough
80+
case strings.HasPrefix(bind, "http://"):
81+
fallthrough
82+
case strings.HasPrefix(bind, "https://"):
83+
if strings.Count(bind, ":") < 2 {
84+
return "", "", false
85+
}
86+
case strings.HasPrefix(bind, "/"):
87+
if strings.Count(bind, ":") < 1 {
88+
return "", "", false
89+
}
90+
default:
91+
return "", "", false
92+
}
93+
94+
pos := strings.LastIndex(bind, ":")
95+
if pos < 0 || pos >= len(bind)-1 {
96+
return "", "", false
97+
}
98+
99+
return bind[:pos], bind[pos+1:], true
100+
}
101+
75102
func (cli *DockerCli) createContainer(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *networktypes.NetworkingConfig, cidfile, name string) (*types.ContainerCreateResponse, error) {
76103
var containerIDFile *cidFile
104+
var initvols, volumeList []string
105+
77106
if cidfile != "" {
78107
var err error
79108
if containerIDFile, err = newCIDFile(cidfile); err != nil {
@@ -82,6 +111,37 @@ func (cli *DockerCli) createContainer(ctx context.Context, config *container.Con
82111
defer containerIDFile.Close()
83112
}
84113

114+
// Check/create protocol and local volume
115+
defer func() {
116+
for _, vol := range volumeList {
117+
cli.client.VolumeRemove(ctx, vol)
118+
}
119+
}()
120+
for idx, bind := range hostConfig.Binds {
121+
if source, dest, ok := parseProtoAndLocalBind(bind); ok {
122+
volReq := types.VolumeCreateRequest{
123+
Driver: "hyper",
124+
Labels: map[string]string{
125+
"autoremove": "true",
126+
}}
127+
if vol, err := cli.client.VolumeCreate(ctx, volReq); err != nil {
128+
return nil, err
129+
} else {
130+
initvols = append(initvols, source+":"+vol.Name)
131+
volumeList = append(volumeList, vol.Name)
132+
hostConfig.Binds[idx] = vol.Name + ":" + dest
133+
}
134+
}
135+
}
136+
137+
// initialize special volumes
138+
if len(initvols) > 0 {
139+
err := cli.initVolumes(initvols, false)
140+
if err != nil {
141+
return nil, err
142+
}
143+
}
144+
85145
ref, err := reference.ParseNamed(config.Image)
86146
if err != nil {
87147
return nil, err
@@ -126,6 +186,7 @@ func (cli *DockerCli) createContainer(ctx context.Context, config *container.Con
126186
return nil, err
127187
}
128188
}
189+
volumeList = nil
129190

130191
for _, warning := range response.Warnings {
131192
fmt.Fprintf(cli.err, "WARNING: %s\n", warning)

api/client/run.go

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -69,32 +69,6 @@ func runStartContainerErr(err error) error {
6969
return statusError
7070
}
7171

72-
func parseProtoAndLocalBind(bind string) (string, string, bool) {
73-
switch {
74-
case strings.HasPrefix(bind, "git://"):
75-
fallthrough
76-
case strings.HasPrefix(bind, "http://"):
77-
fallthrough
78-
case strings.HasPrefix(bind, "https://"):
79-
if strings.Count(bind, ":") < 2 {
80-
return "", "", false
81-
}
82-
case strings.HasPrefix(bind, "/"):
83-
if strings.Count(bind, ":") < 1 {
84-
return "", "", false
85-
}
86-
default:
87-
return "", "", false
88-
}
89-
90-
pos := strings.LastIndex(bind, ":")
91-
if pos < 0 || pos >= len(bind)-1 {
92-
return "", "", false
93-
}
94-
95-
return bind[:pos], bind[pos+1:], true
96-
}
97-
9872
// CmdRun runs a command in a new container.
9973
//
10074
// Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
@@ -114,8 +88,6 @@ func (cli *DockerCli) CmdRun(args ...string) error {
11488
ErrConflictAttachDetach = fmt.Errorf("Conflicting options: -a and -d")
11589
ErrConflictRestartPolicyAndAutoRemove = fmt.Errorf("Conflicting options: --restart and --rm")
11690
ErrConflictDetachAutoRemove = fmt.Errorf("Conflicting options: --rm and -d")
117-
118-
initvols, volumeList []string
11991
)
12092

12193
config, hostConfig, networkingConfig, cmd, err := runconfigopts.Parse(cmd, args)
@@ -184,45 +156,11 @@ func (cli *DockerCli) CmdRun(args ...string) error {
184156

185157
ctx := context.Background()
186158

187-
// Check/create protocol and local volume
188-
defer func() {
189-
for _, vol := range volumeList {
190-
cli.client.VolumeRemove(ctx, vol)
191-
}
192-
}()
193-
for idx, bind := range hostConfig.Binds {
194-
if source, dest, ok := parseProtoAndLocalBind(bind); ok {
195-
volReq := types.VolumeCreateRequest{
196-
Driver: "hyper",
197-
Labels: map[string]string{
198-
"autoremove": "true",
199-
}}
200-
if vol, err := cli.client.VolumeCreate(ctx, volReq); err != nil {
201-
cmd.ReportError(err.Error(), true)
202-
return runStartContainerErr(err)
203-
} else {
204-
initvols = append(initvols, source+":"+vol.Name)
205-
volumeList = append(volumeList, vol.Name)
206-
hostConfig.Binds[idx] = vol.Name + ":" + dest
207-
}
208-
}
209-
}
210-
211-
// initialize special volumes
212-
if len(initvols) > 0 {
213-
err := cli.initVolumes(initvols, false)
214-
if err != nil {
215-
cmd.ReportError(err.Error(), true)
216-
return runStartContainerErr(err)
217-
}
218-
}
219-
220159
createResponse, err := cli.createContainer(ctx, config, hostConfig, networkingConfig, hostConfig.ContainerIDFile, *flName)
221160
if err != nil {
222161
cmd.ReportError(err.Error(), true)
223162
return runStartContainerErr(err)
224163
}
225-
volumeList = nil
226164

227165
if sigProxy {
228166
sigc := cli.forwardAllSignals(ctx, createResponse.ID)

api/client/sg.go

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package client
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"os"
7+
"text/tabwriter"
8+
9+
Cli "github.com/hyperhq/hypercli/cli"
10+
flag "github.com/hyperhq/hypercli/pkg/mflag"
11+
"golang.org/x/net/context"
12+
"gopkg.in/yaml.v2"
13+
)
14+
15+
// CmdSg is the parent subcommand for all sg commands
16+
//
17+
// Usage: hyper sg <COMMAND> [OPTIONS]
18+
func (cli *DockerCli) CmdSg(args ...string) error {
19+
cmd := Cli.Subcmd("sg", []string{"COMMAND [OPTIONS]"}, sgUsage(), false)
20+
cmd.Require(flag.Min, 1)
21+
err := cmd.ParseFlags(args, true)
22+
cmd.Usage()
23+
return err
24+
}
25+
26+
// CmdSgCreate creates a new sg with a given name
27+
//
28+
// Usage: hyper sg create [OPTIONS] NAME
29+
func (cli *DockerCli) CmdSgCreate(args ...string) error {
30+
cmd := Cli.Subcmd("sg create", []string{"NAME"}, "Create a new security group", false)
31+
file := cmd.String([]string{"f", "-file"}, "", "Yaml file to create security group")
32+
33+
cmd.Require(flag.Exact, 1)
34+
err := cmd.ParseFlags(args, true)
35+
if err != nil {
36+
return err
37+
}
38+
data, err := os.Open(*file)
39+
if err != nil {
40+
return err
41+
}
42+
43+
err = cli.client.SgCreate(context.Background(), cmd.Arg(0), data)
44+
if err != nil {
45+
return err
46+
}
47+
return nil
48+
}
49+
50+
// CmdSgRm removes a sg with a given name
51+
//
52+
// Usage: hyper sg rm [OPTIONS] NAME
53+
func (cli *DockerCli) CmdSgRm(args ...string) error {
54+
cmd := Cli.Subcmd("sg rm", []string{"NAME"}, "Remove a security group", false)
55+
56+
cmd.Require(flag.Exact, 1)
57+
err := cmd.ParseFlags(args, true)
58+
if err != nil {
59+
return err
60+
}
61+
62+
err = cli.client.SgRm(context.Background(), cmd.Arg(0))
63+
if err != nil {
64+
return err
65+
}
66+
return nil
67+
}
68+
69+
// CmdSgLs list security groups
70+
//
71+
// Usage: hyper sg ls [OPTIONS]
72+
func (cli *DockerCli) CmdSgLs(args ...string) error {
73+
cmd := Cli.Subcmd("sg ls", []string{}, "List security groups", false)
74+
75+
cmd.Require(flag.Exact, 0)
76+
err := cmd.ParseFlags(args, true)
77+
if err != nil {
78+
return err
79+
}
80+
81+
sgs, err := cli.client.SgLs(context.Background())
82+
if err != nil {
83+
return err
84+
}
85+
86+
w := tabwriter.NewWriter(cli.out, 20, 1, 3, ' ', 0)
87+
fmt.Fprintf(w, "Name\tDescription")
88+
fmt.Fprintf(w, "\n")
89+
for _, sg := range sgs {
90+
fmt.Fprintf(w, "%s\t%s\n", sg.GroupName, sg.Description)
91+
}
92+
w.Flush()
93+
return nil
94+
}
95+
96+
// CmdSgInspect Inspect security groups
97+
//
98+
// Usage: hyper sg inspect [OPTIONS] NAME
99+
func (cli *DockerCli) CmdSgInspect(args ...string) error {
100+
cmd := Cli.Subcmd("sg inspect", []string{"NAME"}, "Inspect the security group", false)
101+
output := cmd.String([]string{"o", "-output"}, "json", "Output format with inspect operation (e.g. yaml or json)")
102+
103+
cmd.Require(flag.Exact, 1)
104+
err := cmd.ParseFlags(args, true)
105+
if err != nil {
106+
return err
107+
}
108+
109+
sg, err := cli.client.SgInspect(context.Background(), cmd.Arg(0))
110+
if err != nil {
111+
return err
112+
}
113+
var data []byte
114+
if *output == "json" {
115+
data, err = json.MarshalIndent(sg, "", "\t")
116+
} else {
117+
data, err = yaml.Marshal(sg)
118+
}
119+
if err != nil {
120+
return err
121+
}
122+
fmt.Printf("%s\n", string(data))
123+
return nil
124+
}
125+
126+
// CmdSgUpdate Update the security group
127+
//
128+
// Usage: hyper sg update [OPTIONS] NAME
129+
func (cli *DockerCli) CmdSgUpdate(args ...string) error {
130+
cmd := Cli.Subcmd("sg update", []string{"NAME"}, "Update the security group", false)
131+
file := cmd.String([]string{"f", "-file"}, "", "Yaml file to update security group")
132+
133+
cmd.Require(flag.Exact, 1)
134+
err := cmd.ParseFlags(args, true)
135+
if err != nil {
136+
return err
137+
}
138+
data, err := os.Open(*file)
139+
if err != nil {
140+
return err
141+
}
142+
143+
err = cli.client.SgUpdate(context.Background(), cmd.Arg(0), data)
144+
if err != nil {
145+
return err
146+
}
147+
return nil
148+
}
149+
150+
func sgUsage() string {
151+
sgCommands := [][]string{
152+
{"create", "Create a new security group"},
153+
{"ls", "List all security groups"},
154+
{"rm", "Remove a security group"},
155+
{"inspect", "Inspect the security group"},
156+
{"update", "Update the security group"},
157+
}
158+
159+
help := "Commands:\n"
160+
161+
for _, cmd := range sgCommands {
162+
help += fmt.Sprintf(" %-25.25s%s\n", cmd[0], cmd[1])
163+
}
164+
165+
help += fmt.Sprintf("\nRun 'hyper sg COMMAND --help' for more information on a command.")
166+
return help
167+
}

0 commit comments

Comments
 (0)