Skip to content

Commit 4fbebde

Browse files
Gayatri Sawantvsin12
authored andcommitted
Added - Nvme variable to LaunchInstanceShapeConfigDetails & UpdateInstanceShapeConfigDetails
1 parent 7dc6bd0 commit 4fbebde

8 files changed

+181
-4
lines changed

internal/integrationtest/core_instance_configuration_test.go

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ var (
6767
acctest.RepresentationGroup{RepType: acctest.Optional, Group: instanceConfigurationInstanceDetailsLaunchDetailsRepresentationForFlexShape},
6868
instanceConfigurationInstanceDetailsLaunchRepresentation)
6969

70+
instanceConfigurationInstanceDetailsLaunchRepresentationForDenseShape = acctest.GetUpdatedRepresentationCopy("launch_details",
71+
acctest.RepresentationGroup{RepType: acctest.Optional, Group: instanceConfigurationInstanceDetailsLaunchDetailsRepresentationForDenseShape},
72+
instanceConfigurationInstanceDetailsLaunchRepresentation)
73+
7074
instanceConfigurationInstanceDetailsBlockRepresentation = map[string]interface{}{
7175
"instance_type": acctest.Representation{RepType: acctest.Required, Create: `compute`},
7276
"block_volumes": acctest.RepresentationGroup{RepType: acctest.Required, Group: instanceConfigurationInstanceDetailsBlockVolumesRepresentation},
@@ -130,6 +134,17 @@ var (
130134
instanceConfigurationInstanceDetailsLaunchDetailsRepresentation),
131135
[]string{"dedicated_vm_host_id", "preferred_maintenance_action"},
132136
)
137+
instanceConfigurationInstanceDetailsLaunchDetailsRepresentationForDenseShape = acctest.RepresentationCopyWithRemovedProperties(
138+
acctest.GetMultipleUpdatedRepresenationCopy(
139+
[]string{"shape", "source_details", "shape_config"},
140+
[]interface{}{
141+
acctest.Representation{RepType: acctest.Optional, Create: InstanceConfigurationVmShapeForDense},
142+
acctest.RepresentationGroup{RepType: acctest.Optional, Group: instanceConfigurationInstanceDetailsLaunchDetailsSourceDetailsRepresentationForDenseShape},
143+
acctest.RepresentationGroup{RepType: acctest.Optional, Group: instanceShapeConfigRepresentationForNvmeShape},
144+
},
145+
instanceConfigurationInstanceDetailsLaunchDetailsRepresentation),
146+
[]string{"dedicated_vm_host_id", "preferred_maintenance_action"},
147+
)
133148
instanceConfigurationInstanceOptionsRepresentation = map[string]interface{}{
134149
"are_legacy_imds_endpoints_disabled": acctest.Representation{RepType: acctest.Optional, Create: `false`},
135150
}
@@ -183,6 +198,10 @@ var (
183198
acctest.Representation{RepType: acctest.Optional, Create: `${var.FlexInstanceImageOCID[var.region]}`},
184199
instanceConfigurationInstanceDetailsLaunchDetailsSourceDetailsRepresentation)
185200

