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  }