github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/hostkeyreporter/worker_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package hostkeyreporter_test 5 6 import ( 7 "fmt" 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 12 "github.com/juju/errors" 13 jujutesting "github.com/juju/testing" 14 jc "github.com/juju/testing/checkers" 15 gc "gopkg.in/check.v1" 16 17 "github.com/juju/juju/worker/dependency" 18 "github.com/juju/juju/worker/hostkeyreporter" 19 "github.com/juju/juju/worker/workertest" 20 ) 21 22 type Suite struct { 23 jujutesting.IsolationSuite 24 25 dir string 26 stub *jujutesting.Stub 27 facade *stubFacade 28 config hostkeyreporter.Config 29 } 30 31 var _ = gc.Suite(&Suite{}) 32 33 func (s *Suite) SetUpTest(c *gc.C) { 34 s.IsolationSuite.SetUpTest(c) 35 36 // Generate some dummy key files 37 s.dir = c.MkDir() 38 sshDir := filepath.Join(s.dir, "etc", "ssh") 39 err := os.MkdirAll(sshDir, 0755) 40 c.Assert(err, jc.ErrorIsNil) 41 writeKey := func(keyType string) { 42 baseName := fmt.Sprintf("ssh_host_%s_key.pub", keyType) 43 fileName := filepath.Join(sshDir, baseName) 44 err := ioutil.WriteFile(fileName, []byte(keyType), 0644) 45 c.Assert(err, jc.ErrorIsNil) 46 } 47 writeKey("dsa") 48 writeKey("rsa") 49 writeKey("ecdsa") 50 51 s.stub = new(jujutesting.Stub) 52 s.facade = newStubFacade(s.stub) 53 s.config = hostkeyreporter.Config{ 54 Facade: s.facade, 55 MachineId: "42", 56 RootDir: s.dir, 57 } 58 } 59 60 func (s *Suite) TestInvalidConfig(c *gc.C) { 61 s.config.MachineId = "" 62 _, err := hostkeyreporter.New(s.config) 63 c.Check(err, gc.ErrorMatches, "empty MachineId .+") 64 c.Check(s.stub.Calls(), gc.HasLen, 0) 65 } 66 67 func (s *Suite) TestNoSSHDir(c *gc.C) { 68 // No /etc/ssh at all 69 s.config.RootDir = c.MkDir() 70 71 w, err := hostkeyreporter.New(s.config) 72 c.Assert(err, jc.ErrorIsNil) 73 err = workertest.CheckKilled(c, w) 74 c.Check(errors.Cause(err), gc.Equals, dependency.ErrUninstall) 75 } 76 77 func (s *Suite) TestNoKeys(c *gc.C) { 78 // Pass an empty /etc/ssh 79 dir := c.MkDir() 80 c.Assert(os.MkdirAll(filepath.Join(dir, "etc", "ssh"), 0777), jc.ErrorIsNil) 81 s.config.RootDir = dir 82 83 w, err := hostkeyreporter.New(s.config) 84 c.Assert(err, jc.ErrorIsNil) 85 err = workertest.CheckKilled(c, w) 86 c.Check(err, gc.ErrorMatches, "no SSH host keys found") 87 } 88 89 func (s *Suite) TestReportKeysError(c *gc.C) { 90 s.facade.reportErr = errors.New("blam") 91 w, err := hostkeyreporter.New(s.config) 92 c.Assert(err, jc.ErrorIsNil) 93 err = workertest.CheckKilled(c, w) 94 c.Check(err, gc.ErrorMatches, "blam") 95 } 96 97 func (s *Suite) TestSuccess(c *gc.C) { 98 w, err := hostkeyreporter.New(s.config) 99 c.Assert(err, jc.ErrorIsNil) 100 err = workertest.CheckKilled(c, w) 101 c.Check(err, gc.Equals, dependency.ErrUninstall) 102 s.stub.CheckCalls(c, []jujutesting.StubCall{{ 103 "ReportKeys", []interface{}{"42", []string{"dsa", "ecdsa", "rsa"}}, 104 }}) 105 } 106 107 func newStubFacade(stub *jujutesting.Stub) *stubFacade { 108 return &stubFacade{ 109 stub: stub, 110 } 111 } 112 113 type stubFacade struct { 114 stub *jujutesting.Stub 115 reportErr error 116 } 117 118 func (c *stubFacade) ReportKeys(machineId string, publicKeys []string) error { 119 c.stub.AddCall("ReportKeys", machineId, publicKeys) 120 return c.reportErr 121 }