config: improve usage and meaning of validate (#1975)

* discuss miniup config.Default() usage + discourage usage for Default() in comment

* Update internal/config/config_test.go

Co-authored-by: Daniel Weiße <66256922+daniel-weisse@users.noreply.github.com>

* add enterprise version check for config.Default

* split config comment lines

* daniel feedback

* featureset.CanUseEmbeddedMeasurmentsAndImage

---------

Co-authored-by: Daniel Weiße <66256922+daniel-weisse@users.noreply.github.com>
This commit is contained in:
Adrian Stobbe 2023-06-28 10:28:48 +02:00 committed by GitHub
parent 1edbe962c1
commit 161bb37cba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 43 additions and 17 deletions

View file

@ -13,6 +13,7 @@ import (
"net" "net"
"github.com/edgelesssys/constellation/v2/cli/internal/cloudcmd" "github.com/edgelesssys/constellation/v2/cli/internal/cloudcmd"
"github.com/edgelesssys/constellation/v2/cli/internal/featureset"
"github.com/edgelesssys/constellation/v2/cli/internal/libvirt" "github.com/edgelesssys/constellation/v2/cli/internal/libvirt"
"github.com/edgelesssys/constellation/v2/cli/internal/terraform" "github.com/edgelesssys/constellation/v2/cli/internal/terraform"
"github.com/edgelesssys/constellation/v2/internal/api/attestationconfigapi" "github.com/edgelesssys/constellation/v2/internal/api/attestationconfigapi"
@ -142,17 +143,14 @@ func (m *miniUpCmd) prepareConfig(cmd *cobra.Command, fileHandler file.Handler,
return nil, errors.New("not overwriting existing config") return nil, errors.New("not overwriting existing config")
} }
} }
if !featureset.CanUseEmbeddedMeasurmentsAndImage {
config := config.Default() cmd.PrintErrln("Generating a valid default config is not supported in the OSS build of the Constellation CLI. Consult the documentation for instructions on where to download the enterprise version.")
config.Name = constants.MiniConstellationUID return nil, errors.New("cannot create a mini cluster without a config file in the OSS build")
config.RemoveProviderAndAttestationExcept(cloudprovider.QEMU) }
config.StateDiskSizeGB = 8 config, err := config.MiniDefault()
if err != nil {
// only release images (e.g. v2.7.0) use the production NVRAM return nil, fmt.Errorf("mini default config is invalid: %v", err)
if !config.IsReleaseImage() {
config.Provider.QEMU.NVRAM = "testing"
} }
m.log.Debugf("Prepared configuration") m.log.Debugf("Prepared configuration")
return config, fileHandler.WriteYAML(constants.ConfigFilename, config, file.OptOverwrite) return config, fileHandler.WriteYAML(constants.ConfigFilename, config, file.OptOverwrite)

View file

@ -20,6 +20,9 @@ const (
// CanFetchMeasurements returns whether the current build can fetch measurements. // CanFetchMeasurements returns whether the current build can fetch measurements.
const CanFetchMeasurements = canFetchMeasurements const CanFetchMeasurements = canFetchMeasurements
// CanUseEmbeddedMeasurmentsAndImage returns whether the current build can use embedded measurements and can provide a node image.
const CanUseEmbeddedMeasurmentsAndImage = canUseEmbeddedMeasurmentsAndImage
// CanUpgradeCheck returns whether the current build can check for upgrades. // CanUpgradeCheck returns whether the current build can check for upgrades.
// This also includes fetching new measurements. // This also includes fetching new measurements.
const CanUpgradeCheck = canUpgradeCheck const CanUpgradeCheck = canUpgradeCheck

View file

@ -9,7 +9,8 @@ SPDX-License-Identifier: AGPL-3.0-only
package featureset package featureset
const ( const (
edition = EditionEnterprise edition = EditionEnterprise
canFetchMeasurements = true canFetchMeasurements = true
canUpgradeCheck = true canUpgradeCheck = true
canUseEmbeddedMeasurmentsAndImage = true
) )

View file

@ -9,7 +9,8 @@ SPDX-License-Identifier: AGPL-3.0-only
package featureset package featureset
const ( const (
edition = EditionOSS edition = EditionOSS
canFetchMeasurements = false canFetchMeasurements = false
canUpgradeCheck = false canUpgradeCheck = false
canUseEmbeddedMeasurmentsAndImage = false
) )

View file

@ -298,6 +298,7 @@ type AttestationConfig struct {
} }
// Default returns a struct with the default config. // Default returns a struct with the default config.
// IMPORTANT: Ensure that any state mutation is followed by a call to Validate() to ensure that the config is always in a valid state. Avoid usage outside of tests.
func Default() *Config { func Default() *Config {
return &Config{ return &Config{
Version: Version3, Version: Version3,
@ -367,6 +368,19 @@ func Default() *Config {
} }
} }
// MiniDefault returns a default config for a mini cluster.
func MiniDefault() (*Config, error) {
config := Default()
config.Name = constants.MiniConstellationUID
config.RemoveProviderAndAttestationExcept(cloudprovider.QEMU)
config.StateDiskSizeGB = 8
// only release images (e.g. v2.7.0) use the production NVRAM
if !config.IsReleaseImage() {
config.Provider.QEMU.NVRAM = "testing"
}
return config, config.Validate(false)
}
// fromFile returns config file with `name` read from `fileHandler` by parsing // fromFile returns config file with `name` read from `fileHandler` by parsing
// it as YAML. You should prefer config.New to read env vars and validate // it as YAML. You should prefer config.New to read env vars and validate
// config in a consistent manner. // config in a consistent manner.

View file

@ -376,6 +376,15 @@ func TestValidate(t *testing.T) {
return cnf return cnf
}(), }(),
}, },
"miniup default config is not valid because image and measurements are missing in OSS": {
cnf: func() *Config {
config, _ := MiniDefault()
require.NotNil(t, config)
return config
}(),
wantErr: true,
wantErrCount: 2,
},
} }
for name, tc := range testCases { for name, tc := range testCases {
@ -389,7 +398,7 @@ func TestValidate(t *testing.T) {
assert.Error(err) assert.Error(err)
var valErr *ValidationError var valErr *ValidationError
require.ErrorAs(err, &valErr) require.ErrorAs(err, &valErr)
assert.Equal(tc.wantErrCount, valErr.messagesCount()) assert.Equalf(tc.wantErrCount, valErr.messagesCount(), "Got unexpected error count: %d: %s", valErr.messagesCount(), valErr.LongMessage())
return return
} }
assert.NoError(err) assert.NoError(err)