Skip to content

Commit 0391c6c

Browse files
authored
feat(keys): add an optional name support for keys:add (#257)
This arg can be used interchangably with the key arg to keep backwards compatibility That allows a user to do deis keys:add ~/.ssh/secret.pub and the name is detected or keys:add magic ~/.ssh/magic.pub or deis keys:add travis and then get the choice list to pick from Closes #256
1 parent 1fb144c commit 0391c6c

5 files changed

Lines changed: 67 additions & 8 deletions

File tree

cmd/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ type Commander interface {
5151
HealthchecksUnset(string, string, []string) error
5252
KeysList(int) error
5353
KeyRemove(string) error
54-
KeyAdd(string) error
54+
KeyAdd(string, string) error
5555
LimitsList(string) error
5656
LimitsSet(string, []string, string) error
5757
LimitsUnset(string, []string, string) error

cmd/keys.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"io"
66
"io/ioutil"
7+
"os"
78
"path/filepath"
89
"strconv"
910
"strings"
@@ -63,7 +64,7 @@ func (d *DeisCmd) KeyRemove(keyID string) error {
6364
}
6465

6566
// KeyAdd adds keys.
66-
func (d *DeisCmd) KeyAdd(keyLocation string) error {
67+
func (d *DeisCmd) KeyAdd(name string, keyLocation string) error {
6768
s, err := settings.Load(d.ConfigFile)
6869

6970
if err != nil {
@@ -72,6 +73,16 @@ func (d *DeisCmd) KeyAdd(keyLocation string) error {
7273

7374
var key api.KeyCreateRequest
7475

76+
// check if name is the key
77+
if name != "" && keyLocation == "" {
78+
// detect of name is a file
79+
_, err := os.Stat(name)
80+
if err == nil {
81+
keyLocation = name
82+
name = ""
83+
}
84+
}
85+
7586
if keyLocation == "" {
7687
ks, err := listKeys(d.WOut)
7788
if err != nil {
@@ -88,6 +99,11 @@ func (d *DeisCmd) KeyAdd(keyLocation string) error {
8899
}
89100
}
90101

102+
// if name is provided by user then overwrite that in the key object
103+
if name != "" {
104+
key.ID = name
105+
}
106+
91107
d.Printf("Uploading %s to deis...", filepath.Base(key.Name))
92108

93109
if _, err = keys.New(s.Client, key.ID, key.Public); d.checkAPICompatibility(s.Client, err) != nil {

cmd/keys_test.go

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,15 +330,54 @@ func TestKeyAdd(t *testing.T) {
330330

331331
out := fmt.Sprintf("Uploading %s to deis... done\n", filepath.Base(keyFile.Name()))
332332

333-
err = cmdr.KeyAdd(keyFile.Name())
333+
err = cmdr.KeyAdd("", keyFile.Name())
334334
assert.NoErr(t, err)
335335
assert.Equal(t, testutil.StripProgress(b.String()), out, "output")
336336

337337
b.Reset()
338338
cmdr.WIn = strings.NewReader("0\n" + keyFile.Name())
339-
err = cmdr.KeyAdd("")
339+
err = cmdr.KeyAdd("", "")
340340
assert.NoErr(t, err)
341341
assert.Equal(t, testutil.StripProgress(b.String()), `Found the following SSH public keys:
342342
0) Enter path to pubfile (or use keys:add <key_path>)
343343
Which would you like to use with Deis? Enter the path to the pubkey file: `+out, "output")
344344
}
345+
346+
func TestKeyAddName(t *testing.T) {
347+
// Set temp home dir so no unknown files are listed.
348+
name, err := ioutil.TempDir("", "deis-key")
349+
assert.NoErr(t, err)
350+
settings.SetHome(name)
351+
folder := filepath.Join(name, ".ssh")
352+
err = os.Mkdir(folder, 0755)
353+
assert.NoErr(t, err)
354+
355+
cf, server, err := testutil.NewTestServerAndClient()
356+
if err != nil {
357+
t.Fatal(err)
358+
}
359+
defer server.Close()
360+
var b bytes.Buffer
361+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
362+
363+
keyFile, err := ioutil.TempFile("", "deis-cli-unit-test-ssh-key")
364+
assert.NoErr(t, err)
365+
// generate with one name but used another in the add
366+
toWrite := []byte("ssh-rsa abc test@example.com")
367+
_, err = keyFile.Write(toWrite)
368+
assert.NoErr(t, err)
369+
keyFile.Close()
370+
371+
server.Mux.HandleFunc("/v2/keys/", func(w http.ResponseWriter, r *http.Request) {
372+
testutil.SetHeaders(w)
373+
testutil.AssertBody(t, api.KeyCreateRequest{ID: "deis-test-key", Public: string(toWrite)}, r)
374+
w.WriteHeader(http.StatusCreated)
375+
fmt.Fprintf(w, "{}")
376+
})
377+
378+
out := fmt.Sprintf("Uploading %s to deis... done\n", filepath.Base(keyFile.Name()))
379+
380+
err = cmdr.KeyAdd("deis-test-key", keyFile.Name())
381+
assert.NoErr(t, err)
382+
assert.Equal(t, testutil.StripProgress(b.String()), out, "output")
383+
}

parser/keys.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,13 @@ func keyAdd(argv []string, cmdr cmd.Commander) error {
6969
usage := `
7070
Adds SSH keys for the logged in user.
7171
72-
Usage: deis keys:add [<key>]
72+
Usage: deis keys:add [<name>] [<key>]
73+
74+
<name> and <key> can be used in either order and are both optional
7375
7476
Arguments:
77+
<name>
78+
name of the SSH key
7579
<key>
7680
a local file path to an SSH public key used to push application code.
7781
`
@@ -81,7 +85,7 @@ Arguments:
8185
return err
8286
}
8387

84-
return cmdr.KeyAdd(safeGetValue(args, "<key>"))
88+
return cmdr.KeyAdd(safeGetValue(args, "<name>"), safeGetValue(args, "<key>"))
8589
}
8690

8791
func keyRemove(argv []string, cmdr cmd.Commander) error {

parser/keys_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func (d FakeDeisCmd) KeyRemove(string) error {
2020
return errors.New("keys:remove")
2121
}
2222

23-
func (d FakeDeisCmd) KeyAdd(string) error {
23+
func (d FakeDeisCmd) KeyAdd(string, string) error {
2424
return errors.New("keys:add")
2525
}
2626

@@ -46,7 +46,7 @@ func TestKeys(t *testing.T) {
4646
expected: "",
4747
},
4848
{
49-
args: []string{"keys:add", "key"},
49+
args: []string{"keys:add", "name", "key"},
5050
expected: "",
5151
},
5252
{

0 commit comments

Comments
 (0)