Skip to content

Commit 5e14f85

Browse files
Steven Cheongvsin12
authored andcommitted
Added - Support for OCI Container Registry (OCIR): Tagging
1 parent 408bf85 commit 5e14f85

20 files changed

+495
-28
lines changed

examples/artifacts/ContainerImageSignature/container_image_signature.tf

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,53 @@ provider "oci" {
1616
region = var.region
1717
}
1818

19-
variable "container_image_signature_compartment_id_in_subtree" {}
19+
variable "container_image_signature_compartment_id_in_subtree" {
20+
default = false
21+
}
22+
23+
variable "container_image_signature_defined_tags_value" {
24+
default = "value"
25+
}
26+
27+
variable "container_image_signature_freeform_tags" {
28+
default = { "Department" = "Finance" }
29+
}
2030

2131
// specify the container image to upload to
22-
variable "container_image_id" {}
32+
variable "container_image_id" {
33+
default = "container_image_id"
34+
}
2335

24-
// specify the management endpoint for the key
25-
variable "crypto_endpoint" {}
36+
// specify the crypto endpoint for the key
37+
variable "crypto_endpoint" {
38+
default = "https://xxxxx-crypto.kms.us-phoenix-1.oraclecloud.com"
39+
}
2640

2741
// specify the kms key to sign the message
28-
variable "kms_rsa_key_id" {}
42+
variable "kms_rsa_key_id" {
43+
default = "kms_rsa_key_id"
44+
}
2945

3046
// specify the kms key version to sign the message
31-
variable "kms_rsa_key_version_id" {}
47+
variable "kms_rsa_key_version_id" {
48+
default = "kms_rsa_key_version_id"
49+
}
3250

3351
// the algorithm to sign with the key
34-
variable "kms_signing_algorithm" {}
52+
variable "kms_signing_algorithm" {
53+
default = "SHA_224_RSA_PKCS_PSS"
54+
}
3555

3656
// user inputted description to include in the signature
37-
variable "description" {}
57+
variable "description" {
58+
default = "test"
59+
}
3860

3961
// user defined a json string to include in the signature (eg. use escape character for the key/value string)
4062
// ex. "{\\\"buildNumber\\\":\\\"123\\\"}"
41-
variable "metadata" {}
63+
variable "metadata" {
64+
default = ""
65+
}
4266

4367
data "oci_artifacts_container_image" "test_container_image" {
4468
image_id = var.container_image_id
@@ -80,6 +104,10 @@ resource "oci_artifacts_container_image_signature" "test_container_image_signatu
80104
message = base64encode(local.message)
81105
signature = oci_kms_sign.test_sign.signature
82106
signing_algorithm = var.kms_signing_algorithm
107+
108+
#Optional
109+
defined_tags = { "example-tag-namespace-all.example-tag" = var.container_image_signature_defined_tags_value }
110+
freeform_tags = var.container_image_signature_freeform_tags
83111
}
84112

