本文整理汇总了Golang中github.com/coreos/fleet/functional/platform.CreateNClusterMembers函数的典型用法代码示例。如果您正苦于以下问题:Golang CreateNClusterMembers函数的具体用法?Golang CreateNClusterMembers怎么用?Golang CreateNClusterMembers使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了CreateNClusterMembers函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: TestScheduleGlobalConflicts
// Start 5 services that conflict with one another. Assert that only
// 3 of the 5 are started.
func TestScheduleGlobalConflicts(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
// Start with a simple three-node cluster
if err := platform.CreateNClusterMembers(cluster, 3, platform.MachineConfig{}); err != nil {
t.Fatal(err)
}
machines, err := cluster.WaitForNMachines(3)
if err != nil {
t.Fatal(err)
}
// Ensure we can SSH into each machine using fleetctl
for _, machine := range machines {
if _, _, err := cluster.Fleetctl("--strict-host-key-checking=false", "ssh", machine, "uptime"); err != nil {
t.Errorf("Unable to SSH into fleet machine: %v", err)
}
}
for i := 0; i < 5; i++ {
unit := fmt.Sprintf("fixtures/units/conflict.%d.service", i)
_, _, err := cluster.Fleetctl("start", "--no-block", unit)
if err != nil {
t.Errorf("Failed starting unit %s: %v", unit, err)
}
}
// All 5 services should be visible immediately and 3 should become
// ACTIVE shortly thereafter
stdout, _, err := cluster.Fleetctl("list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 5 {
t.Fatalf("Did not find five units in cluster: \n%s", stdout)
}
states, err := cluster.WaitForNActiveUnits(3)
if err != nil {
t.Fatal(err)
}
machineSet := make(map[string]bool)
for unit, unitState := range states {
if len(unitState.Machine) == 0 {
t.Errorf("Unit %s is not reporting machine", unit)
}
machineSet[unitState.Machine] = true
}
if len(machineSet) != 3 {
t.Errorf("3 active units not running on 3 unique machines")
}
}
示例2: TestUnitRunnable
// TestUnitRunnable is the simplest test possible, deplying a single-node
// cluster and ensuring a unit can enter an 'active' state
func TestUnitRunnable(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
if err := platform.CreateNClusterMembers(cluster, 1, platform.MachineConfig{}); err != nil {
t.Fatal(err)
}
_, err = cluster.WaitForNMachines(1)
if err != nil {
t.Fatal(err)
}
if stdout, stderr, err := cluster.Fleetctl("start", "fixtures/units/hello.service"); err != nil {
t.Fatalf("Unable to start fleet unit: \nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
}
units, err := cluster.WaitForNActiveUnits(1)
if err != nil {
t.Fatal(err)
}
_, found := units["hello.service"]
if len(units) != 1 || !found {
t.Fatalf("Expected hello.service to be sole active unit, got %v", units)
}
}
示例3: TestScheduleGlobalUnits
func TestScheduleGlobalUnits(t *testing.T) {
// Create a three-member cluster
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy(t)
members, err := platform.CreateNClusterMembers(cluster, 3)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
machines, err := cluster.WaitForNMachines(m0, 3)
if err != nil {
t.Fatal(err)
}
// Launch a couple of simple units
stdout, stderr, err := cluster.Fleetctl(m0, "start", "--no-block", "fixtures/units/hello.service", "fixtures/units/goodbye.service")
if err != nil {
t.Fatalf("Failed starting units: \nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
}
// Both units should show up active
_, err = cluster.WaitForNActiveUnits(m0, 2)
if err != nil {
t.Fatal(err)
}
// Now add a global unit
stdout, stderr, err = cluster.Fleetctl(m0, "start", "--no-block", "fixtures/units/global.service")
if err != nil {
t.Fatalf("Failed starting unit: \nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
}
// Should see 2 + 3 units
states, err := cluster.WaitForNActiveUnits(m0, 5)
if err != nil {
t.Fatal(err)
}
// Each machine should have a single global unit
us := states["global.service"]
for _, mach := range machines {
var found bool
for _, state := range us {
if state.Machine == mach {
found = true
break
}
}
if !found {
t.Fatalf("Did not find global unit on machine %v", mach)
t.Logf("Found unit states:")
for _, state := range states {
t.Logf("%#v", state)
}
}
}
}
示例4: TestScheduleConditionMachineID
// Ensure units can be scheduled directly to a given machine using the
// MachineID unit option.
func TestScheduleConditionMachineID(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy(t)
// Start with a simple three-node cluster
members, err := platform.CreateNClusterMembers(cluster, 3)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
machines, err := cluster.WaitForNMachines(m0, 3)
if err != nil {
t.Fatal(err)
}
// Start 3 units that are each scheduled to one of our machines
schedule := make(map[string]string)
for _, machine := range machines {
contents := `
[Service]
ExecStart=/bin/bash -c "while true; do echo Hello, World!; sleep 1; done"
[X-Fleet]
MachineID=%s
`
unitFile, err := util.TempUnit(fmt.Sprintf(contents, machine))
if err != nil {
t.Fatalf("Failed creating temporary unit: %v", err)
}
defer os.Remove(unitFile)
stdout, stderr, err := cluster.Fleetctl(m0, "start", unitFile)
if err != nil {
t.Fatalf("Failed starting unit file %s: \nstdout: %s\nstderr: %s\nerr: %v", unitFile, stdout, stderr, err)
}
unit := filepath.Base(unitFile)
schedule[unit] = machine
}
// Block until our three units have been started
active, err := cluster.WaitForNActiveUnits(m0, 3)
if err != nil {
t.Fatal(err)
}
states, err := util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
for unit, unitState := range states {
if unitState.Machine != schedule[unit] {
t.Errorf("Unit %s was scheduled to %s, expected %s", unit, unitState.Machine, schedule[unit])
}
}
}
示例5: TestUnitSubmit
func TestUnitSubmit(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
if err := platform.CreateNClusterMembers(cluster, 1, platform.MachineConfig{}); err != nil {
t.Fatal(err)
}
_, err = cluster.WaitForNMachines(1)
if err != nil {
t.Fatal(err)
}
// submit a unit and assert it shows up
if _, _, err := cluster.Fleetctl("submit", "fixtures/units/hello.service"); err != nil {
t.Fatalf("Unable to submit fleet unit: %v", err)
}
stdout, _, err := cluster.Fleetctl("list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 1 {
t.Fatalf("Did not find 1 unit in cluster: \n%s", stdout)
}
// submitting the same unit should not fail
if _, _, err = cluster.Fleetctl("submit", "fixtures/units/hello.service"); err != nil {
t.Fatalf("Expected no failure when double-submitting unit, got this: %v", err)
}
// destroy the unit and ensure it disappears from the unit list
if _, _, err := cluster.Fleetctl("destroy", "fixtures/units/hello.service"); err != nil {
t.Fatalf("Failed to destroy unit: %v", err)
}
stdout, _, err = cluster.Fleetctl("list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
if strings.TrimSpace(stdout) != "" {
t.Fatalf("Did not find 0 units in cluster: \n%s", stdout)
}
// submitting the unit after destruction should succeed
if _, _, err := cluster.Fleetctl("submit", "fixtures/units/hello.service"); err != nil {
t.Fatalf("Unable to submit fleet unit: %v", err)
}
stdout, _, err = cluster.Fleetctl("list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
units = strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 1 {
t.Fatalf("Did not find 1 unit in cluster: \n%s", stdout)
}
}
示例6: TestKnownHostsVerification
func TestKnownHostsVerification(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
members, err := platform.CreateNClusterMembers(cluster, 2)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
machines, err := cluster.WaitForNMachines(m0, 2)
if err != nil {
t.Fatal(err)
}
machine := machines[0]
tmp, err := ioutil.TempFile(os.TempDir(), "known-hosts")
if err != nil {
t.Fatal(err)
}
tmp.Close()
defer syscall.Unlink(tmp.Name())
khFile := tmp.Name()
if stdout, stderr, err := cluster.FleetctlWithInput(m0, "yes", "--strict-host-key-checking=true", fmt.Sprintf("--known-hosts-file=%s", khFile), "ssh", machine, "uptime"); err != nil {
t.Errorf("Unable to SSH into fleet machine: \nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
}
_, err = cluster.ReplaceMember(members[1])
if err != nil {
t.Fatalf("Failed replacing machine: %v", err)
}
machines, err = cluster.WaitForNMachines(m0, 2)
if err != nil {
t.Fatal(err)
}
machine = machines[0]
// SSH'ing to the cluster member should now fail with a host key mismatch
if _, _, err := cluster.Fleetctl(m0, "--strict-host-key-checking=true", fmt.Sprintf("--known-hosts-file=%s", khFile), "ssh", machine, "uptime"); err == nil {
t.Errorf("Expected error while SSH'ing to fleet machine")
}
// Overwrite the known-hosts file to simulate removing the old host key
if err := ioutil.WriteFile(khFile, []byte{}, os.FileMode(0644)); err != nil {
t.Fatalf("Unable to overwrite known-hosts file: %v", err)
}
// And SSH should work again
if stdout, stderr, err := cluster.FleetctlWithInput(m0, "yes", "--strict-host-key-checking=true", fmt.Sprintf("--known-hosts-file=%s", khFile), "ssh", machine, "uptime"); err != nil {
t.Errorf("Unable to SSH into fleet machine: \nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
}
}
示例7: TestUnitSSHActions
func TestUnitSSHActions(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
if err := platform.CreateNClusterMembers(cluster, 1, platform.MachineConfig{}); err != nil {
t.Fatal(err)
}
_, err = cluster.WaitForNMachines(1)
if err != nil {
t.Fatal(err)
}
if _, _, err := cluster.Fleetctl("start", "--no-block", "fixtures/units/hello.service"); err != nil {
t.Fatalf("Unable to start fleet unit: %v", err)
}
units, err := cluster.WaitForNActiveUnits(1)
if err != nil {
t.Fatal(err)
}
_, found := units["hello.service"]
if len(units) != 1 || !found {
t.Fatalf("Expected hello.service to be sole active unit, got %v", units)
}
stdout, _, err := cluster.Fleetctl("--strict-host-key-checking=false", "ssh", "hello.service", "echo", "foo")
if err != nil {
t.Errorf("Failure occurred while calling fleetctl ssh: %v", err)
}
if !strings.Contains(stdout, "foo") {
t.Errorf("Could not find expected string in command output:\n%s", stdout)
}
stdout, _, err = cluster.Fleetctl("--strict-host-key-checking=false", "status", "hello.service")
if err != nil {
t.Errorf("Failure occurred while calling fleetctl status: %v", err)
}
if !strings.Contains(stdout, "Active: active") {
t.Errorf("Could not find expected string in status output:\n%s", stdout)
}
stdout, _, err = cluster.Fleetctl("--strict-host-key-checking=false", "journal", "hello.service")
if err != nil {
t.Errorf("Failure occurred while calling fleetctl journal: %v", err)
}
if !strings.Contains(stdout, "Hello, World!") {
t.Errorf("Could not find expected string in journal output:\n%s", stdout)
}
}
示例8: TestScheduleOneWayConflict
func TestScheduleOneWayConflict(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
// Start with a simple three-node cluster
if err := platform.CreateNClusterMembers(cluster, 1, platform.MachineConfig{}); err != nil {
t.Fatal(err)
}
if _, err := cluster.WaitForNMachines(1); err != nil {
t.Fatal(err)
}
// Start a unit that conflicts with a yet-to-be-scheduled unit
name := "fixtures/units/conflicts-with-hello.service"
if _, _, err := cluster.Fleetctl("start", name); err != nil {
t.Fatalf("Failed starting unit %s: %v", name, err)
}
// Start a unit that has not defined conflicts
name = "fixtures/units/hello.service"
if _, _, err := cluster.Fleetctl("start", name); err == nil {
t.Fatalf("Unit %s unexpectedly started", name)
}
// Both units should show up, but only conflicts-with-hello.service
// should report ACTIVE
stdout, _, err := cluster.Fleetctl("list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 2 {
t.Fatalf("Did not find two units in cluster: \n%s", stdout)
}
states, err := cluster.WaitForNActiveUnits(1)
if err != nil {
t.Fatal(err)
}
for unit, _ := range states {
if unit != "conflicts-with-hello.service" {
t.Error("Incorrect unit started:", unit)
}
}
}
示例9: TestScheduleOneWayConflict
func TestScheduleOneWayConflict(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy(t)
// Start with a simple three-node cluster
members, err := platform.CreateNClusterMembers(cluster, 1)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
if _, err := cluster.WaitForNMachines(m0, 1); err != nil {
t.Fatal(err)
}
// Start a unit that conflicts with a yet-to-be-scheduled unit
name := "fixtures/units/conflicts-with-hello.service"
if stdout, stderr, err := cluster.Fleetctl(m0, "start", "--no-block", name); err != nil {
t.Fatalf("Failed starting unit %s: \nstdout: %s\nstderr: %s\nerr: %v", name, stdout, stderr, err)
}
active, err := cluster.WaitForNActiveUnits(m0, 1)
if err != nil {
t.Fatal(err)
}
states, err := util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
// Start a unit that has not defined conflicts
name = "fixtures/units/hello.service"
if stdout, stderr, err := cluster.Fleetctl(m0, "start", "--no-block", name); err != nil {
t.Fatalf("Failed starting unit %s: \nstdout: %s\nstderr: %s\nerr: %v", name, stdout, stderr, err)
}
// Both units should show up, but only conflicts-with-hello.service
// should report ACTIVE
stdout, _, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-unit-files: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 2 {
t.Fatalf("Did not find two units in cluster: \n%s", stdout)
}
active, err = cluster.WaitForNActiveUnits(m0, 1)
if err != nil {
t.Fatal(err)
}
states, err = util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
for unit := range states {
if unit != "conflicts-with-hello.service" {
t.Error("Incorrect unit started:", unit)
}
}
// Destroying the conflicting unit should allow the other to start
name = "conflicts-with-hello.service"
if _, _, err := cluster.Fleetctl(m0, "destroy", name); err != nil {
t.Fatalf("Failed destroying %s", name)
}
// NOTE: we need to sleep here shortly to avoid occasional errors of
// conflicts-with-hello.service being rescheduled even after being destroyed.
// In that case, the conflicts unit remains active, while the original
// hello.service remains inactive. Then the test TestScheduleOneWayConflict
// fails at the end with a message "Incorrect unit started".
// This error seems to occur frequently when enable_grpc turned on.
// - dpark 20160615
time.Sleep(1 * time.Second)
// Wait for the destroyed unit to actually disappear
timeout, err := util.WaitForState(
func() bool {
stdout, _, err := cluster.Fleetctl(m0, "list-units", "--no-legend", "--full", "--fields", "unit,active,machine")
if err != nil {
return false
}
lines := strings.Split(strings.TrimSpace(stdout), "\n")
states := util.ParseUnitStates(lines)
for _, state := range states {
if state.Name == name {
return false
}
}
return true
},
)
if err != nil {
t.Fatalf("Destroyed unit %s not gone within %v", name, timeout)
}
active, err = cluster.WaitForNActiveUnits(m0, 1)
//.........这里部分代码省略.........
示例10: TestTemplatesWithSpecifiersInMetadata
// Start three machines and test template units based on machines Metadata
func TestTemplatesWithSpecifiersInMetadata(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy(t)
members, err := platform.CreateNClusterMembers(cluster, 3)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
_, err = cluster.WaitForNMachines(m0, 3)
if err != nil {
t.Fatal(err)
}
// Submit one template
if stdout, stderr, err := cluster.Fleetctl(m0, "submit", "fixtures/units/[email protected]"); err != nil {
t.Fatalf("Unable to submit [email protected] template: \nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
}
// Start units based on template in backward order
for i := len(members) - 1; i >= 0; i-- {
if stdout, stderr, err := cluster.Fleetctl(m0, "start", fmt.Sprintf("fixtures/units/[email protected]%s.service", members[i].ID())); err != nil {
t.Fatalf("Unable to start template based unit: \nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
}
}
_, err = cluster.WaitForNActiveUnits(m0, 3)
if err != nil {
t.Fatal(err)
}
stdout, stderr, err := cluster.Fleetctl(m0, "list-units", "--no-legend", "--full", "--fields", "unit,active,machine")
if err != nil {
t.Fatalf("Unable to get submitted units: \nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err)
}
ndesired := 3
stdout = strings.TrimSpace(stdout)
lines := strings.Split(stdout, "\n")
allStates := util.ParseUnitStates(lines)
active := util.FilterActiveUnits(allStates)
nactive := len(active)
if nactive != ndesired {
t.Fatalf("Failed to get %d active units: \nstdout: %s\nstderr: %s", ndesired, stdout, stderr)
}
for _, state := range active {
re := regexp.MustCompile(`@([^.]*)`)
desiredMachine := re.FindStringSubmatch(state.Name)
if len(desiredMachine) < 2 {
t.Fatalf("Cannot parse state.Name (%v): \nstdout: %s\nstderr: %s", state.Name, stdout, stderr)
}
currentMachine := fmt.Sprintf("smoke%s", state.Machine)
if desiredMachine[1] != currentMachine {
t.Fatalf("Template (%s) has been scheduled on wrong machine (%s): \nstdout: %s\nstderr: %s", state.Name, currentMachine, stdout, stderr)
}
}
if stdout, stderr, err := cluster.Fleetctl(m0, "start", "--block-attempts=20", "fixtures/units/[email protected]"); err == nil {
t.Fatalf("[email protected] unit should not be scheduled: \nstdout: %s\nstderr: %s", stdout, stderr)
}
}
示例11: TestDynamicClusterNewMemberUnitMigration
// Ensure an existing unit migrates to an unoccupied machine
// if its host goes down.
func TestDynamicClusterNewMemberUnitMigration(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
// Start with a 4-node cluster
members, err := platform.CreateNClusterMembers(cluster, 4)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
if _, err = cluster.WaitForNMachines(m0, 4); err != nil {
t.Fatal(err)
}
// Start 3 conflicting units on the 4-node cluster
_, _, err = cluster.Fleetctl(m0, "start",
"fixtures/units/conflict.0.service",
"fixtures/units/conflict.1.service",
"fixtures/units/conflict.2.service",
)
if err != nil {
t.Errorf("Failed starting units: %v", err)
}
// All 3 services should be visible immediately, and all of them should
// become ACTIVE shortly thereafter
stdout, _, err := cluster.Fleetctl(m0, "list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 3 {
t.Fatalf("Did not find 3 units in cluster: \n%s", stdout)
}
active, err := cluster.WaitForNActiveUnits(m0, 3)
if err != nil {
t.Fatal(err)
}
// Ensure each unit is only running on a single machine
states, err := util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
// Kill one of the machines and make sure the unit migrates somewhere else
unit := "conflict.1.service"
oldMach := states[unit].Machine
oldIP := states[unit].IP
if _, _, err = cluster.Fleetctl(m0, "--strict-host-key-checking=false", "ssh", oldMach, "sudo", "systemctl", "stop", "fleet"); err != nil {
t.Fatal(err)
}
var mN platform.Member
if m0.IP() == oldIP {
mN = members[1]
} else {
mN = m0
}
if _, err = cluster.WaitForNMachines(mN, 3); err != nil {
t.Fatal(err)
}
newActive, err := cluster.WaitForNActiveUnits(mN, 3)
if err != nil {
t.Fatal(err)
}
// Ensure each unit is only running on a single machine
newStates, err := util.ActiveToSingleStates(newActive)
if err != nil {
t.Fatal(err)
}
newMach := newStates[unit].Machine
if newMach == oldMach {
t.Fatalf("Unit %s did not migrate from machine %s to %s", unit, oldMach, newMach)
}
// Ensure no other units migrated due to this churn
if newMach == states["conflict.0.service"].Machine || newMach == states["conflict.2.service"].Machine {
t.Errorf("Unit %s landed on occupied machine", unit)
}
if states["conflict.0.service"].Machine != newStates["conflict.0.service"].Machine || states["conflict.2.service"].Machine != newStates["conflict.2.service"].Machine {
t.Errorf("Unit caused unnecessary churn in the cluster")
}
}
示例12: TestDynamicClusterMemberReboot
// Simulate rebooting a single member of a fleet cluster
func TestDynamicClusterMemberReboot(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
// Start with a simple three-node cluster
members, err := platform.CreateNClusterMembers(cluster, 3)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
if _, err = cluster.WaitForNMachines(m0, 3); err != nil {
t.Fatal(err)
}
_, _, err = cluster.Fleetctl(m0, "start",
"fixtures/units/conflict.0.service",
"fixtures/units/conflict.1.service",
"fixtures/units/conflict.2.service",
)
if err != nil {
t.Errorf("Failed starting units: %v", err)
}
// All 3 services should be visible immediately, and all of them should
// become ACTIVE shortly thereafter
stdout, _, err := cluster.Fleetctl(m0, "list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 3 {
t.Fatalf("Did not find 3 units in cluster: \n%s", stdout)
}
oldActive, err := cluster.WaitForNActiveUnits(m0, 3)
if err != nil {
t.Fatal(err)
}
oldStates, err := util.ActiveToSingleStates(oldActive)
if err != nil {
t.Fatal(err)
}
// Simulate a reboot by recreating one of the cluster members
if _, err := cluster.ReplaceMember(cluster.Members()[1]); err != nil {
t.Fatalf("replace failed: %v", err)
}
newActive, err := cluster.WaitForNActiveUnits(m0, 3)
if err != nil {
t.Fatal(err)
}
newStates, err := util.ActiveToSingleStates(newActive)
if err != nil {
t.Fatal(err)
}
migrated := 0
for _, unit := range []string{"conflict.0.service", "conflict.1.service", "conflict.2.service"} {
if oldStates[unit].Machine != newStates[unit].Machine {
migrated += 1
}
}
if migrated != 1 {
t.Errorf("Expected 1 unit to migrate, but found %d", migrated)
t.Logf("Initial state: %#v", oldStates)
t.Logf("Post-reboot state: %#v", newStates)
}
}
示例13: TestScheduleOneWayConflict
func TestScheduleOneWayConflict(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
// Start with a simple three-node cluster
members, err := platform.CreateNClusterMembers(cluster, 1)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
if _, err := cluster.WaitForNMachines(m0, 1); err != nil {
t.Fatal(err)
}
// Start a unit that conflicts with a yet-to-be-scheduled unit
name := "fixtures/units/conflicts-with-hello.service"
if stdout, stderr, err := cluster.Fleetctl(m0, "start", "--no-block", name); err != nil {
t.Fatalf("Failed starting unit %s: \nstdout: %s\nstderr: %s\nerr: %v", name, stdout, stderr, err)
}
active, err := cluster.WaitForNActiveUnits(m0, 1)
if err != nil {
t.Fatal(err)
}
states, err := util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
// Start a unit that has not defined conflicts
name = "fixtures/units/hello.service"
if stdout, stderr, err := cluster.Fleetctl(m0, "start", "--no-block", name); err != nil {
t.Fatalf("Failed starting unit %s: \nstdout: %s\nstderr: %s\nerr: %v", name, stdout, stderr, err)
}
// Both units should show up, but only conflicts-with-hello.service
// should report ACTIVE
stdout, _, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-unit-files: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 2 {
t.Fatalf("Did not find two units in cluster: \n%s", stdout)
}
active, err = cluster.WaitForNActiveUnits(m0, 1)
if err != nil {
t.Fatal(err)
}
states, err = util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
for unit := range states {
if unit != "conflicts-with-hello.service" {
t.Error("Incorrect unit started:", unit)
}
}
// Destroying the conflicting unit should allow the other to start
name = "conflicts-with-hello.service"
if _, _, err := cluster.Fleetctl(m0, "destroy", name); err != nil {
t.Fatalf("Failed destroying %s", name)
}
// TODO(jonboulle): fix this race. Since we no longer immediately
// remove unit state on unit destruction (and instead wait for
// UnitStateGenerator/UnitStatePublisher to clean up), the old unit
// shows up as active for quite some time.
time.Sleep(5 * time.Second)
stdout, _, err = cluster.Fleetctl(m0, "list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
units = strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 1 {
t.Fatalf("Did not find one unit in cluster: \n%s", stdout)
}
active, err = cluster.WaitForNActiveUnits(m0, 1)
if err != nil {
t.Fatal(err)
}
states, err = util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
for unit := range states {
if unit != "hello.service" {
t.Error("Incorrect unit started:", unit)
}
}
}
示例14: TestDynamicClusterMemberReboot
// Simulate rebooting a single member of a fleet cluster
func TestDynamicClusterMemberReboot(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy()
// Start with a simple three-node cluster
if err := platform.CreateNClusterMembers(cluster, 3, platform.MachineConfig{}); err != nil {
t.Fatal(err)
}
if _, err = cluster.WaitForNMachines(3); err != nil {
t.Fatal(err)
}
if _, _, err := cluster.Fleetctl("start",
"fixtures/units/conflict.0.service",
"fixtures/units/conflict.1.service",
"fixtures/units/conflict.2.service",
); err != nil {
t.Errorf("Failed starting units: %v", err)
}
// All 3 services should be visible immediately, and all of them should
// become ACTIVE shortly thereafter
stdout, _, err := cluster.Fleetctl("list-units", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-units: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 3 {
t.Fatalf("Did not find 3 units in cluster: \n%s", stdout)
}
oldStates, err := cluster.WaitForNActiveUnits(3)
if err != nil {
t.Fatal(err)
}
// Simulate a reboot by recreating one of the cluster members
member := cluster.Members()[1]
if _, err = cluster.MemberCommand(member, "sudo", "systemctl", "stop", "fleet"); err != nil {
t.Fatal(err)
}
if err = cluster.DestroyMember(member); err != nil {
t.Fatal(err)
}
if _, err = cluster.WaitForNMachines(2); err != nil {
t.Fatal(err)
}
if _, err = cluster.WaitForNActiveUnits(2); err != nil {
t.Fatal(err)
}
if err = cluster.CreateMember(member, platform.MachineConfig{}); err != nil {
t.Fatal(err)
}
if _, err = cluster.WaitForNMachines(3); err != nil {
t.Fatal(err)
}
newStates, err := cluster.WaitForNActiveUnits(3)
if err != nil {
t.Fatal(err)
}
for _, unit := range []string{"conflict.0.service", "conflict.1.service", "conflict.2.service"} {
if oldStates[unit].Machine != newStates[unit].Machine {
t.Fatalf("Unit %s migrated unexpectedly", unit)
}
}
}
示例15: TestScheduleOneWayConflict
func TestScheduleOneWayConflict(t *testing.T) {
cluster, err := platform.NewNspawnCluster("smoke")
if err != nil {
t.Fatal(err)
}
defer cluster.Destroy(t)
// Start with a simple three-node cluster
members, err := platform.CreateNClusterMembers(cluster, 1)
if err != nil {
t.Fatal(err)
}
m0 := members[0]
if _, err := cluster.WaitForNMachines(m0, 1); err != nil {
t.Fatal(err)
}
// Start a unit that conflicts with a yet-to-be-scheduled unit
name := "fixtures/units/conflicts-with-hello.service"
if stdout, stderr, err := cluster.Fleetctl(m0, "start", "--no-block", name); err != nil {
t.Fatalf("Failed starting unit %s: \nstdout: %s\nstderr: %s\nerr: %v", name, stdout, stderr, err)
}
active, err := cluster.WaitForNActiveUnits(m0, 1)
if err != nil {
t.Fatal(err)
}
states, err := util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
// Start a unit that has not defined conflicts
name = "fixtures/units/hello.service"
if stdout, stderr, err := cluster.Fleetctl(m0, "start", "--no-block", name); err != nil {
t.Fatalf("Failed starting unit %s: \nstdout: %s\nstderr: %s\nerr: %v", name, stdout, stderr, err)
}
// Both units should show up, but only conflicts-with-hello.service
// should report ACTIVE
stdout, _, err := cluster.Fleetctl(m0, "list-unit-files", "--no-legend")
if err != nil {
t.Fatalf("Failed to run list-unit-files: %v", err)
}
units := strings.Split(strings.TrimSpace(stdout), "\n")
if len(units) != 2 {
t.Fatalf("Did not find two units in cluster: \n%s", stdout)
}
active, err = cluster.WaitForNActiveUnits(m0, 1)
if err != nil {
t.Fatal(err)
}
states, err = util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
for unit := range states {
if unit != "conflicts-with-hello.service" {
t.Error("Incorrect unit started:", unit)
}
}
// Destroying the conflicting unit should allow the other to start
name = "conflicts-with-hello.service"
if _, _, err := cluster.Fleetctl(m0, "destroy", name); err != nil {
t.Fatalf("Failed destroying %s", name)
}
// Wait for the destroyed unit to actually disappear
timeout, err := util.WaitForState(
func() bool {
stdout, _, err := cluster.Fleetctl(m0, "list-units", "--no-legend", "--full", "--fields", "unit,active,machine")
if err != nil {
return false
}
lines := strings.Split(strings.TrimSpace(stdout), "\n")
states := util.ParseUnitStates(lines)
for _, state := range states {
if state.Name == name {
return false
}
}
return true
},
)
if err != nil {
t.Fatalf("Destroyed unit %s not gone within %v", name, timeout)
}
active, err = cluster.WaitForNActiveUnits(m0, 1)
if err != nil {
t.Fatal(err)
}
states, err = util.ActiveToSingleStates(active)
if err != nil {
t.Fatal(err)
}
for unit := range states {
if unit != "hello.service" {
//.........这里部分代码省略.........