From 3a52bc6ed48a6c3862b9e064851a7aae21cc0587 Mon Sep 17 00:00:00 2001 From: Patrick Marabeas Date: Wed, 13 May 2020 16:18:23 +1000 Subject: [PATCH] Add visibility parameter to repository resource Adds the additional visibility parameter allowing for enterprise accounts to set the repository to be only internally visible. The endpoint is a little sketchy: * an error if trying to update with a visibility value that is the same * auth issues are encountered if trying to create with a visibility value. The parameter needs to be ignored during create, and updated subsequently. Resolves #304 --- github/resource_github_repository.go | 27 +++++++++++++++++++-- github/resource_github_repository_test.go | 29 +++++++++++++++++------ website/docs/r/repository.html.markdown | 2 ++ 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/github/resource_github_repository.go b/github/resource_github_repository.go index 63eb03dc57..5ee0ad6363 100644 --- a/github/resource_github_repository.go +++ b/github/resource_github_repository.go @@ -41,8 +41,17 @@ func resourceGithubRepository() *schema.Resource { Optional: true, }, "private": { - Type: schema.TypeBool, - Optional: true, + Type: schema.TypeBool, + Computed: true, // is affected by "visibility" + Optional: true, + ConflictsWith: []string{"visibility"}, + Deprecated: "use visibility instead", + }, + "visibility": { + Type: schema.TypeString, + Optional: true, + Computed: true, // is affected by "private" + ValidateFunc: validation.StringInSlice([]string{"public", "private", "internal"}, false), }, "has_issues": { Type: schema.TypeBool, @@ -178,6 +187,7 @@ func resourceGithubRepositoryObject(d *schema.ResourceData) *github.Repository { Description: github.String(d.Get("description").(string)), Homepage: github.String(d.Get("homepage_url").(string)), Private: github.Bool(d.Get("private").(bool)), + Visibility: github.String(d.Get("visibility").(string)), HasDownloads: github.Bool(d.Get("has_downloads").(bool)), HasIssues: github.Bool(d.Get("has_issues").(bool)), HasProjects: github.Bool(d.Get("has_projects").(bool)), @@ -204,6 +214,12 @@ func resourceGithubRepositoryCreate(d *schema.ResourceData, meta interface{}) er repoReq := resourceGithubRepositoryObject(d) owner := meta.(*Owner).name + + // Auth issues (403 You need admin access to the organization before adding a repository to it.) + // are encountered when the resources is created with the visibility parameter. As + // resourceGithubRepositoryUpdate is called immediately after, this is subsequently corrected. + repoReq.Visibility = nil + repoName := repoReq.GetName() ctx := context.Background() @@ -300,6 +316,7 @@ func resourceGithubRepositoryRead(d *schema.ResourceData, meta interface{}) erro d.Set("description", repo.GetDescription()) d.Set("homepage_url", repo.GetHomepage()) d.Set("private", repo.GetPrivate()) + d.Set("visibility", repo.GetVisibility()) d.Set("has_issues", repo.GetHasIssues()) d.Set("has_projects", repo.GetHasProjects()) d.Set("has_wiki", repo.GetHasWiki()) @@ -338,6 +355,12 @@ func resourceGithubRepositoryUpdate(d *schema.ResourceData, meta interface{}) er client := meta.(*Owner).v3client repoReq := resourceGithubRepositoryObject(d) + + // The endpoint will throw an error if trying to PATCH with a visibility value that is the same + if !d.HasChange("visibility") { + repoReq.Visibility = nil + } + // Can only set `default_branch` on an already created repository with the target branches ref already in-place if v, ok := d.GetOk("default_branch"); ok { branch := v.(string) diff --git a/github/resource_github_repository_test.go b/github/resource_github_repository_test.go index 82c22e1173..3362135a8d 100644 --- a/github/resource_github_repository_test.go +++ b/github/resource_github_repository_test.go @@ -82,6 +82,7 @@ func TestAccGithubRepository_basic(t *testing.T) { HasProjects: false, DefaultBranch: "master", Archived: false, + Visibility: "public", }), ), }, @@ -100,6 +101,7 @@ func TestAccGithubRepository_basic(t *testing.T) { DefaultBranch: "master", HasProjects: false, Archived: false, + Visibility: "public", }), ), }, @@ -144,6 +146,7 @@ func TestAccGithubRepository_archive(t *testing.T) { HasDownloads: true, DefaultBranch: "master", Archived: true, + Visibility: "public", }), ), }, @@ -188,6 +191,7 @@ func TestAccGithubRepository_archiveUpdate(t *testing.T) { HasDownloads: true, DefaultBranch: "master", Archived: false, + Visibility: "public", }), ), }, @@ -207,6 +211,7 @@ func TestAccGithubRepository_archiveUpdate(t *testing.T) { HasDownloads: true, DefaultBranch: "master", Archived: true, + Visibility: "public", }), ), }, @@ -273,6 +278,7 @@ func TestAccGithubRepository_defaultBranch(t *testing.T) { HasDownloads: true, DefaultBranch: "master", Archived: false, + Visibility: "public", }), ), }, @@ -298,6 +304,7 @@ func TestAccGithubRepository_defaultBranch(t *testing.T) { HasDownloads: true, DefaultBranch: "foo", Archived: false, + Visibility: "public", }), ), }, @@ -345,6 +352,7 @@ func TestAccGithubRepository_templates(t *testing.T) { LicenseTemplate: "ms-pl", GitignoreTemplate: "C++", Archived: false, + Visibility: "public", }), ), }, @@ -397,6 +405,7 @@ func TestAccGithubRepository_topics(t *testing.T) { // non-zero defaults DefaultBranch: "master", + Visibility: "public", AllowMergeCommit: true, AllowSquashMerge: true, AllowRebaseMerge: true, @@ -415,6 +424,7 @@ func TestAccGithubRepository_topics(t *testing.T) { // non-zero defaults DefaultBranch: "master", + Visibility: "public", AllowMergeCommit: true, AllowSquashMerge: true, AllowRebaseMerge: true, @@ -433,6 +443,7 @@ func TestAccGithubRepository_topics(t *testing.T) { // non-zero defaults DefaultBranch: "master", + Visibility: "public", AllowMergeCommit: true, AllowSquashMerge: true, AllowRebaseMerge: true, @@ -520,6 +531,7 @@ type testAccGithubRepositoryExpectedAttributes struct { Description string Homepage string Private bool + Visibility string HasDownloads bool HasIssues bool HasProjects bool @@ -552,6 +564,9 @@ func testAccCheckGithubRepositoryAttributes(repo *github.Repository, want *testA if private := repo.GetPrivate(); private != want.Private { return fmt.Errorf("got private %#v; want %#v", private, want.Private) } + if visibility := repo.GetVisibility(); visibility != want.Visibility { + return fmt.Errorf("got visibility %#v; want %#v", visibility, want.Visibility) + } if hasIssues := repo.GetHasIssues(); hasIssues != want.HasIssues { return fmt.Errorf("got has issues %#v; want %#v", hasIssues, want.HasIssues) } @@ -714,7 +729,7 @@ resource "github_repository" "foo" { # So that acceptance tests can be run in a github organization # with no billing - private = false + visibility = "public" has_issues = true has_wiki = true @@ -746,7 +761,7 @@ resource "github_repository" "foo" { # So that acceptance tests can be run in a github organization # with no billing - private = false + visibility = "public" has_issues = false has_wiki = false @@ -768,7 +783,7 @@ resource "github_repository" "foo" { # So that acceptance tests can be run in a github organization # with no billing - private = false + visibility = "public" has_issues = true has_wiki = true @@ -790,7 +805,7 @@ resource "github_repository" "foo" { # So that acceptance tests can be run in a github organization # with no billing - private = false + visibility = "public" has_issues = true has_wiki = true @@ -813,7 +828,7 @@ resource "github_repository" "foo" { # So that acceptance tests can be run in a github organization # with no billing - private = false + visibility = "public" has_issues = true has_wiki = true @@ -836,7 +851,7 @@ resource "github_repository" "foo" { # So that acceptance tests can be run in a github organization # with no billing - private = false + visibility = "public" has_issues = true has_wiki = true @@ -867,7 +882,7 @@ resource "github_repository" "foo" { # So that acceptance tests can be run in a github organization # with no billing - private = false + visibility = "public" has_issues = true has_wiki = true diff --git a/website/docs/r/repository.html.markdown b/website/docs/r/repository.html.markdown index 4562b5d1fd..e9c9e41395 100644 --- a/website/docs/r/repository.html.markdown +++ b/website/docs/r/repository.html.markdown @@ -38,6 +38,8 @@ The following arguments are supported: * `private` - (Optional) Set to `true` to create a private repository. Repositories are created as public (e.g. open source) by default. + +* `visibility` - (Optional) Can be `public` or `private`. If your organization is associated with an enterprise account using GitHub Enterprise Cloud or GitHub Enterprise Server 2.20+, visibility can also be `internal`. The `visibility` parameter overrides the `private` parameter. * `has_issues` - (Optional) Set to `true` to enable the GitHub Issues features on the repository.