github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/environs/manual/winrmprovisioner/provisioner_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package winrmprovisioner_test
     5  
     6  import (
     7  	"bytes"
     8  	"fmt"
     9  	"io"
    10  
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/apiserver/params"
    15  	"github.com/juju/juju/environs/manual"
    16  	"github.com/juju/juju/environs/manual/winrmprovisioner"
    17  )
    18  
    19  type TestClientAPI struct{}
    20  
    21  func (t TestClientAPI) AddMachines(p []params.AddMachineParams) ([]params.AddMachinesResult, error) {
    22  	return make([]params.AddMachinesResult, 1, 1), nil
    23  }
    24  
    25  func (t TestClientAPI) ForceDestroyMachines(machines ...string) error {
    26  	if machines == nil {
    27  		return fmt.Errorf("epty machines")
    28  	}
    29  	return nil
    30  }
    31  
    32  func (t TestClientAPI) ProvisioningScript(param params.ProvisioningScriptParams) (script string, err error) {
    33  	return "magnifi script", nil
    34  }
    35  
    36  type provisionerSuite struct {
    37  	client *TestClientAPI
    38  }
    39  
    40  var _ = gc.Suite(&provisionerSuite{})
    41  
    42  func (s *provisionerSuite) getArgs(c *gc.C) manual.ProvisionMachineArgs {
    43  	s.client = &TestClientAPI{}
    44  
    45  	return manual.ProvisionMachineArgs{
    46  		Host:   winrmListenerAddr,
    47  		User:   "Administrator",
    48  		Client: s.client,
    49  	}
    50  }
    51  
    52  func (s *provisionerSuite) TestProvisionMachine(c *gc.C) {
    53  	var err error
    54  	args := s.getArgs(c)
    55  	var stdin, stderr, stdout bytes.Buffer
    56  	args.Stdin, args.Stdout, args.Stderr = &stdin, &stderr, &stdout
    57  
    58  	args.WinRM = manual.WinRMArgs{}
    59  	args.WinRM.Client = &fakeWinRM{
    60  		fakePing: func() error {
    61  			return nil
    62  		},
    63  		fakeRun: func(cmd string, stdout, stderr io.Writer) error {
    64  			return nil
    65  		},
    66  	}
    67  
    68  	// this should return this error
    69  	// No hardware fields on running the powershell deteciton script
    70  	machineId, err := winrmprovisioner.ProvisionMachine(args)
    71  	c.Assert(err, gc.NotNil)
    72  	c.Assert(machineId, jc.DeepEquals, "")
    73  
    74  	args.WinRM.Client = &fakeWinRM{
    75  		fakePing: func() error {
    76  			return nil
    77  		},
    78  
    79  		fakeRun: func(cmd string, stdout, stderr io.Writer) error {
    80  			c.Assert((len(cmd) > 0), gc.Equals, true)
    81  			fmt.Fprintf(stdout, "amd64\r\n")
    82  			fmt.Fprintf(stdout, "16\r\n")
    83  			fmt.Fprintf(stdout, "win2012r2\r\n")
    84  			fmt.Fprintf(stdout, "4\r\n")
    85  			return nil
    86  		},
    87  	}
    88  
    89  	machineId, err = winrmprovisioner.ProvisionMachine(args)
    90  	c.Assert(err, gc.IsNil)
    91  	c.Assert(machineId, jc.DeepEquals, "")
    92  
    93  	// this should return that the machine is already provisioned
    94  	args.WinRM.Client = &fakeWinRM{
    95  		fakePing: func() error {
    96  			return nil
    97  		},
    98  
    99  		fakeRun: func(cmd string, stdout, stderr io.Writer) error {
   100  			c.Assert((len(cmd) > 0), gc.Equals, true)
   101  			fmt.Fprintf(stdout, "Yes\r\n")
   102  			return nil
   103  		},
   104  	}
   105  	machineId, err = winrmprovisioner.ProvisionMachine(args)
   106  	c.Assert(err.Error(), jc.DeepEquals, "machine is already provisioned")
   107  	c.Assert(machineId, jc.DeepEquals, "")
   108  }