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 }