201+
instanceConfigurationInstanceDetailsLaunchDetailsSourceDetailsRepresentationForDenseShape = acctest.GetUpdatedRepresentationCopy("image_id",
202+
acctest.Representation{RepType: acctest.Optional, Create: `${var.image_id}`},
203+
instanceConfigurationInstanceDetailsLaunchDetailsSourceDetailsRepresentation)
204+
186205
instanceConfigurationInstanceDetailsSecondaryVnicsCreateVnicDetailsRepresentation = map[string]interface{}{
187206
"assign_private_dns_record": acctest.Representation{RepType: acctest.Optional, Create: `true`},
188207
"assign_public_ip": acctest.Representation{RepType: acctest.Optional, Create: `false`},
@@ -211,8 +230,9 @@ var (
211230
AvailabilityDomainConfig +
212231
DefinedTagsDependencies +
213232
KeyResourceDependencyConfig
214-
InstanceConfigurationVmShape = `VM.Standard2.1`
215-
InstanceConfigurationVmShapeForFlex = `VM.Standard.E3.Flex`
233+
InstanceConfigurationVmShape = `VM.Standard2.1`
234+
InstanceConfigurationVmShapeForFlex = `VM.Standard.E3.Flex`
235+
InstanceConfigurationVmShapeForDense = `VM.DenseIO.E4.Flex`
216236

217237
InstanceConfigurationResourceImageConfig = acctest.GenerateResourceFromRepresentationMap("oci_core_instance_configuration", "test_instance_configuration", acctest.Optional, acctest.Create,
218238
acctest.GetUpdatedRepresentationCopy("instance_details", acctest.RepresentationGroup{RepType: acctest.Optional, Group: instanceConfigurationInstanceDetailsLaunchRepresentation}, instanceConfigurationRepresentation))
@@ -228,6 +248,9 @@ func TestCoreInstanceConfigurationResource_basic(t *testing.T) {
228248
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
229249
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
230250

251+
imageId := utils.GetEnvSettingWithBlankDefault("image_id")
252+
imageIdVariableStr := fmt.Sprintf("variable \"image_id\" { default = \"%s\" }\n", imageId)
253+
231254
compartmentIdU := utils.GetEnvSettingWithDefault("compartment_id_for_update", compartmentId)
232255
compartmentIdUVariableStr := fmt.Sprintf("variable \"compartment_id_for_update\" { default = \"%s\" }\n", compartmentIdU)
233256

@@ -339,6 +362,59 @@ func TestCoreInstanceConfigurationResource_basic(t *testing.T) {
339362
),
340363
},
341364

365+
// delete before next Create
366+
{
367+
Config: config + compartmentIdVariableStr + InstanceConfigurationResourceDependencies,
368+
},
369+
370+
// verify Create with optionals launch_details for E4 dense shape
371+
{
372+
Config: config + compartmentIdVariableStr + imageIdVariableStr + InstanceConfigurationResourceDependencies +
373+
acctest.GenerateResourceFromRepresentationMap("oci_core_instance_configuration", "test_instance_configuration", acctest.Optional, acctest.Create,
374+
acctest.GetUpdatedRepresentationCopy("instance_details", acctest.RepresentationGroup{RepType: acctest.Optional, Group: instanceConfigurationInstanceDetailsLaunchRepresentationForDenseShape}, instanceConfigurationRepresentation)),
375+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
376+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
377+
resource.TestCheckResourceAttr(resourceName, "display_name", "backend-servers"),
378+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
379+
resource.TestCheckResourceAttrSet(resourceName, "id"),
380+
resource.TestCheckResourceAttr(resourceName, "instance_details.#", "1"),
381+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.instance_type", "compute"),
382+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.#", "1"),
383+
resource.TestCheckResourceAttrSet(resourceName, "instance_details.0.launch_details.0.availability_domain"),
384+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.compartment_id", compartmentId),
385+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.display_name", "backend-servers"),
386+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.extended_metadata.%", "1"),
387+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.freeform_tags.%", "1"),
388+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.ipxe_script", "ipxeScript"),
389+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.metadata.%", "1"),
390+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.shape", InstanceConfigurationVmShapeForDense),
391+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.source_details.#", "1"),
392+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.source_details.0.boot_volume_size_in_gbs", "55"),
393+
resource.TestCheckResourceAttrSet(resourceName, "instance_details.0.launch_details.0.source_details.0.image_id"),
394+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.source_details.0.source_type", "image"),
395+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.agent_config.0.is_management_disabled", "false"),
396+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.agent_config.0.is_monitoring_disabled", "false"),
397+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.launch_options.0.network_type", "PARAVIRTUALIZED"),
398+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.instance_options.0.are_legacy_imds_endpoints_disabled", "false"),
399+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.is_pv_encryption_in_transit_enabled", "false"),
400+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.launch_mode", "NATIVE"),
401+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.shape_config.0.ocpus", "8"),
402+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.shape_config.0.memory_in_gbs", "128"),
403+
resource.TestCheckResourceAttr(resourceName, "instance_details.0.launch_details.0.shape_config.0.nvmes", "1"),
404+
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
405+
406+
func(s *terraform.State) (err error) {
407+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
408+
if isEnableExportCompartment, _ := strconv.ParseBool(utils.GetEnvSettingWithDefault("enable_export_compartment", "true")); isEnableExportCompartment {
409+
if errExport := resourcediscovery.TestExportCompartmentWithResourceName(&resId, &compartmentId, resourceName); errExport != nil {
410+
return errExport
411+
}
412+
}
413+
return err
414+
},
415+
),
416+
},
417+
342418
// delete before next Create
343419
{
344420
Config: config + compartmentIdVariableStr + InstanceConfigurationResourceDependencies,

internal/integrationtest/core_instance_resource_test.go

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,30 @@ var (
6060
"is_secure_boot_enabled": acctest.Representation{RepType: acctest.Required, Create: `false`},
6161
"is_trusted_platform_module_enabled": acctest.Representation{RepType: acctest.Required, Create: `false`},
6262
}
63+
// instance representation for E4 Dense
64+
instanceRepresentationWithNvmes = map[string]interface{}{
65+
"availability_domain": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_identity_availability_domains.test_availability_domains.availability_domains.1.name}`},
66+
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${var.compartment_id}`},
67+
"shape": acctest.Representation{RepType: acctest.Required, Create: `VM.DenseIO.E4.Flex`},
68+
"is_pv_encryption_in_transit_enabled": acctest.Representation{RepType: acctest.Required, Create: `true`},
69+
"image": acctest.Representation{RepType: acctest.Required, Create: `${var.image_id}`},
70+
"launch_options": acctest.RepresentationGroup{RepType: acctest.Required, Group: instanceLaunchOptionsRepresentationWithNvmes},
71+
"shape_config": acctest.RepresentationGroup{RepType: acctest.Required, Group: instanceShapeConfigRepresentationForNvmeShape},
72+
"subnet_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_core_subnet.test_subnet.id}`},
73+
}
74+
75+
instanceLaunchOptionsRepresentationWithNvmes = map[string]interface{}{
76+
"boot_volume_type": acctest.Representation{RepType: acctest.Required, Create: `PARAVIRTUALIZED`},
77+
"firmware": acctest.Representation{RepType: acctest.Required, Create: `UEFI_64`},
78+
"network_type": acctest.Representation{RepType: acctest.Required, Create: `PARAVIRTUALIZED`},
79+
"remote_data_volume_type": acctest.Representation{RepType: acctest.Required, Create: `PARAVIRTUALIZED`},
80+
}
81+
82+
instanceShapeConfigRepresentationForNvmeShape = map[string]interface{}{
83+
"memory_in_gbs": acctest.Representation{RepType: acctest.Required, Create: `128`},
84+
"ocpus": acctest.Representation{RepType: acctest.Required, Create: `8`},
85+
"nvmes": acctest.Representation{RepType: acctest.Required, Create: `1`},
86+
}
6387
// instance representation for testing Update to launch_options and fault_domain
6488
instanceRepresentationCore_ForLaunchOptionsUpdate = acctest.RepresentationCopyWithRemovedProperties(acctest.RepresentationCopyWithNewProperties(instanceRepresentation, map[string]interface{}{
6589
"launch_options": acctest.RepresentationGroup{RepType: acctest.Optional, Group: instanceLaunchOptionsRepresentation_ForLaunchOptionsUpdate},
@@ -175,14 +199,14 @@ func (s *ResourceCoreInstanceTestSuite) SetupTest() {
175199
data "oci_identity_availability_domains" "ADs" {
176200
compartment_id = "${var.compartment_id}"
177201
}
178-
202+
179203
resource "oci_core_virtual_network" "t" {
180204
compartment_id = "${var.compartment_id}"
181205
cidr_block = "10.0.0.0/16"
182206
display_name = "-tf-vcn"
183207
dns_label = "examplevcn"
184208
}
185-
209+
186210
resource "oci_core_subnet" "t" {
187211
compartment_id = "${var.compartment_id}"
188212
vcn_id = "${oci_core_virtual_network.t.id}"
@@ -2309,6 +2333,50 @@ func (s *ResourceCoreInstanceTestSuite) TestAccResourceCoreInstance_launchOption
23092333
})
23102334
}
23112335

2336+
// issue-routing-tag: core/computeSharedOwnershipVmAndBm
2337+
func TestAccResourceCoreInstance_nvmeVMShape(t *testing.T) {
2338+
httpreplay.SetScenario("TestAccResourceCoreInstance_nvmeVMShape")
2339+
defer httpreplay.SaveScenario()
2340+
2341+
provider := acctest.TestAccProvider
2342+
config := `
2343+
provider oci {
2344+
test_time_maintenance_reboot_due = "2030-01-01 00:00:00"
2345+
}
2346+
` + acctest.CommonTestVariables()
2347+
2348+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
2349+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
2350+
imageId := utils.GetEnvSettingWithBlankDefault("image_id")
2351+
imageIdVariableStr := fmt.Sprintf("variable \"image_id\" { default = \"%s\" }\n", imageId)
2352+
2353+
resourceName := "oci_core_instance.test_instance"
2354+
2355+
resource.Test(t, resource.TestCase{
2356+
Providers: map[string]*schema.Provider{
2357+
"oci": provider,
2358+
},
2359+
CheckDestroy: testAccCheckCoreInstanceDestroy,
2360+
Steps: []resource.TestStep{
2361+
// Create E4 Dense shape and shape config
2362+
{
2363+
Config: config + compartmentIdVariableStr + imageIdVariableStr + InstanceResourceDependenciesWithoutDHV +
2364+
acctest.GenerateResourceFromRepresentationMap("oci_core_instance", "test_instance", acctest.Required, acctest.Create, instanceRepresentationWithNvmes),
2365+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
2366+
resource.TestCheckResourceAttr(resourceName, "shape", "VM.DenseIO.E4.Flex"),
2367+
resource.TestCheckResourceAttr(resourceName, "shape_config.0.ocpus", "8"),
2368+
resource.TestCheckResourceAttr(resourceName, "shape_config.0.local_disks", "1"),
2369+
resource.TestCheckResourceAttr(resourceName, "shape_config.0.memory_in_gbs", "128"),
2370+
func(s *terraform.State) (err error) {
2371+
_, err = acctest.FromInstanceState(s, resourceName, "id")
2372+
return err
2373+
},
2374+
),
2375+
},
2376+
},
2377+
})
2378+
}
2379+
23122380
// issue-routing-tag: core/computeSharedOwnershipVmAndBm
23132381
func TestAccResourceCoreInstance_FlexibleMemory(t *testing.T) {
23142382
httpreplay.SetScenario("TestAccResourceCoreInstance_FlexibleMemory")

internal/service/core/core_instance_configuration_resource.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,12 @@ func CoreInstanceConfigurationResource() *schema.Resource {
749749
Computed: true,
750750
ForceNew: true,
751751
},
752+
"nvmes": {
753+
Type: schema.TypeInt,
754+
Optional: true,
755+
Computed: true,
756+
ForceNew: true,
757+
},
752758
"ocpus": {
753759
Type: schema.TypeFloat,
754760
Optional: true,
@@ -2283,6 +2289,11 @@ func (s *CoreInstanceConfigurationResourceCrud) mapToInstanceConfigurationLaunch
22832289
result.MemoryInGBs = &tmp
22842290
}
22852291

2292+
if nvmes, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "nvmes")); ok {
2293+
tmp := nvmes.(int)
2294+
result.Nvmes = &tmp
2295+
}
2296+
22862297
if ocpus, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "ocpus")); ok {
22872298
tmp := float32(ocpus.(float64))
22882299
result.Ocpus = &tmp
@@ -2300,6 +2311,10 @@ func InstanceConfigurationLaunchInstanceShapeConfigDetailsToMap(obj *oci_core.In
23002311
result["memory_in_gbs"] = float32(*obj.MemoryInGBs)
23012312
}
23022313

2314+
if obj.Nvmes != nil {
2315+
result["nvmes"] = int(*obj.Nvmes)
2316+
}
2317+
23032318
if obj.Ocpus != nil {
23042319
result["ocpus"] = float32(*obj.Ocpus)
23052320
}

internal/service/core/core_instance_resource.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,11 @@ func CoreInstanceResource() *schema.Resource {
504504
Optional: true,
505505
Computed: true,
506506
},
507+
"nvmes": {
508+
Type: schema.TypeInt,
509+
Optional: true,
510+
Computed: true,
511+
},
507512
"ocpus": {
508513
Type: schema.TypeFloat,
509514
Optional: true,
@@ -2101,6 +2106,11 @@ func (s *CoreInstanceResourceCrud) mapToLaunchInstanceShapeConfigDetails(fieldKe
21012106
result.MemoryInGBs = &tmp
21022107
}
21032108

2109+
if nvmes, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "nvmes")); ok {
2110+
tmp := nvmes.(int)
2111+
result.Nvmes = &tmp
2112+
}
2113+
21042114
if ocpus, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "ocpus")); ok {
21052115
tmp := float32(ocpus.(float64))
21062116
result.Ocpus = &tmp
@@ -2148,6 +2158,7 @@ func InstanceShapeConfigToMap(obj *oci_core.InstanceShapeConfig) map[string]inte
21482158

21492159
if obj.LocalDisks != nil {
21502160
result["local_disks"] = int(*obj.LocalDisks)
2161+
result["nvmes"] = int(*obj.LocalDisks)
21512162
}
21522163

21532164
if obj.LocalDisksTotalSizeInGBs != nil {

website/docs/d/core_instance_configuration.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ The following attributes are exported:
229229
* `BASELINE_1_2` - baseline usage is 1/2 of an OCPU.
230230
* `BASELINE_1_1` - baseline usage is an entire OCPU. This represents a non-burstable instance.
231231
* `memory_in_gbs` - The total amount of memory available to the instance, in gigabytes.
232+
* `nvmes` - The number of NVMe drives to be used for storage. A single drive has 6.8 TB available.
232233
* `ocpus` - The total number of OCPUs available to the instance.
233234
* `source_details` -
234235
* `boot_volume_id` - The OCID of the boot volume used to boot the instance.

website/docs/d/core_instance_configurations.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ The following attributes are exported:
236236
* `BASELINE_1_2` - baseline usage is 1/2 of an OCPU.
237237
* `BASELINE_1_1` - baseline usage is an entire OCPU. This represents a non-burstable instance.
238238
* `memory_in_gbs` - The total amount of memory available to the instance, in gigabytes.
239+
* `nvmes` - The number of NVMe drives to be used for storage. A single drive has 6.8 TB available.
239240
* `ocpus` - The total number of OCPUs available to the instance.
240241
* `source_details` -
241242
* `boot_volume_id` - The OCID of the boot volume used to boot the instance.

website/docs/r/core_instance.html.markdown

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ resource "oci_core_instance" "test_instance" {
147147
#Optional
148148
baseline_ocpu_utilization = var.instance_shape_config_baseline_ocpu_utilization
149149
memory_in_gbs = var.instance_shape_config_memory_in_gbs
150+
nvmes = var.instance_shape_config_nvmes
150151
ocpus = var.instance_shape_config_ocpus
151152
}
152153
source_details {
@@ -370,6 +371,7 @@ The following arguments are supported:
370371
* `BASELINE_1_2` - baseline usage is 1/2 of an OCPU.
371372
* `BASELINE_1_1` - baseline usage is an entire OCPU. This represents a non-burstable instance.
372373
* `memory_in_gbs` - (Optional) (Updatable) The total amount of memory available to the instance, in gigabytes.
374+
* `nvmes` - (Optional) (Updatable) The number of NVMe drives to be used for storage. A single drive has 6.8 TB available.
373375
* `ocpus` - (Optional) (Updatable) The total number of OCPUs available to the instance.
374376
* `source_details` - (Optional) (Updatable)
375377
* `boot_volume_size_in_gbs` - (Applicable when source_type=image) (Updatable) The size of the boot volume in GBs. Minimum value is 50 GB and maximum value is 32,768 GB (32 TB).

0 commit comments

Comments
 (0)