Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions pkg/cmd/provisioning/nutanix/create_shared_secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func createSharedSecretsCmd() *cobra.Command {

cmd.PersistentFlags().StringVar(&CreateSharedSecretsOpts.CredRequestDir, "credentials-requests-dir", "", "Directory containing files of CredentialsRequests (can be created by running 'oc adm release extract --credentials-requests --cloud=nutanix' against an OpenShift release image)")
cmd.MarkPersistentFlagRequired("credentials-requests-dir")
cmd.PersistentFlags().StringVar(&CreateSharedSecretsOpts.CredentialsSourceFilePath, "credentials-source-filepath", "", "The filepath of the nutanix credentials data. If not specified, will use the default path ~/.nutanix/credentials")
cmd.PersistentFlags().StringVar(&CreateSharedSecretsOpts.CredentialsSourceFilePath, "credentials-source-filepath", "", "The path to the nutanix credentials data file, or the directory containing a file named 'credentials'. If not specified, will use the default path ~/.nutanix/credentials")
cmd.PersistentFlags().StringVar(&CreateSharedSecretsOpts.TargetDir, "output-dir", "", "Directory to place generated files (defaults to current directory)")
cmd.PersistentFlags().BoolVar(&CreateSharedSecretsOpts.EnableTechPreview, "enable-tech-preview", false, "Opt into processing CredentialsRequests marked as tech-preview")

Expand Down Expand Up @@ -87,9 +87,16 @@ func createSecretsCmd(cmd *cobra.Command, args []string) error {

// Retrieve the credentials data
func getCredentialsFromFile(filePath string) (*kubernetes.NutanixCredentials, error) {
if _, err := os.Stat(filePath); err != nil {
fileInfo, err := os.Stat(filePath)
if err != nil {
return nil, errors.Wrapf(err, "source credentials file %s does not exist", filePath)
}
if fileInfo.IsDir() {
filePath = filepath.Join(filePath, "credentials")
if _, err := os.Stat(filePath); err != nil {
return nil, errors.Wrapf(err, "credentials file not found in directory; expected at %s", filePath)
}
}

bytes, err := os.ReadFile(filePath)
if err != nil {
Expand Down
52 changes: 52 additions & 0 deletions pkg/cmd/provisioning/nutanix/create_shared_secrets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,58 @@ func TestCreateSharedSecrets(t *testing.T) {
},
expectedErr: "source credentials file does/not/exist does not exist",
},
{
name: "Directory provided for credentials-source-filepath with credentials file inside",
setup: func(t *testing.T) (credReqDir, targetDir, credentialsSourceFilepath string) {
credReqDir, err := os.MkdirTemp(os.TempDir(), testCredReqDirPrefix)
require.NoError(t, err, "Failed to create temp directory for credentials requests")
testCredentialsRequest(t, "credreq-test", "NutanixProviderSpec", "secret-ns", "secret-name", credReqDir)

targetDir, err = os.MkdirTemp(os.TempDir(), testTargetDirPrefix)
require.NoError(t, err, "Failed to create temp directory for credentials requests")

// Create a directory with a "credentials" file inside it (as the docs describe)
credentialsDir, err := os.MkdirTemp(os.TempDir(), testCredentialsDirPrefix)
require.NoError(t, err, "Failed to create temp directory for credentials")
credentialsFilePath := filepath.Join(credentialsDir, "credentials")
err = os.WriteFile(credentialsFilePath, []byte(getBasicAuthCredentials("username", "password")), 0600)
require.NoError(t, err, "Failed to write credentials file")

// Pass the directory, not the file
credentialsSourceFilepath = credentialsDir
return
},
verify: func(t *testing.T, manifestsDir string) {
files, err := os.ReadDir(manifestsDir)
require.NoError(t, err, "unexpected error listing files in manifestsDir")
assert.Len(t, files, 1, "Should be exactly one file in manifestsDir when directory with credentials file is provided")
contents := getSecretFromFileContents(t, filepath.Join(manifestsDir, files[0].Name()))
assert.Equal(t, "username", contents.PrismCentral.Username)
assert.Equal(t, "password", contents.PrismCentral.Password)
},
expectedErr: "",
},
{
name: "Directory provided for credentials-source-filepath without credentials file inside",
setup: func(t *testing.T) (credReqDir, targetDir, credentialsSourceFilepath string) {
credReqDir, err := os.MkdirTemp(os.TempDir(), testCredReqDirPrefix)
require.NoError(t, err, "Failed to create temp directory for credentials requests")

targetDir, err = os.MkdirTemp(os.TempDir(), testTargetDirPrefix)
require.NoError(t, err, "Failed to create temp directory for credentials requests")

// Pass a directory with no credentials file inside
credentialsSourceFilepath, err = os.MkdirTemp(os.TempDir(), testCredentialsDirPrefix)
require.NoError(t, err, "Failed to create temp directory for credentials")
return
},
verify: func(t *testing.T, manifestsDir string) {
files, err := os.ReadDir(manifestsDir)
require.NoError(t, err, "unexpected error listing files in manifestsDir")
assert.Zero(t, len(files), "Should be no files in manifestsDir when no credentials file in directory")
},
expectedErr: "credentials file not found in directory",
},
{
name: "Non-existent credentials requests directory",
setup: func(t *testing.T) (credReqDir, targetDir, credentialsSourceFilepath string) {
Expand Down