Skip to content

Commit

Permalink
merge user_repo_configs and org_repo_configs into repo_configs
Browse files Browse the repository at this point in the history
  • Loading branch information
kobtea committed Jan 3, 2023
1 parent 5b2d627 commit 14b5f1a
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 92 deletions.
37 changes: 3 additions & 34 deletions check/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ func Check(ctx context.Context, cfg *config.Config) error {
return err
}
for _, ghConfig := range cfg.GithubConfigs {
for _, userRepoConfig := range ghConfig.UserRepoConfigs {
for _, ConftestConfig := range userRepoConfig.ConftestConfigs {
for _, repoConfig := range ghConfig.RepoConfigs {
for _, ConftestConfig := range repoConfig.ConftestConfigs {
var prefix string
var glob string
if ConftestConfig.Target == config.TargetRepo {
Expand All @@ -35,38 +35,7 @@ func Check(ctx context.Context, cfg *config.Config) error {
return fmt.Errorf("invalid target type: %s", ConftestConfig.Target)
}

files, err := st.ListRepoPaths(prefix, ghConfig.Domain(), userRepoConfig.Name, userRepoConfig.Regex.Regexp, glob)
if err != nil {
return err
}
r := runner.TestRunner{
AllNamespaces: true,
Combine: ConftestConfig.Combine,
Policy: ConftestConfig.Policies,
}
logger.Debugw("conftest", "policy", ConftestConfig.Policies, "input", files)
res, err := r.Run(ctx, files)
if err != nil {
return err
}
result = append(result, res...)
}
}
for _, orgRepoConfig := range ghConfig.OrgRepoConfigs {
for _, ConftestConfig := range orgRepoConfig.ConftestConfigs {
var prefix string
var glob string
if ConftestConfig.Target == config.TargetRepo {
prefix = storage.MetadataDirname
glob = storage.RepoFilename
} else if ConftestConfig.Target == config.TargetSrc {
prefix = storage.SourceDirname
glob = ConftestConfig.Input
} else {
return fmt.Errorf("invalid target type: %s", ConftestConfig.Target)
}

files, err := st.ListRepoPaths(prefix, ghConfig.Domain(), orgRepoConfig.Name, orgRepoConfig.Regex.Regexp, glob)
files, err := st.ListRepoPaths(prefix, ghConfig.Domain(), repoConfig.Owner, repoConfig.Regex.Regexp, glob)
if err != nil {
return err
}
Expand Down
23 changes: 6 additions & 17 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ type GithubConfig struct {
ApiEndpoint string `yaml:"api_endpoint,omitempty"`
UploadEndpoint string `yaml:"upload_endpoint,omitempty"`
tokenEnvvarName string `yaml:"token_envvar_name"`
UserRepoConfigs []RepoConfig `yaml:"user_repo_configs"`
OrgRepoConfigs []RepoConfig `yaml:"org_repo_configs"`
RepoConfigs []RepoConfig `yaml:"repo_configs"`
}

func (c GithubConfig) Domain() string {
Expand All @@ -48,7 +47,7 @@ func (c GithubConfig) EnvvarName() string {
}

type RepoConfig struct {
Name string `yaml:"name"`
Owner string `yaml:"owner"`
Regex *Regexp `yaml:"regex,omitempty"`
ConftestConfigs []ConftestConfig `yaml:"conftest_configs"`
}
Expand Down Expand Up @@ -98,23 +97,13 @@ func Parse(buf []byte) (*Config, error) {
err := yaml.Unmarshal(buf, &cfg)
// initialize flags in regex
for _, ghConfig := range cfg.GithubConfigs {
for _, userRepoConfig := range ghConfig.UserRepoConfigs {
for _, ConftestConfig := range userRepoConfig.ConftestConfigs {
for _, repoConfig := range ghConfig.RepoConfigs {
for _, ConftestConfig := range repoConfig.ConftestConfigs {
if ConftestConfig.Target == TargetRepo {
userRepoConfig.Regex.UsedWithRepo = true
repoConfig.Regex.UsedWithRepo = true
}
if ConftestConfig.Target == TargetSrc {
userRepoConfig.Regex.UsedWithSrc = true
}
}
}
for _, orgRepoConfig := range ghConfig.OrgRepoConfigs {
for _, ConftestConfig := range orgRepoConfig.ConftestConfigs {
if ConftestConfig.Target == TargetRepo {
orgRepoConfig.Regex.UsedWithRepo = true
}
if ConftestConfig.Target == TargetSrc {
orgRepoConfig.Regex.UsedWithSrc = true
repoConfig.Regex.UsedWithSrc = true
}
}
}
Expand Down
9 changes: 4 additions & 5 deletions example/config.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
working_dir: ./testdata/tmp/
github_configs:
- token_envvar_name: GITHUB_TOKEN
user_repo_configs:
- name: kobtea
repo_configs:
- owner: kobtea
regex: jsonnet
conftest_configs:
- target: repo
Expand All @@ -13,14 +13,13 @@ github_configs:
combine: false
policies:
- ./example/policy/github_actions.rego
- name: kobtea
- owner: kobtea
regex: exporter
conftest_configs:
- target: repo
policies:
- ./example/policy/github_repo.rego
org_repo_configs:
- name: prometheus
- owner: prometheus
regex: node_exporter
conftest_configs:
- target: repo
Expand Down
66 changes: 30 additions & 36 deletions fetch/fetch.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,36 +20,38 @@ func Fetch(ctx context.Context, cfg *config.Config) error {
return err
}
for _, ghConfig := range cfg.GithubConfigs {
userm := map[string][]*config.Regexp{}
for _, userRepoConfig := range ghConfig.UserRepoConfigs {
userm[userRepoConfig.Name] = append(userm[userRepoConfig.Name], userRepoConfig.Regex)
ghOpt := &githubOption{
domain: ghConfig.Domain(),
baseUrl: ghConfig.ApiEndpoint,
uploadUrl: ghConfig.UploadEndpoint,
tokenEnvvarName: ghConfig.EnvvarName(),
}
for user, regexes := range userm {
err := fetchUserRepositories(ctx, storage, user, regexes, &githubOption{
domain: ghConfig.Domain(),
baseUrl: ghConfig.ApiEndpoint,
uploadUrl: ghConfig.UploadEndpoint,
tokenEnvvarName: ghConfig.EnvvarName(),
})
if err != nil {
return err
}
ghCli, err := newClient(ctx, ghOpt)
if err != nil {
return err
}

orgm := map[string][]*config.Regexp{}
for _, orgRepoConfig := range ghConfig.OrgRepoConfigs {
orgm[orgRepoConfig.Name] = append(orgm[orgRepoConfig.Name], orgRepoConfig.Regex)
ownerm := map[string][]*config.Regexp{}
for _, repoConfig := range ghConfig.RepoConfigs {
ownerm[repoConfig.Owner] = append(ownerm[repoConfig.Owner], repoConfig.Regex)
}
for org, regexes := range orgm {
err := fetchOrgRepositories(ctx, storage, org, regexes, &githubOption{
domain: ghConfig.Domain(),
baseUrl: ghConfig.ApiEndpoint,
uploadUrl: ghConfig.UploadEndpoint,
tokenEnvvarName: ghConfig.EnvvarName(),
})
for owner, regexes := range ownerm {
user, _, err := ghCli.Users.Get(ctx, owner)
if err != nil {
return err
}
if *user.Type == "User" {
err := fetchUserRepositories(ctx, storage, owner, regexes, ghCli, ghOpt)
if err != nil {
return err
}
} else if *user.Type == "Organization" {
err := fetchOrgRepositories(ctx, storage, owner, regexes, ghCli, ghOpt)
if err != nil {
return err
}
} else {
return fmt.Errorf("un-supported user type: %s", *user.Type)
}
}
}
if err := storage.DoGc(); err != nil {
Expand Down Expand Up @@ -84,14 +86,10 @@ func newClient(ctx context.Context, option *githubOption) (*github.Client, error
}
}

func fetchUserRepositories(ctx context.Context, storage *storage.Storage, name string, regexes []*config.Regexp, ghOption *githubOption) error {
cli, err := newClient(ctx, ghOption)
if err != nil {
return err
}
func fetchUserRepositories(ctx context.Context, storage *storage.Storage, name string, regexes []*config.Regexp, ghClient *github.Client, ghOption *githubOption) error {
opt := &github.RepositoryListOptions{}
for {
repos, resp, err := cli.Repositories.List(ctx, name, opt)
repos, resp, err := ghClient.Repositories.List(ctx, name, opt)
if err != nil {
return err
}
Expand Down Expand Up @@ -125,14 +123,10 @@ func fetchUserRepositories(ctx context.Context, storage *storage.Storage, name s
return nil
}

func fetchOrgRepositories(ctx context.Context, storage *storage.Storage, name string, regexes []*config.Regexp, ghOption *githubOption) error {
cli, err := newClient(ctx, ghOption)
if err != nil {
return err
}
func fetchOrgRepositories(ctx context.Context, storage *storage.Storage, name string, regexes []*config.Regexp, ghClient *github.Client, ghOption *githubOption) error {
opt := &github.RepositoryListByOrgOptions{}
for {
repos, resp, err := cli.Repositories.ListByOrg(ctx, name, opt)
repos, resp, err := ghClient.Repositories.ListByOrg(ctx, name, opt)
if err != nil {
return err
}
Expand Down

0 comments on commit 14b5f1a

Please sign in to comment.