github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/firewaller/firewaller_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package firewaller_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	"github.com/juju/utils"
     9  	gc "gopkg.in/check.v1"
    10  	"gopkg.in/juju/names.v2"
    11  
    12  	"github.com/juju/juju/api"
    13  	"github.com/juju/juju/api/base/testing"
    14  	"github.com/juju/juju/api/firewaller"
    15  	"github.com/juju/juju/apiserver/params"
    16  	"github.com/juju/juju/core/relation"
    17  	jujutesting "github.com/juju/juju/juju/testing"
    18  	"github.com/juju/juju/state"
    19  	coretesting "github.com/juju/juju/testing"
    20  )
    21  
    22  // NOTE: This suite is intended for embedding into other suites,
    23  // so common code can be reused. Do not add test cases to it,
    24  // otherwise they'll be run by each other suite that embeds it.
    25  type firewallerSuite struct {
    26  	jujutesting.JujuConnSuite
    27  
    28  	st          api.Connection
    29  	machines    []*state.Machine
    30  	application *state.Application
    31  	charm       *state.Charm
    32  	units       []*state.Unit
    33  	relations   []*state.Relation
    34  
    35  	firewaller *firewaller.Client
    36  }
    37  
    38  var _ = gc.Suite(&firewallerSuite{})
    39  
    40  func (s *firewallerSuite) SetUpTest(c *gc.C) {
    41  	s.JujuConnSuite.SetUpTest(c)
    42  
    43  	// Reset previous machines and units (if any) and create 3
    44  	// machines for the tests. The first one is a manager node.
    45  	s.machines = make([]*state.Machine, 3)
    46  	s.units = make([]*state.Unit, 3)
    47  
    48  	var err error
    49  	s.machines[0], err = s.State.AddMachine("quantal", state.JobManageModel, state.JobHostUnits)
    50  	c.Assert(err, jc.ErrorIsNil)
    51  	password, err := utils.RandomPassword()
    52  	c.Assert(err, jc.ErrorIsNil)
    53  	err = s.machines[0].SetPassword(password)
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	err = s.machines[0].SetProvisioned("i-manager", "", "fake_nonce", nil)
    56  	c.Assert(err, jc.ErrorIsNil)
    57  	s.st = s.OpenAPIAsMachine(c, s.machines[0].Tag(), password, "fake_nonce")
    58  	c.Assert(s.st, gc.NotNil)
    59  
    60  	// Note that the specific machine ids allocated are assumed
    61  	// to be numerically consecutive from zero.
    62  	for i := 1; i <= 2; i++ {
    63  		s.machines[i], err = s.State.AddMachine("quantal", state.JobHostUnits)
    64  		c.Check(err, jc.ErrorIsNil)
    65  	}
    66  	// Create an application and three units for these machines.
    67  	s.charm = s.AddTestingCharm(c, "wordpress")
    68  	s.application = s.AddTestingApplication(c, "wordpress", s.charm)
    69  	// Add the rest of the units and assign them.
    70  	for i := 0; i <= 2; i++ {
    71  		s.units[i], err = s.application.AddUnit(state.AddUnitParams{})
    72  		c.Check(err, jc.ErrorIsNil)
    73  		err = s.units[i].AssignToMachine(s.machines[i])
    74  		c.Check(err, jc.ErrorIsNil)
    75  	}
    76  
    77  	// Create a relation.
    78  	s.AddTestingApplication(c, "mysql", s.AddTestingCharm(c, "mysql"))
    79  	eps, err := s.State.InferEndpoints("wordpress", "mysql")
    80  	c.Assert(err, jc.ErrorIsNil)
    81  
    82  	s.relations = make([]*state.Relation, 1)
    83  	s.relations[0], err = s.State.AddRelation(eps...)
    84  	c.Assert(err, jc.ErrorIsNil)
    85  
    86  	// Create the firewaller API facade.
    87  	firewallerClient, err := firewaller.NewClient(s.st)
    88  	c.Assert(err, jc.ErrorIsNil)
    89  	c.Assert(firewallerClient, gc.NotNil)
    90  	s.firewaller = firewallerClient
    91  }
    92  
    93  func (s *firewallerSuite) TestWatchEgressAddressesForRelation(c *gc.C) {
    94  	var callCount int
    95  	relationTag := names.NewRelationTag("mediawiki:db mysql:db")
    96  	apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
    97  		c.Check(objType, gc.Equals, "Firewaller")
    98  		c.Check(version, gc.Equals, 0)
    99  		c.Check(id, gc.Equals, "")
   100  		c.Check(request, gc.Equals, "WatchEgressAddressesForRelations")
   101  		c.Assert(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: relationTag.String()}}})
   102  		c.Assert(result, gc.FitsTypeOf, &params.StringsWatchResults{})
   103  		*(result.(*params.StringsWatchResults)) = params.StringsWatchResults{
   104  			Results: []params.StringsWatchResult{{
   105  				Error: &params.Error{Message: "FAIL"},
   106  			}},
   107  		}
   108  		callCount++
   109  		return nil
   110  	})
   111  	client, err := firewaller.NewClient(apiCaller)
   112  	c.Assert(err, jc.ErrorIsNil)
   113  	_, err = client.WatchEgressAddressesForRelation(relationTag)
   114  	c.Check(err, gc.ErrorMatches, "FAIL")
   115  	c.Check(callCount, gc.Equals, 1)
   116  }
   117  
   118  func (s *firewallerSuite) TestWatchInressAddressesForRelation(c *gc.C) {
   119  	var callCount int
   120  	relationTag := names.NewRelationTag("mediawiki:db mysql:db")
   121  	apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   122  		c.Check(objType, gc.Equals, "Firewaller")
   123  		c.Check(version, gc.Equals, 0)
   124  		c.Check(id, gc.Equals, "")
   125  		c.Check(request, gc.Equals, "WatchIngressAddressesForRelations")
   126  		c.Assert(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: relationTag.String()}}})
   127  		c.Assert(result, gc.FitsTypeOf, &params.StringsWatchResults{})
   128  		*(result.(*params.StringsWatchResults)) = params.StringsWatchResults{
   129  			Results: []params.StringsWatchResult{{
   130  				Error: &params.Error{Message: "FAIL"},
   131  			}},
   132  		}
   133  		callCount++
   134  		return nil
   135  	})
   136  	client, err := firewaller.NewClient(apiCaller)
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	_, err = client.WatchIngressAddressesForRelation(relationTag)
   139  	c.Check(err, gc.ErrorMatches, "FAIL")
   140  	c.Check(callCount, gc.Equals, 1)
   141  }
   142  
   143  func (s *firewallerSuite) TestControllerAPIInfoForModel(c *gc.C) {
   144  	var callCount int
   145  	apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   146  		c.Check(objType, gc.Equals, "Firewaller")
   147  		c.Check(version, gc.Equals, 0)
   148  		c.Check(id, gc.Equals, "")
   149  		c.Check(request, gc.Equals, "ControllerAPIInfoForModels")
   150  		c.Assert(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{{Tag: coretesting.ModelTag.String()}}})
   151  		c.Assert(result, gc.FitsTypeOf, &params.ControllerAPIInfoResults{})
   152  		*(result.(*params.ControllerAPIInfoResults)) = params.ControllerAPIInfoResults{
   153  			Results: []params.ControllerAPIInfoResult{{
   154  				Error: &params.Error{Message: "FAIL"},
   155  			}},
   156  		}
   157  		callCount++
   158  		return nil
   159  	})
   160  	client, err := firewaller.NewClient(apiCaller)
   161  	c.Assert(err, jc.ErrorIsNil)
   162  	_, err = client.ControllerAPIInfoForModel(coretesting.ModelTag.Id())
   163  	c.Check(err, gc.ErrorMatches, "FAIL")
   164  	c.Check(callCount, gc.Equals, 1)
   165  }
   166  
   167  func (s *firewallerSuite) TestMacaroonForRelation(c *gc.C) {
   168  	var callCount int
   169  	apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   170  		c.Check(objType, gc.Equals, "Firewaller")
   171  		c.Check(version, gc.Equals, 0)
   172  		c.Check(id, gc.Equals, "")
   173  		c.Check(request, gc.Equals, "MacaroonForRelations")
   174  		c.Assert(arg, gc.DeepEquals, params.Entities{Entities: []params.Entity{
   175  			{Tag: names.NewRelationTag("mysql:db wordpress:db").String()}}})
   176  		c.Assert(result, gc.FitsTypeOf, &params.MacaroonResults{})
   177  		*(result.(*params.MacaroonResults)) = params.MacaroonResults{
   178  			Results: []params.MacaroonResult{{
   179  				Error: &params.Error{Message: "FAIL"},
   180  			}},
   181  		}
   182  		callCount++
   183  		return nil
   184  	})
   185  	client, err := firewaller.NewClient(apiCaller)
   186  	c.Assert(err, jc.ErrorIsNil)
   187  	_, err = client.MacaroonForRelation("mysql:db wordpress:db")
   188  	c.Check(err, gc.ErrorMatches, "FAIL")
   189  	c.Check(callCount, gc.Equals, 1)
   190  }
   191  
   192  func (s *firewallerSuite) TestSetRelationStatus(c *gc.C) {
   193  	var callCount int
   194  	apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   195  		c.Check(objType, gc.Equals, "Firewaller")
   196  		c.Check(version, gc.Equals, 0)
   197  		c.Check(id, gc.Equals, "")
   198  		c.Check(request, gc.Equals, "SetRelationsStatus")
   199  		c.Assert(arg, gc.DeepEquals, params.SetStatus{Entities: []params.EntityStatusArgs{
   200  			{
   201  				Tag:    names.NewRelationTag("mysql:db wordpress:db").String(),
   202  				Status: "suspended",
   203  				Info:   "a message",
   204  			}}})
   205  		c.Assert(result, gc.FitsTypeOf, &params.ErrorResults{})
   206  		*(result.(*params.ErrorResults)) = params.ErrorResults{
   207  			Results: []params.ErrorResult{{
   208  				Error: &params.Error{Message: "FAIL"},
   209  			}},
   210  		}
   211  		callCount++
   212  		return nil
   213  	})
   214  	client, err := firewaller.NewClient(apiCaller)
   215  	c.Assert(err, jc.ErrorIsNil)
   216  	err = client.SetRelationStatus("mysql:db wordpress:db", relation.Suspended, "a message")
   217  	c.Check(err, gc.ErrorMatches, "FAIL")
   218  	c.Check(callCount, gc.Equals, 1)
   219  }
   220  
   221  func (s *firewallerSuite) TestFirewallRules(c *gc.C) {
   222  	var callCount int
   223  	apiCaller := testing.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error {
   224  		c.Check(objType, gc.Equals, "Firewaller")
   225  		c.Check(version, gc.Equals, 0)
   226  		c.Check(id, gc.Equals, "")
   227  		c.Check(request, gc.Equals, "FirewallRules")
   228  		c.Assert(arg, gc.DeepEquals, params.KnownServiceArgs{
   229  			KnownServices: []params.KnownServiceValue{
   230  				params.JujuApplicationOfferRule, params.JujuControllerRule,
   231  			},
   232  		})
   233  		c.Assert(result, gc.FitsTypeOf, &params.ListFirewallRulesResults{})
   234  		*(result.(*params.ListFirewallRulesResults)) = params.ListFirewallRulesResults{
   235  			Rules: []params.FirewallRule{
   236  				{KnownService: params.JujuApplicationOfferRule, WhitelistCIDRS: []string{"10.0.0.0/16"}},
   237  			},
   238  		}
   239  		callCount++
   240  		return nil
   241  	})
   242  	client, err := firewaller.NewClient(apiCaller)
   243  	c.Assert(err, jc.ErrorIsNil)
   244  	result, err := client.FirewallRules("juju-application-offer", "juju-controller")
   245  	c.Assert(err, jc.ErrorIsNil)
   246  	c.Assert(result, gc.HasLen, 1)
   247  	c.Check(callCount, gc.Equals, 1)
   248  }