Skip to content

Commit f5a34a3

Browse files
committed
feat: add import functionality for GitHub enterprise ruleset and update documentation
1 parent 353b601 commit f5a34a3

File tree

3 files changed

+119
-2
lines changed

3 files changed

+119
-2
lines changed

github/resource_github_enterprise_ruleset.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package github
33
import (
44
"context"
55
"errors"
6+
"fmt"
67
"net/http"
78
"strconv"
89

@@ -22,6 +23,10 @@ func resourceGithubEnterpriseRuleset() *schema.Resource {
2223
UpdateContext: resourceGithubEnterpriseRulesetUpdate,
2324
DeleteContext: resourceGithubEnterpriseRulesetDelete,
2425

26+
Importer: &schema.ResourceImporter{
27+
StateContext: resourceGithubEnterpriseRulesetImport,
28+
},
29+
2530
CustomizeDiff: resourceGithubEnterpriseRulesetCustomizeDiff,
2631

2732
Schema: map[string]*schema.Schema{
@@ -958,3 +963,40 @@ func resourceGithubEnterpriseRulesetDelete(ctx context.Context, d *schema.Resour
958963
return nil
959964
}
960965

966+
func resourceGithubEnterpriseRulesetImport(ctx context.Context, d *schema.ResourceData, meta any) ([]*schema.ResourceData, error) {
967+
enterpriseSlug, rulesetIDStr, err := parseTwoPartID(d.Id(), "enterprise_slug", "ruleset_id")
968+
if err != nil {
969+
return []*schema.ResourceData{d}, err
970+
}
971+
972+
rulesetID, err := strconv.ParseInt(rulesetIDStr, 10, 64)
973+
if err != nil {
974+
return []*schema.ResourceData{d}, unconvertibleIdErr(rulesetIDStr, err)
975+
}
976+
if rulesetID == 0 {
977+
return []*schema.ResourceData{d}, fmt.Errorf("`ruleset_id` must be present")
978+
}
979+
980+
tflog.Debug(ctx, "Importing enterprise ruleset", map[string]any{
981+
"enterprise_slug": enterpriseSlug,
982+
"ruleset_id": rulesetID,
983+
})
984+
985+
client := meta.(*Owner).v3client
986+
987+
ruleset, _, err := client.Enterprise.GetRepositoryRuleset(ctx, enterpriseSlug, rulesetID)
988+
if ruleset == nil || err != nil {
989+
return []*schema.ResourceData{d}, err
990+
}
991+
992+
d.SetId(strconv.FormatInt(ruleset.GetID(), 10))
993+
_ = d.Set("enterprise_slug", enterpriseSlug)
994+
995+
tflog.Info(ctx, "Imported enterprise ruleset", map[string]any{
996+
"enterprise_slug": enterpriseSlug,
997+
"ruleset_id": rulesetID,
998+
})
999+
1000+
return []*schema.ResourceData{d}, nil
1001+
}
1002+

github/resource_github_enterprise_ruleset_test.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
88
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
910
)
1011

1112
func TestAccGithubEnterpriseRuleset_basic(t *testing.T) {
@@ -766,3 +767,77 @@ resource "github_enterprise_ruleset" "test" {
766767
})
767768
}
768769

770+
771+
func TestAccGithubEnterpriseRuleset_import(t *testing.T) {
772+
randomID := acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum)
773+
rulesetName := fmt.Sprintf("%s-enterprise-import-%s", testResourcePrefix, randomID)
774+
775+
rulesetHCL := `
776+
resource "github_enterprise_ruleset" "test" {
777+
enterprise_slug = "%s"
778+
name = "%s"
779+
target = "branch"
780+
enforcement = "active"
781+
782+
conditions {
783+
organization_name {
784+
include = ["~ALL"]
785+
exclude = []
786+
}
787+
788+
repository_name {
789+
include = ["~ALL"]
790+
exclude = []
791+
}
792+
793+
ref_name {
794+
include = ["~ALL"]
795+
exclude = []
796+
}
797+
}
798+
799+
rules {
800+
creation = true
801+
}
802+
}
803+
`
804+
config := fmt.Sprintf(rulesetHCL, testAccConf.enterpriseSlug, rulesetName)
805+
806+
resource.Test(t, resource.TestCase{
807+
PreCheck: func() { skipUnlessEnterprise(t) },
808+
Providers: testAccProviders,
809+
Steps: []resource.TestStep{
810+
{
811+
Config: config,
812+
},
813+
{
814+
ResourceName: "github_enterprise_ruleset.test",
815+
ImportState: true,
816+
ImportStateVerify: true,
817+
ImportStateIdFunc: importEnterpriseRulesetByResourcePath("github_enterprise_ruleset.test"),
818+
ImportStateVerifyIgnore: []string{"etag"},
819+
},
820+
},
821+
})
822+
}
823+
824+
func importEnterpriseRulesetByResourcePath(rulesetLogicalName string) resource.ImportStateIdFunc {
825+
return func(s *terraform.State) (string, error) {
826+
ruleset := s.RootModule().Resources[rulesetLogicalName]
827+
if ruleset == nil {
828+
return "", fmt.Errorf("Cannot find %s in terraform state", rulesetLogicalName)
829+
}
830+
831+
rulesetID := ruleset.Primary.ID
832+
if rulesetID == "" {
833+
return "", fmt.Errorf("ruleset %s does not have an id in terraform state", rulesetLogicalName)
834+
}
835+
836+
enterpriseSlug := ruleset.Primary.Attributes["enterprise_slug"]
837+
if enterpriseSlug == "" {
838+
return "", fmt.Errorf("ruleset %s does not have enterprise_slug in terraform state", rulesetLogicalName)
839+
}
840+
841+
return fmt.Sprintf("%s:%s", enterpriseSlug, rulesetID), nil
842+
}
843+
}

website/docs/r/enterprise_ruleset.html.markdown

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -599,8 +599,8 @@ The following additional attributes are exported:
599599

600600
## Import
601601

602-
GitHub Enterprise Rulesets can be imported using the enterprise slug and ruleset ID in the format `{enterprise_slug}/{ruleset_id}`, e.g.
602+
GitHub Enterprise Rulesets can be imported using the enterprise slug and ruleset ID in the format `{enterprise_slug}:{ruleset_id}`, e.g.
603603

604604
```sh
605-
terraform import github_enterprise_ruleset.example my-enterprise/12345
605+
terraform import github_enterprise_ruleset.example my-enterprise:12345
606606
```

0 commit comments

Comments
 (0)