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  }