Skip to content

Commit 3f13f31

Browse files
taorliu960926varmax2511
authored andcommitted
Added - Support for Oracle Cloud Advisor v2
1 parent c036649 commit 3f13f31

23 files changed

+852
-44
lines changed

examples/optimizer/main.tf

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ provider "oci" {
3131
data "oci_optimizer_categories" "test_categories" {
3232
compartment_id = "${var.tenancy_ocid}"
3333
compartment_id_in_subtree = "true"
34+
filter {
35+
name = "name"
36+
values = ["cost-management-name"]
37+
}
3438
}
3539

3640
data "oci_optimizer_category" "test_category" {
@@ -163,4 +167,13 @@ data "oci_optimizer_recommendation_strategies" "test_recommendation_strategies"
163167
#Required
164168
compartment_id = "${var.tenancy_ocid}"
165169
compartment_id_in_subtree = "true"
166-
}
170+
}
171+
172+
// profile level
173+
data "oci_optimizer_profile_levels" "test_profile_levels" {
174+
#Required
175+
compartment_id = "${var.tenancy_ocid}"
176+
compartment_id_in_subtree = "true"
177+
#optional
178+
recommendation_name = "cost-management-compute-host-underutilized-name"
179+
}

oci/optimizer_categories_data_source.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ func OptimizerCategoriesDataSource() *schema.Resource {
6262
Type: schema.TypeFloat,
6363
Computed: true,
6464
},
65+
"extended_metadata": {
66+
Type: schema.TypeMap,
67+
Computed: true,
68+
Elem: schema.TypeString,
69+
},
6570
"id": {
6671
Type: schema.TypeString,
6772
Computed: true,

oci/optimizer_category_data_source.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ func OptimizerCategoryDataSource() *schema.Resource {
3535
Type: schema.TypeFloat,
3636
Computed: true,
3737
},
38+
"extended_metadata": {
39+
Type: schema.TypeMap,
40+
Computed: true,
41+
Elem: schema.TypeString,
42+
},
3843
"name": {
3944
Type: schema.TypeString,
4045
Computed: true,
@@ -153,6 +158,8 @@ func (s *OptimizerCategoryDataSourceCrud) SetData() error {
153158
s.D.Set("estimated_cost_saving", *s.Res.EstimatedCostSaving)
154159
}
155160

161+
s.D.Set("extended_metadata", s.Res.ExtendedMetadata)
162+
156163
if s.Res.Name != nil {
157164
s.D.Set("name", *s.Res.Name)
158165
}
@@ -197,6 +204,8 @@ func CategorySummaryToMap(obj oci_optimizer.CategorySummary) map[string]interfac
197204
result["estimated_cost_saving"] = float32(*obj.EstimatedCostSaving)
198205
}
199206

207+
result["extended_metadata"] = obj.ExtendedMetadata
208+
200209
if obj.Id != nil {
201210
result["id"] = string(*obj.Id)
202211
}

oci/optimizer_histories_data_source.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ func HistorySummaryToMap(obj oci_optimizer.HistorySummary) map[string]interface{
316316
result["estimated_cost_saving"] = float32(*obj.EstimatedCostSaving)
317317
}
318318

319-
result["extended_metadata"] = obj.ExtendedMetadata
319+
result["extended_metadata"] = GenericMapToJsonMap(obj.ExtendedMetadata)
320320

321321
if obj.Id != nil {
322322
result["id"] = string(*obj.Id)

oci/optimizer_profile_data_source.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ func (s *OptimizerProfileDataSourceCrud) SetData() error {
6767

6868
s.D.SetId(*s.Res.Id)
6969

70+
if s.Res.AggregationIntervalInDays != nil {
71+
s.D.Set("aggregation_interval_in_days", *s.Res.AggregationIntervalInDays)
72+
}
73+
7074
if s.Res.CompartmentId != nil {
7175
s.D.Set("compartment_id", *s.Res.CompartmentId)
7276
}
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
// Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package oci
5+
6+
import (
7+
"context"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
10+
oci_optimizer "github.com/oracle/oci-go-sdk/v51/optimizer"
11+
)
12+
13+
func init() {
14+
RegisterDatasource("oci_optimizer_profile_level", OptimizerProfileLevelDataSource())
15+
}
16+
17+
func OptimizerProfileLevelDataSource() *schema.Resource {
18+
return &schema.Resource{
19+
Read: readSingularOptimizerProfileLevel,
20+
Schema: map[string]*schema.Schema{
21+
"compartment_id": {
22+
Type: schema.TypeString,
23+
Required: true,
24+
},
25+
"compartment_id_in_subtree": {
26+
Type: schema.TypeBool,
27+
Required: true,
28+
},
29+
"name": {
30+
Type: schema.TypeString,
31+
Optional: true,
32+
},
33+
"recommendation_name": {
34+
Type: schema.TypeString,
35+
Optional: true,
36+
},
37+
// Computed
38+
"items": {
39+
Type: schema.TypeList,
40+
Computed: true,
41+
Elem: &schema.Resource{
42+
Schema: map[string]*schema.Schema{
43+
// Required
44+
45+
// Optional
46+
47+
// Computed
48+
"default_interval": {
49+
Type: schema.TypeInt,
50+
Computed: true,
51+
},
52+
"metrics": {
53+
Type: schema.TypeList,
54+
Computed: true,
55+
Elem: &schema.Resource{
56+
Schema: map[string]*schema.Schema{
57+
// Required
58+
59+
// Optional
60+
61+
// Computed
62+
"name": {
63+
Type: schema.TypeString,
64+
Computed: true,
65+
},
66+
"statistic": {
67+
Type: schema.TypeString,
68+
Computed: true,
69+
},
70+
"target": {
71+
Type: schema.TypeFloat,
72+
Computed: true,
73+
},
74+
"threshold": {
75+
Type: schema.TypeFloat,
76+
Computed: true,
77+
},
78+
},
79+
},
80+
},
81+
"name": {
82+
Type: schema.TypeString,
83+
Computed: true,
84+
},
85+
"recommendation_name": {
86+
Type: schema.TypeString,
87+
Computed: true,
88+
},
89+
"time_created": {
90+
Type: schema.TypeString,
91+
Computed: true,
92+
},
93+
"time_updated": {
94+
Type: schema.TypeString,
95+
Computed: true,
96+
},
97+
"valid_intervals": {
98+
Type: schema.TypeList,
99+
Computed: true,
100+
MinItems: 1,
101+
Elem: &schema.Schema{
102+
Type: schema.TypeInt,
103+
},
104+
},
105+
},
106+
},
107+
},
108+
},
109+
}
110+
}
111+
112+
func readSingularOptimizerProfileLevel(d *schema.ResourceData, m interface{}) error {
113+
sync := &OptimizerProfileLevelDataSourceCrud{}
114+
sync.D = d
115+
sync.Client = m.(*OracleClients).optimizerClient()
116+
117+
return ReadResource(sync)
118+
}
119+
120+
type OptimizerProfileLevelDataSourceCrud struct {
121+
D *schema.ResourceData
122+
Client *oci_optimizer.OptimizerClient
123+
Res *oci_optimizer.ListProfileLevelsResponse
124+
}
125+
126+
func (s *OptimizerProfileLevelDataSourceCrud) VoidState() {
127+
s.D.SetId("")
128+
}
129+
130+
func (s *OptimizerProfileLevelDataSourceCrud) Get() error {
131+
request := oci_optimizer.ListProfileLevelsRequest{}
132+
133+
if compartmentId, ok := s.D.GetOkExists("compartment_id"); ok {
134+
tmp := compartmentId.(string)
135+
request.CompartmentId = &tmp
136+
}
137+
138+
if compartmentIdInSubtree, ok := s.D.GetOkExists("compartment_id_in_subtree"); ok {
139+
tmp := compartmentIdInSubtree.(bool)
140+
request.CompartmentIdInSubtree = &tmp
141+
}
142+
143+
if name, ok := s.D.GetOkExists("name"); ok {
144+
tmp := name.(string)
145+
request.Name = &tmp
146+
}
147+
148+
if recommendationName, ok := s.D.GetOkExists("recommendation_name"); ok {
149+
tmp := recommendationName.(string)
150+
request.RecommendationName = &tmp
151+
}
152+
153+
request.RequestMetadata.RetryPolicy = GetRetryPolicy(false, "optimizer")
154+
155+
response, err := s.Client.ListProfileLevels(context.Background(), request)
156+
if err != nil {
157+
return err
158+
}
159+
160+
s.Res = &response
161+
return nil
162+
}
163+
164+
func (s *OptimizerProfileLevelDataSourceCrud) SetData() error {
165+
if s.Res == nil {
166+
return nil
167+
}
168+
169+
s.D.SetId(GenerateDataSourceHashID("OptimizerProfileLevelDataSource-", OptimizerProfileLevelDataSource(), s.D))
170+
171+
items := []interface{}{}
172+
for _, item := range s.Res.Items {
173+
items = append(items, ProfileLevelSummaryToMap(item))
174+
}
175+
s.D.Set("items", items)
176+
177+
return nil
178+
}
179+
180+
func optimizerEvaluatedMetricToMap(obj oci_optimizer.EvaluatedMetric) map[string]interface{} {
181+
result := map[string]interface{}{}
182+
183+
if obj.Name != nil {
184+
result["name"] = string(*obj.Name)
185+
}
186+
187+
if obj.Statistic != nil {
188+
result["statistic"] = string(*obj.Statistic)
189+
}
190+
191+
if obj.Target != nil {
192+
result["target"] = float64(*obj.Target)
193+
}
194+
195+
if obj.Threshold != nil {
196+
result["threshold"] = float64(*obj.Threshold)
197+
}
198+
199+
return result
200+
}
201+
202+
func optimizerProfileLevelSummaryToMap(obj oci_optimizer.ProfileLevelSummary) map[string]interface{} {
203+
result := map[string]interface{}{}
204+
205+
if obj.DefaultInterval != nil {
206+
result["default_interval"] = int(*obj.DefaultInterval)
207+
}
208+
209+
metrics := []interface{}{}
210+
for _, item := range obj.Metrics {
211+
metrics = append(metrics, EvaluatedMetricToMap(item))
212+
}
213+
result["metrics"] = metrics
214+
215+
if obj.Name != nil {
216+
result["name"] = string(*obj.Name)
217+
}
218+
219+
if obj.RecommendationName != nil {
220+
result["recommendation_name"] = string(*obj.RecommendationName)
221+
}
222+
223+
if obj.TimeCreated != nil {
224+
result["time_created"] = obj.TimeCreated.String()
225+
}
226+
227+
if obj.TimeUpdated != nil {
228+
result["time_updated"] = obj.TimeUpdated.String()
229+
}
230+
231+
result["valid_intervals"] = obj.ValidIntervals
232+
233+
return result
234+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright (c) 2017, 2021, Oracle and/or its affiliates. All rights reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package oci
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
11+
12+
"github.com/terraform-providers/terraform-provider-oci/httpreplay"
13+
)
14+
15+
var (
16+
profileLevelSingularDataSourceRepresentation = map[string]interface{}{
17+
"compartment_id": Representation{RepType: Required, Create: `${var.compartment_id}`},
18+
"compartment_id_in_subtree": Representation{RepType: Required, Create: `true`},
19+
"recommendation_name": Representation{RepType: Required, Create: `${oci_optimizer_recommendation.test_recommendation.name}`},
20+
}
21+
22+
profileLevelDataSourceRepresentation = map[string]interface{}{
23+
"compartment_id": Representation{RepType: Required, Create: `${var.compartment_id}`},
24+
"compartment_id_in_subtree": Representation{RepType: Required, Create: `true`},
25+
"recommendation_name": Representation{RepType: Required, Create: `${oci_optimizer_recommendation.test_recommendation.name}`},
26+
}
27+
28+
ProfileLevelResourceConfig = RecommendationResourceDependencies + GenerateResourceFromRepresentationMap("oci_optimizer_recommendation", "test_recommendation", Required, Create, recommendationRepresentation)
29+
)
30+
31+
// issue-routing-tag: optimizer/default
32+
func TestOptimizerProfileLevelResource_basic(t *testing.T) {
33+
httpreplay.SetScenario("TestOptimizerProfileLevelResource_basic")
34+
defer httpreplay.SaveScenario()
35+
36+
config := testProviderConfig()
37+
38+
compartmentId := getEnvSettingWithBlankDefault("tenancy_ocid")
39+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
40+
41+
datasourceName := "data.oci_optimizer_profile_levels.test_profile_levels"
42+
singularDatasourceName := "data.oci_optimizer_profile_level.test_profile_level"
43+
44+
SaveConfigContent("", "", "", t)
45+
46+
ResourceTest(t, nil, []resource.TestStep{
47+
// verify datasource
48+
{
49+
Config: config +
50+
GenerateDataSourceFromRepresentationMap("oci_optimizer_profile_levels", "test_profile_levels", Required, Create, profileLevelDataSourceRepresentation) +
51+
compartmentIdVariableStr + ProfileLevelResourceConfig,
52+
Check: ComposeAggregateTestCheckFuncWrapper(
53+
resource.TestCheckResourceAttr(datasourceName, "compartment_id", compartmentId),
54+
resource.TestCheckResourceAttr(datasourceName, "compartment_id_in_subtree", "true"),
55+
resource.TestCheckResourceAttrSet(datasourceName, "recommendation_name"),
56+
resource.TestCheckResourceAttrSet(datasourceName, "profile_level_collection.#"),
57+
resource.TestCheckResourceAttrSet(datasourceName, "profile_level_collection.0.items.#"),
58+
),
59+
},
60+
// verify singular datasource
61+
{
62+
Config: config +
63+
GenerateDataSourceFromRepresentationMap("oci_optimizer_profile_level", "test_profile_level", Required, Create, profileLevelSingularDataSourceRepresentation) +
64+
compartmentIdVariableStr + ProfileLevelResourceConfig,
65+
Check: ComposeAggregateTestCheckFuncWrapper(
66+
resource.TestCheckResourceAttr(singularDatasourceName, "compartment_id", compartmentId),
67+
resource.TestCheckResourceAttr(singularDatasourceName, "compartment_id_in_subtree", "true"),
68+
resource.TestCheckResourceAttrSet(singularDatasourceName, "recommendation_name"),
69+
resource.TestCheckResourceAttrSet(singularDatasourceName, "items.#"),
70+
),
71+
},
72+
})
73+
}

0 commit comments

Comments
 (0)