func (s *format_1_18Suite) TestMissingAttributes(c *gc.C) { logDir, err := paths.LogDir(series.HostSeries()) c.Assert(err, jc.ErrorIsNil) realDataDir, err := paths.DataDir(series.HostSeries()) c.Assert(err, jc.ErrorIsNil) realDataDir = filepath.FromSlash(realDataDir) logPath := filepath.Join(logDir, "juju") logPath = filepath.FromSlash(logPath) dataDir := c.MkDir() configPath := filepath.Join(dataDir, agentConfigFilename) err = utils.AtomicWriteFile(configPath, []byte(configData1_18WithoutUpgradedToVersion), 0600) c.Assert(err, jc.ErrorIsNil) readConfig, err := ReadConfig(configPath) c.Assert(err, jc.ErrorIsNil) c.Assert(readConfig.UpgradedToVersion(), gc.Equals, version.MustParse("1.16.0")) configLogDir := filepath.FromSlash(readConfig.LogDir()) configDataDir := filepath.FromSlash(readConfig.DataDir()) c.Assert(configLogDir, gc.Equals, logPath) c.Assert(configDataDir, gc.Equals, realDataDir) c.Assert(readConfig.PreferIPv6(), jc.IsFalse) // The api info doesn't have the environment tag set. apiInfo, ok := readConfig.APIInfo() c.Assert(ok, jc.IsTrue) c.Assert(apiInfo.EnvironTag.Id(), gc.Equals, "") }
func (s *format_1_16Suite) TestMissingAttributes(c *gc.C) { logDir, err := paths.LogDir(series.HostSeries()) c.Assert(err, jc.ErrorIsNil) realDataDir, err := paths.DataDir(series.HostSeries()) c.Assert(err, jc.ErrorIsNil) realDataDir = filepath.FromSlash(realDataDir) logPath := filepath.Join(logDir, "juju") logPath = filepath.FromSlash(logPath) dataDir := c.MkDir() formatPath := filepath.Join(dataDir, legacyFormatFilename) err = utils.AtomicWriteFile(formatPath, []byte(legacyFormatFileContents), 0600) c.Assert(err, jc.ErrorIsNil) configPath := filepath.Join(dataDir, agentConfigFilename) err = utils.AtomicWriteFile(configPath, []byte(configDataWithoutNewAttributes), 0600) c.Assert(err, jc.ErrorIsNil) readConfig, err := ReadConfig(configPath) c.Assert(err, jc.ErrorIsNil) c.Assert(readConfig.UpgradedToVersion(), gc.Equals, version.MustParse("1.16.0")) configLogDir := filepath.FromSlash(readConfig.LogDir()) configDataDir := filepath.FromSlash(readConfig.DataDir()) c.Assert(configLogDir, gc.Equals, logPath) c.Assert(configDataDir, gc.Equals, realDataDir) // Test data doesn't include a StateServerKey so StateServingInfo // should *not* be available _, available := readConfig.StateServingInfo() c.Assert(available, jc.IsFalse) }
// Bootstrap is specified in the Environ interface. func (env *localEnviron) Bootstrap(ctx environs.BootstrapContext, args environs.BootstrapParams) (*environs.BootstrapResult, error) { if err := ensureNotRoot(); err != nil { return nil, err } // Make sure there are tools available for the // host's architecture and series. if _, err := args.AvailableTools.Match(tools.Filter{ Arch: arch.HostArch(), Series: series.HostSeries(), }); err != nil { return nil, err } cfg, err := env.Config().Apply(map[string]interface{}{ // Record the bootstrap IP, so the containers know where to go for storage. "bootstrap-ip": env.bridgeAddress, }) if err == nil { err = env.SetConfig(cfg) } if err != nil { logger.Errorf("failed to apply bootstrap-ip to config: %v", err) return nil, err } result := &environs.BootstrapResult{ Arch: arch.HostArch(), Series: series.HostSeries(), Finalize: env.finishBootstrap, } return result, nil }
func (s *toolsSuite) testFindToolsExact(c *gc.C, t common.ToolsStorageGetter, inStorage bool, develVersion bool) { var called bool s.PatchValue(common.EnvtoolsFindTools, func(e environs.Environ, major, minor int, stream string, filter coretools.Filter) (list coretools.List, err error) { called = true c.Assert(filter.Number, gc.Equals, version.Current) c.Assert(filter.Series, gc.Equals, series.HostSeries()) c.Assert(filter.Arch, gc.Equals, arch.HostArch()) if develVersion { c.Assert(stream, gc.Equals, "devel") } else { c.Assert(stream, gc.Equals, "released") } return nil, errors.NotFoundf("tools") }) toolsFinder := common.NewToolsFinder(s.State, t, sprintfURLGetter("tools:%s")) result, err := toolsFinder.FindTools(params.FindToolsParams{ Number: version.Current, MajorVersion: -1, MinorVersion: -1, Series: series.HostSeries(), Arch: arch.HostArch(), }) c.Assert(err, jc.ErrorIsNil) if inStorage { c.Assert(result.Error, gc.IsNil) c.Assert(called, jc.IsFalse) } else { c.Assert(result.Error, gc.ErrorMatches, "tools not found") c.Assert(called, jc.IsTrue) } }
func (s *uploadSuite) TestUploadFakeSeries(c *gc.C) { seriesToUpload := "precise" if seriesToUpload == series.HostSeries() { seriesToUpload = "raring" } t, err := sync.Upload(s.targetStorage, "released", nil, "quantal", seriesToUpload) c.Assert(err, jc.ErrorIsNil) s.assertUploadedTools(c, t, []string{seriesToUpload, "quantal", series.HostSeries()}, "released") }
func (s *BootstrapSuite) testToolsMetadata(c *gc.C, exploded bool) { envtesting.RemoveFakeToolsMetadata(c, s.toolsStorage) _, cmd, err := s.initBootstrapCommand(c, nil, "--model-config", s.b64yamlControllerModelConfig, "--hosted-model-config", s.b64yamlHostedModelConfig, "--instance-id", string(s.instanceId), ) c.Assert(err, jc.ErrorIsNil) err = cmd.Run(nil) c.Assert(err, jc.ErrorIsNil) // We don't write metadata at bootstrap anymore. simplestreamsMetadata, err := envtools.ReadMetadata(s.toolsStorage, "released") c.Assert(err, jc.ErrorIsNil) c.Assert(simplestreamsMetadata, gc.HasLen, 0) // The tools should have been added to tools storage, and // exploded into each of the supported series of // the same operating system if the tools were uploaded. st, err := state.Open(testing.ModelTag, &mongo.MongoInfo{ Info: mongo.Info{ Addrs: []string{gitjujutesting.MgoServer.Addr()}, CACert: testing.CACert, }, Password: testPassword, }, mongotest.DialOpts(), environs.NewStatePolicy()) c.Assert(err, jc.ErrorIsNil) defer st.Close() expectedSeries := make(set.Strings) if exploded { for _, ser := range series.SupportedSeries() { os, err := series.GetOSFromSeries(ser) c.Assert(err, jc.ErrorIsNil) hostos, err := series.GetOSFromSeries(series.HostSeries()) c.Assert(err, jc.ErrorIsNil) if os == hostos { expectedSeries.Add(ser) } } } else { expectedSeries.Add(series.HostSeries()) } storage, err := st.ToolsStorage() c.Assert(err, jc.ErrorIsNil) defer storage.Close() metadata, err := storage.AllMetadata() c.Assert(err, jc.ErrorIsNil) c.Assert(metadata, gc.HasLen, expectedSeries.Size()) for _, m := range metadata { v := version.MustParseBinary(m.Version) c.Assert(expectedSeries.Contains(v.Series), jc.IsTrue) } }
func (s *uploadSuite) TestSyncToolsFakeSeries(c *gc.C) { seriesToUpload := "precise" if seriesToUpload == series.HostSeries() { seriesToUpload = "raring" } builtTools, err := sync.BuildToolsTarball(nil, "testing") c.Assert(err, jc.ErrorIsNil) t, err := sync.SyncBuiltTools(s.targetStorage, "testing", builtTools, "quantal", seriesToUpload) c.Assert(err, jc.ErrorIsNil) s.assertUploadedTools(c, t, []string{seriesToUpload, "quantal", series.HostSeries()}, "testing") }
// AddDefaultToolsToState adds tools to tools storage for // {Number: jujuversion.Current.Number, Arch: amd64}, for the // "precise" series and the environment's preferred series. // The preferred series is default-series if specified, // otherwise the latest LTS. func (s *JujuConnSuite) AddDefaultToolsToState(c *gc.C) { preferredVersion := version.Binary{ Number: jujuversion.Current, Arch: "amd64", Series: series.HostSeries(), } current := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } versions := PreferredDefaultVersions(s.Environ.Config(), preferredVersion) versions = append(versions, current) s.AddToolsToState(c, versions...) }
func (s *syslogSuite) SetUpTest(c *gc.C) { if runtime.GOOS != "linux" { c.Skip(fmt.Sprintf("this test requires a controller, therefore does not support %q", runtime.GOOS)) } currentSeries := series.HostSeries() osFromSeries, err := series.GetOSFromSeries(currentSeries) c.Assert(err, jc.ErrorIsNil) if osFromSeries != os.Ubuntu { c.Skip(fmt.Sprintf("this test requires a controller, therefore does not support OS %q only Ubuntu", osFromSeries.String())) } s.AgentSuite.SetUpTest(c) // TODO(perrito666) 200160701: // This needs to be done to stop the test from trying to install mongo // while running, but it is a huge footprint for such little benefit. // This test should not need JujuConnSuite or AgentSuite. s.fakeEnsureMongo = agenttest.InstallFakeEnsureMongo(s) done := make(chan struct{}) s.received = make(chan rfc5424test.Message) addr := s.createSyslogServer(c, s.received, done) // Leave log forwarding disabled initially, it will be enabled // via a model config update in the test. err = s.State.UpdateModelConfig(map[string]interface{}{ "syslog-host": addr, "syslog-ca-cert": coretesting.CACert, "syslog-client-cert": coretesting.ServerCert, "syslog-client-key": coretesting.ServerKey, }, nil, nil) c.Assert(err, jc.ErrorIsNil) s.logsCh, err = logsender.InstallBufferedLogWriter(1000) c.Assert(err, jc.ErrorIsNil) }
func (s *UpgradeSuite) SetUpTest(c *gc.C) { s.StateSuite.SetUpTest(c) s.preUpgradeError = false // Most of these tests normally finish sub-second on a fast machine. // If any given test hits a minute, we have almost certainly become // wedged, so dump the logs. coretesting.DumpTestLogsAfter(time.Minute, c, s) s.oldVersion = version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } s.oldVersion.Major = 1 s.oldVersion.Minor = 16 // Don't wait so long in tests. s.PatchValue(&UpgradeStartTimeoutMaster, time.Duration(time.Millisecond*50)) s.PatchValue(&UpgradeStartTimeoutSecondary, time.Duration(time.Millisecond*60)) // Allow tests to make the API connection appear to be dead. s.connectionDead = false s.PatchValue(&cmdutil.ConnectionIsDead, func(loggo.Logger, cmdutil.Pinger) bool { return s.connectionDead }) s.machineIsMaster = true fakeIsMachineMaster := func(*state.State, string) (bool, error) { return s.machineIsMaster, nil } s.PatchValue(&IsMachineMaster, fakeIsMachineMaster) }
func (s *upgraderSuite) TestSetTools(c *gc.C) { current := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } _, err := s.rawMachine.AgentTools() c.Assert(err, jc.Satisfies, errors.IsNotFound) args := params.EntitiesVersion{ AgentTools: []params.EntityVersion{{ Tag: s.rawMachine.Tag().String(), Tools: ¶ms.Version{ Version: current, }}, }, } results, err := s.upgrader.SetTools(args) c.Assert(err, jc.ErrorIsNil) c.Assert(results.Results, gc.HasLen, 1) c.Assert(results.Results[0].Error, gc.IsNil) // Check that the new value actually got set, we must Refresh because // it was set on a different Machine object err = s.rawMachine.Refresh() c.Assert(err, jc.ErrorIsNil) realTools, err := s.rawMachine.AgentTools() c.Assert(err, jc.ErrorIsNil) c.Check(realTools.Version, gc.Equals, current) c.Check(realTools.URL, gc.Equals, "") }
func (s *ContainerSetupSuite) TestLxcContainerUsesImageURL(c *gc.C) { // create a machine to host the container. m, err := s.BackingState.AddOneMachine(state.MachineTemplate{ Series: series.LatestLts(), Jobs: []state.MachineJob{state.JobHostUnits}, Constraints: s.defaultConstraints, }) c.Assert(err, jc.ErrorIsNil) err = m.SetSupportedContainers([]instance.ContainerType{instance.LXC, instance.KVM}) c.Assert(err, jc.ErrorIsNil) current := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } err = m.SetAgentVersion(current) c.Assert(err, jc.ErrorIsNil) brokerCalled := false newlxcbroker := func(api provisioner.APICalls, agentConfig agent.Config, managerConfig container.ManagerConfig, imageURLGetter container.ImageURLGetter, enableNAT bool, defaultMTU int) (environs.InstanceBroker, error) { imageURL, err := imageURLGetter.ImageURL(instance.LXC, "trusty", "amd64") c.Assert(err, jc.ErrorIsNil) c.Assert(imageURL, gc.Equals, "imageURL") c.Assert(imageURLGetter.CACert(), gc.DeepEquals, []byte("cert")) brokerCalled = true return nil, fmt.Errorf("lxc broker error") } s.PatchValue(&provisioner.NewLxcBroker, newlxcbroker) s.createContainer(c, m, instance.LXC) c.Assert(brokerCalled, jc.IsTrue) }
func (s *MachineSuite) assertAgentSetsToolsVersion(c *gc.C, job state.MachineJob) { vers := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } vers.Minor++ m, _, _ := s.primeAgentVersion(c, vers, job) a := s.newAgent(c, m) go func() { c.Check(a.Run(nil), jc.ErrorIsNil) }() defer func() { c.Check(a.Stop(), jc.ErrorIsNil) }() timeout := time.After(coretesting.LongWait) for done := false; !done; { select { case <-timeout: c.Fatalf("timeout while waiting for agent version to be set") case <-time.After(coretesting.ShortWait): c.Log("Refreshing") err := m.Refresh() c.Assert(err, jc.ErrorIsNil) c.Log("Fetching agent tools") agentTools, err := m.AgentTools() c.Assert(err, jc.ErrorIsNil) c.Logf("(%v vs. %v)", agentTools.Version, jujuversion.Current) if agentTools.Version.Minor != jujuversion.Current.Minor { continue } c.Assert(agentTools.Version.Number, gc.DeepEquals, jujuversion.Current) done = true } } }
func (s *LXCDefaultMTUSuite) TestDefaultMTUPropagatedToNewLXCBroker(c *gc.C) { // create a machine to host the container. m, err := s.BackingState.AddOneMachine(state.MachineTemplate{ Series: coretesting.FakeDefaultSeries, Jobs: []state.MachineJob{state.JobHostUnits}, Constraints: s.defaultConstraints, }) c.Assert(err, jc.ErrorIsNil) err = m.SetSupportedContainers([]instance.ContainerType{instance.LXC, instance.KVM}) c.Assert(err, jc.ErrorIsNil) current := version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } err = m.SetAgentVersion(current) c.Assert(err, jc.ErrorIsNil) brokerCalled := false newlxcbroker := func(api provisioner.APICalls, agentConfig agent.Config, managerConfig container.ManagerConfig, imageURLGetter container.ImageURLGetter, enableNAT bool, defaultMTU int) (environs.InstanceBroker, error) { brokerCalled = true c.Assert(defaultMTU, gc.Equals, 9000) return nil, fmt.Errorf("lxc broker error") } s.PatchValue(&provisioner.NewLxcBroker, newlxcbroker) s.createContainer(c, m, instance.LXC) c.Assert(brokerCalled, jc.IsTrue) }
func getContainerInstance() (cont []ContainerInstance, err error) { current_os, err := series.GetOSFromSeries(series.HostSeries()) if err != nil { return nil, err } switch current_os { case jujuos.CentOS: cont = []ContainerInstance{ {instance.LXC, [][]string{ {"lxc"}, {"cloud-image-utils"}, }}, {instance.KVM, [][]string{ {"uvtool-libvirt"}, {"uvtool"}, }}, } default: cont = []ContainerInstance{ {instance.LXC, [][]string{ {"--target-release", "precise-updates/cloud-tools", "lxc"}, {"--target-release", "precise-updates/cloud-tools", "cloud-image-utils"}, }}, {instance.KVM, [][]string{ {"uvtool-libvirt"}, {"uvtool"}, }}, } } return cont, nil }
func (s *ContainerSetupSuite) TestContainerInitLockError(c *gc.C) { m, err := s.BackingState.AddOneMachine(state.MachineTemplate{ Series: coretesting.FakeDefaultSeries, Jobs: []state.MachineJob{state.JobHostUnits}, Constraints: s.defaultConstraints, }) c.Assert(err, jc.ErrorIsNil) current := version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } err = m.SetAgentVersion(current) c.Assert(err, jc.ErrorIsNil) err = os.RemoveAll(s.initLockDir) c.Assert(err, jc.ErrorIsNil) handler, runner := s.setupContainerWorker(c, m.Tag().(names.MachineTag)) runner.Kill() err = runner.Wait() c.Assert(err, jc.ErrorIsNil) _, err = handler.SetUp() c.Assert(err, jc.ErrorIsNil) err = handler.Handle([]string{"0/lxc/0"}) c.Assert(err, gc.ErrorMatches, ".*failed to acquire initialization lock:.*") }
func (s *prereqsSuite) SetUpTest(c *gc.C) { s.BaseSuite.SetUpTest(c) s.tmpdir = c.MkDir() s.testMongodPath = filepath.Join(s.tmpdir, "mongod") s.PatchEnvironment("PATH", s.tmpdir) s.PatchValue(&mongo.JujuMongodPath, "/somewhere/that/wont/exist") os.Setenv("JUJUTEST_LSB_RELEASE_ID", "Ubuntu") err := ioutil.WriteFile(filepath.Join(s.tmpdir, "lsb_release"), []byte(lsbrelease), 0777) c.Assert(err, jc.ErrorIsNil) // symlink $temp/dpkg-query to /bin/true, to // simulate package installation query responses. pm, err := testing.GetPackageManager() c.Assert(err, jc.ErrorIsNil) err = symlink.New("/bin/true", filepath.Join(s.tmpdir, pm.PackageQuery)) c.Assert(err, jc.ErrorIsNil) s.PatchValue(&isPackageInstalled, func(pack string) bool { pacman, err := manager.NewPackageManager(series.HostSeries()) c.Assert(err, jc.ErrorIsNil) return pacman.IsInstalled(pack) }) }
func (s *localJujuTestSuite) testBootstrap(c *gc.C, cfg *config.Config) environs.Environ { ctx := envtesting.BootstrapContext(c) environ, err := local.Provider.PrepareForBootstrap(ctx, cfg) c.Assert(err, jc.ErrorIsNil) availableTools := coretools.List{&coretools.Tools{ Version: version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), }, URL: "http://testing.invalid/tools.tar.gz", }} result, err := environ.Bootstrap(ctx, environs.BootstrapParams{ AvailableTools: availableTools, }) c.Assert(err, jc.ErrorIsNil) icfg, err := instancecfg.NewBootstrapInstanceConfig( constraints.Value{}, constraints.Value{}, "quantal", "", ) c.Assert(err, jc.ErrorIsNil) icfg.Tools = availableTools[0] err = result.Finalize(ctx, icfg) c.Assert(err, jc.ErrorIsNil) return environ }
// Create creates a service with the given config. func (s *SvcManager) Create(name string, conf common.Conf) error { serviceStartName := "LocalSystem" var passwd string if !series.IsWindowsNano(series.HostSeries()) { password, err := getPassword() if err != nil { return errors.Trace(err) } passwd = password serviceStartName = jujudUser } cfg := mgr.Config{ Dependencies: []string{"Winmgmt"}, ErrorControl: mgr.ErrorSevere, StartType: mgr.StartAutomatic, DisplayName: conf.Desc, ServiceStartName: serviceStartName, Password: passwd, } // mgr.CreateService actually does correct argument escaping itself. There is no // need for quoted strings of any kind passed to this function. It takes in // a binary name, and an array or arguments. service, err := s.mgr.CreateService(name, conf.ServiceBinary, cfg, conf.ServiceArgs...) if err != nil { return errors.Trace(err) } defer service.Close() err = s.ensureRestartOnFailure(name) if err != nil { return errors.Trace(err) } return nil }
func (fix *SimpleToolsFixture) SetUp(c *gc.C, dataDir string) { fix.dataDir = dataDir fix.logDir = c.MkDir() current := version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } toolsDir := tools.SharedToolsDir(fix.dataDir, current) err := os.MkdirAll(toolsDir, 0755) c.Assert(err, jc.ErrorIsNil) jujudPath := filepath.Join(toolsDir, "jujud") err = ioutil.WriteFile(jujudPath, []byte(fakeJujud), 0755) c.Assert(err, jc.ErrorIsNil) toolsPath := filepath.Join(toolsDir, "downloaded-tools.txt") testTools := coretools.Tools{Version: current, URL: "http://testing.invalid/tools"} data, err := json.Marshal(testTools) c.Assert(err, jc.ErrorIsNil) err = ioutil.WriteFile(toolsPath, data, 0644) c.Assert(err, jc.ErrorIsNil) fix.binDir = c.MkDir() fix.origPath = os.Getenv("PATH") os.Setenv("PATH", fix.binDir+":"+fix.origPath) fix.makeBin(c, "status", `echo "blah stop/waiting"`) fix.makeBin(c, "stopped-status", `echo "blah stop/waiting"`) fix.makeBin(c, "started-status", `echo "blah start/running, process 666"`) fix.makeBin(c, "start", "cp $(which started-status) $(which status)") fix.makeBin(c, "stop", "cp $(which stopped-status) $(which status)") fix.data = svctesting.NewFakeServiceData() }
func (s *upgradeSuite) SetUpTest(c *gc.C) { s.AgentSuite.SetUpTest(c) s.oldVersion = version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } s.oldVersion.Major = 1 s.oldVersion.Minor = 16 // Don't wait so long in tests. s.PatchValue(&upgradesteps.UpgradeStartTimeoutMaster, time.Duration(time.Millisecond*50)) s.PatchValue(&upgradesteps.UpgradeStartTimeoutSecondary, time.Duration(time.Millisecond*60)) // Ensure we don't fail disk space check. s.PatchValue(&upgrades.MinDiskSpaceMib, uint64(0)) // Consume apt-get commands that get run before upgrades. aptCmds := s.AgentSuite.HookCommandOutput(&pacman.CommandOutput, nil, nil) go func() { for _ = range aptCmds { } }() // TODO(mjs) - the following should maybe be part of AgentSuite.SetUpTest() s.PatchValue(&cmdutil.EnsureMongoServer, func(mongo.EnsureServerParams) error { return nil }) s.PatchValue(&agentcmd.ProductionMongoWriteConcern, false) }
// GetMockBuildTools returns a sync.BuildAgentTarballFunc implementation which generates // a fake tools tarball. func GetMockBuildTools(c *gc.C) sync.BuildAgentTarballFunc { return func(build bool, forceVersion *version.Number, stream string) (*sync.BuiltAgent, error) { vers := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } if forceVersion != nil { vers.Number = *forceVersion } tgz, checksum := coretesting.TarGz( coretesting.NewTarFile(names.Jujud, 0777, "jujud contents "+vers.String())) toolsDir, err := ioutil.TempDir("", "juju-tools-"+stream) c.Assert(err, jc.ErrorIsNil) name := "name" ioutil.WriteFile(filepath.Join(toolsDir, name), tgz, 0777) return &sync.BuiltAgent{ Dir: toolsDir, StorageName: name, Version: vers, Size: int64(len(tgz)), Sha256Hash: checksum, }, nil } }
func (s *toolsSuite) TestFindAvailableToolsSpecificVersion(c *gc.C) { currentVersion := version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } currentVersion.Major = 2 currentVersion.Minor = 3 s.PatchValue(&version.Current, currentVersion.Number) var findToolsCalled int s.PatchValue(bootstrap.FindTools, func(_ environs.Environ, major, minor int, stream string, f tools.Filter) (tools.List, error) { c.Assert(f.Number.Major, gc.Equals, 10) c.Assert(f.Number.Minor, gc.Equals, 11) c.Assert(f.Number.Patch, gc.Equals, 12) c.Assert(stream, gc.Equals, "released") findToolsCalled++ return []*tools.Tools{ &tools.Tools{ Version: currentVersion, URL: "http://testing.invalid/tools.tar.gz", }, }, nil }) env := newEnviron("foo", useDefaultKeys, nil) toolsVersion := version.MustParse("10.11.12") result, err := bootstrap.FindAvailableTools(env, &toolsVersion, nil, nil, false) c.Assert(err, jc.ErrorIsNil) c.Assert(findToolsCalled, gc.Equals, 1) c.Assert(result, jc.DeepEquals, tools.List{ &tools.Tools{ Version: currentVersion, URL: "http://testing.invalid/tools.tar.gz", }, }) }
// MakeMachineNested will make a machine nested in the machine with ID given. func (factory *Factory) MakeMachineNested(c *gc.C, parentId string, params *MachineParams) *state.Machine { params = factory.paramsFillDefaults(c, params) machineTemplate := state.MachineTemplate{ Series: params.Series, Jobs: params.Jobs, Volumes: params.Volumes, Filesystems: params.Filesystems, Constraints: params.Constraints, } m, err := factory.st.AddMachineInsideMachine( machineTemplate, parentId, instance.LXD, ) c.Assert(err, jc.ErrorIsNil) err = m.SetProvisioned(params.InstanceId, params.Nonce, params.Characteristics) c.Assert(err, jc.ErrorIsNil) current := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } err = m.SetAgentVersion(current) c.Assert(err, jc.ErrorIsNil) return m }
func (*CurrentSuite) TestCurrentSeries(c *gc.C) { s := series.HostSeries() if s == "unknown" { s = "n/a" } out, err := exec.Command("lsb_release", "-c").CombinedOutput() if err != nil { // If the command fails (for instance if we're running on some other // platform) then CurrentSeries should be unknown. switch runtime.GOOS { case "darwin": c.Check(s, gc.Matches, `mavericks|mountainlion|lion|snowleopard`) case "windows": c.Check(s, gc.Matches, `win2012hvr2|win2012hv|win2012|win2012r2|win8|win81|win7`) default: current_os, err := series.GetOSFromSeries(s) c.Assert(err, gc.IsNil) if s != "n/a" { // There is no lsb_release command on CentOS. if current_os == os.CentOS { c.Check(s, gc.Matches, `centos7`) } } } } else { c.Assert(string(out), gc.Equals, "Codename:\t"+s+"\n") } }
func (factory *Factory) makeMachineReturningPassword(c *gc.C, params *MachineParams, setProvisioned bool) (*state.Machine, string) { machineTemplate := state.MachineTemplate{ Series: params.Series, Jobs: params.Jobs, Volumes: params.Volumes, Filesystems: params.Filesystems, Constraints: params.Constraints, } machine, err := factory.st.AddOneMachine(machineTemplate) c.Assert(err, jc.ErrorIsNil) if setProvisioned { err = machine.SetProvisioned(params.InstanceId, params.Nonce, params.Characteristics) c.Assert(err, jc.ErrorIsNil) } err = machine.SetPassword(params.Password) c.Assert(err, jc.ErrorIsNil) if len(params.Addresses) > 0 { err := machine.SetProviderAddresses(params.Addresses...) c.Assert(err, jc.ErrorIsNil) } current := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } err = machine.SetAgentVersion(current) c.Assert(err, jc.ErrorIsNil) return machine, params.Password }
func (s *upgraderSuite) TestToolsForAgent(c *gc.C) { current := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } agent := params.Entity{Tag: s.rawMachine.Tag().String()} // The machine must have its existing tools set before we query for the // next tools. This is so that we can grab Arch and Series without // having to pass it in again err := s.rawMachine.SetAgentVersion(current) c.Assert(err, jc.ErrorIsNil) args := params.Entities{Entities: []params.Entity{agent}} results, err := s.upgrader.Tools(args) c.Assert(err, jc.ErrorIsNil) assertTools := func() { c.Check(results.Results, gc.HasLen, 1) c.Assert(results.Results[0].Error, gc.IsNil) agentTools := results.Results[0].ToolsList[0] url := fmt.Sprintf("https://%s/model/%s/tools/%s", s.APIState.Addr(), coretesting.ModelTag.Id(), current) c.Check(agentTools.URL, gc.Equals, url) c.Check(agentTools.Version, gc.DeepEquals, current) } assertTools() }
func (s *BootstrapSuite) SetUpTest(c *gc.C) { s.BaseSuite.SetUpTest(c) s.PatchValue(&sshGenerateKey, func(name string) (string, string, error) { return "private-key", "public-key", nil }) s.MgoSuite.SetUpTest(c) s.dataDir = c.MkDir() s.logDir = c.MkDir() s.mongoOplogSize = "1234" s.fakeEnsureMongo = agenttesting.InstallFakeEnsureMongo(s) s.PatchValue(&maybeInitiateMongoServer, s.fakeEnsureMongo.InitiateMongo) // Create fake tools.tar.gz and downloaded-tools.txt. current := version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } toolsDir := filepath.FromSlash(agenttools.SharedToolsDir(s.dataDir, current)) err := os.MkdirAll(toolsDir, 0755) c.Assert(err, jc.ErrorIsNil) err = ioutil.WriteFile(filepath.Join(toolsDir, "tools.tar.gz"), nil, 0644) c.Assert(err, jc.ErrorIsNil) s.writeDownloadedTools(c, &tools.Tools{Version: current}) }
func (s *UnitSuite) TestUpgrade(c *gc.C) { machine, unit, _, currentTools := s.primeAgent(c) agent := s.newAgent(c, unit) newVers := version.Binary{ Number: version.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } newVers.Patch++ envtesting.AssertUploadFakeToolsVersions( c, s.DefaultToolsStorage, s.Environ.Config().AgentStream(), s.Environ.Config().AgentStream(), newVers) // The machine agent downloads the tools; fake this by // creating downloaded-tools.txt in data-dir/tools/<version>. toolsDir := agenttools.SharedToolsDir(s.DataDir(), newVers) err := os.MkdirAll(toolsDir, 0755) c.Assert(err, jc.ErrorIsNil) toolsPath := filepath.Join(toolsDir, "downloaded-tools.txt") testTools := tools.Tools{Version: newVers, URL: "http://testing.invalid/tools"} data, err := json.Marshal(testTools) c.Assert(err, jc.ErrorIsNil) err = ioutil.WriteFile(toolsPath, data, 0644) c.Assert(err, jc.ErrorIsNil) // Set the machine agent version to trigger an upgrade. err = machine.SetAgentVersion(newVers) c.Assert(err, jc.ErrorIsNil) err = runWithTimeout(agent) envtesting.CheckUpgraderReadyError(c, err, &upgrader.UpgradeReadyError{ AgentName: unit.Tag().String(), OldTools: currentTools.Version, NewTools: newVers, DataDir: s.DataDir(), }) }
// ListServices lists all installed services on the running system func ListServices() ([]string, error) { initName, err := VersionInitSystem(series.HostSeries()) if err != nil { return nil, errors.Trace(err) } switch initName { case InitSystemWindows: services, err := windows.ListServices() if err != nil { return nil, errors.Annotatef(err, "failed to list %s services", initName) } return services, nil case InitSystemUpstart: services, err := upstart.ListServices() if err != nil { return nil, errors.Annotatef(err, "failed to list %s services", initName) } return services, nil case InitSystemSystemd: services, err := systemd.ListServices() if err != nil { return nil, errors.Annotatef(err, "failed to list %s services", initName) } return services, nil default: return nil, errors.NotFoundf("init system %q", initName) } }