diff --git a/ci_tools/fsas_nodedriver_template.yml b/ci_tools/fsas_nodedriver_template.yml index 33b4027..666eafa 100644 --- a/ci_tools/fsas_nodedriver_template.yml +++ b/ci_tools/fsas_nodedriver_template.yml @@ -5,6 +5,7 @@ metadata: passwordFields: credentialsPassword,slesRegistrationCode privateCredentialFields: credentialsPassword,slesRegistrationCode publicCredentialFields: credentialsUsername,tenantUuid,apiUrl,ntpUrl,dnsIp,slesRegistrationEmail + nodedriver.cattle.io/file-to-field-aliases: firstLoginSshKey:firstLoginSshKey name: fsas spec: active: true @@ -12,7 +13,7 @@ spec: builtin: false checksum: description: '' - displayName: fsas + displayName: 'Fsas' externalId: '' uiUrl: '' url: diff --git a/pkg/drivers/fsas/fsas.go b/pkg/drivers/fsas/fsas.go index ef13362..7b283c1 100644 --- a/pkg/drivers/fsas/fsas.go +++ b/pkg/drivers/fsas/fsas.go @@ -69,6 +69,7 @@ type Driver struct { Keycloak keycloak.Keycloak `json:"-"` SshManager sshutils.SshManager `json:"-"` CfgManager cfgutils.CfgManager `json:"-"` + FirstLoginSshKey string `json:"firstLoginSshKey"` // Matches the name used in annotations } // NewDriver creates and returns a new instance of the FSAS CDI driver @@ -249,6 +250,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag { Usage: "Warning: this field should remain empty as custom userdata are not supported!", EnvVar: "FSAS_USERDATA", }, + mcnflag.StringFlag{ + Name: "fsas-first-login-ssh-key", + Usage: "SSH private key for first log in", + EnvVar: "FSAS_FIRST_LOGIN_SSH_KEY", + }, } } @@ -398,6 +404,9 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { d.SlesRegistrationEmail = strings.TrimSpace(flags.String("fsas-sles-registration-email")) slog.Debug("Driver", "FSAS SLES registration email", d.SlesRegistrationEmail) + d.FirstLoginSshKey = strings.TrimSpace(flags.String("fsas-first-login-ssh-key")) + slog.Debug("Driver ", "FSAS first login SSH key", d.FirstLoginSshKey) + return d.checkConfig() } @@ -520,6 +529,10 @@ func (d *Driver) checkConfig() error { return fmt.Errorf(errorMandatoryOption, "OS image name", "--fsas-os-image-name") } + if d.FirstLoginSshKey == "" { + return fmt.Errorf(errorMandatoryOption, "First login SSH key", "--fsas-first-login-ssh-key") + } + if err := d.FabricManager.ValidateTenant(d.TenantUuid, d.Keycloak.GetToken()); err != nil { slog.Error("tenant_uuid validation unsuccessful", "err", err) return err diff --git a/pkg/drivers/fsas/fsas_test.go b/pkg/drivers/fsas/fsas_test.go index 587df4d..773e9c9 100644 --- a/pkg/drivers/fsas/fsas_test.go +++ b/pkg/drivers/fsas/fsas_test.go @@ -107,6 +107,7 @@ func TestSetConfigFromFlagsTrimsWhitespace(t *testing.T) { "fsas-image-os-ssh-host-pub-key": " " + hostPublicKey + " ", "fsas-sles-registration-code": "", "fsas-sles-registration-email": "", + "fsas-first-login-ssh-key": "111-222-333", }, } @@ -291,6 +292,7 @@ func TestCheckConfigTenantSuccess(t *testing.T) { OsImageName: "Ubuntu", UserDataFile: "userData.json", OsImageSshHostPubKey: hostPublicKey, + FirstLoginSshKey: "111-222-333", } driver.SSHUser = "user" @@ -325,6 +327,7 @@ func TestCheckConfigEmptySshHostPubKey(t *testing.T) { OsImageName: "Ubuntu", UserDataFile: "userData.json", OsImageSshHostPubKey: "", + FirstLoginSshKey: "111-222-333", } driver.SSHUser = "user" @@ -358,6 +361,7 @@ func TestCheckConfigInvalidSshHostPubKey(t *testing.T) { OsImageName: "Ubuntu", UserDataFile: "userData.json", OsImageSshHostPubKey: "not-a-valid ssh-key", + FirstLoginSshKey: "111-222-333", } driver.SSHUser = "user" @@ -393,6 +397,7 @@ func TestCheckConfig_SlesParamsFail(t *testing.T) { UserDataFile: "userData.json", OsImageSshHostPubKey: hostPublicKey, SlesRegistrationCode: "123", + FirstLoginSshKey: "111-222-333", } driver.SSHUser = "user" @@ -460,6 +465,7 @@ func TestCheckConfigTenantFailed(t *testing.T) { TenantUuid: "cdi-test", OsImageName: "Ubuntu", UserDataFile: "userData.json", + FirstLoginSshKey: "111-222-333", } driver.SSHUser = "user"