Skip to content

Commit e7ab6c1

Browse files
rashik-bhasinsrishtipmishra
authored andcommitted
Migrate to VCN status support added to container engine
1 parent f5cacb5 commit e7ab6c1

10 files changed

+329
-51
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### Added
44
- Support for Data Safe target database registration
55
- Support for Elastic storage for ExaCC
6+
- Support for Migrate VCN status added to container engine
67

78
## 4.30.0 (June 09, 2021)
89

examples/container_engine/main.tf

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ resource "oci_containerengine_node_pool" "test_node_pool" {
197197

198198
node_source_details {
199199
#Required
200-
image_id = local.oracle_linux_images.0
200+
image_id = local.image_id
201201
source_type = "IMAGE"
202202

203203
#Optional
@@ -219,8 +219,8 @@ resource "oci_containerengine_node_pool" "test_flex_shape_node_pool" {
219219

220220
node_source_details {
221221
#Required
222-
image_id = data.oci_containerengine_node_pool_option.test_node_pool_option.sources[0].image_id
223-
source_type = data.oci_containerengine_node_pool_option.test_node_pool_option.sources[0].source_type
222+
image_id = local.oracle_linux_images.0
223+
source_type = "IMAGE"
224224
}
225225

226226
node_shape_config {
@@ -265,10 +265,22 @@ data "oci_containerengine_node_pool_option" "test_node_pool_option" {
265265
node_pool_option_id = "all"
266266
}
267267

268+
data "oci_core_images" "shape_specific_images" {
269+
#Required
270+
compartment_id = var.tenancy_ocid
271+
shape = "VM.Standard2.1"
272+
}
273+
268274
locals {
275+
all_images = "${data.oci_core_images.shape_specific_images.images}"
269276
all_sources = "${data.oci_containerengine_node_pool_option.test_node_pool_option.sources}"
270277

278+
compartment_images = [for image in local.all_images : image.id if length(regexall("Oracle-Linux-[0-9]*.[0-9]*-20[0-9]*",image.display_name)) > 0 ]
279+
271280
oracle_linux_images = [for source in local.all_sources : source.image_id if length(regexall("Oracle-Linux-[0-9]*.[0-9]*-20[0-9]*",source.source_name)) > 0]
281+
282+
image_id = tolist(setintersection( toset(local.compartment_images), toset(local.oracle_linux_images)))[0]
283+
272284
}
273285

274286
output "cluster_kubernetes_versions" {

examples/container_engine/regional_subnet/datasources.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,22 @@ data "oci_containerengine_node_pool_option" "test_node_pool_option" {
1919
node_pool_option_id = "all"
2020
}
2121

22+
data "oci_core_images" "shape_specific_images" {
23+
#Required
24+
compartment_id = var.tenancy_ocid
25+
shape = "VM.Standard2.1"
26+
}
27+
2228
locals {
29+
all_images = "${data.oci_core_images.shape_specific_images.images}"
2330
all_sources = "${data.oci_containerengine_node_pool_option.test_node_pool_option.sources}"
2431

32+
compartment_images = [for image in local.all_images : image.id if length(regexall("Oracle-Linux-[0-9]*.[0-9]*-20[0-9]*",image.display_name)) > 0 ]
33+
2534
oracle_linux_images = [for source in local.all_sources : source.image_id if length(regexall("Oracle-Linux-[0-9]*.[0-9]*-20[0-9]*",source.source_name)) > 0]
35+
36+
image_id = tolist(setintersection( toset(local.compartment_images), toset(local.oracle_linux_images)))[0]
37+
2638
}
2739

2840
output "cluster_kubernetes_versions" {

examples/container_engine/regional_subnet/variables.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ variable "node_pool_name" {
3838
}
3939

4040
variable "node_pool_node_image_name" {
41-
default = "Oracle-Linux-7.4"
41+
default = "Oracle-Linux-7.6"
4242
}
4343

4444
variable "node_pool_node_shape" {

oci/containerengine_cluster_resource.go

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ func ContainerengineClusterResource() *schema.Resource {
7070
"subnet_id": {
7171
Type: schema.TypeString,
7272
Required: true,
73-
ForceNew: true,
7473
},
7574

7675
// Optional
@@ -656,9 +655,19 @@ func (s *ContainerengineClusterResourceCrud) Get() error {
656655
func (s *ContainerengineClusterResourceCrud) Update() error {
657656
clusterID := s.D.Id()
658657
if endpointConfig, ok := s.D.GetOkExists("endpoint_config"); ok && s.D.HasChange("endpoint_config") {
659-
err := s.updateClusterEndpointConfig(clusterID, endpointConfig)
660-
if err != nil {
661-
return err
658+
oldConfig, _ := s.D.GetChange("endpoint_config")
659+
oldConfigList := oldConfig.([]interface{})
660+
if len(oldConfigList) > 0 {
661+
//If an endpoint config is already set on the cluster, perform and UpdateClusterEndpointConfig operation, otherwise perform a MigrateClusterToNativeVCN operation
662+
err := s.updateClusterEndpointConfig(clusterID, endpointConfig)
663+
if err != nil {
664+
return err
665+
}
666+
} else {
667+
err := s.migrateClusterToNativeVCN(clusterID, endpointConfig)
668+
if err != nil {
669+
return err
670+
}
662671
}
663672
}
664673

@@ -728,6 +737,28 @@ func (s *ContainerengineClusterResourceCrud) updateClusterEndpointConfig(cluster
728737
return s.getClusterFromWorkRequest(workID, getRetryPolicy(s.DisableNotFoundRetries, "containerengine"), oci_containerengine.WorkRequestResourceActionTypeUpdated, s.D.Timeout(schema.TimeoutUpdate))
729738
}
730739

740+
func (s *ContainerengineClusterResourceCrud) migrateClusterToNativeVCN(clusterID string, endpointConfig interface{}) error {
741+
request := oci_containerengine.ClusterMigrateToNativeVcnRequest{}
742+
request.ClusterId = &clusterID
743+
744+
if tmpList := endpointConfig.([]interface{}); len(tmpList) > 0 {
745+
fieldKeyFormat := fmt.Sprintf("%s.%d.%%s", "endpoint_config", 0)
746+
tmp, err := s.mapToMigrateClusterToNativeVCNDetails(fieldKeyFormat)
747+
if err != nil {
748+
return err
749+
}
750+
request.ClusterMigrateToNativeVcnDetails = tmp
751+
}
752+
753+
response, err := s.Client.ClusterMigrateToNativeVcn(context.Background(), request)
754+
if err != nil {
755+
return err
756+
}
757+
758+
workID := response.OpcWorkRequestId
759+
return s.getClusterFromWorkRequest(workID, getRetryPolicy(s.DisableNotFoundRetries, "containerengine"), oci_containerengine.WorkRequestResourceActionTypeUpdated, s.D.Timeout(schema.TimeoutUpdate))
760+
}
761+
731762
func (s *ContainerengineClusterResourceCrud) Delete() error {
732763
request := oci_containerengine.DeleteClusterRequest{}
733764

@@ -1015,6 +1046,42 @@ func (s *ContainerengineClusterResourceCrud) mapToUpdateClusterEndpointConfigDet
10151046
return result, nil
10161047
}
10171048

1049+
func (s *ContainerengineClusterResourceCrud) mapToMigrateClusterToNativeVCNDetails(fieldKeyFormat string) (oci_containerengine.ClusterMigrateToNativeVcnDetails, error) {
1050+
result := oci_containerengine.ClusterMigrateToNativeVcnDetails{}
1051+
endpointConfigDetails := oci_containerengine.ClusterEndpointConfig{}
1052+
1053+
if isPublicIpEnabled, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "is_public_ip_enabled")); ok {
1054+
tmp := isPublicIpEnabled.(bool)
1055+
endpointConfigDetails.IsPublicIpEnabled = &tmp
1056+
}
1057+
if nsgIds, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "nsg_ids")); ok {
1058+
set := nsgIds.(*schema.Set)
1059+
interfaces := set.List()
1060+
tmp := make([]string, len(interfaces))
1061+
for i := range interfaces {
1062+
if interfaces[i] != nil {
1063+
tmp[i] = interfaces[i].(string)
1064+
}
1065+
}
1066+
if len(tmp) != 0 || s.D.HasChange(fmt.Sprintf(fieldKeyFormat, "nsg_ids")) {
1067+
endpointConfigDetails.NsgIds = tmp
1068+
}
1069+
}
1070+
if subnetId, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "subnet_id")); ok {
1071+
tmp := subnetId.(string)
1072+
endpointConfigDetails.SubnetId = &tmp
1073+
}
1074+
1075+
result.EndpointConfig = &endpointConfigDetails
1076+
1077+
if DecommissionDelayDuration, ok := s.D.GetOkExists(fmt.Sprintf(fieldKeyFormat, "decommission_delay_duration")); ok {
1078+
tmp := DecommissionDelayDuration.(string)
1079+
result.DecommissionDelayDuration = &tmp
1080+
}
1081+
1082+
return result, nil
1083+
}
1084+
10181085
func (s *ContainerengineClusterResourceCrud) mapToCreateClusterEndpointConfigDetails(fieldKeyFormat string) (oci_containerengine.CreateClusterEndpointConfigDetails, error) {
10191086
result := oci_containerengine.CreateClusterEndpointConfigDetails{}
10201087

oci/containerengine_cluster_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ var (
6060
"service_lb_subnet_ids": Representation{repType: Optional, create: []string{`${oci_core_subnet.clusterSubnet_1.id}`, `${oci_core_subnet.clusterSubnet_2.id}`}},
6161
}
6262
clusterImagePolicyConfigKeyDetailsRepresentation = map[string]interface{}{
63-
"kms_key_id": Representation{repType: Optional, update: `${lookup(data.oci_kms_keys.test_keys_dependency_RSA.keys[0], "id")}`},
63+
"kms_key_id": Representation{repType: Optional, create: `${lookup(data.oci_kms_keys.test_keys_dependency_RSA.keys[0], "id")}`},
6464
}
6565
clusterOptionsAddOnsRepresentation = map[string]interface{}{
6666
"is_kubernetes_dashboard_enabled": Representation{repType: Optional, create: `true`},
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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_containerengine "github.com/oracle/oci-go-sdk/v41/containerengine"
11+
)
12+
13+
func init() {
14+
RegisterDatasource("oci_containerengine_migrate_to_native_vcn_status",
15+
ContainerengineMigrateToNativeVcnStatusDataSource())
16+
}
17+
18+
func ContainerengineMigrateToNativeVcnStatusDataSource() *schema.Resource {
19+
return &schema.Resource{
20+
Read: readSingularContainerengineMigrateToNativeVcnStatus,
21+
Schema: map[string]*schema.Schema{
22+
"cluster_id": {
23+
Type: schema.TypeString,
24+
Required: true,
25+
},
26+
// Computed
27+
"state": {
28+
Type: schema.TypeString,
29+
Computed: true,
30+
},
31+
"time_decommission_scheduled": {
32+
Type: schema.TypeString,
33+
Computed: true,
34+
},
35+
},
36+
}
37+
}
38+
39+
func readSingularContainerengineMigrateToNativeVcnStatus(d *schema.ResourceData, m interface{}) error {
40+
sync := &ContainerengineMigrateToNativeVcnStatusDataSourceCrud{}
41+
sync.D = d
42+
sync.Client = m.(*OracleClients).containerEngineClient()
43+
44+
return ReadResource(sync)
45+
}
46+
47+
type ContainerengineMigrateToNativeVcnStatusDataSourceCrud struct {
48+
D *schema.ResourceData
49+
Client *oci_containerengine.ContainerEngineClient
50+
Res *oci_containerengine.GetClusterMigrateToNativeVcnStatusResponse
51+
}
52+
53+
func (s *ContainerengineMigrateToNativeVcnStatusDataSourceCrud) VoidState() {
54+
s.D.SetId("")
55+
}
56+
57+
func (s *ContainerengineMigrateToNativeVcnStatusDataSourceCrud) Get() error {
58+
request := oci_containerengine.GetClusterMigrateToNativeVcnStatusRequest{}
59+
60+
if clusterId, ok := s.D.GetOkExists("cluster_id"); ok {
61+
tmp := clusterId.(string)
62+
request.ClusterId = &tmp
63+
}
64+
65+
request.RequestMetadata.RetryPolicy = getRetryPolicy(false, "containerengine")
66+
67+
response, err := s.Client.GetClusterMigrateToNativeVcnStatus(context.Background(), request)
68+
if err != nil {
69+
return err
70+
}
71+
72+
s.Res = &response
73+
return nil
74+
}
75+
76+
func (s *ContainerengineMigrateToNativeVcnStatusDataSourceCrud) SetData() error {
77+
if s.Res == nil {
78+
return nil
79+
}
80+
81+
s.D.SetId(GenerateDataSourceHashID("ContainerengineMigrateToNativeVcnStatusDataSource-",
82+
ContainerengineMigrateToNativeVcnStatusDataSource(), s.D))
83+
84+
s.D.Set("state", s.Res.State)
85+
86+
if s.Res.TimeDecommissionScheduled != nil {
87+
s.D.Set("time_decommission_scheduled", s.Res.TimeDecommissionScheduled.String())
88+
}
89+
90+
return nil
91+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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+
"github.com/hashicorp/terraform-plugin-sdk/terraform"
12+
13+
"github.com/terraform-providers/terraform-provider-oci/httpreplay"
14+
)
15+
16+
var (
17+
migrateToNativeVCNSingularDataSourceRepresentation = map[string]interface{}{
18+
"cluster_id": Representation{repType: Required, create: `${oci_containerengine_cluster.test_cluster.id}`},
19+
}
20+
)
21+
22+
func TestContainerengineMigrateToNativeVcnStatusResource_basic(t *testing.T) {
23+
httpreplay.SetScenario("TestContainerengineMigrateToNativeVcnStatusResource_basic")
24+
defer httpreplay.SaveScenario()
25+
26+
provider := testAccProvider
27+
config := testProviderConfig()
28+
29+
compartmentId := getEnvSettingWithBlankDefault("compartment_ocid")
30+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
31+
32+
resourceName := "oci_containerengine_cluster.test_cluster"
33+
singularDatasourceName := "data.oci_containerengine_migrate_to_native_vcn_status.test_migrate_to_native_vcn_status"
34+
35+
var resId, resId2 string
36+
37+
saveConfigContent("", "", "", t)
38+
39+
resource.Test(t, resource.TestCase{
40+
PreCheck: func() { testAccPreCheck(t) },
41+
Providers: map[string]terraform.ResourceProvider{
42+
"oci": provider,
43+
},
44+
CheckDestroy: testAccCheckContainerengineClusterDestroy,
45+
46+
Steps: []resource.TestStep{
47+
// create V1 Cluster
48+
{
49+
Config: config + compartmentIdVariableStr + ClusterResourceDependencies + generateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", Required, Create, representationCopyWithRemovedProperties(clusterRepresentation, []string{"kms_key_id", "options", "image_policy_config"})),
50+
Check: resource.ComposeAggregateTestCheckFunc(
51+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
52+
resource.TestCheckResourceAttrSet(resourceName, "kubernetes_version"),
53+
resource.TestCheckResourceAttr(resourceName, "name", "name"),
54+
resource.TestCheckResourceAttrSet(resourceName, "vcn_id"),
55+
56+
func(s *terraform.State) (err error) {
57+
resId, err = fromInstanceState(s, resourceName, "id")
58+
return err
59+
},
60+
),
61+
},
62+
63+
// verify V1 Cluster migrates to V2
64+
{
65+
Config: config + compartmentIdVariableStr + ClusterResourceDependencies + generateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", Optional, Update, representationCopyWithRemovedProperties(clusterRepresentation, []string{"kms_key_id", "options", "image_policy_config"})),
66+
Check: resource.ComposeAggregateTestCheckFunc(
67+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
68+
resource.TestCheckResourceAttr(resourceName, "endpoint_config.#", "1"),
69+
resource.TestCheckResourceAttr(resourceName, "endpoint_config.0.is_public_ip_enabled", "false"),
70+
resource.TestCheckResourceAttrSet(resourceName, "endpoint_config.0.subnet_id"),
71+
resource.TestCheckResourceAttrSet(resourceName, "endpoint_config.0.nsg_ids.#"),
72+
resource.TestCheckResourceAttrSet(resourceName, "kubernetes_version"),
73+
resource.TestCheckResourceAttrSet(resourceName, "vcn_id"),
74+
75+
func(s *terraform.State) (err error) {
76+
resId2, err = fromInstanceState(s, resourceName, "id")
77+
if resId != resId2 {
78+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
79+
}
80+
return err
81+
},
82+
),
83+
},
84+
// verify singular datasource
85+
{
86+
Config: config + compartmentIdVariableStr + ClusterResourceDependencies + generateResourceFromRepresentationMap("oci_containerengine_cluster", "test_cluster", Optional, Update, representationCopyWithRemovedProperties(clusterRepresentation, []string{"kms_key_id", "options", "image_policy_config"})) + generateDataSourceFromRepresentationMap(
87+
"oci_containerengine_migrate_to_native_vcn_status", "test_migrate_to_native_vcn_status",
88+
Optional, Create, migrateToNativeVCNSingularDataSourceRepresentation),
89+
Check: resource.ComposeAggregateTestCheckFunc(
90+
resource.TestCheckResourceAttrSet(singularDatasourceName, "cluster_id"),
91+
resource.TestCheckResourceAttrSet(singularDatasourceName, "state"),
92+
resource.TestCheckResourceAttrSet(singularDatasourceName, "time_decommission_scheduled"),
93+
),
94+
},
95+
},
96+
})
97+
}

0 commit comments

Comments
 (0)