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

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter_test
     5  
     6  import (
     7  	"github.com/juju/charm/v12"
     8  	"github.com/juju/names/v5"
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/api/agent/uniter"
    13  	basetesting "github.com/juju/juju/api/base/testing"
    14  	"github.com/juju/juju/core/life"
    15  	"github.com/juju/juju/core/relation"
    16  	"github.com/juju/juju/rpc/params"
    17  	"github.com/juju/juju/testing"
    18  )
    19  
    20  type relationSuite struct {
    21  	testing.BaseSuite
    22  }
    23  
    24  var _ = gc.Suite(&relationSuite{})
    25  
    26  func (s *relationSuite) TestRelation(c *gc.C) {
    27  	apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
    28  		c.Assert(objType, gc.Equals, "Uniter")
    29  		c.Assert(request, gc.Equals, "Relation")
    30  		c.Assert(arg, gc.DeepEquals, params.RelationUnits{
    31  			RelationUnits: []params.RelationUnit{
    32  				{Relation: "relation-wordpress.db#mysql.server", Unit: "unit-mysql-0"},
    33  			},
    34  		})
    35  		c.Assert(result, gc.FitsTypeOf, &params.RelationResults{})
    36  		*(result.(*params.RelationResults)) = params.RelationResults{
    37  			Results: []params.RelationResult{{
    38  				Life:      life.Alive,
    39  				Suspended: false,
    40  				Id:        666,
    41  				Key:       "wordpress:db mysql:server",
    42  				Endpoint: params.Endpoint{
    43  					Relation: params.CharmRelation{
    44  						Name:      "db",
    45  						Role:      "requirer",
    46  						Interface: "mysql",
    47  						Optional:  true,
    48  						Limit:     1,
    49  						Scope:     "global",
    50  					},
    51  				},
    52  				OtherApplication: "mysql",
    53  			}},
    54  		}
    55  		return nil
    56  	})
    57  	client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0"))
    58  	tag := names.NewRelationTag("wordpress:db mysql:server")
    59  	rel, err := client.Relation(tag)
    60  	c.Assert(err, jc.ErrorIsNil)
    61  	c.Assert(rel.Id(), gc.Equals, 666)
    62  	c.Assert(rel.Tag(), gc.Equals, tag)
    63  	c.Assert(rel.Life(), gc.Equals, life.Alive)
    64  	c.Assert(rel.String(), gc.Equals, tag.Id())
    65  	c.Assert(rel.OtherApplication(), gc.Equals, "mysql")
    66  	ep, err := rel.Endpoint()
    67  	c.Assert(err, jc.ErrorIsNil)
    68  	c.Assert(ep, jc.DeepEquals, &uniter.Endpoint{
    69  		charm.Relation{
    70  			Name:      "db",
    71  			Role:      "requirer",
    72  			Interface: "mysql",
    73  			Optional:  true,
    74  			Limit:     1,
    75  			Scope:     "global",
    76  		},
    77  	})
    78  }
    79  
    80  func (s *relationSuite) TestRefresh(c *gc.C) {
    81  	apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
    82  		c.Assert(objType, gc.Equals, "Uniter")
    83  		c.Assert(request, gc.Equals, "Relation")
    84  		c.Assert(arg, gc.DeepEquals, params.RelationUnits{
    85  			RelationUnits: []params.RelationUnit{
    86  				{Relation: "relation-wordpress.db#mysql.server", Unit: "unit-mysql-0"},
    87  			},
    88  		})
    89  		c.Assert(result, gc.FitsTypeOf, &params.RelationResults{})
    90  		*(result.(*params.RelationResults)) = params.RelationResults{
    91  			Results: []params.RelationResult{{
    92  				Life:      life.Dying,
    93  				Suspended: true,
    94  			}},
    95  		}
    96  		return nil
    97  	})
    98  
    99  	client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0"))
   100  	tag := names.NewRelationTag("wordpress:db mysql:server")
   101  	rel := uniter.CreateRelation(client, tag)
   102  	err := rel.Refresh()
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	c.Assert(rel.Life(), gc.Equals, life.Dying)
   105  	c.Assert(rel.Suspended(), jc.IsTrue)
   106  }
   107  
   108  func (s *relationSuite) TestSuspended(c *gc.C) {
   109  	apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   110  		return nil
   111  	})
   112  	client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0"))
   113  	tag := names.NewRelationTag("wordpress:db mysql:server")
   114  	rel := uniter.CreateRelation(client, tag)
   115  	c.Assert(rel.Suspended(), jc.IsFalse)
   116  	rel.UpdateSuspended(true)
   117  	c.Assert(rel.Suspended(), jc.IsTrue)
   118  }
   119  
   120  func (s *relationSuite) TestSetStatus(c *gc.C) {
   121  	statusSet := false
   122  	apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   123  		c.Assert(objType, gc.Equals, "Uniter")
   124  		c.Assert(request, gc.Equals, "SetRelationStatus")
   125  		c.Assert(arg, gc.DeepEquals, params.RelationStatusArgs{
   126  			Args: []params.RelationStatusArg{{
   127  				UnitTag:    "unit-mysql-0",
   128  				RelationId: 666,
   129  				Status:     params.Suspended,
   130  			}},
   131  		})
   132  		c.Assert(result, gc.FitsTypeOf, &params.ErrorResults{})
   133  		*(result.(*params.ErrorResults)) = params.ErrorResults{
   134  			Results: []params.ErrorResult{{}},
   135  		}
   136  		statusSet = true
   137  		return nil
   138  	})
   139  	client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0"))
   140  	tag := names.NewRelationTag("wordpress:db mysql:server")
   141  	rel := uniter.CreateRelation(client, tag)
   142  	err := rel.SetStatus(relation.Suspended)
   143  	c.Assert(err, jc.ErrorIsNil)
   144  	c.Assert(statusSet, jc.IsTrue)
   145  }
   146  
   147  func (s *relationSuite) TestRelationById(c *gc.C) {
   148  	apiCaller := basetesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   149  		c.Assert(objType, gc.Equals, "Uniter")
   150  		c.Assert(request, gc.Equals, "RelationById")
   151  		c.Assert(arg, gc.DeepEquals, params.RelationIds{RelationIds: []int{666}})
   152  		c.Assert(result, gc.FitsTypeOf, &params.RelationResults{})
   153  		*(result.(*params.RelationResults)) = params.RelationResults{
   154  			Results: []params.RelationResult{{
   155  				Id:        666,
   156  				Life:      life.Alive,
   157  				Suspended: true,
   158  				Key:       "wordpress:db mysql:server",
   159  			}},
   160  		}
   161  		return nil
   162  	})
   163  	client := uniter.NewState(apiCaller, names.NewUnitTag("mysql/0"))
   164  
   165  	rel, err := client.RelationById(666)
   166  	c.Assert(rel.Id(), gc.Equals, 666)
   167  	c.Assert(rel.Tag(), gc.Equals, names.NewRelationTag("wordpress:db mysql:server"))
   168  	c.Assert(rel.Life(), gc.Equals, life.Alive)
   169  	c.Assert(rel.Suspended(), jc.IsTrue)
   170  	c.Assert(rel.String(), gc.Equals, "wordpress:db mysql:server")
   171  	c.Assert(err, jc.ErrorIsNil)
   172  }