85113
data "oci_artifacts_container_image_signatures" "test_container_image_signatures" {

examples/artifacts/ContainerRepository/container_repository.tf

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ variable "container_repository_compartment_id_in_subtree" {
1212
default = false
1313
}
1414

15+
variable "container_repository_defined_tags_value" {
16+
default = "value"
17+
}
18+
19+
variable "container_repository_freeform_tags" {
20+
default = { "Department" = "Finance" }
21+
}
22+
1523
variable "container_repository_is_immutable" {
1624
default = false
1725
}
@@ -45,7 +53,7 @@ provider "oci" {
4553
// repository displayName needs to be unique within a tenant, so generate random string here to avoid collision
4654
resource "random_string" "container_repository_display_name" {
4755
length = 5
48-
number = false
56+
numeric = false
4957
special = false
5058
upper = false
5159
}
@@ -56,8 +64,10 @@ resource "oci_artifacts_container_repository" "test_container_repository" {
5664
display_name = random_string.container_repository_display_name.result
5765

5866
#Optional
59-
is_immutable = var.container_repository_is_immutable
60-
is_public = var.container_repository_is_public
67+
defined_tags = { "example-tag-namespace-all.example-tag" = var.container_repository_defined_tags_value }
68+
freeform_tags = var.container_repository_freeform_tags
69+
is_immutable = var.container_repository_is_immutable
70+
is_public = var.container_repository_is_public
6171
readme {
6272
#Required
6373
content = var.container_repository_readme_content

internal/integrationtest/artifacts_container_image_signature_test.go

Lines changed: 111 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"strconv"
1010
"testing"
11+
"time"
1112

1213
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1314
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -24,6 +25,10 @@ import (
2425
)
2526

2627
var (
28+
// We need a few resources such as KMS vault and container image pre-created
29+
// Therefore, before running the signature tests below, please first set the following env var:
30+
// TF_VAR_container_image_ocid, TF_VAR_kms_vault_ocid, TF_VAR_management_endpoint, and TF_VAR_container_image_signing_signature
31+
2732
message = utils.GetEnvSettingWithBlankDefault("container_image_signing_signature")
2833
signingAlgorithm = "SHA_224_RSA_PKCS_PSS"
2934
signingAlgorithmStr = fmt.Sprintf("variable \"signingAlgorithm\" { default = \"%s\" }\n", signingAlgorithm)
@@ -55,12 +60,19 @@ var (
5560
"message": acctest.Representation{RepType: acctest.Required, Create: message},
5661
"signature": acctest.Representation{RepType: acctest.Required, Create: `${oci_kms_sign.test_container_image_signature_kms_sign.signature}`},
5762
"signing_algorithm": acctest.Representation{RepType: acctest.Required, Create: signingAlgorithm},
63+
"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")}`},
64+
"freeform_tags": acctest.Representation{RepType: acctest.Optional, Create: map[string]string{"Department": "Finance"}, Update: map[string]string{"Department": "Accounting"}},
5865
}
5966

6067
ArtifactsArtifactscontainerContainerImageSignatureSingularDataSourceRepresentation = map[string]interface{}{
6168
"image_signature_id": acctest.Representation{RepType: acctest.Required, Create: `${oci_artifacts_container_image_signature.test_container_image_signature.id}`},
6269
}
6370

71+
ArtifactsArtifactscontainerContainerImageSignatureResourceDependencies = descriptionStr + metadataStr + signingAlgorithmStr +
72+
DefinedTagsDependencies +
73+
ArtifactsArtifactscontainerImageResourceConfig +
74+
ArtifactsArtifactscontainerContainerImageSignatureKmsSignResourceDependencies
75+
6476
ArtifactsArtifactscontainerContainerImageSignatureDataSourceRepresentation = map[string]interface{}{
6577
"compartment_id": acctest.Representation{RepType: acctest.Required, Create: `${data.oci_artifacts_container_image.test_container_image.compartment_id}`},
6678
"compartment_id_in_subtree": acctest.Representation{RepType: acctest.Optional, Create: `false`},
@@ -88,18 +100,18 @@ func TestArtifactsContainerImageSignatureResource_basic(t *testing.T) {
88100

89101
config := acctest.ProviderTestConfig()
90102

103+
compartmentId := utils.GetEnvSettingWithBlankDefault("compartment_ocid")
104+
91105
resourceName := "oci_artifacts_container_image_signature.test_container_image_signature"
92106
datasourceName := "data.oci_artifacts_container_image_signatures.test_container_image_signatures"
93107
singularDatasourceName := "data.oci_artifacts_container_image_signature.test_container_image_signature"
94108

95-
var resId string
109+
var resId, resId2 string
96110

97111
acctest.ResourceTest(t, testAccCheckArtifactsContainerImageSignatureDestroy, []resource.TestStep{
98112
// verify Create
99113
{
100-
Config: config + descriptionStr + metadataStr + signingAlgorithmStr +
101-
ArtifactsArtifactscontainerImageResourceConfig +
102-
ArtifactsArtifactscontainerContainerImageSignatureKmsSignResourceDependencies +
114+
Config: config + ArtifactsArtifactscontainerContainerImageSignatureResourceDependencies +
103115
acctest.GenerateResourceFromRepresentationMap("oci_artifacts_container_image_signature", "test_container_image_signature", acctest.Required, acctest.Create, ArtifactsArtifactscontainerContainerImageSignatureRepresentation),
104116
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
105117
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
@@ -113,6 +125,37 @@ func TestArtifactsContainerImageSignatureResource_basic(t *testing.T) {
113125
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
114126
resource.TestCheckResourceAttr(resourceName, "signing_algorithm", signingAlgorithm),
115127

128+
func(s *terraform.State) (err error) {
129+
resId, err = acctest.FromInstanceState(s, resourceName, "id")
130+
return err
131+
},
132+
),
133+
},
134+
135+
// delete before next Create
136+
{
137+
Config: config + ArtifactsArtifactscontainerImageResourceConfig,
138+
},
139+
// verify Create with optionals
140+
{
141+
Config: config + ArtifactsArtifactscontainerContainerImageSignatureResourceDependencies +
142+
acctest.GenerateResourceFromRepresentationMap("oci_artifacts_container_image_signature", "test_container_image_signature", acctest.Optional, acctest.Create, ArtifactsArtifactscontainerContainerImageSignatureRepresentation),
143+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
144+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
145+
resource.TestCheckResourceAttrSet(resourceName, "created_by"),
146+
resource.TestCheckResourceAttrSet(resourceName, "display_name"),
147+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
148+
resource.TestCheckResourceAttr(resourceName, "defined_tags.%", "1"),
149+
resource.TestCheckResourceAttrSet(resourceName, "id"),
150+
resource.TestCheckResourceAttrSet(resourceName, "image_id"),
151+
resource.TestCheckResourceAttrSet(resourceName, "kms_key_id"),
152+
resource.TestCheckResourceAttrSet(resourceName, "kms_key_version_id"),
153+
resource.TestCheckResourceAttr(resourceName, "message", message),
154+
resource.TestCheckResourceAttrPair(resourceName, "signature", "oci_kms_sign.test_container_image_signature_kms_sign", "signature"),
155+
resource.TestCheckResourceAttr(resourceName, "signing_algorithm", signingAlgorithm),
156+
resource.TestCheckResourceAttrSet(resourceName, "state"),
157+
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
158+
116159
func(s *terraform.State) (err error) {
117160
resId, err = acctest.FromInstanceState(s, resourceName, "id")
118161
if isEnableExportCompartment, _ := strconv.ParseBool(utils.GetEnvSettingWithDefault("enable_export_compartment", "true")); isEnableExportCompartment {
@@ -125,11 +168,38 @@ func TestArtifactsContainerImageSignatureResource_basic(t *testing.T) {
125168
),
126169
},
127170

171+
// verify updates to updatable parameters
172+
{
173+
Config: config + ArtifactsArtifactscontainerContainerImageSignatureResourceDependencies +
174+
acctest.GenerateResourceFromRepresentationMap("oci_artifacts_container_image_signature", "test_container_image_signature", acctest.Optional, acctest.Update, ArtifactsArtifactscontainerContainerImageSignatureRepresentation),
175+
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
176+
resource.TestCheckResourceAttr(resourceName, "compartment_id", compartmentId),
177+
resource.TestCheckResourceAttrSet(resourceName, "created_by"),
178+
resource.TestCheckResourceAttrSet(resourceName, "display_name"),
179+
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
180+
resource.TestCheckResourceAttr(resourceName, "defined_tags.%", "1"),
181+
resource.TestCheckResourceAttrSet(resourceName, "id"),
182+
resource.TestCheckResourceAttrSet(resourceName, "image_id"),
183+
resource.TestCheckResourceAttrSet(resourceName, "kms_key_id"),
184+
resource.TestCheckResourceAttrSet(resourceName, "kms_key_version_id"),
185+
resource.TestCheckResourceAttr(resourceName, "message", message),
186+
resource.TestCheckResourceAttrPair(resourceName, "signature", "oci_kms_sign.test_container_image_signature_kms_sign", "signature"),
187+
resource.TestCheckResourceAttr(resourceName, "signing_algorithm", signingAlgorithm),
188+
resource.TestCheckResourceAttrSet(resourceName, "state"),
189+
resource.TestCheckResourceAttrSet(resourceName, "time_created"),
190+
191+
func(s *terraform.State) (err error) {
192+
resId2, err = acctest.FromInstanceState(s, resourceName, "id")
193+
if resId != resId2 {
194+
return fmt.Errorf("Resource recreated when it was supposed to be updated.")
195+
}
196+
return err
197+
},
198+
),
199+
},
128200
// verify datasource
129201
{
130-
Config: config + descriptionStr + metadataStr + signingAlgorithmStr +
131-
ArtifactsArtifactscontainerImageResourceConfig +
132-
ArtifactsArtifactscontainerContainerImageSignatureKmsSignResourceDependencies +
202+
Config: config + ArtifactsArtifactscontainerContainerImageSignatureResourceDependencies +
133203
acctest.GenerateResourceFromRepresentationMap("oci_artifacts_container_image_signature", "test_container_image_signature", acctest.Optional, acctest.Update, ArtifactsArtifactscontainerContainerImageSignatureRepresentation) +
134204
acctest.GenerateDataSourceFromRepresentationMap("oci_artifacts_container_image_signatures", "test_container_image_signatures", acctest.Optional, acctest.Update, ArtifactsArtifactscontainerContainerImageSignatureDataSourceRepresentation),
135205
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
@@ -146,25 +216,28 @@ func TestArtifactsContainerImageSignatureResource_basic(t *testing.T) {
146216

147217
resource.TestCheckResourceAttr(datasourceName, "container_image_signature_collection.#", "1"),
148218
resource.TestCheckResourceAttr(datasourceName, "container_image_signature_collection.0.items.#", "1"),
219+
resource.TestCheckResourceAttr(datasourceName, "container_image_signature_collection.0.items.0.defined_tags.%", "1"),
220+
resource.TestCheckResourceAttr(datasourceName, "container_image_signature_collection.0.items.0.freeform_tags.%", "1"),
149221
),
150222
},
151223

152224
// verify singular datasource
153225
{
154-
Config: config + descriptionStr + metadataStr + signingAlgorithmStr +
155-
ArtifactsArtifactscontainerImageResourceConfig +
156-
ArtifactsArtifactscontainerContainerImageSignatureKmsSignResourceDependencies +
226+
Config: config + ArtifactsArtifactscontainerContainerImageSignatureResourceDependencies +
157227
acctest.GenerateResourceFromRepresentationMap("oci_artifacts_container_image_signature", "test_container_image_signature", acctest.Optional, acctest.Update, ArtifactsArtifactscontainerContainerImageSignatureRepresentation) +
158228
acctest.GenerateDataSourceFromRepresentationMap("oci_artifacts_container_image_signature", "test_container_image_signature", acctest.Required, acctest.Create, ArtifactsArtifactscontainerContainerImageSignatureSingularDataSourceRepresentation),
159229
Check: acctest.ComposeAggregateTestCheckFuncWrapper(
160230
resource.TestCheckResourceAttrSet(singularDatasourceName, "image_signature_id"),
161231
resource.TestCheckResourceAttr(singularDatasourceName, "compartment_id", compartmentId),
162232
resource.TestCheckResourceAttrSet(singularDatasourceName, "created_by"),
163233
resource.TestCheckResourceAttrSet(singularDatasourceName, "display_name"),
234+
resource.TestCheckResourceAttr(singularDatasourceName, "freeform_tags.%", "1"),
235+
resource.TestCheckResourceAttr(singularDatasourceName, "defined_tags.%", "1"),
164236
resource.TestCheckResourceAttrSet(singularDatasourceName, "id"),
165237
//resource.TestCheckResourceAttr(singularDatasourceName, "message", encodedMessage),
166238
resource.TestCheckResourceAttrSet(singularDatasourceName, "signature"),
167239
resource.TestCheckResourceAttr(singularDatasourceName, "signing_algorithm", signingAlgorithm),
240+
resource.TestCheckResourceAttrSet(singularDatasourceName, "state"),
168241
resource.TestCheckResourceAttrSet(singularDatasourceName, "time_created"),
169242
),
170243
},
@@ -193,10 +266,18 @@ func testAccCheckArtifactsContainerImageSignatureDestroy(s *terraform.State) err
193266

194267
request.RequestMetadata.RetryPolicy = tfresource.GetRetryPolicy(true, "artifacts")
195268

196-
_, err := client.GetContainerImageSignature(context.Background(), request)
269+
response, err := client.GetContainerImageSignature(context.Background(), request)
197270

198271
if err == nil {
199-
return fmt.Errorf("resource still exists")
272+
deletedLifecycleStates := map[string]bool{
273+
string(oci_artifacts.ContainerImageSignatureLifecycleStateDeleted): true,
274+
}
275+
if _, ok := deletedLifecycleStates[string(response.LifecycleState)]; !ok {
276+
//resource lifecycle state is not in expected deleted lifecycle states.
277+
return fmt.Errorf("resource lifecycle state: %s is not in expected deleted lifecycle states", response.LifecycleState)
278+
}
279+
//resource lifecycle state is in expected deleted lifecycle states. continue with next one.
280+
continue
200281
}
201282

202283
//Verify that exception is for '404 not found'.
@@ -241,6 +322,8 @@ func sweepArtifactsContainerImageSignatureResource(compartment string) error {
241322
fmt.Printf("Error deleting ContainerImageSignature %s %s, It is possible that the resource is already deleted. Please verify manually \n", containerImageSignatureId, error)
242323
continue
243324
}
325+
acctest.WaitTillCondition(acctest.TestAccProvider, &containerImageSignatureId, ArtifactsContainerImageSignatureSweepWaitCondition, time.Duration(3*time.Minute),
326+
ArtifactsContainerImageSignatureSweepResponseFetchOperation, "artifacts", true)
244327
}
245328
}
246329
return nil
@@ -269,3 +352,19 @@ func getContainerImageSignatureIds(compartment string) ([]string, error) {
269352
}
270353
return resourceIds, nil
271354
}
355+
356+
func ArtifactsContainerImageSignatureSweepWaitCondition(response common.OCIOperationResponse) bool {
357+
// 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.
358+
if containerImageSignatureResponse, ok := response.Response.(oci_artifacts.GetContainerImageSignatureResponse); ok {
359+
return containerImageSignatureResponse.LifecycleState != oci_artifacts.ContainerImageSignatureLifecycleStateDeleted
360+
}
361+
return false
362+
}
363+
364+
func ArtifactsContainerImageSignatureSweepResponseFetchOperation(client *tf_client.OracleClients, resourceId *string, retryPolicy *common.RetryPolicy) error {
365+
_, err := client.ArtifactsClient().GetContainerImageSignature(context.Background(), oci_artifacts.GetContainerImageSignatureRequest{RequestMetadata: common.RequestMetadata{
366+
RetryPolicy: retryPolicy,
367+
},
368+
})
369+
return err
370+
}

internal/integrationtest/artifacts_container_image_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ var (
2929
// Therefore, we need to set the env var of the pre-canned container image for testing, i.e. TF_VAR_container_image_ocid
3030

3131
imageId = utils.GetEnvSettingWithBlankDefault("container_image_ocid")
32-
compartmentId = utils.GetEnvSettingWithBlankDefault("tenancy_ocid")
32+
compartmentId = utils.GetEnvSettingWithBlankDefault("compartment_ocid")
3333

3434
ArtifactsArtifactscontainerImageSingularDataSourceRepresentation = map[string]interface{}{
3535
"image_id": acctest.Representation{RepType: acctest.Required, Create: imageId},
@@ -72,8 +72,9 @@ func TestArtifactsContainerImageResource_basic(t *testing.T) {
7272
resource.TestCheckResourceAttr(datasourceName, "state", "AVAILABLE"),
7373

7474
resource.TestCheckResourceAttr(datasourceName, "container_image_collection.#", "1"),
75-
7675
resource.TestCheckResourceAttr(datasourceName, "container_image_collection.0.items.#", "1"),
76+
resource.TestCheckResourceAttr(datasourceName, "container_image_collection.0.items.0.defined_tags.%", "2"),
77+
resource.TestCheckResourceAttr(datasourceName, "container_image_collection.0.items.0.freeform_tags.%", "3"),
7778
resource.TestCheckResourceAttr(datasourceName, "container_image_collection.0.remaining_items_count", "0"),
7879
),
7980
},
@@ -98,6 +99,8 @@ func TestArtifactsContainerImageResource_basic(t *testing.T) {
9899
resource.TestCheckResourceAttrSet(singularDatasourceName, "time_created"),
99100
resource.TestCheckResourceAttrSet(singularDatasourceName, "version"),
100101
resource.TestCheckResourceAttrSet(singularDatasourceName, "versions.#"),
102+
resource.TestCheckResourceAttr(singularDatasourceName, "freeform_tags.%", "3"),
103+
resource.TestCheckResourceAttr(singularDatasourceName, "defined_tags.%", "2"),
101104
),
102105
},
103106
})

0 commit comments

Comments
 (0)