Skip to content

Commit 80edb21

Browse files
Xiaotong Yansagarp337
authored andcommitted
Added - Support for Resource Scheduler
1 parent 9af3a29 commit 80edb21

20 files changed

+2754
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Overview
2+
This is a Terraform configuration that creates the Resource Scheduler service on Oracle Cloud Infrastructure.
3+
4+
The Terraform code is used to create a Resource Scheduler, that creates the required resources and configures the application on the created resources.

examples/resourcescheduler/main.tf

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
// Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
variable "tenancy_ocid" {}
5+
variable "user_ocid" {}
6+
variable "fingerprint" {}
7+
variable "private_key_path" {}
8+
variable "region" {}
9+
variable "compartment_id" {}
10+
11+
variable "schedule_action" {
12+
default = "START_RESOURCE"
13+
}
14+
15+
variable "schedule_defined_tags_value" {
16+
default = "value"
17+
}
18+
19+
variable "schedule_description" {
20+
default = "description"
21+
}
22+
23+
variable "schedule_display_name" {
24+
default = "displayName"
25+
}
26+
27+
variable "schedule_freeform_tags" {
28+
default = { "Department" = "Finance" }
29+
}
30+
31+
variable "schedule_recurrence_details" {
32+
default = "recurrenceDetails"
33+
}
34+
35+
variable "schedule_recurrence_type" {
36+
default = "CRON"
37+
}
38+
39+
variable "schedule_resource_filters_attribute" {
40+
default = "COMPARTMENT_ID"
41+
}
42+
43+
variable "schedule_resource_filters_condition" {
44+
default = "EQUAL"
45+
}
46+
47+
variable "schedule_resource_filters_should_include_child_compartments" {
48+
default = false
49+
}
50+
51+
variable "schedule_resource_filters_value_namespace" {
52+
default = "namespace"
53+
}
54+
55+
variable "schedule_resource_filters_value_tag_key" {
56+
default = "tagKey"
57+
}
58+
59+
variable "schedule_resource_filters_value_value" {
60+
default = "value"
61+
}
62+
63+
variable "schedule_resources_id" {
64+
default = "id"
65+
}
66+
67+
variable "schedule_resources_metadata" {
68+
default = "metadata"
69+
}
70+
71+
variable "schedule_state" {
72+
default = "AVAILABLE"
73+
}
74+
75+
variable "schedule_time_ends" {
76+
default = "timeEnds"
77+
}
78+
79+
variable "schedule_time_starts" {
80+
default = "timeStarts"
81+
}
82+
83+
84+
85+
provider "oci" {
86+
tenancy_ocid = var.tenancy_ocid
87+
user_ocid = var.user_ocid
88+
fingerprint = var.fingerprint
89+
private_key_path = var.private_key_path
90+
region = var.region
91+
}
92+
93+
resource "oci_resource_scheduler_schedule" "test_schedule" {
94+
#Required
95+
action = var.schedule_action
96+
compartment_id = var.compartment_id
97+
recurrence_details = var.schedule_recurrence_details
98+
recurrence_type = var.schedule_recurrence_type
99+
100+
#Optional
101+
defined_tags = map(oci_identity_tag_namespace.tag-namespace1.name.oci_identity_tag.tag1.name, var.schedule_defined_tags_value)
102+
description = var.schedule_description
103+
display_name = var.schedule_display_name
104+
freeform_tags = var.schedule_freeform_tags
105+
resource_filters {
106+
#Required
107+
attribute = var.schedule_resource_filters_attribute
108+
109+
#Optional
110+
condition = var.schedule_resource_filters_condition
111+
should_include_child_compartments = var.schedule_resource_filters_should_include_child_compartments
112+
value {
113+
114+
#Optional
115+
namespace = var.schedule_resource_filters_value_namespace
116+
tag_key = var.schedule_resource_filters_value_tag_key
117+
value = var.schedule_resource_filters_value_value
118+
}
119+
}
120+
resources {
121+
#Required
122+
id = var.schedule_resources_id
123+
124+
#Optional
125+
metadata = var.schedule_resources_metadata
126+
}
127+
time_ends = var.schedule_time_ends
128+
time_starts = var.schedule_time_starts
129+
}
130+
131+
data "oci_resource_scheduler_schedules" "test_schedules" {
132+
133+
#Optional
134+
compartment_id = var.compartment_id
135+
display_name = var.schedule_display_name
136+
schedule_id = oci_resource_scheduler_schedule.test_schedule.id
137+
state = var.schedule_state
138+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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 client
5+
6+
import (
7+
oci_resource_scheduler "github.com/oracle/oci-go-sdk/v65/resourcescheduler"
8+
9+
oci_common "github.com/oracle/oci-go-sdk/v65/common"
10+
)
11+
12+
func init() {
13+
RegisterOracleClient("oci_resource_scheduler.ScheduleClient", &OracleClient{InitClientFn: initResourceschedulerScheduleClient})
14+
}
15+
16+
func initResourceschedulerScheduleClient(configProvider oci_common.ConfigurationProvider, configureClient ConfigureClient, serviceClientOverrides ServiceClientOverrides) (interface{}, error) {
17+
client, err := oci_resource_scheduler.NewScheduleClientWithConfigurationProvider(configProvider)
18+
if err != nil {
19+
return nil, err
20+
}
21+
err = configureClient(&client.BaseClient)
22+
if err != nil {
23+
return nil, err
24+
}
25+
26+
if serviceClientOverrides.HostUrlOverride != "" {
27+
client.Host = serviceClientOverrides.HostUrlOverride
28+
}
29+
return &client, nil
30+
}
31+
32+
func (m *OracleClients) ScheduleClient() *oci_resource_scheduler.ScheduleClient {
33+
return m.GetClient("oci_resource_scheduler.ScheduleClient").(*oci_resource_scheduler.ScheduleClient)
34+
}
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
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/oracle/terraform-provider-oci/httpreplay"
11+
"github.com/oracle/terraform-provider-oci/internal/utils"
12+
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
15+
"github.com/oracle/terraform-provider-oci/internal/acctest"
16+
)
17+
18+
var (
19+
ResourceSchedulerScheduleWithResourceFilterRequiredOnlyResource = ResourceSchedulerScheduleResourceDependencies +
20+
acctest.GenerateResourceFromRepresentationMap("oci_resource_scheduler_schedule", "test_schedule", acctest.Required, acctest.Create, DefinedTagsFilterRepresentation)
21+
22+
DefinedTagsFilterSingularDataSourceRepresentation = map[string]interface{}{
23+
"schedule_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_resource_scheduler_schedule.test_schedule.id}`},
24+
}
25+
26+
DefinedTagsFilterDataSourceRepresentation = map[string]interface{}{
27+
// must include at least one of `compartmentId` and `schedule_id`
28+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
29+
"schedule_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_resource_scheduler_schedule.test_schedule.id}`},
30+
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `provider displayName1`, Update: `provider displayName2`},
31+
"state": acctest.Representation{RepType: acctest.Optional, Create: `AVAILABLE`},
32+
"filter": acctest.RepresentationGroup{RepType: acctest.Optional, Group: ResourceSchedulerScheduleDataSourceFilterRepresentation}}
33+
34+
ResourceSchedulerScheduleResourceDefinedTagsFiltersRepresentation = map[string]interface{}{
35+
"attribute": acctest.Representation{RepType: acctest.Required, Create: `DEFINED_TAGS`, Update: `DEFINED_TAGS`},
36+
"value": acctest.RepresentationGroup{RepType: acctest.Required, Group: ResourceSchedulerScheduleResourceDefinedTagsFiltersValueRepresentation},
37+
}
38+
ResourceSchedulerScheduleResourceDefinedTagsFiltersValueRepresentation = map[string]interface{}{
39+
"namespace": acctest.Representation{RepType: acctest.Required, Create: `ResourceSchedulerCanary`, Update: `Test`},
40+
"tag_key": acctest.Representation{RepType: acctest.Required, Create: `ScheduleTagFilterTestKey`, Update: `ORM-123837`},
41+
"value": acctest.Representation{RepType: acctest.Required, Create: `foo`, Update: `inaccessible`},
42+
}
43+
44+
DefinedTagsFilterRepresentation = map[string]interface{}{
45+
// Required
46+
"action": acctest.Representation{RepType: acctest.Required, Create: `START_RESOURCE`, Update: `STOP_RESOURCE`},
47+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
48+
"recurrence_details": acctest.Representation{RepType: acctest.Required, Create: `FREQ=DAILY;INTERVAL=1`, Update: `FREQ=DAILY;INTERVAL=2`},
49+
"recurrence_type": acctest.Representation{RepType: acctest.Required, Create: `ICAL`, Update: `ICAL`},
50+
"resource_filters": acctest.RepresentationGroup{RepType: acctest.Required, Group: ResourceSchedulerScheduleResourceDefinedTagsFiltersRepresentation},
51+
// Optionals
52+
"description": acctest.Representation{RepType: acctest.Optional, Create: `provider description1`, Update: `provider description2`},
53+
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `provider displayName1`, Update: `provider displayName2`},
54+
"time_ends": acctest.Representation{RepType: acctest.Optional, Create: `2024-06-22T00:00:00Z`, Update: `2024-06-24T00:00:00Z`},
55+
"time_starts": acctest.Representation{RepType: acctest.Optional, Create: `2024-06-16T00:00:00Z`, Update: `2024-06-18T00:00:00Z`},
56+
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}, Update: map[string]string{"Department": "Accounting"}},
57+
"defined_tags": acctest.Representation{RepType: acctest.Optional, Create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`, Update: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue")}`},
58+
"state": acctest.Representation{RepType: acctest.Optional, Create: `INACTIVE`, Update: `ACTIVE`},
59+
"lifecycle": acctest.RepresentationGroup{RepType: acctest.Optional, Group: ignoreChangesDefinedTagsResourceSchedulerRepresentation},
60+
}
61+
)
62+
63+
func TestResourceSchedulerScheduleDefinedTagResourceFilter(t *testing.T) {
64+
httpreplay.SetScenario("TestResourceSchedulerScheduleDefinedTagResourceFilter")
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+
resourceName := "oci_resource_scheduler_schedule.test_schedule"
73+
singularDatasourceName := "data.oci_resource_scheduler_schedule.test_schedule"
74+
datasourceName := "data.oci_resource_scheduler_schedules.test_schedules"
75+
76+
// 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.
77+
acctest.SaveConfigContent(config+compartmentIdVariableStr+ResourceSchedulerScheduleResourceDependencies+
78+
acctest.GenerateResourceFromRepresentationMap("oci_resource_scheduler_schedule", "test_schedule", acctest.Optional, acctest.Create, DefinedTagsFilterRepresentation), "resourcescheduler", "schedule", t)
79+
80+
acctest.ResourceTest(t, testAccCheckResourceSchedulerScheduleDestroy, []resource.TestStep{
81+
//verify Create with Required - resourceFilter
82+
{
83+
Config: config + compartmentIdVariableStr + ResourceSchedulerScheduleResourceDependencies +
84+
acctest.GenerateResourceFromRepresentationMap("oci_resource_scheduler_schedule", "test_schedule", acctest.Required, acctest.Create, DefinedTagsFilterRepresentation),
85+
86+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
87+
resource.TestCheckResourceAttrSet(resourceName, "id"),
88+
resource.TestCheckResourceAttr(resourceName, "action", "START_RESOURCE"),
89+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
90+
resource.TestCheckResourceAttr(resourceName, "recurrence_details", "FREQ=DAILY;INTERVAL=1"),
91+
resource.TestCheckResourceAttr(resourceName, "recurrence_type", "ICAL"),
92+
93+
resource.TestCheckResourceAttr(resourceName, "resources.#", "0"),
94+
resource.TestCheckResourceAttr(resourceName, "resource_filters.#", "1"),
95+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.attribute", "DEFINED_TAGS"),
96+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.#", "1"),
97+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.namespace", "ResourceSchedulerCanary"),
98+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.tag_key", "ScheduleTagFilterTestKey"),
99+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.value", "foo"),
100+
101+
func(s *terraform.State) (err error) {
102+
_, err = acctest.FromInstanceState(s, resourceName, "id")
103+
return err
104+
},
105+
),
106+
},
107+
108+
//delete before next Create
109+
{
110+
Config: config + compartmentIdVariableStr + ResourceSchedulerScheduleResourceDependencies,
111+
},
112+
113+
// verify create with optionals - resourceFilter
114+
{
115+
Config: config + compartmentIdVariableStr + ResourceSchedulerScheduleResourceDependencies +
116+
acctest.GenerateResourceFromRepresentationMap("oci_resource_scheduler_schedule", "test_schedule", acctest.Optional, acctest.Create, DefinedTagsFilterRepresentation),
117+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
118+
resource.TestCheckResourceAttrSet(resourceName, "id"),
119+
resource.TestCheckResourceAttr(resourceName, "action", "START_RESOURCE"),
120+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
121+
resource.TestCheckResourceAttr(resourceName, "recurrence_details", "FREQ=DAILY;INTERVAL=1"),
122+
resource.TestCheckResourceAttr(resourceName, "recurrence_type", "ICAL"),
123+
124+
resource.TestCheckResourceAttr(resourceName, "description", "provider description1"),
125+
resource.TestCheckResourceAttr(resourceName, "display_name", "provider displayName1"),
126+
resource.TestCheckResourceAttr(resourceName, "time_ends", "2024-06-22T00:00:00Z"),
127+
resource.TestCheckResourceAttr(resourceName, "time_starts", "2024-06-16T00:00:00Z"),
128+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
129+
130+
resource.TestCheckResourceAttr(resourceName, "resources.#", "0"),
131+
resource.TestCheckResourceAttr(resourceName, "resource_filters.#", "1"),
132+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.attribute", "DEFINED_TAGS"),
133+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.#", "1"),
134+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.namespace", "ResourceSchedulerCanary"),
135+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.tag_key", "ScheduleTagFilterTestKey"),
136+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.value", "foo"),
137+
138+
func(s *terraform.State) (err error) {
139+
_, err = acctest.FromInstanceState(s, resourceName, "id")
140+
return err
141+
},
142+
),
143+
},
144+
145+
// verify singular datasource
146+
{
147+
Config: config +
148+
acctest.GenerateDataSourceFromRepresentationMap("oci_resource_scheduler_schedule", "test_schedule", acctest.Required, acctest.Create, DefinedTagsFilterSingularDataSourceRepresentation) +
149+
compartmentIdVariableStr + ResourceSchedulerScheduleWithResourceFilterRequiredOnlyResource,
150+
151+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
152+
resource.TestCheckResourceAttrSet(singularDatasourceName, "id"),
153+
resource.TestCheckResourceAttrSet(singularDatasourceName, "time_created"),
154+
155+
resource.TestCheckResourceAttr(singularDatasourceName, "action", "START_RESOURCE"),
156+
resource.TestCheckResourceAttr(singularDatasourceName, "compartment_id", compartmentId),
157+
resource.TestCheckResourceAttr(singularDatasourceName, "recurrence_details", "FREQ=DAILY;INTERVAL=1"),
158+
resource.TestCheckResourceAttr(singularDatasourceName, "recurrence_type", "ICAL"),
159+
160+
resource.TestCheckResourceAttr(singularDatasourceName, "resources.#", "0"),
161+
resource.TestCheckResourceAttr(resourceName, "resource_filters.#", "1"),
162+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.attribute", "DEFINED_TAGS"),
163+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.#", "1"),
164+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.namespace", "ResourceSchedulerCanary"),
165+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.tag_key", "ScheduleTagFilterTestKey"),
166+
resource.TestCheckResourceAttr(resourceName, "resource_filters.0.value.0.value", "foo"),
167+
),
168+
},
169+
170+
// verify datasources
171+
{
172+
Config: config + compartmentIdVariableStr + ResourceSchedulerScheduleResourceDependencies +
173+
acctest.GenerateResourceFromRepresentationMap("oci_resource_scheduler_schedule", "test_schedule", acctest.Required, acctest.Create, DefinedTagsFilterRepresentation) +
174+
acctest.GenerateDataSourceFromRepresentationMap("oci_resource_scheduler_schedules", "test_schedules", acctest.Required, acctest.Create, DefinedTagsFilterDataSourceRepresentation),
175+
176+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
177+
178+
resource.TestCheckResourceAttr(datasourceName, "compartment_id", compartmentId),
179+
180+
resource.TestCheckResourceAttr(datasourceName, "schedule_collection.#", "1"),
181+
),
182+
},
183+
184+
// verify resource import
185+
{
186+
Config: config + ResourceSchedulerScheduleWithResourceFilterRequiredOnlyResource,
187+
ImportState: true,
188+
ImportStateVerify: true,
189+
ImportStateVerifyIgnore: []string{"time_next_run"},
190+
ResourceName: resourceName,
191+
},
192+
})
193+
}

0 commit comments

Comments
 (0)