func (s *bootstrapSuite) TestBootstrapNoTools(c *gc.C) { env := newEnviron("foo", useDefaultKeys, nil) s.setDummyStorage(c, env) envtesting.RemoveFakeTools(c, env.Storage()) err := bootstrap.Bootstrap(coretesting.Context(c), env, environs.BootstrapParams{}) // bootstrap.Bootstrap leaves it to the provider to // locate bootstrap tools. c.Assert(err, gc.IsNil) }
func (s *bootstrapSuite) TestEnsureToolsAvailabilityAgentVersionAlreadySet(c *gc.C) { // Can't upload tools if agent version already set. env := newEnviron("foo", useDefaultKeys, map[string]interface{}{"agent-version": "1.16.0"}) s.setDummyStorage(c, env) envtesting.RemoveFakeTools(c, env.Storage()) _, err := bootstrap.EnsureToolsAvailability(coretesting.Context(c), env, config.PreferredSeries(env.Config()), nil) c.Assert(err, gc.NotNil) stripped := strings.Replace(err.Error(), "\n", "", -1) c.Assert(stripped, gc.Matches, "cannot upload bootstrap tools: Juju cannot bootstrap because no tools are available for your environment.*") }
func (s *bootstrapSuite) TestEnsureToolsAvailabilityNonDevVersion(c *gc.C) { // Can't automatically upload tools for released versions. s.PatchValue(&version.Current, version.MustParseBinary("1.18.0-trusty-arm64")) env := newEnviron("foo", useDefaultKeys, nil) s.setDummyStorage(c, env) envtesting.RemoveFakeTools(c, env.Storage()) _, err := bootstrap.EnsureToolsAvailability(coretesting.Context(c), env, config.PreferredSeries(env.Config()), nil) c.Assert(err, gc.NotNil) stripped := strings.Replace(err.Error(), "\n", "", -1) c.Assert(stripped, gc.Matches, "cannot upload bootstrap tools: Juju cannot bootstrap because no tools are available for your environment.*") }
func (s *localHTTPSServerSuite) TestCanBootstrap(c *gc.C) { restoreFinishBootstrap := envtesting.DisableFinishBootstrap() defer restoreFinishBootstrap() // For testing, we create a storage instance to which is uploaded tools and image metadata. metadataStorage := openstack.MetadataStorage(s.env) url, err := metadataStorage.URL("") c.Assert(err, gc.IsNil) c.Logf("Generating fake tools for: %v", url) envtesting.UploadFakeTools(c, metadataStorage) defer envtesting.RemoveFakeTools(c, metadataStorage) openstack.UseTestImageData(metadataStorage, s.cred) defer openstack.RemoveTestImageData(metadataStorage) err = bootstrap.Bootstrap(coretesting.Context(c), s.env, environs.BootstrapParams{}) c.Assert(err, gc.IsNil) }
func (s *bootstrapSuite) assertUploadTools(c *gc.C, vers version.Binary, forceVersion bool, extraConfig map[string]interface{}, errMessage string) { s.PatchValue(&version.Current, vers) // If we allow released tools to be uploaded, the build number is incremented so in that case // we need to ensure the environment is set up to allow dev tools to be used. env := newEnviron("foo", useDefaultKeys, extraConfig) s.setDummyStorage(c, env) envtesting.RemoveFakeTools(c, env.Storage()) // At this point, as a result of setDummyStorage, env has tools for amd64 uploaded. // Set version.Current to be arm64 to simulate a different CLI version. cliVersion := version.Current cliVersion.Arch = "arm64" version.Current = cliVersion s.PatchValue(&envtools.BundleTools, toolstesting.GetMockBundleTools(c)) // Host runs arm64, environment supports arm64. s.PatchValue(&arch.HostArch, func() string { return "arm64" }) arch := "arm64" err := bootstrap.UploadTools(coretesting.Context(c), env, &arch, forceVersion, "precise") if errMessage != "" { c.Assert(err, gc.NotNil) stripped := strings.Replace(err.Error(), "\n", "", -1) c.Assert(stripped, gc.Matches, errMessage) return } c.Assert(err, gc.IsNil) params := envtools.BootstrapToolsParams{ Arch: &arch, Series: version.Current.Series, } agentTools, err := envtools.FindBootstrapTools(env, params) c.Assert(err, gc.IsNil) c.Assert(agentTools, gc.HasLen, 1) expectedVers := vers expectedVers.Number.Build++ expectedVers.Series = version.Current.Series c.Assert(agentTools[0].Version, gc.DeepEquals, expectedVers) }
func (s *bootstrapSuite) TestEnsureToolsAvailabilityIncompatibleTargetArch(c *gc.C) { // Host runs ppc64, environment only supports amd64, arm64. s.PatchValue(&arch.HostArch, func() string { return "ppc64" }) // Force a dev version by having a non zero build number. // This is because we have not uploaded any tools and auto // upload is only enabled for dev versions. devVersion := version.Current devVersion.Build = 1234 s.PatchValue(&version.Current, devVersion) env := newEnviron("foo", useDefaultKeys, nil) s.setDummyStorage(c, env) envtesting.RemoveFakeTools(c, env.Storage()) _, err := bootstrap.EnsureToolsAvailability(coretesting.Context(c), env, config.PreferredSeries(env.Config()), nil) c.Assert(err, gc.NotNil) stripped := strings.Replace(err.Error(), "\n", "", -1) c.Assert(stripped, gc.Matches, `cannot upload bootstrap tools: environment "foo" of type dummy does not support instances running on "ppc64"`) }
func (s *ProvisionerSuite) TestPossibleTools(c *gc.C) { // Clear out all tools, and set a current version that does not match the // agent-version in the environ config. envStorage := s.Environ.Storage() envtesting.RemoveFakeTools(c, envStorage) currentVersion := version.MustParseBinary("1.2.3-quantal-arm64") s.PatchValue(&version.Current, currentVersion) // Upload some plausible matches, and some that should be filtered out. compatibleVersion := version.MustParseBinary("1.2.3-quantal-amd64") ignoreVersion1 := version.MustParseBinary("1.2.4-quantal-arm64") ignoreVersion2 := version.MustParseBinary("1.2.3-precise-arm64") availableVersions := []version.Binary{ currentVersion, compatibleVersion, ignoreVersion1, ignoreVersion2, } envtesting.AssertUploadFakeToolsVersions(c, envStorage, availableVersions...) // Extract the tools that we expect to actually match. expectedList, err := tools.FindTools(s.Environ, -1, -1, coretools.Filter{ Number: currentVersion.Number, Series: currentVersion.Series, }, tools.DoNotAllowRetry) c.Assert(err, gc.IsNil) // Create the machine and check the tools that get passed into StartInstance. machine, err := s.BackingState.AddOneMachine(state.MachineTemplate{ Series: "quantal", Jobs: []state.MachineJob{state.JobHostUnits}, }) c.Assert(err, gc.IsNil) provisioner := s.newEnvironProvisioner(c) defer stop(c, provisioner) s.checkStartInstanceCustom( c, machine, "pork", constraints.Value{}, nil, nil, expectedList, true, ) }
func (s *bootstrapSuite) TestEnsureToolsAvailabilityIncompatibleHostArch(c *gc.C) { // Host runs amd64, want ppc64 tools. s.PatchValue(&arch.HostArch, func() string { return "amd64" }) // Force a dev version by having an odd minor version number. // This is because we have not uploaded any tools and auto // upload is only enabled for dev versions. devVersion := version.Current devVersion.Minor = 11 s.PatchValue(&version.Current, devVersion) env := newEnviron("foo", useDefaultKeys, nil) s.setDummyStorage(c, env) envtesting.RemoveFakeTools(c, env.Storage()) arch := "ppc64" _, err := bootstrap.EnsureToolsAvailability(coretesting.Context(c), env, config.PreferredSeries(env.Config()), &arch) c.Assert(err, gc.NotNil) stripped := strings.Replace(err.Error(), "\n", "", -1) c.Assert(stripped, gc.Matches, `cannot upload bootstrap tools: cannot build tools for "ppc64" using a machine running on "amd64"`) }