diff --git a/.dockerignore b/.dockerignore index 9fc648039..fc7f83bcf 100644 --- a/.dockerignore +++ b/.dockerignore @@ -14,7 +14,6 @@ #ignore build files /build admin.conf -coordinatorConfig.json coordinator-* /image diff --git a/.gitignore b/.gitignore index 55cd0b0fc..c36523c61 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,6 @@ build admin.conf -coordinatorConfig.json coordinator-* util/pcr-reader/pcrs/ diff --git a/Dockerfile.e2e b/Dockerfile.e2e index fceeca35d..a10034b0c 100644 --- a/Dockerfile.e2e +++ b/Dockerfile.e2e @@ -16,7 +16,7 @@ RUN git clone -b v1.0.20210914 --depth=1 https://git.zx2c4.com/wireguard-tools & # Setup CLI RUN wg genkey | (umask 0077 && tee /privatekey) | wg pubkey > /publickey -RUN mkdir -p /root/.config/constellation && touch /root/.config/constellation/config.json +RUN mkdir -p /root/.config/constellation && touch /root/.config/constellation/constellation-conf.yaml # Setup AWS config RUN mkdir -p /root/.aws && echo "[default]\nregion = us-east-2" > /root/.aws/config && echo "[default]" >> /root/.aws/credentials diff --git a/README.md b/README.md index 0a257eb07..22c8bdcfe 100644 --- a/README.md +++ b/README.md @@ -95,12 +95,12 @@ go install github.com/edgelesssys/constellation/debugd/cdbg With `cdbg` installed in your path: -1. Run `constellation --dev-config /path/to/dev-config create […]` while specifying a cloud-provider image with the debugd already included. See [Configuration](#debugd-configuration) for a dev-config with a custom image and firewall rules to allow incoming connection on the debugd default port 4000. -2. Run `cdbg deploy --dev-config /path/to/dev-config` +0. (optional) Run `constellation config generate` to create a new default configuration +1. Run `constellation create […]` while specifying a cloud-provider image with the debugd already included. See [Configuration](#debugd-configuration) for a config with a custom image and firewall rules to allow incoming connection on the debugd default port 4000. +2. Run `cdbg deploy` 3. Run `constellation init […]` as usual - ### debugd GCP image For GCP, run the following command to get a list of all constellation images, sorted by their creation date: @@ -121,109 +121,92 @@ Choose the newest debugd image and copy the full URI. You should first locate the newest debugd image for your cloud provider ([GCP](#debugd-gcp-image), [Azure](#debugd-azure-image)). -This tool uses the dev-config file from `constellation-coordinator` and extends it with more fields. +This tool uses the config file from `constellation` and extends it with more fields. See this example on what the possible settings are and how to setup the constellation cli to use a cloud-provider image and firewall rules with support for debugd: -```json -{ - "cdbg":{ - "authorized_keys":[ - { - "user":"my-username", - "pubkey":"ssh-rsa AAAAB…LJuM=" - } - ], - "coordinator_path":"/path/to/coordinator", - "systemd_units":[ - { - "name":"some-custom.service", - "contents":"[Unit]\nDescription=…" - } - ] - }, - "provider": { - "gcpConfig": { - "image": "projects/constellation-images/global/images/constellation-coreos-debugd-TIMESTAMP", - "firewallInput": { - "ingress": [ - { - "name": "coordinator", - "description": "Coordinator default port", - "protocol": "tcp", - "fromport": 9000 - }, - { - "name": "wireguard", - "description": "WireGuard default port", - "protocol": "udp", - "fromport": 51820 - }, - { - "name": "ssh", - "description": "SSH", - "protocol": "tcp", - "fromport": 22 - }, - { - "name": "nodeport", - "description": "NodePort", - "protocol": "tcp", - "fromport": 30000, - "toport": 32767 - }, - { - "name": "debugd", - "description": "debugd default port", - "protocol": "tcp", - "fromport": 4000 - } - ] - } - }, - "azureConfig": { - "image": "/subscriptions/0d202bbb-4fa7-4af8-8125-58c269a05435/resourceGroups/CONSTELLATION-IMAGES/providers/Microsoft.Compute/galleries/Constellation/images/constellation-coreos-debugd/versions/0.0.TIMESTAMP", - "networkSecurityGroupInput": { - "ingress": [ - { - "name": "coordinator", - "description": "Coordinator default port", - "protocol": "tcp", - "iprange": "0.0.0.0/0", - "fromport": 9000 - }, - { - "name": "wireguard", - "description": "WireGuard default port", - "protocol": "udp", - "iprange": "0.0.0.0/0", - "fromport": 51820 - }, - { - "name": "ssh", - "description": "SSH", - "protocol": "tcp", - "iprange": "0.0.0.0/0", - "fromport": 22 - }, - { - "name": "nodeport", - "description": "NodePort", - "protocol": "tcp", - "iprange": "0.0.0.0/0", - "fromport": 30000, - "toport": 32767 - }, - { - "name": "debugd", - "description": "debugd default port", - "protocol": "tcp", - "iprange": "0.0.0.0/0", - "fromport": 4000 - } - ] - } - } - } -} +```yaml +cdbg: + authorizedKeys: + - user: my-username + pubkey: ssh-rsa AAAAB…LJuM= + coordinatorPath: "/path/to/coordinator" + systemdUnits: + - name: some-custom.service + contents: |- + [Unit] + Description=… +provider: + # Add Azure image + azureConfig: + image: /subscriptions/0d202bbb-4fa7-4af8-8125-58c269a05435/resourceGroups/CONSTELLATION-IMAGES/providers/Microsoft.Compute/galleries/Constellation/images/constellation-coreos/versions/0.0.TIMESTAMP + networkSecurityGroupInput: + ingress: + - name: coordinator + description: Coordinator default port + protocol: tcp + iprange: 0.0.0.0/0 + fromport: 9000 + toport: 0 + - name: wireguard + description: WireGuard default port + protocol: udp + iprange: 0.0.0.0/0 + fromport: 51820 + toport: 0 + - name: ssh + description: SSH + protocol: tcp + iprange: 0.0.0.0/0 + fromport: 22 + toport: 0 + - name: nodeport + description: NodePort + protocol: tcp + iprange: 0.0.0.0/0 + fromport: 30000 + toport: 32767 + # Add debug port + - name: debugd + description: debugd default port + protocol: tcp + iprange: 0.0.0.0/0 + fromport: 4000 + toport: 0 + gcpConfig: + # Add GCP image + image: projects/constellation-images/global/images/constellation-coreos-debugd-TIMESTAMP + firewallInput: + ingress: + - name: coordinator + description: Coordinator default port + protocol: tcp + iprange: "" + fromport: 9000 + toport: 0 + - name: wireguard + description: WireGuard default port + protocol: udp + iprange: "" + fromport: 51820 + toport: 0 + - name: ssh + description: SSH + protocol: tcp + iprange: "" + fromport: 22 + toport: 0 + - name: nodeport + description: NodePort + protocol: tcp + iprange: "" + fromport: 30000 + toport: 32767 + # Add debugd port + - name: debugd + description: debugd default port + protocol: tcp + iprange: "" + fromport: 4000 + toport: 0 ``` # Local image testing with QEMU diff --git a/cli/cmd/create.go b/cli/cmd/create.go index b32c76b99..9c4bf22e5 100644 --- a/cli/cmd/create.go +++ b/cli/cmd/create.go @@ -68,7 +68,7 @@ func create(cmd *cobra.Command, creator cloudCreator, fileHandler file.Handler, return err } - config, err := config.FromFile(fileHandler, flags.devConfigPath) + config, err := config.FromFile(fileHandler, flags.configPath) if err != nil { return err } @@ -146,7 +146,7 @@ func parseCreateFlags(cmd *cobra.Command, provider cloudprovider.Provider) (crea return createFlags{}, err } - devConfigPath, err := cmd.Flags().GetString("dev-config") + configPath, err := cmd.Flags().GetString("config") if err != nil { return createFlags{}, err } @@ -156,7 +156,7 @@ func parseCreateFlags(cmd *cobra.Command, provider cloudprovider.Provider) (crea workerCount: workerCount, insType: insType, name: name, - devConfigPath: devConfigPath, + configPath: configPath, yes: yes, }, nil } @@ -167,7 +167,7 @@ type createFlags struct { workerCount int insType string name string - devConfigPath string + configPath string yes bool } diff --git a/cli/cmd/create_test.go b/cli/cmd/create_test.go index 09bf6e2c9..b6410fc93 100644 --- a/cli/cmd/create_test.go +++ b/cli/cmd/create_test.go @@ -57,7 +57,7 @@ func TestCreate(t *testing.T) { controllerCountFlag *int workerCountFlag *int insTypeFlag string - devConfigFlag string + configFlag string nameFlag string stdin string wantErr bool @@ -187,14 +187,14 @@ func TestCreate(t *testing.T) { yesFlag: true, wantErr: true, }, - "dev config does not exist": { + "config does not exist": { setupFs: func(require *require.Assertions) afero.Fs { return afero.NewMemMapFs() }, creator: &stubCloudCreator{}, provider: cloudprovider.GCP, controllerCountFlag: intPtr(1), workerCountFlag: intPtr(1), yesFlag: true, - devConfigFlag: "dev-config.json", + configFlag: constants.ConfigFilename, wantErr: true, }, "create error": { @@ -229,15 +229,15 @@ func TestCreate(t *testing.T) { cmd.SetOut(&bytes.Buffer{}) cmd.SetErr(&bytes.Buffer{}) cmd.SetIn(bytes.NewBufferString(tc.stdin)) - cmd.Flags().String("dev-config", "", "") // register persisten flag manually + cmd.Flags().String("config", "", "") // register persisten flag manually if tc.yesFlag { require.NoError(cmd.Flags().Set("yes", "true")) } if tc.nameFlag != "" { require.NoError(cmd.Flags().Set("name", tc.nameFlag)) } - if tc.devConfigFlag != "" { - require.NoError(cmd.Flags().Set("dev-config", tc.devConfigFlag)) + if tc.configFlag != "" { + require.NoError(cmd.Flags().Set("config", tc.configFlag)) } if tc.controllerCountFlag != nil { require.NoError(cmd.Flags().Set("control-plane-nodes", strconv.Itoa(*tc.controllerCountFlag))) diff --git a/cli/cmd/init.go b/cli/cmd/init.go index 6f49a885c..dbb8ce9ee 100644 --- a/cli/cmd/init.go +++ b/cli/cmd/init.go @@ -72,7 +72,7 @@ func initialize(ctx context.Context, cmd *cobra.Command, protCl protoClient, ser return err } - config, err := config.FromFile(fileHandler, flags.devConfigPath) + config, err := config.FromFile(fileHandler, flags.configPath) if err != nil { return err } @@ -290,13 +290,13 @@ func evalFlagArgs(cmd *cobra.Command, fileHandler file.Handler) (initFlags, erro if err != nil { return initFlags{}, err } - devConfigPath, err := cmd.Flags().GetString("dev-config") + configPath, err := cmd.Flags().GetString("config") if err != nil { return initFlags{}, err } return initFlags{ - devConfigPath: devConfigPath, + configPath: configPath, userPrivKey: userPrivKey, userPubKey: userPubKey, autoconfigureWG: autoconfigureWG, @@ -307,7 +307,7 @@ func evalFlagArgs(cmd *cobra.Command, fileHandler file.Handler) (initFlags, erro // initFlags are the resulting values of flag preprocessing. type initFlags struct { - devConfigPath string + configPath string userPrivKey []byte userPubKey []byte masterSecret []byte diff --git a/cli/cmd/init_test.go b/cli/cmd/init_test.go index ae5fc986a..95277bbf6 100644 --- a/cli/cmd/init_test.go +++ b/cli/cmd/init_test.go @@ -296,7 +296,7 @@ func TestInitialize(t *testing.T) { cmd.SetOut(&out) var errOut bytes.Buffer cmd.SetErr(&errOut) - cmd.Flags().String("dev-config", "", "") // register persisten flag manually + cmd.Flags().String("config", "", "") // register persisten flag manually fs := afero.NewMemMapFs() fileHandler := file.NewHandler(fs) require.NoError(fileHandler.WriteJSON(constants.StateFilename, tc.existingState, file.OptNone)) @@ -603,7 +603,7 @@ func TestAutoscaleFlag(t *testing.T) { cmd.SetOut(&out) var errOut bytes.Buffer cmd.SetErr(&errOut) - cmd.Flags().String("dev-config", "", "") // register persisten flag manually + cmd.Flags().String("config", "", "") // register persisten flag manually fs := afero.NewMemMapFs() fileHandler := file.NewHandler(fs) vpnHandler := stubVPNHandler{} diff --git a/cli/cmd/recover.go b/cli/cmd/recover.go index 91e3b29f2..145f3485d 100644 --- a/cli/cmd/recover.go +++ b/cli/cmd/recover.go @@ -51,7 +51,7 @@ func recover(ctx context.Context, cmd *cobra.Command, fileHandler file.Handler, return err } - config, err := config.FromFile(fileHandler, flags.devConfigPath) + config, err := config.FromFile(fileHandler, flags.configPath) if err != nil { return err } @@ -112,24 +112,24 @@ func parseRecoverFlags(cmd *cobra.Command, fileHandler file.Handler) (recoverFla return recoverFlags{}, err } - devConfigPath, err := cmd.Flags().GetString("dev-config") + configPath, err := cmd.Flags().GetString("config") if err != nil { return recoverFlags{}, err } return recoverFlags{ - endpoint: endpoint, - diskUUID: diskUUID, - masterSecret: masterSecret, - devConfigPath: devConfigPath, + endpoint: endpoint, + diskUUID: diskUUID, + masterSecret: masterSecret, + configPath: configPath, }, nil } type recoverFlags struct { - endpoint string - diskUUID string - masterSecret []byte - devConfigPath string + endpoint string + diskUUID string + masterSecret []byte + configPath string } // readMasterSecret reads a base64 encoded master secret from file. diff --git a/cli/cmd/recover_test.go b/cli/cmd/recover_test.go index 5a924d5bc..152e8c421 100644 --- a/cli/cmd/recover_test.go +++ b/cli/cmd/recover_test.go @@ -50,7 +50,7 @@ func TestRecover(t *testing.T) { endpointFlag string diskUUIDFlag string masterSecretFlag string - devConfigFlag string + configFlag string stateless bool wantErr bool wantKey []byte @@ -95,16 +95,16 @@ func TestRecover(t *testing.T) { setupFs: func(require *require.Assertions) afero.Fs { return afero.NewMemMapFs() }, wantErr: true, }, - "missing dev-config": { + "missing config": { setupFs: func(require *require.Assertions) afero.Fs { fs := afero.NewMemMapFs() require.NoError(afero.WriteFile(fs, "constellation-mastersecret.base64", []byte("Y29uc3RlbGxhdGlvbi1tYXN0ZXItc2VjcmV0LWxlbmc="), 0o777)) return fs }, - endpointFlag: "192.0.2.1", - diskUUIDFlag: "00000000-0000-0000-0000-000000000000", - devConfigFlag: "nonexistent-dev-config", - wantErr: true, + endpointFlag: "192.0.2.1", + diskUUIDFlag: "00000000-0000-0000-0000-000000000000", + configFlag: "nonexistent-config", + wantErr: true, }, "missing state": { setupFs: func(require *require.Assertions) afero.Fs { @@ -161,7 +161,7 @@ func TestRecover(t *testing.T) { require := require.New(t) cmd := newRecoverCmd() - cmd.Flags().String("dev-config", "", "") // register persisten flag manually + cmd.Flags().String("config", "", "") // register persisten flag manually out := &bytes.Buffer{} cmd.SetOut(out) cmd.SetErr(&bytes.Buffer{}) @@ -174,8 +174,8 @@ func TestRecover(t *testing.T) { if tc.masterSecretFlag != "" { require.NoError(cmd.Flags().Set("master-secret", tc.masterSecretFlag)) } - if tc.devConfigFlag != "" { - require.NoError(cmd.Flags().Set("dev-config", tc.devConfigFlag)) + if tc.configFlag != "" { + require.NoError(cmd.Flags().Set("config", tc.configFlag)) } fileHandler := file.NewHandler(tc.setupFs(require)) if !tc.stateless { @@ -229,13 +229,13 @@ func TestParseRecoverFlags(t *testing.T) { "all args set": { args: []string{ "-e", "192.0.2.1:2", "--disk-uuid", "12345678-1234-1234-1234-123456789012", - "--master-secret", "constellation-mastersecret.base64", "--dev-config", "dev-config-path", + "--master-secret", "constellation-mastersecret.base64", "--config", "config-path", }, wantFlags: recoverFlags{ - endpoint: "192.0.2.1:2", - diskUUID: "12345678-1234-1234-1234-123456789012", - masterSecret: []byte("constellation-master-secret-leng"), - devConfigPath: "dev-config-path", + endpoint: "192.0.2.1:2", + diskUUID: "12345678-1234-1234-1234-123456789012", + masterSecret: []byte("constellation-master-secret-leng"), + configPath: "config-path", }, }, "uppercase disk-uuid is converted to lowercase": { @@ -256,7 +256,7 @@ func TestParseRecoverFlags(t *testing.T) { fs := afero.NewMemMapFs() require.NoError(afero.WriteFile(fs, "constellation-mastersecret.base64", []byte("Y29uc3RlbGxhdGlvbi1tYXN0ZXItc2VjcmV0LWxlbmc="), 0o777)) cmd := newRecoverCmd() - cmd.Flags().String("dev-config", "", "") // register persistent flag manually + cmd.Flags().String("config", "", "") // register persistent flag manually require.NoError(cmd.ParseFlags(tc.args)) flags, err := parseRecoverFlags(cmd, file.NewHandler(fs)) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index e1adf4017..541073a62 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -6,6 +6,7 @@ import ( "os" "os/signal" + "github.com/edgelesssys/constellation/internal/constants" "github.com/spf13/cobra" ) @@ -29,8 +30,8 @@ func NewRootCmd() *cobra.Command { // Set output of cmd.Print to stdout. (By default, it's stderr.) rootCmd.SetOut(os.Stdout) - rootCmd.PersistentFlags().String("dev-config", "", "use settings from a development config") - must(rootCmd.MarkPersistentFlagFilename("dev-config", "json")) + rootCmd.PersistentFlags().String("config", constants.ConfigFilename, "use settings from a config") + must(rootCmd.MarkPersistentFlagFilename("config", "json")) rootCmd.AddCommand(newCreateCmd()) rootCmd.AddCommand(newInitCmd()) diff --git a/cli/cmd/verify.go b/cli/cmd/verify.go index ddad6be72..29d882afe 100644 --- a/cli/cmd/verify.go +++ b/cli/cmd/verify.go @@ -49,7 +49,7 @@ func verify(ctx context.Context, cmd *cobra.Command, provider cloudprovider.Prov return err } - config, err := config.FromFile(fileHandler, flags.devConfigPath) + config, err := config.FromFile(fileHandler, flags.configPath) if err != nil { return err } @@ -102,24 +102,24 @@ func parseVerifyFlags(cmd *cobra.Command) (verifyFlags, error) { return verifyFlags{}, err } - devConfigPath, err := cmd.Flags().GetString("dev-config") + configPath, err := cmd.Flags().GetString("config") if err != nil { return verifyFlags{}, err } return verifyFlags{ - endpoint: endpoint, - devConfigPath: devConfigPath, - ownerID: ownerID, - clusterID: clusterID, + endpoint: endpoint, + configPath: configPath, + ownerID: ownerID, + clusterID: clusterID, }, nil } type verifyFlags struct { - endpoint string - ownerID string - clusterID string - devConfigPath string + endpoint string + ownerID string + clusterID string + configPath string } // verifyCompletion handels the completion of CLI arguments. It is frequently called diff --git a/cli/cmd/verify_test.go b/cli/cmd/verify_test.go index 57dba5ae4..a12c80f6a 100644 --- a/cli/cmd/verify_test.go +++ b/cli/cmd/verify_test.go @@ -53,7 +53,7 @@ func TestVerify(t *testing.T) { provider cloudprovider.Provider protoClient protoClient nodeEndpointFlag string - devConfigFlag string + configFlag string ownerIDFlag string clusterIDFlag string wantErr bool @@ -93,12 +93,12 @@ func TestVerify(t *testing.T) { nodeEndpointFlag: "192.0.2.1:1234", wantErr: true, }, - "dev config file not existing": { + "config file not existing": { setupFs: func(require *require.Assertions) afero.Fs { return afero.NewMemMapFs() }, provider: cloudprovider.GCP, ownerIDFlag: zeroBase64, nodeEndpointFlag: "192.0.2.1:1234", - devConfigFlag: "./file", + configFlag: "./file", wantErr: true, }, "error protoClient Connect": { @@ -133,12 +133,12 @@ func TestVerify(t *testing.T) { require := require.New(t) cmd := newVerifyCmd() - cmd.Flags().String("dev-config", "", "") // register persisten flag manually + cmd.Flags().String("config", "", "") // register persisten flag manually out := &bytes.Buffer{} cmd.SetOut(out) cmd.SetErr(&bytes.Buffer{}) - if tc.devConfigFlag != "" { - require.NoError(cmd.Flags().Set("dev-config", tc.devConfigFlag)) + if tc.configFlag != "" { + require.NoError(cmd.Flags().Set("config", tc.configFlag)) } if tc.ownerIDFlag != "" { require.NoError(cmd.Flags().Set("owner-id", tc.ownerIDFlag)) diff --git a/debugd/cdbg/cmd/deploy.go b/debugd/cdbg/cmd/deploy.go index 9fdf8c73c..0e063a626 100644 --- a/debugd/cdbg/cmd/deploy.go +++ b/debugd/cdbg/cmd/deploy.go @@ -28,20 +28,20 @@ var deployCmd = &cobra.Command{ Use: "deploy", Short: "Deploys a self-compiled coordinator binary and SSH keys on the current constellation", Long: `Deploys a self-compiled coordinator binary and SSH keys on the current constellation. -Uses dev-config provided by --dev-config and reads constellation config from its default location. +Uses config provided by --config and reads constellation config from its default location. If required, you can override the IP addresses that are used for a deployment by specifying "--ips" and a list of IP addresses. Specifying --coordinator will upload the coordinator from the specified path.`, RunE: runDeploy, - Example: "cdbg deploy --dev-config /path/to/dev-config\ncdbg deploy --coordinator /path/to/coordinator --ips 192.0.2.1,192.0.2.2,192.0.2.3 --dev-config /path/to/dev-config", + Example: "cdbg deploy --config /path/to/config\ncdbg deploy --coordinator /path/to/coordinator --ips 192.0.2.1,192.0.2.2,192.0.2.3 --config /path/to/config", } func runDeploy(cmd *cobra.Command, args []string) error { - devConfigName, err := cmd.Flags().GetString("dev-config") + configName, err := cmd.Flags().GetString("config") if err != nil { return err } fileHandler := file.NewHandler(afero.NewOsFs()) - config, err := config.FromFile(fileHandler, devConfigName) + config, err := config.FromFile(fileHandler, configName) if err != nil { return err } @@ -178,7 +178,7 @@ func init() { rootCmd.AddCommand(deployCmd) deployCmd.Flags().StringSlice("ips", nil, "override the ips that the coordinator will be uploaded to (defaults to ips from constellation config)") - deployCmd.Flags().String("coordinator", "", "override the path to the coordinator binary uploaded to instances (defaults to path set in dev-config)") + deployCmd.Flags().String("coordinator", "", "override the path to the coordinator binary uploaded to instances (defaults to path set in config)") } type fileToStreamReader interface { diff --git a/debugd/cdbg/cmd/root.go b/debugd/cdbg/cmd/root.go index fd410d8b0..2eead5ec8 100644 --- a/debugd/cdbg/cmd/root.go +++ b/debugd/cdbg/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "os" + "github.com/edgelesssys/constellation/internal/constants" "github.com/spf13/cobra" ) @@ -21,6 +22,5 @@ func Execute() { } func init() { - rootCmd.PersistentFlags().String("dev-config", "", "debugd config file (required)") - _ = rootCmd.MarkPersistentFlagRequired("dev-config") + rootCmd.PersistentFlags().String("config", constants.ConfigFilename, "debugd config file") } diff --git a/debugd/cdbg/config/config.go b/debugd/cdbg/config/config.go index f3accae8c..0c429ebea 100644 --- a/debugd/cdbg/config/config.go +++ b/debugd/cdbg/config/config.go @@ -11,15 +11,15 @@ import ( // CDBGConfig describes the constellation-cli config file and extends it with a new field "cdbg". type CDBGConfig struct { - ConstellationDebugConfig ConstellationDebugdConfig `json:"cdbg"` - configc.Config `` + ConstellationDebugConfig ConstellationDebugdConfig `yaml:"cdbg"` + configc.Config } // ConstellationDebugdConfig is the cdbg specific configuration. type ConstellationDebugdConfig struct { - AuthorizedKeys []ssh.SSHKey `json:"authorized_keys"` - CoordinatorPath string `json:"coordinator_path"` - SystemdUnits []deploy.SystemdUnit `json:"systemd_units,omitempty"` + AuthorizedKeys []ssh.SSHKey `yaml:"authorizedKeys"` + CoordinatorPath string `yaml:"coordinatorPath"` + SystemdUnits []deploy.SystemdUnit `yaml:"systemdUnits,omitempty"` } // Default returns a struct with the default config. @@ -42,7 +42,7 @@ func FromFile(fileHandler file.Handler, name string) (*CDBGConfig, error) { return conf, nil } - if err := fileHandler.ReadJSON(name, conf); err != nil { + if err := fileHandler.ReadYAML(name, conf); err != nil { return nil, fmt.Errorf("could not load config from file %s: %w", name, err) } return conf, nil diff --git a/debugd/debugd/deploy/service.go b/debugd/debugd/deploy/service.go index 363b3eaad..87a9daba4 100644 --- a/debugd/debugd/deploy/service.go +++ b/debugd/debugd/deploy/service.go @@ -34,8 +34,8 @@ type ServiceManagerRequest struct { // SystemdUnit describes a systemd service file including the unit name and contents. type SystemdUnit struct { - Name string `json:"name"` - Contents string `json:"contents"` + Name string `yaml:"name"` + Contents string `yaml:"contents"` } // ServiceManager receives ServiceManagerRequests and units via channels and performs the requests / creates the unit files. diff --git a/debugd/ssh/sshkey.go b/debugd/ssh/sshkey.go index 5e14f55b5..34dad8658 100644 --- a/debugd/ssh/sshkey.go +++ b/debugd/ssh/sshkey.go @@ -2,6 +2,6 @@ package ssh // SSHKey describes a public ssh key. type SSHKey struct { - Username string `json:"user"` - KeyValue string `json:"pubkey"` + Username string `yaml:"user"` + KeyValue string `yaml:"pubkey"` } diff --git a/internal/config/config.go b/internal/config/config.go index 3c2d67078..757ac190f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,7 +1,9 @@ package config import ( + "errors" "fmt" + "io/fs" "strconv" azureClient "github.com/edgelesssys/constellation/cli/azure/client" @@ -214,6 +216,9 @@ func FromFile(fileHandler file.Handler, name string) (*Config, error) { } if err := fileHandler.ReadYAML(name, conf); err != nil { + if errors.Is(err, fs.ErrNotExist) { + return nil, fmt.Errorf("unable to find %s - use `constellation config generate` to generate it first", constants.ConfigFilename) + } return nil, fmt.Errorf("could not load config from file %s: %w", name, err) } return conf, nil diff --git a/internal/config/config_test.go b/internal/config/config_test.go index e8338e747..3fb87e792 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -6,6 +6,7 @@ import ( "github.com/edgelesssys/constellation/cli/cloud/cloudtypes" "github.com/edgelesssys/constellation/cli/file" "github.com/edgelesssys/constellation/cli/gcp/client" + "github.com/edgelesssys/constellation/internal/constants" "github.com/spf13/afero" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -40,8 +41,6 @@ func TestFromFile(t *testing.T) { }, } - configName := "config.json" - testCases := map[string]struct { from *Config configName string @@ -50,12 +49,12 @@ func TestFromFile(t *testing.T) { }{ "overwrite fields": { from: &Config{CoordinatorPort: proto.String("1000")}, - configName: configName, + configName: constants.ConfigFilename, wantResultMutator: func(c *Config) { c.CoordinatorPort = proto.String("1000") }, }, "overwrite slices": { from: &Config{Provider: someProviderConfig}, - configName: configName, + configName: constants.ConfigFilename, wantResultMutator: func(c *Config) { c.Provider = someProviderConfig }, }, "default with empty name": { @@ -77,7 +76,7 @@ func TestFromFile(t *testing.T) { require := require.New(t) fileHandler := file.NewHandler(afero.NewMemMapFs()) - require.NoError(fileHandler.WriteYAML(configName, tc.from, file.OptNone)) + require.NoError(fileHandler.WriteYAML(constants.ConfigFilename, tc.from, file.OptNone)) result, err := FromFile(fileHandler, tc.configName)