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