mirror of
https://github.com/hashicorp/packer.git
synced 2026-09-20 23:11:40 -04:00
When trying to validate that a particular file exists after a run of Packer in a test suite, we can use the FileExists checker that we provide as part of the gadgets we added for the acceptance test suites. This approach works well, but only if we can extract a file name reliably from the output of Packer core, or if we know what to look for exactly beforehand. For other cases with a generated name however, the FileExists checker is not enough, and therefore to accomodate for those cases, we are introducing a new checker for this purpose: FileGlob. FileGlob, as its name suggests, runs a glob expression on the filesystem, and returns an error if no match was found regarding this glob expression.
60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package check
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
type fileExists struct {
|
|
filepath string
|
|
isDir bool
|
|
}
|
|
|
|
func (fe fileExists) Check(_, _ string, _ error) error {
|
|
st, err := os.Stat(fe.filepath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to stat %q: %s", fe.filepath, err)
|
|
}
|
|
|
|
if st.IsDir() && !fe.isDir {
|
|
return fmt.Errorf("file %q is a directory, wasn't supposed to be", fe.filepath)
|
|
}
|
|
|
|
if !st.IsDir() && fe.isDir {
|
|
return fmt.Errorf("file %q is not a directory, was supposed to be", fe.filepath)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func FileExists(filePath string, isDir bool) Checker {
|
|
return fileExists{
|
|
filepath: filePath,
|
|
isDir: isDir,
|
|
}
|
|
}
|
|
|
|
type fileGlob struct {
|
|
filepath string
|
|
}
|
|
|
|
func (fe fileGlob) Check(_, _ string, _ error) error {
|
|
matches, err := filepath.Glob(fe.filepath)
|
|
if err != nil {
|
|
return fmt.Errorf("error evaluating file glob pattern %q: %v", fe.filepath, err)
|
|
}
|
|
|
|
if len(matches) == 0 {
|
|
return fmt.Errorf("no matches found for file glob pattern %q", fe.filepath)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func FileGlob(filename string) Checker {
|
|
return fileGlob{
|
|
filepath: filename,
|
|
}
|
|
}
|