Skip to content

Commit 77ee0b1

Browse files
authored
EE Fix/support management repo policies (#1588)
* support management policy repo in EE
1 parent b43944e commit 77ee0b1

File tree

10 files changed

+83
-19
lines changed

10 files changed

+83
-19
lines changed

cli/cmd/digger/default.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"github.com/diggerhq/digger/cli/pkg/digger"
66
"github.com/diggerhq/digger/cli/pkg/drift"
77
"github.com/diggerhq/digger/cli/pkg/github"
8+
"github.com/diggerhq/digger/cli/pkg/policy"
89
"github.com/diggerhq/digger/cli/pkg/usage"
910
comment_updater "github.com/diggerhq/digger/libs/comment_utils/summary"
1011
dg_github "github.com/diggerhq/digger/libs/orchestrator/github"
@@ -23,7 +24,7 @@ var defaultCmd = &cobra.Command{
2324
switch ci {
2425
case digger.GitHub:
2526
logLeader = os.Getenv("GITHUB_ACTOR")
26-
github.GitHubCI(lock, PolicyChecker, BackendApi, ReportStrategy, dg_github.GithubServiceProviderBasic{}, comment_updater.CommentUpdaterProviderBasic{}, drift.DriftNotificationProviderBasic{})
27+
github.GitHubCI(lock, policy.PolicyCheckerProviderBasic{}, BackendApi, ReportStrategy, dg_github.GithubServiceProviderBasic{}, comment_updater.CommentUpdaterProviderBasic{}, drift.DriftNotificationProviderBasic{})
2728
case digger.None:
2829
print("No CI detected.")
2930
os.Exit(10)

cli/cmd/digger/root.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"github.com/diggerhq/digger/cli/pkg/bitbucket"
77
core_backend "github.com/diggerhq/digger/cli/pkg/core/backend"
88
core_policy "github.com/diggerhq/digger/cli/pkg/core/policy"
9-
"github.com/diggerhq/digger/cli/pkg/policy"
109
"github.com/diggerhq/digger/cli/pkg/utils"
1110
"github.com/diggerhq/digger/libs/comment_utils/reporting"
1211
locking2 "github.com/diggerhq/digger/libs/locking"
@@ -90,9 +89,9 @@ func PreRun(cmd *cobra.Command, args []string) {
9089

9190
hostName := os.Getenv("DIGGER_HOSTNAME")
9291
token := os.Getenv("DIGGER_TOKEN")
93-
orgName := os.Getenv("DIGGER_ORGANISATION")
92+
//orgName := os.Getenv("DIGGER_ORGANISATION")
9493
BackendApi = backend.NewBackendApi(hostName, token)
95-
PolicyChecker = policy.NewPolicyChecker(hostName, orgName, token)
94+
//PolicyChecker = policy.NewPolicyChecker(hostName, orgName, token)
9695

9796
if os.Getenv("REPORTING_STRATEGY") == "comments_per_run" || os.Getenv("ACCUMULATE_PLANS") == "true" {
9897
ReportStrategy = &reporting.CommentPerRunStrategy{

cli/pkg/core/policy/policy.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ type Checker interface {
1818
CheckDriftPolicy(SCMOrganisation string, SCMrepository string, projectname string) (bool, error)
1919
}
2020

21+
type PolicyCheckerProvider interface {
22+
Get(hostname string, organisationName string, authToken string) (Checker, error)
23+
}
24+
2125
type AccessPolicyContext struct {
2226
SCMOrganisation string
2327
SCMrepository string

cli/pkg/digger/digger.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func RunJobs(jobs []orchestrator.Job, prService orchestrator.PullRequestService,
8787
}
8888

8989
if !allowedToPerformCommand {
90-
msg := reportPolicyError(job.ProjectName, job.RequestedBy, command, reporter)
90+
msg := reportPolicyError(job.ProjectName, command, job.RequestedBy, reporter)
9191
log.Printf("Skipping command ... %v for project %v", command, job.ProjectName)
9292
log.Println(msg)
9393
appliesPerProject[job.ProjectName] = false

cli/pkg/github/github.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/diggerhq/digger/cli/pkg/digger"
1111
"github.com/diggerhq/digger/cli/pkg/drift"
1212
github_models "github.com/diggerhq/digger/cli/pkg/github/models"
13-
"github.com/diggerhq/digger/cli/pkg/policy"
1413
"github.com/diggerhq/digger/cli/pkg/storage"
1514
"github.com/diggerhq/digger/cli/pkg/usage"
1615
"github.com/diggerhq/digger/cli/pkg/utils"
@@ -31,7 +30,7 @@ import (
3130
"time"
3231
)
3332

34-
func GitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backendApi core_backend.Api, reportingStrategy reporting.ReportStrategy, githubServiceProvider dg_github.GithubServiceProvider, commentUpdaterProvider comment_updater.CommentUpdaterProvider, driftNotifcationProvider drift.DriftNotificationProvider) {
33+
func GitHubCI(lock core_locking.Lock, policyCheckerProvider core_policy.PolicyCheckerProvider, backendApi core_backend.Api, reportingStrategy reporting.ReportStrategy, githubServiceProvider dg_github.GithubServiceProvider, commentUpdaterProvider comment_updater.CommentUpdaterProvider, driftNotifcationProvider drift.DriftNotificationProvider) {
3534
log.Printf("Using GitHub.\n")
3635
githubActor := os.Getenv("GITHUB_ACTOR")
3736
if githubActor != "" {
@@ -40,6 +39,12 @@ func GitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
4039
usage.SendUsageRecord("", "log", "non github initialisation")
4140
}
4241

42+
// default policy checker for backwards compatability, will be overriden in orchestrator flow
43+
hostName := os.Getenv("DIGGER_HOSTNAME")
44+
token := os.Getenv("DIGGER_TOKEN")
45+
orgName := os.Getenv("DIGGER_ORGANISATION")
46+
var policyChecker, _ = policyCheckerProvider.Get(hostName, token, orgName)
47+
4348
ghToken := os.Getenv("GITHUB_TOKEN")
4449
if ghToken == "" {
4550
usage.ReportErrorAndExit(githubActor, "GITHUB_TOKEN is not defined", 1)
@@ -119,7 +124,8 @@ func GitHubCI(lock core_locking.Lock, policyChecker core_policy.Checker, backend
119124
if jobSpec.BackendHostname != "" && jobSpec.BackendOrganisationName != "" && jobSpec.BackendJobToken != "" {
120125
log.Printf("Found settings sent by backend in jobSpec string, overriding backendApi and policyCheckecd r. setting: (orgName: %v BackedHost: %v token: %v)", jobSpec.BackendOrganisationName, jobSpec.BackendHostname, "****")
121126
backendApi = backend.NewBackendApi(jobSpec.BackendHostname, jobSpec.BackendJobToken)
122-
policyChecker = policy.NewPolicyChecker(jobSpec.BackendHostname, jobSpec.BackendOrganisationName, jobSpec.BackendJobToken)
127+
policyChecker, _ = policyCheckerProvider.Get(jobSpec.BackendHostname, jobSpec.BackendOrganisationName, jobSpec.BackendJobToken)
128+
123129
} else {
124130
usage.ReportErrorAndExit(githubActor, fmt.Sprintf("Missing values from job spec: hostname, orgName, token: %v %v", jobSpec.BackendHostname, jobSpec.BackendOrganisationName), 4)
125131
}

cli/pkg/policy/providers.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package policy
2+
3+
import (
4+
core_policy "github.com/diggerhq/digger/cli/pkg/core/policy"
5+
"log"
6+
"net/http"
7+
"os"
8+
)
9+
10+
type PolicyCheckerProviderBasic struct{}
11+
12+
func (p PolicyCheckerProviderBasic) Get(hostname string, organisationName string, authToken string) (core_policy.Checker, error) {
13+
var policyChecker core_policy.Checker
14+
if os.Getenv("NO_BACKEND") == "true" {
15+
log.Println("WARNING: running in 'backendless' mode. No policies will be supported.")
16+
policyChecker = NoOpPolicyChecker{}
17+
} else {
18+
policyChecker = DiggerPolicyChecker{
19+
PolicyProvider: &DiggerHttpPolicyProvider{
20+
DiggerHost: hostname,
21+
DiggerOrganisation: organisationName,
22+
AuthToken: authToken,
23+
HttpClient: http.DefaultClient,
24+
}}
25+
}
26+
return policyChecker, nil
27+
}

ee/cli/cmd/digger/default.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/diggerhq/digger/ee/cli/pkg/comment_updater"
99
"github.com/diggerhq/digger/ee/cli/pkg/drift"
1010
github2 "github.com/diggerhq/digger/ee/cli/pkg/github"
11+
"github.com/diggerhq/digger/ee/cli/pkg/policy"
1112
"github.com/spf13/cobra"
1213
"log"
1314
"os"
@@ -23,7 +24,7 @@ var defaultCmd = &cobra.Command{
2324
switch ci {
2425
case digger.GitHub:
2526
logLeader = os.Getenv("GITHUB_ACTOR")
26-
github.GitHubCI(lock, PolicyChecker, BackendApi, ReportStrategy, github2.GithubServiceProviderAdvanced{}, comment_updater.CommentUpdaterProviderAdvanced{}, drift.DriftNotificationProviderAdvanced{})
27+
github.GitHubCI(lock, policy.PolicyCheckerProviderAdvanced{}, BackendApi, ReportStrategy, github2.GithubServiceProviderAdvanced{}, comment_updater.CommentUpdaterProviderAdvanced{}, drift.DriftNotificationProviderAdvanced{})
2728
case digger.None:
2829
print("No CI detected.")
2930
os.Exit(10)

ee/cli/cmd/digger/root.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ func (r *RunConfig) GetServices() (*orchestrator.PullRequestService, *orchestrat
7878
return &prService, &orgService, &reporter, nil
7979
}
8080

81-
var PolicyChecker core_policy.Checker
8281
var BackendApi core_backend.Api
8382
var ReportStrategy reporting.ReportStrategy
8483
var lock locking.Lock
@@ -87,9 +86,7 @@ func PreRun(cmd *cobra.Command, args []string) {
8786

8887
hostName := os.Getenv("DIGGER_HOSTNAME")
8988
token := os.Getenv("DIGGER_TOKEN")
90-
orgName := os.Getenv("DIGGER_ORGANISATION")
9189
BackendApi = NewBackendApi(hostName, token)
92-
PolicyChecker = NewPolicyChecker(hostName, orgName, token)
9390

9491
if os.Getenv("REPORTING_STRATEGY") == "comments_per_run" || os.Getenv("ACCUMULATE_PLANS") == "true" {
9592
ReportStrategy = &reporting.CommentPerRunStrategy{

ee/cli/pkg/policy/policy.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package policy
33
import (
44
"fmt"
55
"github.com/diggerhq/digger/ee/cli/pkg/utils"
6+
"log"
67
"os"
78
"path"
89
)
@@ -30,19 +31,20 @@ func getContents(filePath string) (string, error) {
3031
return string(contents), nil
3132
}
3233

33-
func (p *DiggerRepoPolicyProvider) getPolicyFileContents(repo string, projectName string, fileName string) (string, error) {
34+
func (p DiggerRepoPolicyProvider) getPolicyFileContents(repo string, projectName string, fileName string) (string, error) {
3435
var contents string
3536
err := utils.CloneGitRepoAndDoAction(p.ManagementRepoUrl, "main", p.GitToken, func(basePath string) error {
3637
orgAccesspath := path.Join(basePath, "policies", fileName)
3738
repoAccesspath := path.Join(basePath, "policies", repo, fileName)
3839
projectAccessPath := path.Join(basePath, "policies", repo, projectName, fileName)
3940

41+
log.Printf("loading repo orgAccess %v repoAccess %v projectAcces %v", orgAccesspath, repoAccesspath, projectAccessPath)
4042
var err error
41-
contents, err = getContents(orgAccesspath)
43+
contents, err = getContents(projectAccessPath)
4244
if os.IsNotExist(err) {
4345
contents, err = getContents(repoAccesspath)
4446
if os.IsNotExist(err) {
45-
contents, err = getContents(projectAccessPath)
47+
contents, err = getContents(orgAccesspath)
4648
if os.IsNotExist(err) {
4749
return nil
4850
} else {
@@ -63,19 +65,19 @@ func (p *DiggerRepoPolicyProvider) getPolicyFileContents(repo string, projectNam
6365
}
6466

6567
// GetPolicy fetches policy for particular project, if not found then it will fallback to org level policy
66-
func (p *DiggerRepoPolicyProvider) GetAccessPolicy(organisation string, repo string, projectName string) (string, error) {
68+
func (p DiggerRepoPolicyProvider) GetAccessPolicy(organisation string, repo string, projectName string) (string, error) {
6769
return p.getPolicyFileContents(repo, projectName, "access.rego")
6870
}
6971

70-
func (p *DiggerRepoPolicyProvider) GetPlanPolicy(organisation string, repo string, projectName string) (string, error) {
72+
func (p DiggerRepoPolicyProvider) GetPlanPolicy(organisation string, repo string, projectName string) (string, error) {
7173
return "", nil
7274
}
7375

74-
func (p *DiggerRepoPolicyProvider) GetDriftPolicy() (string, error) {
76+
func (p DiggerRepoPolicyProvider) GetDriftPolicy() (string, error) {
7577
return "", nil
7678

7779
}
7880

79-
func (p *DiggerRepoPolicyProvider) GetOrganisation() string {
81+
func (p DiggerRepoPolicyProvider) GetOrganisation() string {
8082
return ""
8183
}

ee/cli/pkg/policy/providers.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package policy
2+
3+
import (
4+
"fmt"
5+
core_policy "github.com/diggerhq/digger/cli/pkg/core/policy"
6+
"github.com/diggerhq/digger/cli/pkg/policy"
7+
"os"
8+
)
9+
10+
type PolicyCheckerProviderAdvanced struct{}
11+
12+
func (p PolicyCheckerProviderAdvanced) Get(hostname string, organisationName string, authToken string) (core_policy.Checker, error) {
13+
managementRepo := os.Getenv("DIGGER_MANAGEMENT_REPO")
14+
if managementRepo != "" {
15+
token := os.Getenv("GITHUB_TOKEN")
16+
if token == "" {
17+
return nil, fmt.Errorf("failed to get managent repo policy provider: GITHUB_TOKEN not specified")
18+
}
19+
return policy.DiggerPolicyChecker{
20+
PolicyProvider: DiggerRepoPolicyProvider{
21+
ManagementRepoUrl: managementRepo,
22+
GitToken: token,
23+
},
24+
}, nil
25+
}
26+
return policy.PolicyCheckerProviderBasic{}.Get(hostname, organisationName, authToken)
27+
}

0 commit comments

Comments
 (0)