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

Commit 7009904

Browse files
authored
Merge pull request #220 from pengisgood/key-api
Implement the key related apis
2 parents c65e6e8 + e9e769f commit 7009904

File tree

2 files changed

+200
-0
lines changed

2 files changed

+200
-0
lines changed

key.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package shell
2+
3+
import "context"
4+
5+
type Key struct {
6+
Id string
7+
Name string
8+
}
9+
10+
type KeyRenameObject struct {
11+
Id string
12+
Now string
13+
Overwrite bool
14+
Was string
15+
}
16+
17+
type keyListOutput struct {
18+
Keys []*Key
19+
}
20+
21+
type KeyOpt func(*RequestBuilder) error
22+
type keyGen struct{}
23+
24+
var KeyGen keyGen
25+
26+
func (keyGen) Type(alg string) KeyOpt {
27+
return func(rb *RequestBuilder) error {
28+
rb.Option("type", alg)
29+
return nil
30+
}
31+
}
32+
33+
func (keyGen) Size(size int) KeyOpt {
34+
return func(rb *RequestBuilder) error {
35+
rb.Option("size", size)
36+
return nil
37+
}
38+
}
39+
40+
// KeyGen Create a new keypair
41+
func (s *Shell) KeyGen(ctx context.Context, name string, options ...KeyOpt) (*Key, error) {
42+
rb := s.Request("key/gen", name)
43+
for _, opt := range options {
44+
if err := opt(rb); err != nil {
45+
return nil, err
46+
}
47+
}
48+
49+
var out Key
50+
if err := rb.Exec(ctx, &out); err != nil {
51+
return nil, err
52+
}
53+
return &out, nil
54+
}
55+
56+
// KeyList List all local keypairs
57+
func (s *Shell) KeyList(ctx context.Context) ([]*Key, error) {
58+
var out keyListOutput
59+
if err := s.Request("key/list").Exec(ctx, &out); err != nil {
60+
return nil, err
61+
}
62+
return out.Keys, nil
63+
}
64+
65+
// KeyRename Rename a keypair
66+
func (s *Shell) KeyRename(ctx context.Context, old string, new string, force bool) (*KeyRenameObject, error) {
67+
var out KeyRenameObject
68+
if err := s.Request("key/rename", old, new).
69+
Option("force", force).
70+
Exec(ctx, &out); err != nil {
71+
return nil, err
72+
}
73+
return &out, nil
74+
}
75+
76+
// KeyRm remove a keypair
77+
func (s *Shell) KeyRm(ctx context.Context, name string) ([]*Key, error) {
78+
var out keyListOutput
79+
if err := s.Request("key/rm", name).
80+
Exec(ctx, &out); err != nil {
81+
return nil, err
82+
}
83+
return out.Keys, nil
84+
}

key_test.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package shell
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/cheekybits/is"
8+
)
9+
10+
func TestKeyGen(t *testing.T) {
11+
is := is.New(t)
12+
s := NewShell(shellUrl)
13+
14+
defer func() {
15+
_, err := s.KeyRm(context.Background(), "testKey1")
16+
is.Nil(err)
17+
}()
18+
key1, err := s.KeyGen(context.Background(), "testKey1", KeyGen.Type("ed25519"))
19+
is.Nil(err)
20+
is.Equal(key1.Name, "testKey1")
21+
is.NotNil(key1.Id)
22+
23+
defer func() {
24+
_, err = s.KeyRm(context.Background(), "testKey2")
25+
is.Nil(err)
26+
}()
27+
key2, err := s.KeyGen(context.Background(), "testKey2", KeyGen.Type("ed25519"))
28+
is.Nil(err)
29+
is.Equal(key2.Name, "testKey2")
30+
is.NotNil(key2.Id)
31+
32+
defer func() {
33+
_, err = s.KeyRm(context.Background(), "testKey3")
34+
is.Nil(err)
35+
}()
36+
key3, err := s.KeyGen(context.Background(), "testKey3", KeyGen.Type("rsa"))
37+
is.Nil(err)
38+
is.Equal(key3.Name, "testKey3")
39+
is.NotNil(key3.Id)
40+
41+
defer func() {
42+
_, err = s.KeyRm(context.Background(), "testKey4")
43+
is.Nil(err)
44+
}()
45+
key4, err := s.KeyGen(context.Background(), "testKey4", KeyGen.Type("rsa"), KeyGen.Size(4096))
46+
is.Nil(err)
47+
is.Equal(key4.Name, "testKey4")
48+
is.NotNil(key4.Id)
49+
50+
_, err = s.KeyGen(context.Background(), "testKey5", KeyGen.Type("rsa"), KeyGen.Size(1024))
51+
is.NotNil(err)
52+
is.Equal(err.Error(), "key/gen: rsa keys must be >= 2048 bits to be useful")
53+
}
54+
55+
func TestKeyList(t *testing.T) {
56+
is := is.New(t)
57+
s := NewShell(shellUrl)
58+
59+
defer func() {
60+
_, err := s.KeyRm(context.Background(), "testKey")
61+
is.Nil(err)
62+
}()
63+
key, err := s.KeyGen(context.Background(), "testKey")
64+
is.Nil(err)
65+
66+
keys, err := s.KeyList(context.Background())
67+
is.Nil(err)
68+
69+
is.Equal(len(keys), 2)
70+
is.Equal(keys[0].Name, "self")
71+
is.NotNil(keys[0].Id)
72+
is.NotNil(keys[1].Id, key.Id)
73+
is.NotNil(keys[1].Name, key.Name)
74+
}
75+
76+
func TestKeyRename(t *testing.T) {
77+
is := is.New(t)
78+
s := NewShell(shellUrl)
79+
80+
key, err := s.KeyGen(context.Background(), "test1")
81+
is.Nil(err)
82+
83+
out, err := s.KeyRename(context.Background(), "test1", "test2", false)
84+
is.Nil(err)
85+
86+
is.Equal(out.Now, "test2")
87+
is.Equal(out.Was, "test1")
88+
is.Equal(out.Id, key.Id)
89+
is.False(out.Overwrite)
90+
91+
_, err = s.KeyRm(context.Background(), "test2")
92+
is.Nil(err)
93+
94+
_, err = s.KeyRename(context.Background(), "test2", "test1", false)
95+
is.NotNil(err)
96+
is.Equal(err.Error(), "key/rename: no key named test2 was found")
97+
}
98+
99+
func TestKeyRm(t *testing.T) {
100+
is := is.New(t)
101+
s := NewShell(shellUrl)
102+
103+
key, err := s.KeyGen(context.Background(), "testKey")
104+
is.Nil(err)
105+
106+
keys, err := s.KeyRm(context.Background(), "testKey")
107+
is.Nil(err)
108+
109+
is.Equal(len(keys), 1)
110+
is.Equal(keys[0].Name, key.Name)
111+
is.Equal(keys[0].Id, key.Id)
112+
113+
_, err = s.KeyRm(context.Background(), "testKey")
114+
is.NotNil(err)
115+
is.Equal(err.Error(), "key/rm: no key named testKey was found")
116+
}

0 commit comments

Comments
 (0)