Skip to content

Commit 3fc5d3d

Browse files
prprachiMonica Joshi
authored andcommitted
Added - Support for Pull Request - settings and protected branches
1 parent 5fd8f0f commit 3fc5d3d

32 files changed

+2789
-5
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
variable "branch_name" {
2+
default = "<branch_name>"
3+
}
4+
variable "repository_id" {
5+
}
6+
variable "project_id" {
7+
}
8+
variable "repository_setting_merge_checks_last_build_succeeded"{
9+
default = "DISABLED"
10+
}
11+
variable "repository_setting_approval_rules_items_min_approvals_count" {
12+
default = 1
13+
}
14+
15+
resource "oci_devops_repository_protected_branch_management" "test_repository_protected_branch_management" {
16+
#Required
17+
branch_name = var.branch_name
18+
repository_id = var.repository_id
19+
20+
#Optional
21+
# protection_levels = <protection_levels>
22+
}
23+
24+
resource "oci_devops_project_repository_setting" "test_project_repository_setting" {
25+
#Required
26+
project_id = var.project_id
27+
28+
#Optional
29+
approval_rules {
30+
#Required
31+
items {
32+
#Required
33+
min_approvals_count = var.repository_setting_approval_rules_items_min_approvals_count
34+
name = "ApprovalRuleName"
35+
36+
#Optional
37+
destination_branch = var.branch_name
38+
reviewers {
39+
#Required
40+
principal_id = <reviewers>
41+
}
42+
}
43+
}
44+
merge_settings {
45+
#Required
46+
allowed_merge_strategies = ["MERGE_COMMIT", "FAST_FORWARD"]
47+
default_merge_strategy = "MERGE_COMMIT"
48+
}
49+
}
50+
51+
resource "oci_devops_repository_setting" "test_repository_setting" {
52+
#Required
53+
repository_id = var.repository_id
54+
55+
#Optional
56+
approval_rules {
57+
#Required
58+
items {
59+
#Required
60+
min_approvals_count = var.repository_setting_approval_rules_items_min_approvals_count
61+
name = "ApprovalName"
62+
63+
#Optional
64+
destination_branch = var.branch_name
65+
reviewers {
66+
#Required
67+
principal_id = "<principal_id>"
68+
}
69+
}
70+
}
71+
merge_checks {
72+
#Required
73+
last_build_succeeded = var.repository_setting_merge_checks_last_build_succeeded
74+
}
75+
merge_settings {
76+
#Required
77+
allowed_merge_strategies = ["MERGE_COMMIT", "FAST_FORWARD"]
78+
default_merge_strategy = "MERGE_COMMIT"
79+
}
80+
}
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
// Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package integrationtest
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"strconv"
10+
"testing"
11+
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
14+
"github.com/oracle/oci-go-sdk/v65/common"
15+
oci_devops "github.com/oracle/oci-go-sdk/v65/devops"
16+
17+
"github.com/oracle/terraform-provider-oci/httpreplay"
18+
"github.com/oracle/terraform-provider-oci/internal/acctest"
19+
tf_client "github.com/oracle/terraform-provider-oci/internal/client"
20+
"github.com/oracle/terraform-provider-oci/internal/resourcediscovery"
21+
"github.com/oracle/terraform-provider-oci/internal/tfresource"
22+
"github.com/oracle/terraform-provider-oci/internal/utils"
23+
)
24+
25+
var (
26+
DevopsProjectRepositorySettingRequiredOnlyResource = DevopsProjectRepositorySettingResourceDependencies +
27+
acctest.GenerateResourceFromRepresentationMap("oci_devops_project_repository_setting", "test_project_repository_setting", acctest.Required, acctest.Create, DevopsProjectRepositorySettingRepresentation)
28+
29+
DevopsProjectRepositorySettingResourceConfig = DevopsProjectRepositorySettingResourceDependencies +
30+
acctest.GenerateResourceFromRepresentationMap("oci_devops_project_repository_setting", "test_project_repository_setting", acctest.Optional, acctest.Update, DevopsProjectRepositorySettingRepresentation)
31+
32+
DevopsProjectRepositorySettingSingularDataSourceRepresentation = map[string]interface{}{
33+
"project_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_devops_project.test_project.id}`},
34+
}
35+
36+
DevopsProjectRepositorySettingRepresentation = map[string]interface{}{
37+
"project_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_devops_project.test_project.id}`},
38+
"approval_rules": acctest.RepresentationGroup{RepType: acctest.Optional, Group: DevopsProjectRepositorySettingApprovalRulesRepresentation},
39+
"merge_settings": acctest.RepresentationGroup{RepType: acctest.Optional, Group: DevopsProjectRepositorySettingMergeSettingsRepresentation},
40+
}
41+
DevopsProjectRepositorySettingApprovalRulesRepresentation = map[string]interface{}{
42+
"items": acctest.RepresentationGroup{RepType: acctest.Required, Group: DevopsProjectRepositorySettingApprovalRulesItemsRepresentation},
43+
}
44+
DevopsProjectRepositorySettingMergeSettingsRepresentation = map[string]interface{}{
45+
"allowed_merge_strategies": acctest.Representation{RepType: acctest.Required, Create: []string{`MERGE_COMMIT`}, Update: []string{`FAST_FORWARD`}},
46+
"default_merge_strategy": acctest.Representation{RepType: acctest.Required, Create: `MERGE_COMMIT`, Update: `FAST_FORWARD`},
47+
}
48+
DevopsProjectRepositorySettingApprovalRulesItemsRepresentation = map[string]interface{}{
49+
"min_approvals_count": acctest.Representation{RepType: acctest.Required, Create: `1`, Update: `1`},
50+
"name": acctest.Representation{RepType: acctest.Required, Create: `name`, Update: `name2`},
51+
"destination_branch": acctest.Representation{RepType: acctest.Optional, Create: `main`, Update: `main`},
52+
"reviewers": acctest.RepresentationGroup{RepType: acctest.Optional, Group: DevopsProjectRepositorySettingApprovalRulesItemsReviewersRepresentation},
53+
}
54+
DevopsProjectRepositorySettingApprovalRulesItemsReviewersRepresentation = map[string]interface{}{
55+
"principal_id": acctest.Representation{RepType: acctest.Required, Create: `${var.principal_ocid}`},
56+
}
57+
58+
DevopsProjectRepositorySettingResourceDependencies = acctest.GenerateResourceFromRepresentationMap("oci_devops_project", "test_project", acctest.Required, acctest.Create, DevopsProjectRepresentation) +
59+
acctest.GenerateResourceFromRepresentationMap("oci_ons_notification_topic", "test_notification_topic", acctest.Required, acctest.Create, OnsNotificationTopicRepresentation)
60+
)
61+
62+
// issue-routing-tag: devops/default
63+
func TestDevopsProjectRepositorySettingResource_basic(t *testing.T) {
64+
httpreplay.SetScenario("TestDevopsProjectRepositorySettingResource_basic")
65+
defer httpreplay.SaveScenario()
66+
67+
config := acctest.ProviderTestConfig()
68+
69+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
70+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
71+
72+
principalId := utils.GetEnvSettingWithBlankDefault("principal_ocid")
73+
principalIdVariableStr := fmt.Sprintf("variable \"principal_ocid\" { default = \"%s\" }\n", principalId)
74+
75+
resourceName := "oci_devops_project_repository_setting.test_project_repository_setting"
76+
77+
singularDatasourceName := "data.oci_devops_project_repository_setting.test_project_repository_setting"
78+
79+
var resId, resId2 string
80+
// Save TF content to Create resource with optional properties. This has to be exactly the same as the config part in the "create with optionals" step in the test.
81+
acctest.SaveConfigContent(config+compartmentIdVariableStr+DevopsProjectRepositorySettingResourceDependencies+principalIdVariableStr+
82+
acctest.GenerateResourceFromRepresentationMap("oci_devops_project_repository_setting", "test_project_repository_setting", acctest.Optional, acctest.Create, DevopsProjectRepositorySettingRepresentation), "devops", "projectRepositorySetting", t)
83+
84+
acctest.ResourceTest(t, testAccCheckDevopsProjectRepositorySettingDestroy, []resource.TestStep{
85+
// verify Create
86+
{
87+
Config: config + compartmentIdVariableStr + DevopsProjectRepositorySettingResourceDependencies +
88+
acctest.GenerateResourceFromRepresentationMap("oci_devops_project_repository_setting", "test_project_repository_setting", acctest.Required, acctest.Create, DevopsProjectRepositorySettingRepresentation),
89+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
90+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
91+
92+
func(s *terraform.State) (err error) {
93+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
94+
return err
95+
},
96+
),
97+
},
98+
99+
// delete before next Create
100+
{
101+
Config: config + compartmentIdVariableStr + DevopsProjectRepositorySettingResourceDependencies,
102+
},
103+
// verify Create with optionals
104+
{
105+
Config: config + compartmentIdVariableStr + principalIdVariableStr + DevopsProjectRepositorySettingResourceDependencies +
106+
acctest.GenerateResourceFromRepresentationMap("oci_devops_project_repository_setting", "test_project_repository_setting", acctest.Optional, acctest.Create, DevopsProjectRepositorySettingRepresentation),
107+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
108+
resource.TestCheckResourceAttr(resourceName, "approval_rules.#", "1"),
109+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.#", "1"),
110+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.0.destination_branch", "main"),
111+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.0.min_approvals_count", "1"),
112+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.0.name", "name"),
113+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.0.reviewers.#", "1"),
114+
resource.TestCheckResourceAttrSet(resourceName, "approval_rules.0.items.0.reviewers.0.principal_id"),
115+
resource.TestCheckResourceAttr(resourceName, "merge_settings.#", "1"),
116+
resource.TestCheckResourceAttr(resourceName, "merge_settings.0.allowed_merge_strategies.#", "1"),
117+
resource.TestCheckResourceAttr(resourceName, "merge_settings.0.default_merge_strategy", "MERGE_COMMIT"),
118+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
119+
120+
func(s *terraform.State) (err error) {
121+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
122+
if isEnableExportCompartment, _ := strconv.ParseBool(utils.GetEnvSettingWithDefault("enable_export_compartment", "true")); isEnableExportCompartment {
123+
if errExport := resourcediscovery.TestExportCompartmentWithResourceName(&resId, &compartmentId, resourceName); errExport != nil {
124+
return errExport
125+
}
126+
}
127+
return err
128+
},
129+
),
130+
},
131+
132+
// verify updates to updatable parameters
133+
{
134+
Config: config + compartmentIdVariableStr + DevopsProjectRepositorySettingResourceDependencies + principalIdVariableStr +
135+
acctest.GenerateResourceFromRepresentationMap("oci_devops_project_repository_setting", "test_project_repository_setting", acctest.Optional, acctest.Update, DevopsProjectRepositorySettingRepresentation),
136+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
137+
resource.TestCheckResourceAttr(resourceName, "approval_rules.#", "1"),
138+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.#", "1"),
139+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.0.destination_branch", "main"),
140+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.0.min_approvals_count", "1"),
141+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.0.name", "name2"),
142+
resource.TestCheckResourceAttr(resourceName, "approval_rules.0.items.0.reviewers.#", "1"),
143+
resource.TestCheckResourceAttrSet(resourceName, "approval_rules.0.items.0.reviewers.0.principal_id"),
144+
resource.TestCheckResourceAttr(resourceName, "merge_settings.#", "1"),
145+
resource.TestCheckResourceAttr(resourceName, "merge_settings.0.allowed_merge_strategies.#", "1"),
146+
resource.TestCheckResourceAttr(resourceName, "merge_settings.0.default_merge_strategy", "FAST_FORWARD"),
147+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
148+
149+
func(s *terraform.State) (err error) {
150+
resId2, err = acctest.FromInstanceState(s, resourceName, "id")
151+
if resId != resId2 {
152+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
153+
}
154+
return err
155+
},
156+
),
157+
},
158+
// verify singular datasource
159+
{
160+
Config: config +
161+
acctest.GenerateDataSourceFromRepresentationMap("oci_devops_project_repository_setting", "test_project_repository_setting", acctest.Required, acctest.Create, DevopsProjectRepositorySettingSingularDataSourceRepresentation) +
162+
compartmentIdVariableStr + DevopsProjectRepositorySettingResourceConfig + principalIdVariableStr,
163+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
164+
resource.TestCheckResourceAttrSet(singularDatasourceName, "project_id"),
165+
166+
resource.TestCheckResourceAttr(singularDatasourceName, "approval_rules.#", "1"),
167+
resource.TestCheckResourceAttr(singularDatasourceName, "approval_rules.0.items.#", "1"),
168+
resource.TestCheckResourceAttr(singularDatasourceName, "approval_rules.0.items.0.destination_branch", "main"),
169+
resource.TestCheckResourceAttr(singularDatasourceName, "approval_rules.0.items.0.min_approvals_count", "1"),
170+
resource.TestCheckResourceAttr(singularDatasourceName, "approval_rules.0.items.0.name", "name2"),
171+
resource.TestCheckResourceAttr(singularDatasourceName, "approval_rules.0.items.0.reviewers.#", "1"),
172+
resource.TestCheckResourceAttrSet(singularDatasourceName, "approval_rules.0.items.0.reviewers.0.principal_name"),
173+
resource.TestCheckResourceAttrSet(singularDatasourceName, "approval_rules.0.items.0.reviewers.0.principal_state"),
174+
resource.TestCheckResourceAttrSet(singularDatasourceName, "approval_rules.0.items.0.reviewers.0.principal_type"),
175+
resource.TestCheckResourceAttr(singularDatasourceName, "merge_settings.#", "1"),
176+
resource.TestCheckResourceAttr(singularDatasourceName, "merge_settings.0.allowed_merge_strategies.#", "1"),
177+
resource.TestCheckResourceAttr(singularDatasourceName, "merge_settings.0.default_merge_strategy", "FAST_FORWARD"),
178+
),
179+
},
180+
// verify resource import
181+
{
182+
Config: config + DevopsProjectRepositorySettingRequiredOnlyResource,
183+
ImportState: true,
184+
ImportStateVerify: true,
185+
ImportStateVerifyIgnore: []string{},
186+
ResourceName: resourceName,
187+
},
188+
})
189+
}
190+
191+
func testAccCheckDevopsProjectRepositorySettingDestroy(s *terraform.State) error {
192+
noResourceFound := true
193+
client := acctest.TestAccProvider.Meta().(*tf_client.OracleClients).DevopsClient()
194+
for _, rs := range s.RootModule().Resources {
195+
if rs.Type == "oci_devops_project_repository_setting" {
196+
noResourceFound = false
197+
request := oci_devops.GetProjectRepositorySettingsRequest{}
198+
199+
if value, ok := rs.Primary.Attributes["project_id"]; ok {
200+
request.ProjectId = &value
201+
}
202+
203+
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(true, "devops")
204+
205+
_, err := client.GetProjectRepositorySettings(context.Background(), request)
206+
207+
if err == nil {
208+
return fmt.Errorf("resource still exists")
209+
}
210+
211+
//Verify that exception is for '404 not found'.
212+
if failure, isServiceError := common.IsServiceError(err); !isServiceError || failure.GetHTTPStatusCode() != 404 {
213+
return err
214+
}
215+
}
216+
}
217+
if noResourceFound {
218+
return fmt.Errorf("at least one resource was expected from the state file, but could not be found")
219+
}
220+
221+
return nil
222+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package integrationtest
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
"github.com/oracle/terraform-provider-oci/httpreplay"
12+
"github.com/oracle/terraform-provider-oci/internal/acctest"
13+
14+
"github.com/oracle/terraform-provider-oci/internal/utils"
15+
)
16+
17+
var (
18+
DevopsRepositoryProtectedBranchManagementRequiredOnlyResource = DevopsRepositoryProtectedBranchManagementResourceDependencies +
19+
acctest.GenerateResourceFromRepresentationMap("oci_devops_repository_protected_branch_management", "test_repository_protected_branch_management", acctest.Required, acctest.Create, DevopsRepositoryProtectedBranchManagementRepresentation)
20+
21+
DevopsRepositoryProtectedBranchManagementRepresentation = map[string]interface{}{
22+
"branch_name": acctest.Representation{RepType: acctest.Required, Create: `refs/heads/main`},
23+
"repository_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_devops_repository.test_repository.id}`},
24+
"protection_levels": acctest.Representation{RepType: acctest.Optional, Create: []string{`READ_ONLY`}, Update: []string{`PULL_REQUEST_MERGE_ONLY`}},
25+
}
26+
27+
DevopsRepositoryProtectedBranchManagementResourceDependencies = acctest.GenerateResourceFromRepresentationMap("oci_devops_project", "test_project", acctest.Required, acctest.Create, DevopsProjectRepresentation) +
28+
acctest.GenerateResourceFromRepresentationMap("oci_devops_repository", "test_repository", acctest.Required, acctest.Create, DevopsRepositoryRepresentation) +
29+
acctest.GenerateResourceFromRepresentationMap("oci_ons_notification_topic", "test_notification_topic", acctest.Required, acctest.Create, OnsNotificationTopicRepresentation)
30+
)
31+
32+
// issue-routing-tag: devops/default
33+
func TestDevopsRepositoryProtectedBranchManagementResource_basic(t *testing.T) {
34+
httpreplay.SetScenario("TestDevopsRepositoryProtectedBranchManagementResource_basic")
35+
defer httpreplay.SaveScenario()
36+
37+
config := acctest.ProviderTestConfig()
38+
39+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
40+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
41+
42+
resourceName := "oci_devops_repository_protected_branch_management.test_repository_protected_branch_management"
43+
44+
// Save TF content to Create resource with optional properties. This has to be exactly the same as the config part in the "create with optionals" step in the test.
45+
acctest.SaveConfigContent(config+compartmentIdVariableStr+DevopsRepositoryProtectedBranchManagementResourceDependencies+
46+
acctest.GenerateResourceFromRepresentationMap("oci_devops_repository_protected_branch_management", "test_repository_protected_branch_management", acctest.Required, acctest.Create, DevopsRepositoryProtectedBranchManagementRepresentation), "devops", "repositoryProtectedBranchManagement", t)
47+
48+
acctest.ResourceTest(t, nil, []resource.TestStep{
49+
// verify Create
50+
{
51+
Config: config + compartmentIdVariableStr + DevopsRepositoryProtectedBranchManagementResourceDependencies +
52+
acctest.GenerateResourceFromRepresentationMap("oci_devops_repository_protected_branch_management", "test_repository_protected_branch_management", acctest.Required, acctest.Create, DevopsRepositoryProtectedBranchManagementRepresentation),
53+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
54+
resource.TestCheckResourceAttr(resourceName, "branch_name", "refs/heads/main"),
55+
resource.TestCheckResourceAttrSet(resourceName, "repository_id"),
56+
),
57+
},
58+
59+
// delete before next Create
60+
{
61+
Config: config + compartmentIdVariableStr + DevopsRepositoryProtectedBranchManagementResourceDependencies,
62+
},
63+
// verify Create with optionals
64+
{
65+
Config: config + compartmentIdVariableStr + DevopsRepositoryProtectedBranchManagementResourceDependencies +
66+
acctest.GenerateResourceFromRepresentationMap("oci_devops_repository_protected_branch_management", "test_repository_protected_branch_management", acctest.Optional, acctest.Create, DevopsRepositoryProtectedBranchManagementRepresentation),
67+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
68+
resource.TestCheckResourceAttr(resourceName, "branch_name", "refs/heads/main"),
69+
resource.TestCheckResourceAttr(resourceName, "protection_levels.#", "1"),
70+
resource.TestCheckResourceAttrSet(resourceName, "repository_id"),
71+
),
72+
},
73+
// verify update with optionals
74+
{
75+
Config: config + compartmentIdVariableStr + DevopsRepositoryProtectedBranchManagementResourceDependencies +
76+
acctest.GenerateResourceFromRepresentationMap("oci_devops_repository_protected_branch_management", "test_repository_protected_branch_management", acctest.Optional, acctest.Update, DevopsRepositoryProtectedBranchManagementRepresentation),
77+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
78+
resource.TestCheckResourceAttr(resourceName, "branch_name", "refs/heads/main"),
79+
resource.TestCheckResourceAttr(resourceName, "protection_levels.#", "1"),
80+
resource.TestCheckResourceAttrSet(resourceName, "repository_id"),
81+
),
82+
},
83+
})
84+
}

0 commit comments

Comments
 (0)