github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/provider/gce/environ_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package gce_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/cloudconfig/instancecfg"
    13  	"github.com/juju/juju/controller"
    14  	corebase "github.com/juju/juju/core/base"
    15  	"github.com/juju/juju/core/network"
    16  	"github.com/juju/juju/core/network/firewall"
    17  	"github.com/juju/juju/environs"
    18  	envtesting "github.com/juju/juju/environs/testing"
    19  	"github.com/juju/juju/provider/common"
    20  	"github.com/juju/juju/provider/gce"
    21  	"github.com/juju/juju/testing"
    22  )
    23  
    24  type environSuite struct {
    25  	gce.BaseSuite
    26  }
    27  
    28  var _ = gc.Suite(&environSuite{})
    29  
    30  func (s *environSuite) TestName(c *gc.C) {
    31  	name := s.Env.Name()
    32  
    33  	c.Check(name, gc.Equals, "google")
    34  }
    35  
    36  func (s *environSuite) TestProvider(c *gc.C) {
    37  	provider := s.Env.Provider()
    38  
    39  	c.Check(provider, gc.Equals, gce.Provider)
    40  }
    41  
    42  func (s *environSuite) TestRegion(c *gc.C) {
    43  	cloudSpec, err := s.Env.Region()
    44  	c.Assert(err, jc.ErrorIsNil)
    45  
    46  	c.Check(cloudSpec.Region, gc.Equals, "us-east1")
    47  	c.Check(cloudSpec.Endpoint, gc.Equals, "https://www.googleapis.com")
    48  }
    49  
    50  func (s *environSuite) TestSetConfig(c *gc.C) {
    51  	err := s.Env.SetConfig(s.Config)
    52  	c.Assert(err, jc.ErrorIsNil)
    53  
    54  	c.Check(gce.ExposeEnvConfig(s.Env), jc.DeepEquals, s.EnvConfig)
    55  	c.Check(gce.ExposeEnvConnection(s.Env), gc.Equals, s.FakeConn)
    56  }
    57  
    58  func (s *environSuite) TestSetConfigFake(c *gc.C) {
    59  	err := s.Env.SetConfig(s.Config)
    60  	c.Assert(err, jc.ErrorIsNil)
    61  
    62  	c.Check(s.FakeConn.Calls, gc.HasLen, 0)
    63  }
    64  
    65  func (s *environSuite) TestConfig(c *gc.C) {
    66  	cfg := s.Env.Config()
    67  
    68  	c.Check(cfg, jc.DeepEquals, s.Config)
    69  }
    70  
    71  func (s *environSuite) TestBootstrap(c *gc.C) {
    72  	s.FakeCommon.Arch = "amd64"
    73  	s.FakeCommon.Base = corebase.MakeDefaultBase("ubuntu", "22.04")
    74  	finalizer := func(environs.BootstrapContext, *instancecfg.InstanceConfig, environs.BootstrapDialOpts) error {
    75  		return nil
    76  	}
    77  	s.FakeCommon.BSFinalizer = finalizer
    78  
    79  	ctx := envtesting.BootstrapTODOContext(c)
    80  	params := environs.BootstrapParams{
    81  		ControllerConfig:         testing.FakeControllerConfig(),
    82  		SupportedBootstrapSeries: testing.FakeSupportedJujuSeries,
    83  	}
    84  	result, err := s.Env.Bootstrap(ctx, s.CallCtx, params)
    85  	c.Assert(err, jc.ErrorIsNil)
    86  
    87  	c.Check(result.Arch, gc.Equals, "amd64")
    88  	c.Check(result.Base.DisplayString(), gc.Equals, "ubuntu@22.04")
    89  	// We don't check bsFinalizer because functions cannot be compared.
    90  	c.Check(result.CloudBootstrapFinalizer, gc.NotNil)
    91  }
    92  
    93  func (s *environSuite) TestBootstrapInvalidCredentialError(c *gc.C) {
    94  	s.FakeConn.Err = gce.InvalidCredentialError
    95  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
    96  	params := environs.BootstrapParams{
    97  		ControllerConfig:         testing.FakeControllerConfig(),
    98  		SupportedBootstrapSeries: testing.FakeSupportedJujuSeries,
    99  	}
   100  	_, err := s.Env.Bootstrap(envtesting.BootstrapTODOContext(c), s.CallCtx, params)
   101  	c.Check(err, gc.NotNil)
   102  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
   103  }
   104  
   105  func (s *environSuite) TestBootstrapOpensAPIPort(c *gc.C) {
   106  	config := testing.FakeControllerConfig()
   107  	s.checkAPIPorts(c, config, []int{config.APIPort()})
   108  }
   109  
   110  func (s *environSuite) TestBootstrapOpensAPIPortsWithAutocert(c *gc.C) {
   111  	config := testing.FakeControllerConfig()
   112  	config["api-port"] = 443
   113  	config["autocert-dns-name"] = "example.com"
   114  	s.checkAPIPorts(c, config, []int{443, 80})
   115  }
   116  
   117  func (s *environSuite) checkAPIPorts(c *gc.C, config controller.Config, expectedPorts []int) {
   118  	finalizer := func(environs.BootstrapContext, *instancecfg.InstanceConfig, environs.BootstrapDialOpts) error {
   119  		return nil
   120  	}
   121  	s.FakeCommon.BSFinalizer = finalizer
   122  
   123  	ctx := envtesting.BootstrapTODOContext(c)
   124  	params := environs.BootstrapParams{
   125  		ControllerConfig:         config,
   126  		SupportedBootstrapSeries: testing.FakeSupportedJujuSeries,
   127  	}
   128  	_, err := s.Env.Bootstrap(ctx, s.CallCtx, params)
   129  	c.Assert(err, jc.ErrorIsNil)
   130  
   131  	called, calls := s.FakeConn.WasCalled("OpenPorts")
   132  	c.Check(called, gc.Equals, true)
   133  	// NOTE(achilleasa): the bootstrap code will merge the port ranges
   134  	// for the API and port 80 when using autocert in a single OpenPorts
   135  	// call
   136  	c.Check(calls, gc.HasLen, 1)
   137  
   138  	var expRules firewall.IngressRules
   139  	for _, port := range expectedPorts {
   140  		expRules = append(
   141  			expRules,
   142  			firewall.NewIngressRule(network.MustParsePortRange(fmt.Sprintf("%d/tcp", port))),
   143  		)
   144  	}
   145  
   146  	call := calls[0]
   147  	c.Check(call.FirewallName, gc.Equals, gce.GlobalFirewallName(s.Env))
   148  	c.Check(call.Rules, jc.DeepEquals, expRules)
   149  }
   150  
   151  func (s *environSuite) TestBootstrapCommon(c *gc.C) {
   152  	ctx := envtesting.BootstrapTODOContext(c)
   153  	params := environs.BootstrapParams{
   154  		ControllerConfig:         testing.FakeControllerConfig(),
   155  		SupportedBootstrapSeries: testing.FakeSupportedJujuSeries,
   156  	}
   157  	_, err := s.Env.Bootstrap(ctx, s.CallCtx, params)
   158  	c.Assert(err, jc.ErrorIsNil)
   159  
   160  	s.FakeCommon.CheckCalls(c, []gce.FakeCall{{
   161  		FuncName: "Bootstrap",
   162  		Args: gce.FakeCallArgs{
   163  			"ctx":    ctx,
   164  			"switch": s.Env,
   165  			"params": params,
   166  		},
   167  	}})
   168  }
   169  
   170  func (s *environSuite) TestCreateInvalidCredentialError(c *gc.C) {
   171  	s.FakeConn.Err = gce.InvalidCredentialError
   172  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
   173  	err := s.Env.Create(s.CallCtx, environs.CreateParams{})
   174  	c.Check(err, gc.NotNil)
   175  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
   176  }
   177  
   178  func (s *environSuite) TestDestroyInvalidCredentialError(c *gc.C) {
   179  	s.FakeConn.Err = gce.InvalidCredentialError
   180  	c.Assert(s.InvalidatedCredentials, jc.IsFalse)
   181  	err := s.Env.Destroy(s.CallCtx)
   182  	c.Check(err, gc.NotNil)
   183  	c.Assert(s.InvalidatedCredentials, jc.IsTrue)
   184  }
   185  
   186  func (s *environSuite) TestDestroy(c *gc.C) {
   187  	err := s.Env.Destroy(s.CallCtx)
   188  
   189  	c.Check(err, jc.ErrorIsNil)
   190  }
   191  
   192  func (s *environSuite) TestDestroyAPI(c *gc.C) {
   193  	err := s.Env.Destroy(s.CallCtx)
   194  	c.Assert(err, jc.ErrorIsNil)
   195  
   196  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
   197  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "Ports")
   198  	fwname := common.EnvFullName(s.Env.Config().UUID())
   199  	c.Check(s.FakeConn.Calls[0].FirewallName, gc.Equals, fwname)
   200  	s.FakeCommon.CheckCalls(c, []gce.FakeCall{{
   201  		FuncName: "Destroy",
   202  		Args: gce.FakeCallArgs{
   203  			"switch": s.Env,
   204  		},
   205  	}})
   206  }