From 7e765fecdab65edab897bb1a806e34c0af3150cf Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Wed, 13 Jul 2016 15:19:12 +0200 Subject: [PATCH] functional: introduce a test TestMetadataOperator TestMetadataOperator ensures that metadata operators work also for extended operators such as ">=", "<=", "<", ">", "!=", or "==". First make the test machine have "ram=1024" in its machine metadata. Then in TestMetadataOperator, check each possible operator one after another, to make sure that each works without error. --- functional/fixtures/units/metadata-op.service | 5 ++ functional/metadata_test.go | 85 +++++++++++++++++++ functional/util/config.go | 5 +- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 functional/fixtures/units/metadata-op.service diff --git a/functional/fixtures/units/metadata-op.service b/functional/fixtures/units/metadata-op.service new file mode 100644 index 000000000..fd28c8a63 --- /dev/null +++ b/functional/fixtures/units/metadata-op.service @@ -0,0 +1,5 @@ +[Service] +ExecStart=/bin/bash -c "while true; do echo Hello, World!; sleep 1; done" + +[X-Fleet] +MachineMetadata="ram>=1024" diff --git a/functional/metadata_test.go b/functional/metadata_test.go index 5308abf8e..7a9b2345c 100644 --- a/functional/metadata_test.go +++ b/functional/metadata_test.go @@ -16,6 +16,7 @@ package functional import ( "fmt" + "path" "regexp" "strings" "testing" @@ -90,3 +91,87 @@ func TestTemplatesWithSpecifiersInMetadata(t *testing.T) { t.Fatalf("metadata@invalid unit should not be scheduled: \nstdout: %s\nstderr: %s", stdout, stderr) } } + +// TestMetadataOperator ensures that metadata operators work also for +// extended operators such as ">=", "<=", "<", ">", "!=", or "==". +func TestMetadataOperator(t *testing.T) { + cluster, err := platform.NewNspawnCluster("smoke") + if err != nil { + t.Fatal(err) + } + defer cluster.Destroy(t) + + members, err := platform.CreateNClusterMembers(cluster, 1) + if err != nil { + t.Fatal(err) + } + m0 := members[0] + _, err = cluster.WaitForNMachines(m0, 1) + if err != nil { + t.Fatal(err) + } + + stdout, stderr, err := cluster.Fleetctl(m0, "list-machines", "--fields", "machine,metadata") + if err != nil { + t.Fatalf("Unable to get machine metadata\nstdout: %s\nstderr: %s\nerr: %v", stdout, stderr, err) + } + + runMetaOp := func(ramEq string, expectSuccess bool) { + tmpMdOpService := "/tmp/metadata-op.service" + MdOpService := "fixtures/units/metadata-op.service" + MdOpBaseName := path.Base(MdOpService) + var nUnits int + + if expectSuccess { + t.Logf("Testing %s expecting success...", ramEq) + nUnits = 1 + } else { + t.Logf("Testing %s expecting failure...", ramEq) + nUnits = 0 + } + + err = util.GenNewFleetService(tmpMdOpService, MdOpService, ramEq, "ram>=1024") + if err != nil { + t.Fatalf("Failed to generate a temp fleet service: %v", err) + } + + stdout, stderr, err = cluster.Fleetctl(m0, "start", "--no-block", tmpMdOpService) + if err != nil { + t.Fatalf("starting unit %s returned error:\nstdout: %s\nstderr: %s\nerr: %v", + tmpMdOpService, stdout, stderr, err) + } + + _, err = cluster.WaitForNActiveUnits(m0, nUnits) + if err != nil { + t.Fatal(err) + } + + stdout, stderr, err = cluster.Fleetctl(m0, "destroy", MdOpBaseName) + if err != nil { + t.Fatalf("unit %s cannot be stopped: \nstdout: %s\nstderr: %s\nerr: %v", + MdOpBaseName, stdout, stderr, err) + } + + _, err = cluster.WaitForNUnitFiles(m0, 0) + if err != nil { + t.Fatal(err) + } + + } + + // run tests for success cases + runMetaOp("ram>=1024", true) + runMetaOp("ram<=1024", true) + runMetaOp("ram>1023", true) + runMetaOp("ram<1025", true) + runMetaOp("ram!=1025", true) + runMetaOp("ram==1024", true) + + // run tests for failure cases + runMetaOp("ram>=1025", false) + runMetaOp("ram<=1023", false) + runMetaOp("ram>1024", false) + runMetaOp("ram<1024", false) + runMetaOp("ram!=1024", false) + runMetaOp("ram==1025", false) +} diff --git a/functional/util/config.go b/functional/util/config.go index 66d94c431..c91b35c83 100644 --- a/functional/util/config.go +++ b/functional/util/config.go @@ -26,6 +26,7 @@ import ( const ( fleetAPIPort = 54728 + fleetRAM = 1024 // in MiB FleetTTL = "3s" cloudConfig = `#cloud-config @@ -62,7 +63,7 @@ coreos: command: start content: | [Service] - Environment=FLEET_METADATA=hostname=%H + Environment=FLEET_METADATA=hostname=%H,ram={{printf "%d" .FleetRAM}} ExecStart=/opt/fleet/fleetd -config /opt/fleet/fleet.conf ` ) @@ -80,6 +81,7 @@ type configValues struct { EtcdEndpoint string EtcdKeyPrefix string FleetAPIPort int + FleetRAM int FleetAgentTTL string FleetExtra string } @@ -118,6 +120,7 @@ func BuildCloudConfig(dst io.Writer, ip, etcdEndpoint, etcdKeyPrefix string) err EtcdEndpoint: etcdEndpoint, EtcdKeyPrefix: etcdKeyPrefix, FleetAPIPort: fleetAPIPort, + FleetRAM: fleetRAM, FleetAgentTTL: FleetTTL, FleetExtra: os.Getenv("FLEETD_TEST_ENV"), }