github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/utils/ssh/clientkeys_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package ssh_test 5 6 import ( 7 "io/ioutil" 8 "os" 9 10 gc "launchpad.net/gocheck" 11 12 "launchpad.net/juju-core/testing" 13 jc "launchpad.net/juju-core/testing/checkers" 14 "launchpad.net/juju-core/testing/testbase" 15 "launchpad.net/juju-core/utils" 16 "launchpad.net/juju-core/utils/ssh" 17 ) 18 19 type ClientKeysSuite struct { 20 testbase.LoggingSuite 21 } 22 23 var _ = gc.Suite(&ClientKeysSuite{}) 24 25 func (s *ClientKeysSuite) SetUpTest(c *gc.C) { 26 s.LoggingSuite.SetUpTest(c) 27 fakeHome := testing.MakeEmptyFakeHome(c) 28 s.AddCleanup(func(*gc.C) { fakeHome.Restore() }) 29 s.AddCleanup(func(*gc.C) { ssh.ClearClientKeys() }) 30 } 31 32 func checkFiles(c *gc.C, obtained, expected []string) { 33 var err error 34 for i, e := range expected { 35 expected[i], err = utils.NormalizePath(e) 36 c.Assert(err, gc.IsNil) 37 } 38 c.Assert(obtained, jc.SameContents, expected) 39 } 40 41 func checkPublicKeyFiles(c *gc.C, expected ...string) { 42 keys := ssh.PublicKeyFiles() 43 checkFiles(c, keys, expected) 44 } 45 46 func checkPrivateKeyFiles(c *gc.C, expected ...string) { 47 keys := ssh.PrivateKeyFiles() 48 checkFiles(c, keys, expected) 49 } 50 51 func (s *ClientKeysSuite) TestPublicKeyFiles(c *gc.C) { 52 // LoadClientKeys will create the specified directory 53 // and populate it with a key pair. 54 err := ssh.LoadClientKeys("~/.juju/ssh") 55 c.Assert(err, gc.IsNil) 56 checkPublicKeyFiles(c, "~/.juju/ssh/juju_id_rsa.pub") 57 // All files ending with .pub in the client key dir get picked up. 58 priv, pub, err := ssh.GenerateKey("whatever") 59 c.Assert(err, gc.IsNil) 60 err = ioutil.WriteFile(testing.HomePath(".juju", "ssh", "whatever.pub"), []byte(pub), 0600) 61 c.Assert(err, gc.IsNil) 62 err = ssh.LoadClientKeys("~/.juju/ssh") 63 c.Assert(err, gc.IsNil) 64 // The new public key won't be observed until the 65 // corresponding private key exists. 66 checkPublicKeyFiles(c, "~/.juju/ssh/juju_id_rsa.pub") 67 err = ioutil.WriteFile(testing.HomePath(".juju", "ssh", "whatever"), []byte(priv), 0600) 68 c.Assert(err, gc.IsNil) 69 err = ssh.LoadClientKeys("~/.juju/ssh") 70 c.Assert(err, gc.IsNil) 71 checkPublicKeyFiles(c, "~/.juju/ssh/juju_id_rsa.pub", "~/.juju/ssh/whatever.pub") 72 } 73 74 func (s *ClientKeysSuite) TestPrivateKeyFiles(c *gc.C) { 75 // Create/load client keys. They will be cached in memory: 76 // any files added to the directory will not be considered 77 // unless LoadClientKeys is called again. 78 err := ssh.LoadClientKeys("~/.juju/ssh") 79 c.Assert(err, gc.IsNil) 80 checkPrivateKeyFiles(c, "~/.juju/ssh/juju_id_rsa") 81 priv, pub, err := ssh.GenerateKey("whatever") 82 c.Assert(err, gc.IsNil) 83 err = ioutil.WriteFile(testing.HomePath(".juju", "ssh", "whatever"), []byte(priv), 0600) 84 c.Assert(err, gc.IsNil) 85 err = ssh.LoadClientKeys("~/.juju/ssh") 86 c.Assert(err, gc.IsNil) 87 // The new private key won't be observed until the 88 // corresponding public key exists. 89 checkPrivateKeyFiles(c, "~/.juju/ssh/juju_id_rsa") 90 err = ioutil.WriteFile(testing.HomePath(".juju", "ssh", "whatever.pub"), []byte(pub), 0600) 91 c.Assert(err, gc.IsNil) 92 // new keys won't be reported until we call LoadClientKeys again 93 checkPublicKeyFiles(c, "~/.juju/ssh/juju_id_rsa.pub") 94 checkPrivateKeyFiles(c, "~/.juju/ssh/juju_id_rsa") 95 err = ssh.LoadClientKeys("~/.juju/ssh") 96 c.Assert(err, gc.IsNil) 97 checkPublicKeyFiles(c, "~/.juju/ssh/juju_id_rsa.pub", "~/.juju/ssh/whatever.pub") 98 checkPrivateKeyFiles(c, "~/.juju/ssh/juju_id_rsa", "~/.juju/ssh/whatever") 99 } 100 101 func (s *ClientKeysSuite) TestLoadClientKeysDirExists(c *gc.C) { 102 err := os.MkdirAll(testing.HomePath(".juju", "ssh"), 0755) 103 c.Assert(err, gc.IsNil) 104 err = ssh.LoadClientKeys("~/.juju/ssh") 105 c.Assert(err, gc.IsNil) 106 checkPrivateKeyFiles(c, "~/.juju/ssh/juju_id_rsa") 107 }