Skip to content

Commit

Permalink
check: Verify number of documentation files for Terraform Registry st…
Browse files Browse the repository at this point in the history
…orage limits

Closes #19
  • Loading branch information
bflad committed Dec 17, 2019
1 parent 3d6b017 commit 918210b
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 0 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# v0.2.0

ENHANCEMENTS

* check: Verify number of documentation files for Terraform Registry storage limits

# v0.1.2

BUG FIXES
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ The `tfproviderdocs check` command verifies the Terraform Provider documentation

- Verifies that no invalid directories are found in the documentation directory structure.
- Ensures that there is not a mix (legacy and Terraform Registry) of directory structures, which is not supported during Terraform Registry documentation ingress.
- Verifies number of documentation files is below Terraform Registry storage limits.
- Verifies each file in the documentation directories is valid.

The validity of files is checked with the following rules:
Expand Down
10 changes: 10 additions & 0 deletions check/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ import (
"github.com/hashicorp/go-multierror"
)

const (
// Terraform Registry Storage Limits
// https://www.terraform.io/docs/registry/providers/docs.html#storage-limits
RegistryMaximumNumberOfFiles = 1000
)

type Check struct {
Options *CheckOptions
}
Expand Down Expand Up @@ -43,6 +49,10 @@ func (check *Check) Run(directories map[string][]string) error {
return err
}

if err := NumberOfFilesCheck(directories); err != nil {
return err
}

var result *multierror.Error

if files, ok := directories[RegistryDataSourcesDirectory]; ok {
Expand Down
21 changes: 21 additions & 0 deletions check/directory.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package check

import (
"fmt"
"log"
"path/filepath"

"github.com/bmatcuk/doublestar"
Expand Down Expand Up @@ -77,6 +78,26 @@ func MixedDirectoriesCheck(directories map[string][]string) error {
return nil
}

// NumberOfFilesCheck verifies that documentation is below the Terraform Registry storage limit.
// This check presumes that all provided directories are valid, e.g. that directory checking
// for invalid or mixed directory structures was previously completed.
func NumberOfFilesCheck(directories map[string][]string) error {
var numberOfFiles int

for directory, files := range directories {
directoryNumberOfFiles := len(files)
log.Printf("[TRACE] Found %d documentation files in directory: %s", directoryNumberOfFiles, directory)
numberOfFiles = numberOfFiles + directoryNumberOfFiles
}

log.Printf("[DEBUG] Found %d documentation files with limit of %d", numberOfFiles, RegistryMaximumNumberOfFiles)
if numberOfFiles >= RegistryMaximumNumberOfFiles {
return fmt.Errorf("exceeded maximum (%d) number of documentation files for Terraform Registry: %d", RegistryMaximumNumberOfFiles, numberOfFiles)
}

return nil
}

func GetDirectories(basepath string) (map[string][]string, error) {
globPattern := DocumentationGlobPattern

Expand Down
57 changes: 57 additions & 0 deletions check/directory_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package check

import (
"fmt"
"testing"
)

func TestNumberOfFilesCheck(t *testing.T) {
testCases := []struct {
Name string
Directories map[string][]string
ExpectError bool
}{
{
Name: "under limit",
Directories: testGenerateDirectories(RegistryMaximumNumberOfFiles - 1),
},
{
Name: "at limit",
Directories: testGenerateDirectories(RegistryMaximumNumberOfFiles),
ExpectError: true,
},
{
Name: "over limit",
Directories: testGenerateDirectories(RegistryMaximumNumberOfFiles + 1),
ExpectError: true,
},
}

for _, testCase := range testCases {
t.Run(testCase.Name, func(t *testing.T) {
got := NumberOfFilesCheck(testCase.Directories)

if got == nil && testCase.ExpectError {
t.Errorf("expected error, got no error")
}

if got != nil && !testCase.ExpectError {
t.Errorf("expected no error, got error: %s", got)
}
})
}
}

func testGenerateDirectories(numberOfFiles int) map[string][]string {
files := make([]string, numberOfFiles)

for i := 0; i < numberOfFiles; i++ {
files[i] = fmt.Sprintf("thing%d.md", i)
}

directories := map[string][]string{
"docs/resources": files,
}

return directories
}

0 comments on commit 918210b

Please sign in to comment.