Skip to content

Commit 4fb469a

Browse files
Manisha Sangatramanivsin12
authored andcommitted
Added - Support for ODSC - Model Store - Model Versioning
1 parent 3f667c3 commit 4fb469a

17 files changed

+1293
-15
lines changed

internal/integrationtest/datascience_model_test.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@ var (
3737
}
3838

3939
DatascienceDatascienceModelDataSourceRepresentation = map[string]interface{}{
40-
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
41-
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`, Update: `displayName2`},
42-
"id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_datascience_model.test_model.id}`},
43-
"project_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_datascience_project.test_project.id}`},
44-
"state": acctest.Representation{RepType: acctest.Optional, Create: `ACTIVE`},
45-
"filter": acctest.RepresentationGroup{RepType: acctest.Required, Group: DatascienceModelDataSourceFilterRepresentation}}
40+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
41+
"display_name": acctest.Representation{RepType: acctest.Optional, Create: `displayName`, Update: `displayName2`},
42+
"id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_datascience_model.test_model.id}`},
43+
"model_version_set_name": acctest.Representation{RepType: acctest.Optional, Create: ``},
44+
"project_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_datascience_project.test_project.id}`},
45+
"state": acctest.Representation{RepType: acctest.Optional, Create: `ACTIVE`},
46+
"version_label": acctest.Representation{RepType: acctest.Optional, Create: ``, Update: ``},
47+
"filter": acctest.RepresentationGroup{RepType: acctest.Required, Group: DatascienceModelDataSourceFilterRepresentation}}
4648
DatascienceModelDataSourceFilterRepresentation = map[string]interface{}{
4749
"name": acctest.Representation{RepType: acctest.Required, Create: `id`},
4850
"values": acctest.Representation{RepType: acctest.Required, Create: []string{`${oci_datascience_model.test_model.id}`}},
@@ -76,6 +78,10 @@ var (
7678

7779
DatascienceModelResourceDependencies = acctest.GenerateResourceFromRepresentationMap("oci_datascience_project", "test_project", acctest.Required, acctest.Create, DatascienceProjectRepresentation) +
7880
DefinedTagsDependencies
81+
82+
DatascienceModelResourceModelVersionSetDependencies = acctest.GenerateResourceFromRepresentationMap("oci_datascience_model_version_set", "test_model_version_set", acctest.Required, acctest.Create, DatascienceModelVersionSetRepresentation) +
83+
acctest.GenerateResourceFromRepresentationMap("oci_datascience_project", "test_project", acctest.Required, acctest.Create, DatascienceProjectRepresentation) +
84+
DefinedTagsDependencies
7985
)
8086

8187
// issue-routing-tag: datascience/default
@@ -241,11 +247,12 @@ func TestDatascienceModelResource_basic(t *testing.T) {
241247
{
242248
Config: config +
243249
acctest.GenerateDataSourceFromRepresentationMap("oci_datascience_models", "test_models", acctest.Optional, acctest.Update, DatascienceDatascienceModelDataSourceRepresentation) +
244-
compartmentIdVariableStr + DatascienceModelResourceDependencies +
250+
compartmentIdVariableStr + DatascienceModelResourceModelVersionSetDependencies +
245251
acctest.GenerateResourceFromRepresentationMap("oci_datascience_model", "test_model", acctest.Optional, acctest.Update, DatascienceModelRepresentation),
246252
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
247253
resource.TestCheckResourceAttr(datasourceName, "compartment_id", compartmentId),
248254
resource.TestCheckResourceAttr(datasourceName, "display_name", "displayName2"),
255+
resource.TestCheckResourceAttrSet(datasourceName, "id"),
249256
resource.TestCheckResourceAttrSet(datasourceName, "project_id"),
250257
resource.TestCheckResourceAttr(datasourceName, "state", "ACTIVE"),
251258

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
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 integrationtest
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"strconv"
10+
"testing"
11+
"time"
12+
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
15+
"github.com/oracle/oci-go-sdk/v65/common"
16+
oci_datascience "github.com/oracle/oci-go-sdk/v65/datascience"
17+
18+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
19+
"github.com/oracle/terraform-provider-oci/httpreplay"
20+
"github.com/oracle/terraform-provider-oci/internal/acctest"
21+
tf_client "github.com/oracle/terraform-provider-oci/internal/client"
22+
"github.com/oracle/terraform-provider-oci/internal/resourcediscovery"
23+
"github.com/oracle/terraform-provider-oci/internal/tfresource"
24+
"github.com/oracle/terraform-provider-oci/internal/utils"
25+
)
26+
27+
var (
28+
DatascienceModelVersionSetRequiredOnlyResource = DatascienceModelVersionSetResourceDependencies +
29+
acctest.GenerateResourceFromRepresentationMap("oci_datascience_model_version_set", "test_model_version_set", acctest.Required, acctest.Create, DatascienceModelVersionSetRepresentation)
30+
31+
DatascienceModelVersionSetResourceConfig = DatascienceModelVersionSetResourceDependencies +
32+
acctest.GenerateResourceFromRepresentationMap("oci_datascience_model_version_set", "test_model_version_set", acctest.Optional, acctest.Update, DatascienceModelVersionSetRepresentation)
33+
34+
DatascienceDatascienceModelVersionSetSingularDataSourceRepresentation = map[string]interface{}{
35+
"model_version_set_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_datascience_model_version_set.test_model_version_set.id}`},
36+
}
37+
38+
DatascienceDatascienceModelVersionSetDataSourceRepresentation = map[string]interface{}{
39+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
40+
"created_by": acctest.Representation{RepType: acctest.Optional, Create: `createdBy`},
41+
"id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_datascience_model_version_set.test_model_version_set.id}`},
42+
"name": acctest.Representation{RepType: acctest.Optional, Create: `name` + utils.RandomString(15, utils.CharsetWithoutDigits)},
43+
"project_id": acctest.Representation{RepType: acctest.Optional, Create: `${oci_datascience_project.test_project.id}`},
44+
"state": acctest.Representation{RepType: acctest.Optional, Create: `ACTIVE`},
45+
"filter": acctest.RepresentationGroup{RepType: acctest.Required, Group: DatascienceModelVersionSetDataSourceFilterRepresentation}}
46+
DatascienceModelVersionSetDataSourceFilterRepresentation = map[string]interface{}{
47+
"name": acctest.Representation{RepType: acctest.Required, Create: `id`},
48+
"values": acctest.Representation{RepType: acctest.Required, Create: []string{`${oci_datascience_model_version_set.test_model_version_set.id}`}},
49+
}
50+
51+
DatascienceModelVersionSetRepresentation = map[string]interface{}{
52+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
53+
"name": acctest.Representation{RepType: acctest.Required, Create: `name` + utils.RandomString(15, utils.CharsetWithoutDigits)},
54+
"project_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_datascience_project.test_project.id}`},
55+
"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")}`},
56+
"description": acctest.Representation{RepType: acctest.Optional, Create: `description`, Update: `description2`},
57+
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}, Update: map[string]string{"Department": "Accounting"}},
58+
}
59+
60+
DatascienceModelVersionSetResourceDependencies = acctest.GenerateResourceFromRepresentationMap("oci_datascience_project", "test_project", acctest.Required, acctest.Create, DatascienceProjectRepresentation) +
61+
DefinedTagsDependencies
62+
)
63+
64+
// issue-routing-tag: datascience/default
65+
func TestDatascienceModelVersionSetResource_basic(t *testing.T) {
66+
httpreplay.SetScenario("TestDatascienceModelVersionSetResource_basic")
67+
defer httpreplay.SaveScenario()
68+
69+
config := acctest.ProviderTestConfig()
70+
71+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
72+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
73+
74+
resourceName := "oci_datascience_model_version_set.test_model_version_set"
75+
76+
var resId string
77+
// 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.
78+
acctest.SaveConfigContent(config+compartmentIdVariableStr+DatascienceModelVersionSetResourceDependencies+
79+
acctest.GenerateResourceFromRepresentationMap("oci_datascience_model_version_set", "test_model_version_set", acctest.Optional, acctest.Create, DatascienceModelVersionSetRepresentation), "datascience", "modelVersionSet", t)
80+
81+
acctest.ResourceTest(t, testAccCheckDatascienceModelVersionSetDestroy, []resource.TestStep{
82+
// verify Create
83+
{
84+
Config: config + compartmentIdVariableStr + DatascienceModelVersionSetResourceDependencies +
85+
acctest.GenerateResourceFromRepresentationMap("oci_datascience_model_version_set", "test_model_version_set", acctest.Required, acctest.Create, DatascienceModelVersionSetRepresentation),
86+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
87+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
88+
resource.TestCheckResourceAttrSet(resourceName, "name"),
89+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
90+
91+
func(s *terraform.State) (err error) {
92+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
93+
return err
94+
},
95+
),
96+
},
97+
// delete before next Create
98+
{
99+
Config: config + compartmentIdVariableStr + DatascienceModelVersionSetResourceDependencies,
100+
},
101+
// verify Create with optionals
102+
{
103+
Config: config + compartmentIdVariableStr + DatascienceModelVersionSetResourceDependencies +
104+
acctest.GenerateResourceFromRepresentationMap("oci_datascience_model_version_set", "test_model_version_set", acctest.Optional, acctest.Create,
105+
acctest.RepresentationCopyWithNewProperties(DatascienceModelVersionSetRepresentation, map[string]interface{}{
106+
"name": acctest.Representation{RepType: acctest.Required, Create: `name` + utils.RandomString(15, utils.CharsetWithoutDigits)},
107+
})),
108+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
109+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
110+
resource.TestCheckResourceAttrSet(resourceName, "created_by"),
111+
resource.TestCheckResourceAttr(resourceName, "description", "description"),
112+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
113+
resource.TestCheckResourceAttrSet(resourceName, "id"),
114+
resource.TestCheckResourceAttrSet(resourceName, "name"),
115+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
116+
resource.TestCheckResourceAttrSet(resourceName, "state"),
117+
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
118+
resource.TestCheckResourceAttrSet(resourceName, "time_updated"),
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+
// verify resource import
132+
{
133+
Config: config + DatascienceModelVersionSetRequiredOnlyResource,
134+
ImportState: true,
135+
ImportStateVerify: true,
136+
ImportStateVerifyIgnore: []string{},
137+
ResourceName: resourceName,
138+
},
139+
})
140+
}
141+
142+
func testAccCheckDatascienceModelVersionSetDestroy(s *terraform.State) error {
143+
noResourceFound := true
144+
client := acctest.TestAccProvider.Meta().(*tf_client.OracleClients).DataScienceClient()
145+
for _, rs := range s.RootModule().Resources {
146+
if rs.Type == "oci_datascience_model_version_set" {
147+
noResourceFound = false
148+
request := oci_datascience.GetModelVersionSetRequest{}
149+
150+
tmp := rs.Primary.ID
151+
request.ModelVersionSetId = &tmp
152+
153+
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(true, "datascience")
154+
155+
response, err := client.GetModelVersionSet(context.Background(), request)
156+
157+
if err == nil {
158+
deletedLifecycleStates := map[string]bool{
159+
string(oci_datascience.ModelVersionSetLifecycleStateDeleted): true,
160+
}
161+
if _, ok := deletedLifecycleStates[string(response.LifecycleState)]; !ok {
162+
//resource lifecycle state is not in expected deleted lifecycle states.
163+
return fmt.Errorf("resource lifecycle state: %s is not in expected deleted lifecycle states", response.LifecycleState)
164+
}
165+
//resource lifecycle state is in expected deleted lifecycle states. continue with next one.
166+
continue
167+
}
168+
169+
//Verify that exception is for '404 not found'.
170+
if failure, isServiceError := common.IsServiceError(err); !isServiceError || failure.GetHTTPStatusCode() != 404 {
171+
return err
172+
}
173+
}
174+
}
175+
if noResourceFound {
176+
return fmt.Errorf("at least one resource was expected from the state file, but could not be found")
177+
}
178+
179+
return nil
180+
}
181+
182+
func init() {
183+
if acctest.DependencyGraph == nil {
184+
acctest.InitDependencyGraph()
185+
}
186+
if !acctest.InSweeperExcludeList("DatascienceModelVersionSet") {
187+
resource.AddTestSweepers("DatascienceModelVersionSet", &resource.Sweeper{
188+
Name: "DatascienceModelVersionSet",
189+
Dependencies: acctest.DependencyGraph["modelVersionSet"],
190+
F: sweepDatascienceModelVersionSetResource,
191+
})
192+
}
193+
}
194+
195+
func sweepDatascienceModelVersionSetResource(compartment string) error {
196+
dataScienceClient := acctest.GetTestClients(&schema.ResourceData{}).DataScienceClient()
197+
modelVersionSetIds, err := getDatascienceModelVersionSetIds(compartment)
198+
if err != nil {
199+
return err
200+
}
201+
for _, modelVersionSetId := range modelVersionSetIds {
202+
if ok := acctest.SweeperDefaultResourceId[modelVersionSetId]; !ok {
203+
deleteModelVersionSetRequest := oci_datascience.DeleteModelVersionSetRequest{}
204+
205+
deleteModelVersionSetRequest.ModelVersionSetId = &modelVersionSetId
206+
207+
deleteModelVersionSetRequest.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(true, "datascience")
208+
_, error := dataScienceClient.DeleteModelVersionSet(context.Background(), deleteModelVersionSetRequest)
209+
if error != nil {
210+
fmt.Printf("Error deleting ModelVersionSet %s %s, It is possible that the resource is already deleted. Please verify manually \n", modelVersionSetId, error)
211+
continue
212+
}
213+
acctest.WaitTillCondition(acctest.TestAccProvider, &modelVersionSetId, DatascienceModelVersionSetSweepWaitCondition, time.Duration(3*time.Minute),
214+
DatascienceModelVersionSetSweepResponseFetchOperation, "datascience", true)
215+
}
216+
}
217+
return nil
218+
}
219+
220+
func getDatascienceModelVersionSetIds(compartment string) ([]string, error) {
221+
ids := acctest.GetResourceIdsToSweep(compartment, "ModelVersionSetId")
222+
if ids != nil {
223+
return ids, nil
224+
}
225+
var resourceIds []string
226+
compartmentId := compartment
227+
dataScienceClient := acctest.GetTestClients(&schema.ResourceData{}).DataScienceClient()
228+
229+
listModelVersionSetsRequest := oci_datascience.ListModelVersionSetsRequest{}
230+
listModelVersionSetsRequest.CompartmentId = &compartmentId
231+
listModelVersionSetsRequest.LifecycleState = oci_datascience.ListModelVersionSetsLifecycleStateActive
232+
listModelVersionSetsResponse, err := dataScienceClient.ListModelVersionSets(context.Background(), listModelVersionSetsRequest)
233+
234+
if err != nil {
235+
return resourceIds, fmt.Errorf("Error getting ModelVersionSet list for compartment id : %s , %s \n", compartmentId, err)
236+
}
237+
for _, modelVersionSet := range listModelVersionSetsResponse.Items {
238+
id := *modelVersionSet.Id
239+
resourceIds = append(resourceIds, id)
240+
acctest.AddResourceIdToSweeperResourceIdMap(compartmentId, "ModelVersionSetId", id)
241+
}
242+
return resourceIds, nil
243+
}
244+
245+
func DatascienceModelVersionSetSweepWaitCondition(response common.OCIOperationResponse) bool {
246+
// Only stop if the resource is available beyond 3 mins. As there could be an issue for the sweeper to delete the resource and manual intervention required.
247+
if modelVersionSetResponse, ok := response.Response.(oci_datascience.GetModelVersionSetResponse); ok {
248+
return modelVersionSetResponse.LifecycleState != oci_datascience.ModelVersionSetLifecycleStateDeleted
249+
}
250+
return false
251+
}
252+
253+
func DatascienceModelVersionSetSweepResponseFetchOperation(client *tf_client.OracleClients, resourceId *string, retryPolicy *common.RetryPolicy) error {
254+
_, err := client.DataScienceClient().GetModelVersionSet(context.Background(), oci_datascience.GetModelVersionSetRequest{
255+
ModelVersionSetId: resourceId,
256+
RequestMetadata: common.RequestMetadata{
257+
RetryPolicy: retryPolicy,
258+
},
259+
})
260+
return err
261+
}

internal/service/datascience/datascience_export.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,17 @@ var exportDatascienceJobRunHints = &tf_export.TerraformResourceHints{
9595
},
9696
}
9797

98+
var exportDatascienceModelVersionSetHints = &tf_export.TerraformResourceHints{
99+
ResourceClass: "oci_datascience_model_version_set",
100+
DatasourceClass: "oci_datascience_model_version_sets",
101+
DatasourceItemsAttr: "model_version_sets",
102+
ResourceAbbreviation: "model_version_set",
103+
RequireResourceRefresh: true,
104+
DiscoverableLifecycleStates: []string{
105+
string(oci_datascience.ModelVersionSetLifecycleStateActive),
106+
},
107+
}
108+
98109
var datascienceResourceGraph = tf_export.TerraformResourceGraph{
99110
"oci_identity_compartment": {
100111
{TerraformResourceHints: exportDatascienceProjectHints},
@@ -103,6 +114,7 @@ var datascienceResourceGraph = tf_export.TerraformResourceGraph{
103114
{TerraformResourceHints: exportDatascienceModelDeploymentHints},
104115
{TerraformResourceHints: exportDatascienceJobHints},
105116
{TerraformResourceHints: exportDatascienceJobRunHints},
117+
{TerraformResourceHints: exportDatascienceModelVersionSetHints},
106118
},
107119
"oci_datascience_model": {
108120
{

internal/service/datascience/datascience_model_data_source.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,22 @@ func (s *DatascienceModelDataSourceCrud) SetData() error {
9191
s.D.Set("compartment_id", *s.Res.CompartmentId)
9292
}
9393

94+
if s.Res.ModelVersionSetId != nil {
95+
s.D.Set("model_version_set_id", *s.Res.ModelVersionSetId)
96+
}
97+
98+
if s.Res.VersionLabel != nil {
99+
s.D.Set("version_label", *s.Res.VersionLabel)
100+
}
101+
102+
if s.Res.VersionId != nil {
103+
s.D.Set("version_id", *s.Res.VersionId)
104+
}
105+
106+
if s.Res.ModelVersionSetName != nil {
107+
s.D.Set("model_version_set_name", *s.Res.ModelVersionSetName)
108+
}
109+
94110
if s.Res.CreatedBy != nil {
95111
s.D.Set("created_by", *s.Res.CreatedBy)
96112
}

0 commit comments

Comments
 (0)