github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/controller/firewaller/firewaller_unit_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package firewaller_test
     5  
     6  import (
     7  	"github.com/juju/testing"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  	"gopkg.in/juju/names.v2"
    11  
    12  	apitesting "github.com/juju/juju/api/testing"
    13  	"github.com/juju/juju/apiserver/common"
    14  	"github.com/juju/juju/apiserver/facades/controller/firewaller"
    15  	"github.com/juju/juju/apiserver/params"
    16  	apiservertesting "github.com/juju/juju/apiserver/testing"
    17  	"github.com/juju/juju/core/crossmodel"
    18  	"github.com/juju/juju/core/status"
    19  	"github.com/juju/juju/state"
    20  	coretesting "github.com/juju/juju/testing"
    21  )
    22  
    23  var _ = gc.Suite(&RemoteFirewallerSuite{})
    24  
    25  type RemoteFirewallerSuite struct {
    26  	coretesting.BaseSuite
    27  
    28  	resources  *common.Resources
    29  	authorizer *apiservertesting.FakeAuthorizer
    30  	st         *mockState
    31  	api        *firewaller.FirewallerAPIV4
    32  }
    33  
    34  func (s *RemoteFirewallerSuite) SetUpTest(c *gc.C) {
    35  	s.BaseSuite.SetUpTest(c)
    36  
    37  	s.resources = common.NewResources()
    38  	s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() })
    39  
    40  	s.authorizer = &apiservertesting.FakeAuthorizer{
    41  		Tag:        names.NewMachineTag("0"),
    42  		Controller: true,
    43  	}
    44  
    45  	s.st = newMockState(coretesting.ModelTag.Id())
    46  	api, err := firewaller.NewFirewallerAPI(s.st, s.resources, s.authorizer, &mockCloudSpecAPI{})
    47  	c.Assert(err, jc.ErrorIsNil)
    48  	s.api = &firewaller.FirewallerAPIV4{FirewallerAPIV3: api, ControllerConfigAPI: common.NewControllerConfig(s.st)}
    49  }
    50  
    51  func (s *RemoteFirewallerSuite) TestWatchIngressAddressesForRelations(c *gc.C) {
    52  	db2Relation := newMockRelation(123)
    53  	s.st.relations["remote-db2:db django:db"] = db2Relation
    54  
    55  	result, err := s.api.WatchIngressAddressesForRelations(
    56  		params.Entities{Entities: []params.Entity{{
    57  			Tag: names.NewRelationTag("remote-db2:db django:db").String(),
    58  		}}})
    59  	c.Assert(err, jc.ErrorIsNil)
    60  	c.Assert(result.Results, gc.HasLen, 1)
    61  	c.Assert(result.Results[0].Changes, jc.SameContents, []string{"1.2.3.4/32"})
    62  	c.Assert(result.Results[0].Error, gc.IsNil)
    63  	c.Assert(result.Results[0].StringsWatcherId, gc.Equals, "1")
    64  
    65  	resource := s.resources.Get("1")
    66  	c.Assert(resource, gc.NotNil)
    67  	c.Assert(resource, gc.Implements, new(state.StringsWatcher))
    68  
    69  	s.st.CheckCalls(c, []testing.StubCall{
    70  		{"KeyRelation", []interface{}{"remote-db2:db django:db"}},
    71  	})
    72  }
    73  
    74  func (s *RemoteFirewallerSuite) TestControllerAPIInfoForModels(c *gc.C) {
    75  	controllerInfo := &mockControllerInfo{
    76  		uuid: "some uuid",
    77  		info: crossmodel.ControllerInfo{
    78  			Addrs:  []string{"1.2.3.4/32"},
    79  			CACert: coretesting.CACert,
    80  		},
    81  	}
    82  	s.st.controllerInfo[coretesting.ModelTag.Id()] = controllerInfo
    83  	result, err := s.api.ControllerAPIInfoForModels(
    84  		params.Entities{Entities: []params.Entity{{
    85  			Tag: coretesting.ModelTag.String(),
    86  		}}})
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	c.Assert(result.Results, gc.HasLen, 1)
    89  	c.Assert(result.Results[0].Addresses, jc.SameContents, []string{"1.2.3.4/32"})
    90  	c.Assert(result.Results[0].Error, gc.IsNil)
    91  	c.Assert(result.Results[0].CACert, gc.Equals, coretesting.CACert)
    92  }
    93  
    94  func (s *RemoteFirewallerSuite) TestMacaroonForRelations(c *gc.C) {
    95  	mac, err := apitesting.NewMacaroon("apimac")
    96  	c.Assert(err, jc.ErrorIsNil)
    97  	entity := names.NewRelationTag("mysql:db wordpress:db")
    98  	s.st.macaroons[entity] = mac
    99  	result, err := s.api.MacaroonForRelations(
   100  		params.Entities{Entities: []params.Entity{{
   101  			Tag: entity.String(),
   102  		}}})
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	c.Assert(result.Results, gc.HasLen, 1)
   105  	c.Assert(result.Results[0].Error, gc.IsNil)
   106  	c.Assert(result.Results[0].Result, jc.DeepEquals, mac)
   107  }
   108  
   109  func (s *RemoteFirewallerSuite) TestSetRelationStatus(c *gc.C) {
   110  	db2Relation := newMockRelation(123)
   111  	s.st.relations["remote-db2:db django:db"] = db2Relation
   112  	entity := names.NewRelationTag("remote-db2:db django:db")
   113  	result, err := s.api.SetRelationsStatus(
   114  		params.SetStatus{Entities: []params.EntityStatusArgs{{
   115  			Tag:    entity.String(),
   116  			Status: "suspended",
   117  			Info:   "a message",
   118  		}}})
   119  	c.Assert(err, jc.ErrorIsNil)
   120  	c.Assert(result.Results, gc.HasLen, 1)
   121  	c.Assert(result.Results[0].Error, gc.IsNil)
   122  	c.Assert(db2Relation.status, jc.DeepEquals, status.StatusInfo{Status: status.Suspended, Message: "a message"})
   123  }
   124  
   125  func (s *RemoteFirewallerSuite) TestFirewallRules(c *gc.C) {
   126  	s.st.firewallRules[state.JujuApplicationOfferRule] = &state.FirewallRule{
   127  		WellKnownService: state.JujuApplicationOfferRule,
   128  		WhitelistCIDRs:   []string{"192.168.0.0/16"},
   129  	}
   130  	result, err := s.api.FirewallRules(params.KnownServiceArgs{
   131  		KnownServices: []params.KnownServiceValue{params.JujuApplicationOfferRule, params.SSHRule}})
   132  	c.Assert(err, jc.ErrorIsNil)
   133  	c.Assert(result.Rules, gc.HasLen, 1)
   134  	c.Assert(result.Rules[0].KnownService, gc.Equals, params.KnownServiceValue("juju-application-offer"))
   135  	c.Assert(result.Rules[0].WhitelistCIDRS, jc.SameContents, []string{"192.168.0.0/16"})
   136  }