mirror of
https://github.com/edgelesssys/constellation.git
synced 2025-04-28 02:56:19 -04:00

keyservice joinservice upgrade-agent measurement-reader debugd disk-mapper rewrote joinservice main rewrote some unit tests rewrote upgrade-agent + some grpc functions rewrote measurement-reader rewrote debugd removed unused import removed forgotten zap reference in measurements reader rewrote disk-mapper + tests rewrote packages verify disk-mapper malicious join bootstrapper attestationconfigapi versionapi internal/cloud/azure disk-mapper tests image/upload/internal/cmd rewrote verify (WIP with loglevel increase) rewrote forgotten zap references in disk-mapper rewrote malicious join rewrote bootstrapper rewrote parts of internal/ rewrote attestationconfigapi (WIP) rewrote versionapi cli rewrote internal/cloud/azure rewrote disk-mapper tests (untested by me rn) rewrote image/upload/internal/cmd removed forgotten zap references in verify/cmd rewrote packages hack/oci-pin hack/qemu-metadata-api debugd/internal/debugd/deploy hack/bazel-deps-mirror cli/internal/cmd cli-k8s-compatibility rewrote hack/qemu-metadata-api/server rewrote debugd/internal/debugd/deploy rewrote hack/bazel-deps-mirror rewrote rest of hack/qemu-metadata-api rewrote forgotten zap references in joinservice server rewrote cli/internal/cmd rewrote cli-k8s-compatibility rewrote packages internal/staticupload e2d/internal/upgrade internal/constellation/helm internal/attestation/aws/snp internal/attestation/azure/trustedlaunch joinservice/internal/certcache/amkds some missed unit tests rewrote e2e/internal/upgrade rewrote internal/constellation/helm internal/attestation/aws/snp internal/attestation/azure/trustedlaunch joinservice/internal/certcache/amkds search and replace test logging over all left *_test.go
88 lines
2.7 KiB
Go
88 lines
2.7 KiB
Go
//go:build linux && amd64
|
|
|
|
/*
|
|
Copyright (c) Edgeless Systems GmbH
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// checkSystemRequirements checks if the system meets the requirements for running a MiniConstellation cluster.
|
|
// We do so by verifying that the host:
|
|
// - arch/os is linux/amd64.
|
|
// - has access to /dev/kvm.
|
|
// - has at least 4 CPU cores.
|
|
// - has at least 4GB of memory.
|
|
// - has at least 20GB of free disk space.
|
|
func (m *miniUpCmd) checkSystemRequirements(out io.Writer) error {
|
|
// check arch/os
|
|
if runtime.GOARCH != "amd64" || runtime.GOOS != "linux" {
|
|
return fmt.Errorf("creation of a QEMU based Constellation is not supported for %s/%s, a linux/amd64 platform is required", runtime.GOOS, runtime.GOARCH)
|
|
}
|
|
|
|
m.log.Debug("Checked arch and os")
|
|
// check if /dev/kvm exists
|
|
if _, err := os.Stat("/dev/kvm"); err != nil {
|
|
return fmt.Errorf("unable to access KVM device: %w", err)
|
|
}
|
|
m.log.Debug("Checked that /dev/kvm exists")
|
|
// check CPU cores
|
|
if runtime.NumCPU() < 4 {
|
|
return fmt.Errorf("insufficient CPU cores: %d, at least 4 cores are required by MiniConstellation", runtime.NumCPU())
|
|
}
|
|
if runtime.NumCPU() < 6 {
|
|
fmt.Fprintf(out, "WARNING: Only %d CPU cores available. This may cause performance issues.\n", runtime.NumCPU())
|
|
}
|
|
m.log.Debug("Checked CPU cores - there are %d", runtime.NumCPU())
|
|
|
|
// check memory
|
|
f, err := os.Open("/proc/meminfo")
|
|
if err != nil {
|
|
return fmt.Errorf("determining available memory: failed to open /proc/meminfo: %w", err)
|
|
}
|
|
defer f.Close()
|
|
var memKB int
|
|
scanner := bufio.NewScanner(f)
|
|
for scanner.Scan() {
|
|
if strings.HasPrefix(scanner.Text(), "MemTotal:") {
|
|
_, err = fmt.Sscanf(scanner.Text(), "MemTotal:%d", &memKB)
|
|
if err != nil {
|
|
return fmt.Errorf("determining available memory: failed to parse /proc/meminfo: %w", err)
|
|
}
|
|
}
|
|
}
|
|
m.log.Debug("Scanned for available memory")
|
|
memGB := memKB / 1024 / 1024
|
|
if memGB < 4 {
|
|
return fmt.Errorf("insufficient memory: %dGB, at least 4GB of memory are required by MiniConstellation", memGB)
|
|
}
|
|
if memGB < 6 {
|
|
fmt.Fprintln(out, "WARNING: Less than 6GB of memory available. This may cause performance issues.")
|
|
}
|
|
m.log.Debug("Checked available memory, you have %dGB available", memGB)
|
|
|
|
var stat unix.Statfs_t
|
|
if err := unix.Statfs(".", &stat); err != nil {
|
|
return err
|
|
}
|
|
freeSpaceGB := stat.Bavail * uint64(stat.Bsize) / 1024 / 1024 / 1024
|
|
if freeSpaceGB < 20 {
|
|
return fmt.Errorf("insufficient disk space: %dGB, at least 20GB of disk space are required by MiniConstellation", freeSpaceGB)
|
|
}
|
|
m.log.Debug("Checked for free space available, you have %dGB available", freeSpaceGB)
|
|
|
|
return nil
|
|
}
|