diff --git a/.circleci/config.yml b/.circleci/config.yml index 92d95411b..3e0989cb7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,6 +54,13 @@ workflows: name: "test-shared-exec" test_packages: "./drivers/shared/executor" <<: *IGNORE_FOR_UI_BRANCHES + - test-machine: + name: "test-32bit" + # Currently we only explicitly test fingerprinting on 32bit + # architectures. + test_packages: "./client/fingerprint" + goarch: "386" + <<: *IGNORE_FOR_UI_BRANCHES - test-rkt: <<: *IGNORE_FOR_UI_BRANCHES - test-e2e: @@ -118,11 +125,15 @@ jobs: exclude_packages: type: string default: "" + goarch: + type: string + default: "amd64" environment: <<: *COMMON_ENVS GOTEST_PKGS: "<< parameters.test_packages >>" GOTEST_PKGS_EXCLUDE: "<< parameters.exclude_packages >>" GOPATH: /go + GOTESTARCH: "<< parameters.goarch >>" steps: - checkout - run: make deps @@ -191,17 +202,30 @@ jobs: executor: type: string default: "go-machine-recent" + goarch: + type: string + default: "amd64" environment: <<: *COMMON_ENVS GOTEST_PKGS_EXCLUDE: "<< parameters.exclude_packages >>" GOTEST_PKGS: "<< parameters.test_packages >>" GOPATH: /home/circleci/go + GOTESTARCH: "<< parameters.goarch >>" steps: - checkout - install-golang - install-protoc - install-consul - install-vault + - run: + name: Install 32bit gcc libs + command: | + if [ ! -z $GOTESTARCH ] && [ $GOTESTARCH == "386" ]; then + sudo apt-get update + sudo apt-get install -y gcc-multilib + else + echo "Skipping 32bit lib installation while building for not 386" + fi - run: PATH="$GOPATH/bin:/usr/local/go/bin:$PATH" make bootstrap - run-tests - store_test_results: @@ -330,6 +354,10 @@ commands: unset GOTEST_PKGS fi + if [ ! -z $GOTESTARCH ]; then + export GOARCH="$GOTESTARCH"; + fi + mkdir -p /tmp/test-reports sudo -E PATH="$GOPATH/bin:/usr/local/go/bin:$PATH" make generate-structs sudo -E PATH="$GOPATH/bin:/usr/local/go/bin:$PATH" make test-nomad diff --git a/client/fingerprint/memory.go b/client/fingerprint/memory.go index ad28ed2ec..df5e24c33 100644 --- a/client/fingerprint/memory.go +++ b/client/fingerprint/memory.go @@ -8,7 +8,7 @@ import ( "github.com/shirou/gopsutil/mem" ) -const bytesInMB = 1024 * 1024 +const bytesInMB int64 = 1024 * 1024 // MemoryFingerprint is used to fingerprint the available memory on the node type MemoryFingerprint struct { @@ -25,10 +25,10 @@ func NewMemoryFingerprint(logger log.Logger) Fingerprint { } func (f *MemoryFingerprint) Fingerprint(req *FingerprintRequest, resp *FingerprintResponse) error { - var totalMemory int + var totalMemory int64 cfg := req.Config if cfg.MemoryMB != 0 { - totalMemory = cfg.MemoryMB * bytesInMB + totalMemory = int64(cfg.MemoryMB) * bytesInMB } else { memInfo, err := mem.VirtualMemory() if err != nil { @@ -36,21 +36,23 @@ func (f *MemoryFingerprint) Fingerprint(req *FingerprintRequest, resp *Fingerpri return err } if memInfo.Total > 0 { - totalMemory = int(memInfo.Total) + totalMemory = int64(memInfo.Total) } } if totalMemory > 0 { resp.AddAttribute("memory.totalbytes", fmt.Sprintf("%d", totalMemory)) - // COMPAT(0.10): Remove in 0.10 + memoryMB := totalMemory / bytesInMB + + // COMPAT(0.10): Unused since 0.9. resp.Resources = &structs.Resources{ - MemoryMB: totalMemory / bytesInMB, + MemoryMB: int(memoryMB), } resp.NodeResources = &structs.NodeResources{ Memory: structs.NodeMemoryResources{ - MemoryMB: int64(totalMemory / bytesInMB), + MemoryMB: memoryMB, }, } } diff --git a/client/fingerprint/memory_test.go b/client/fingerprint/memory_test.go index 6624b9225..8635b55fd 100644 --- a/client/fingerprint/memory_test.go +++ b/client/fingerprint/memory_test.go @@ -11,6 +11,8 @@ import ( ) func TestMemoryFingerprint(t *testing.T) { + require := require.New(t) + f := NewMemoryFingerprint(testlog.HCLogger(t)) node := &structs.Node{ Attributes: make(map[string]string), @@ -19,24 +21,13 @@ func TestMemoryFingerprint(t *testing.T) { request := &FingerprintRequest{Config: &config.Config{}, Node: node} var response FingerprintResponse err := f.Fingerprint(request, &response) - if err != nil { - t.Fatalf("err: %v", err) - } + require.NoError(err) assertNodeAttributeContains(t, response.Attributes, "memory.totalbytes") - - if response.Resources == nil { - t.Fatalf("response resources should not be nil") - } - - // COMPAT(0.10): Remove in 0.10 - if response.Resources.MemoryMB == 0 { - t.Fatalf("Expected node.Resources.MemoryMB to be non-zero") - } - - if response.NodeResources.Memory.MemoryMB == 0 { - t.Fatalf("Expected node.Resources.MemoryMB to be non-zero") - } + require.NotNil(response.Resources, "expected response Resources to not be nil") + require.NotZero(response.Resources.MemoryMB, "expected memory to be non-zero") + require.NotNil(response.NodeResources, "expected response NodeResources to not be nil") + require.NotZero(response.NodeResources.Memory.MemoryMB, "expected memory to be non-zero") } func TestMemoryFingerprint_Override(t *testing.T) { @@ -56,6 +47,7 @@ func TestMemoryFingerprint_Override(t *testing.T) { assertNodeAttributeContains(t, response.Attributes, "memory.totalbytes") require := require.New(t) require.NotNil(response.Resources) - require.Equal(response.Resources.MemoryMB, memoryMB) + require.EqualValues(response.Resources.MemoryMB, memoryMB) + require.NotNil(response.NodeResources) require.EqualValues(response.NodeResources.Memory.MemoryMB, memoryMB) }