github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/api/agent/caasapplication/client_test.go (about)

     1  // Copyright 2020 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasapplication_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names/v5"
     9  	"github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/api/agent/caasapplication"
    14  	basetesting "github.com/juju/juju/api/base/testing"
    15  	"github.com/juju/juju/rpc/params"
    16  )
    17  
    18  type provisionerSuite struct {
    19  	testing.IsolationSuite
    20  }
    21  
    22  var _ = gc.Suite(&provisionerSuite{})
    23  
    24  func newClient(f basetesting.APICallerFunc) *caasapplication.Client {
    25  	return caasapplication.NewClient(basetesting.BestVersionCaller{f, 1})
    26  }
    27  
    28  func (s *provisionerSuite) TestUnitIntroduction(c *gc.C) {
    29  	var called bool
    30  	client := newClient(func(objType string, version int, id, request string, a, result interface{}) error {
    31  		called = true
    32  		c.Assert(objType, gc.Equals, "CAASApplication")
    33  		c.Assert(id, gc.Equals, "")
    34  		c.Assert(request, gc.Equals, "UnitIntroduction")
    35  		c.Assert(a, gc.FitsTypeOf, params.CAASUnitIntroductionArgs{})
    36  		args := a.(params.CAASUnitIntroductionArgs)
    37  		c.Assert(args.PodName, gc.Equals, "pod-name")
    38  		c.Assert(args.PodUUID, gc.Equals, "pod-uuid")
    39  		c.Assert(result, gc.FitsTypeOf, &params.CAASUnitIntroductionResult{})
    40  		*(result.(*params.CAASUnitIntroductionResult)) = params.CAASUnitIntroductionResult{
    41  			Result: &params.CAASUnitIntroduction{
    42  				AgentConf: []byte("config data"),
    43  				UnitName:  "app/0",
    44  			},
    45  		}
    46  		return nil
    47  	})
    48  	unitConfig, err := client.UnitIntroduction("pod-name", "pod-uuid")
    49  	c.Assert(err, jc.ErrorIsNil)
    50  	c.Assert(called, jc.IsTrue)
    51  	c.Assert(unitConfig, gc.NotNil)
    52  	c.Assert(unitConfig.UnitTag.String(), gc.Equals, "unit-app-0")
    53  	c.Assert(unitConfig.AgentConf, jc.SameContents, []byte("config data"))
    54  }
    55  
    56  func (s *provisionerSuite) TestUnitIntroductionFail(c *gc.C) {
    57  	var called bool
    58  	client := newClient(func(objType string, version int, id, request string, a, result interface{}) error {
    59  		called = true
    60  		c.Assert(objType, gc.Equals, "CAASApplication")
    61  		c.Assert(id, gc.Equals, "")
    62  		c.Assert(request, gc.Equals, "UnitIntroduction")
    63  		c.Assert(a, gc.FitsTypeOf, params.CAASUnitIntroductionArgs{})
    64  		args := a.(params.CAASUnitIntroductionArgs)
    65  		c.Assert(args.PodName, gc.Equals, "pod-name")
    66  		c.Assert(args.PodUUID, gc.Equals, "pod-uuid")
    67  		c.Assert(result, gc.FitsTypeOf, &params.CAASUnitIntroductionResult{})
    68  		*(result.(*params.CAASUnitIntroductionResult)) = params.CAASUnitIntroductionResult{
    69  			Error: &params.Error{Message: "FAIL"},
    70  		}
    71  		return nil
    72  	})
    73  	_, err := client.UnitIntroduction("pod-name", "pod-uuid")
    74  	c.Assert(err, gc.ErrorMatches, "FAIL")
    75  	c.Assert(called, jc.IsTrue)
    76  }
    77  
    78  func (s *provisionerSuite) TestUnitIntroductionFailAlreadyExists(c *gc.C) {
    79  	var called bool
    80  	client := newClient(func(objType string, version int, id, request string, a, result interface{}) error {
    81  		called = true
    82  		c.Assert(objType, gc.Equals, "CAASApplication")
    83  		c.Assert(id, gc.Equals, "")
    84  		c.Assert(request, gc.Equals, "UnitIntroduction")
    85  		c.Assert(a, gc.FitsTypeOf, params.CAASUnitIntroductionArgs{})
    86  		args := a.(params.CAASUnitIntroductionArgs)
    87  		c.Assert(args.PodName, gc.Equals, "pod-name")
    88  		c.Assert(args.PodUUID, gc.Equals, "pod-uuid")
    89  		c.Assert(result, gc.FitsTypeOf, &params.CAASUnitIntroductionResult{})
    90  		*(result.(*params.CAASUnitIntroductionResult)) = params.CAASUnitIntroductionResult{
    91  			Error: &params.Error{Code: params.CodeAlreadyExists},
    92  		}
    93  		return nil
    94  	})
    95  	_, err := client.UnitIntroduction("pod-name", "pod-uuid")
    96  	c.Assert(errors.Is(err, errors.AlreadyExists), jc.IsTrue)
    97  	c.Assert(called, jc.IsTrue)
    98  }
    99  
   100  func (s *provisionerSuite) TestUnitIntroductionFailNotAssigned(c *gc.C) {
   101  	var called bool
   102  	client := newClient(func(objType string, version int, id, request string, a, result interface{}) error {
   103  		called = true
   104  		c.Assert(objType, gc.Equals, "CAASApplication")
   105  		c.Assert(id, gc.Equals, "")
   106  		c.Assert(request, gc.Equals, "UnitIntroduction")
   107  		c.Assert(a, gc.FitsTypeOf, params.CAASUnitIntroductionArgs{})
   108  		args := a.(params.CAASUnitIntroductionArgs)
   109  		c.Assert(args.PodName, gc.Equals, "pod-name")
   110  		c.Assert(args.PodUUID, gc.Equals, "pod-uuid")
   111  		c.Assert(result, gc.FitsTypeOf, &params.CAASUnitIntroductionResult{})
   112  		*(result.(*params.CAASUnitIntroductionResult)) = params.CAASUnitIntroductionResult{
   113  			Error: &params.Error{Code: params.CodeNotAssigned},
   114  		}
   115  		return nil
   116  	})
   117  	_, err := client.UnitIntroduction("pod-name", "pod-uuid")
   118  	c.Assert(errors.Is(err, errors.NotAssigned), jc.IsTrue)
   119  	c.Assert(called, jc.IsTrue)
   120  }
   121  
   122  func (s *provisionerSuite) TestUnitTerminating(c *gc.C) {
   123  	tests := []struct {
   124  		willRestart bool
   125  		err         error
   126  	}{
   127  		{false, nil},
   128  		{true, nil},
   129  		{false, errors.New("oops")},
   130  	}
   131  	for _, test := range tests {
   132  		var called bool
   133  		client := newClient(func(objType string, version int, id, request string, a, result interface{}) error {
   134  			called = true
   135  			c.Assert(objType, gc.Equals, "CAASApplication")
   136  			c.Assert(id, gc.Equals, "")
   137  			c.Assert(request, gc.Equals, "UnitTerminating")
   138  			c.Assert(a, gc.FitsTypeOf, params.Entity{})
   139  			args := a.(params.Entity)
   140  			c.Assert(args.Tag, gc.Equals, "unit-app-0")
   141  			c.Assert(result, gc.FitsTypeOf, &params.CAASUnitTerminationResult{})
   142  			var err *params.Error
   143  			if test.err != nil {
   144  				err = &params.Error{Message: test.err.Error()}
   145  			}
   146  			*(result.(*params.CAASUnitTerminationResult)) = params.CAASUnitTerminationResult{
   147  				WillRestart: test.willRestart,
   148  				Error:       err,
   149  			}
   150  			return nil
   151  		})
   152  		unitTermination, err := client.UnitTerminating(names.NewUnitTag("app/0"))
   153  		if test.err == nil {
   154  			c.Assert(err, jc.ErrorIsNil)
   155  		} else {
   156  			c.Assert(err, gc.ErrorMatches, test.err.Error())
   157  		}
   158  		c.Assert(called, jc.IsTrue)
   159  		c.Assert(unitTermination, gc.DeepEquals, caasapplication.UnitTermination{WillRestart: test.willRestart})
   160  	}
   161  }