Skip to content

Commit 67df62e

Browse files
committed
aws_sagemaker_image_version - add support for alias fixes #35931
1 parent 9e15953 commit 67df62e

File tree

6 files changed

+160
-6
lines changed

6 files changed

+160
-6
lines changed

.changelog/42609.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/aws_sagemaker_image_version: Add `aliases` argument
3+
```

internal/service/sagemaker/image_version.go

Lines changed: 94 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ func resourceImageVersion() *schema.Resource {
5454
Type: schema.TypeString,
5555
Computed: true,
5656
},
57+
"aliases": {
58+
Type: schema.TypeSet,
59+
Optional: true,
60+
Elem: &schema.Schema{
61+
Type: schema.TypeString,
62+
},
63+
},
5764
"base_image": {
5865
Type: schema.TypeString,
5966
Required: true,
@@ -119,7 +126,7 @@ func resourceImageVersionCreate(ctx context.Context, d *schema.ResourceData, met
119126
conn := meta.(*conns.AWSClient).SageMakerClient(ctx)
120127

121128
name := d.Get("image_name").(string)
122-
input := sagemaker.CreateImageVersionInput{
129+
input := &sagemaker.CreateImageVersionInput{
123130
ImageName: aws.String(name),
124131
BaseImage: aws.String(d.Get("base_image").(string)),
125132
ClientToken: aws.String(id.UniqueId()),
@@ -153,7 +160,15 @@ func resourceImageVersionCreate(ctx context.Context, d *schema.ResourceData, met
153160
input.ProgrammingLang = aws.String(v.(string))
154161
}
155162

156-
if _, err := conn.CreateImageVersion(ctx, &input); err != nil {
163+
if v, ok := d.GetOk("aliases"); ok {
164+
aliases := v.(*schema.Set).List()
165+
input.Aliases = make([]string, len(aliases))
166+
for i, alias := range aliases {
167+
input.Aliases[i] = alias.(string)
168+
}
169+
}
170+
171+
if _, err := conn.CreateImageVersion(ctx, input); err != nil {
157172
return sdkdiag.AppendErrorf(diags, "creating SageMaker AI Image Version %s: %s", name, err)
158173
}
159174

@@ -208,6 +223,34 @@ func resourceImageVersionRead(ctx context.Context, d *schema.ResourceData, meta
208223
d.Set("ml_framework", image.MLFramework)
209224
d.Set("programming_lang", image.ProgrammingLang)
210225

226+
// The AWS SDK doesn't have an Aliases field in DescribeImageVersionOutput
227+
// We need to fetch aliases separately using ListAliases API
228+
idParts, err := flex.ExpandResourceId(d.Id(), imageVersionResourcePartCount, false)
229+
if err != nil {
230+
return sdkdiag.AppendErrorf(diags, "invalid resource ID format: %s", d.Id())
231+
}
232+
233+
imageName := idParts[0]
234+
versionStr := idParts[1]
235+
versionNum, err := strconv.Atoi(versionStr)
236+
if err != nil {
237+
return sdkdiag.AppendErrorf(diags, "invalid version number in resource ID: %s", d.Id())
238+
}
239+
240+
aliasesInput := &sagemaker.ListAliasesInput{
241+
ImageName: aws.String(imageName),
242+
Version: aws.Int32(int32(versionNum)),
243+
}
244+
245+
aliasesOutput, err := conn.ListAliases(ctx, aliasesInput)
246+
if err != nil {
247+
return sdkdiag.AppendErrorf(diags, "listing aliases for SageMaker AI Image Version (%s): %s", d.Id(), err)
248+
}
249+
250+
if err := d.Set("aliases", aliasesOutput.SageMakerImageVersionAliases); err != nil {
251+
return sdkdiag.AppendErrorf(diags, "setting aliases: %s", err)
252+
}
253+
211254
return diags
212255
}
213256

@@ -218,7 +261,7 @@ func resourceImageVersionUpdate(ctx context.Context, d *schema.ResourceData, met
218261
name := d.Get("image_name").(string)
219262
version := d.Get(names.AttrVersion).(int)
220263

221-
input := sagemaker.UpdateImageVersionInput{
264+
input := &sagemaker.UpdateImageVersionInput{
222265
ImageName: aws.String(name),
223266
Version: aws.Int32(int32(version)),
224267
}
@@ -251,7 +294,53 @@ func resourceImageVersionUpdate(ctx context.Context, d *schema.ResourceData, met
251294
input.ProgrammingLang = aws.String(d.Get("programming_lang").(string))
252295
}
253296

254-
if _, err := conn.UpdateImageVersion(ctx, &input); err != nil {
297+
if d.HasChange("aliases") {
298+
// For UpdateImageVersion, we need to use AliasesToAdd and AliasesToDelete
299+
// instead of Aliases directly
300+
oldAliasesSet, newAliasesSet := d.GetChange("aliases")
301+
oldAliases := oldAliasesSet.(*schema.Set).List()
302+
newAliases := newAliasesSet.(*schema.Set).List()
303+
304+
// Find aliases to add (in new but not in old)
305+
var aliasesToAdd []string
306+
for _, newAlias := range newAliases {
307+
found := false
308+
for _, oldAlias := range oldAliases {
309+
if newAlias.(string) == oldAlias.(string) {
310+
found = true
311+
break
312+
}
313+
}
314+
if !found {
315+
aliasesToAdd = append(aliasesToAdd, newAlias.(string))
316+
}
317+
}
318+
319+
// Find aliases to delete (in old but not in new)
320+
var aliasesToDelete []string
321+
for _, oldAlias := range oldAliases {
322+
found := false
323+
for _, newAlias := range newAliases {
324+
if oldAlias.(string) == newAlias.(string) {
325+
found = true
326+
break
327+
}
328+
}
329+
if !found {
330+
aliasesToDelete = append(aliasesToDelete, oldAlias.(string))
331+
}
332+
}
333+
334+
if len(aliasesToAdd) > 0 {
335+
input.AliasesToAdd = aliasesToAdd
336+
}
337+
338+
if len(aliasesToDelete) > 0 {
339+
input.AliasesToDelete = aliasesToDelete
340+
}
341+
}
342+
343+
if _, err := conn.UpdateImageVersion(ctx, input); err != nil {
255344
return sdkdiag.AppendErrorf(diags, "updating SageMaker AI Image Version (%s): %s", d.Id(), err)
256345
}
257346

@@ -353,7 +442,7 @@ func expandImageVersionResourceID(id string) (string, int, error) {
353442
name := parts[0]
354443
version, err := strconv.Atoi(parts[1])
355444
if err != nil {
356-
return name, version, err
445+
return name, 0, err
357446
}
358447

359448
return name, version, nil

internal/service/sagemaker/image_version_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ func TestAccSageMakerImageVersion_update(t *testing.T) {
9797
resource.TestCheckResourceAttr(resourceName, "job_type", "TRAINING"),
9898
resource.TestCheckResourceAttr(resourceName, "ml_framework", "TensorFlow 1.1"),
9999
resource.TestCheckResourceAttr(resourceName, "programming_lang", "Python 3.8"),
100+
resource.TestCheckResourceAttr(resourceName, "aliases.#", "2"),
101+
resource.TestCheckTypeSetElemAttr(resourceName, "aliases.*", "latest"),
102+
resource.TestCheckTypeSetElemAttr(resourceName, "aliases.*", "stable"),
100103
),
101104
},
102105
{
@@ -121,6 +124,9 @@ func TestAccSageMakerImageVersion_update(t *testing.T) {
121124
resource.TestCheckResourceAttr(resourceName, "job_type", "TRAINING"),
122125
resource.TestCheckResourceAttr(resourceName, "ml_framework", "TensorFlow 1.1"),
123126
resource.TestCheckResourceAttr(resourceName, "programming_lang", "Python 3.8"),
127+
resource.TestCheckResourceAttr(resourceName, "aliases.#", "2"),
128+
resource.TestCheckTypeSetElemAttr(resourceName, "aliases.*", "latest"),
129+
resource.TestCheckTypeSetElemAttr(resourceName, "aliases.*", "stable"),
124130
),
125131
ConfigPlanChecks: resource.ConfigPlanChecks{
126132
PreApply: []plancheck.PlanCheck{
@@ -404,6 +410,7 @@ resource "aws_sagemaker_image_version" "test" {
404410
vendor_guidance = "STABLE"
405411
ml_framework = "TensorFlow 1.1"
406412
programming_lang = "Python 3.8"
413+
aliases = ["latest", "stable"]
407414
}
408415
`, baseImage, notes))
409416
}

website/docs/cdktf/python/r/sagemaker_image_version.html.markdown

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,34 @@ class MyConvertedCode(TerraformStack):
3434
)
3535
```
3636

37+
### With aliases
38+
39+
```python
40+
# DO NOT EDIT. Code generated by 'cdktf convert' - Please report bugs at https://cdk.tf/bug
41+
from constructs import Construct
42+
from cdktf import Token, TerraformStack
43+
#
44+
# Provider bindings are generated by running `cdktf get`.
45+
# See https://cdk.tf/provider-generation for more details.
46+
#
47+
from imports.aws.sagemaker_image_version import SagemakerImageVersion
48+
class MyConvertedCode(TerraformStack):
49+
def __init__(self, scope, name):
50+
super().__init__(scope, name)
51+
SagemakerImageVersion(self, "test",
52+
aliases=["latest", "stable"],
53+
base_image="012345678912.dkr.ecr.us-west-2.amazonaws.com/image:latest",
54+
image_name=Token.as_string(aws_sagemaker_image_test.id)
55+
)
56+
```
57+
3758
## Argument Reference
3859

3960
This resource supports the following arguments:
4061

4162
* `image_name` - (Required) The name of the image. Must be unique to your account.
4263
* `base_image` - (Required) The registry path of the container image on which this image version is based.
64+
* `aliases` - (Optional) A list of aliases for the image version.
4365
* `horovod` - (Optional) Indicates Horovod compatibility.
4466
* `job_type` - (Optional) Indicates SageMaker AI job type compatibility. Valid values are: `TRAINING`, `INFERENCE`, and `NOTEBOOK_KERNEL`.
4567
* `ml_framework` - (Optional) The machine learning framework vended in the image version.

website/docs/cdktf/typescript/r/sagemaker_image_version.html.markdown

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,29 @@ class MyConvertedCode extends TerraformStack {
3434
});
3535
}
3636
}
37+
```
38+
39+
### With aliases
3740

41+
```typescript
42+
// DO NOT EDIT. Code generated by 'cdktf convert' - Please report bugs at https://cdk.tf/bug
43+
import { Construct } from "constructs";
44+
import { Token, TerraformStack } from "cdktf";
45+
/*
46+
* Provider bindings are generated by running `cdktf get`.
47+
* See https://cdk.tf/provider-generation for more details.
48+
*/
49+
import { SagemakerImageVersion } from "./.gen/providers/aws/sagemaker-image-version";
50+
class MyConvertedCode extends TerraformStack {
51+
constructor(scope: Construct, name: string) {
52+
super(scope, name);
53+
new SagemakerImageVersion(this, "test", {
54+
aliases: ["latest", "stable"],
55+
baseImage: "012345678912.dkr.ecr.us-west-2.amazonaws.com/image:latest",
56+
imageName: Token.asString(awsSagemakerImageTest.id),
57+
});
58+
}
59+
}
3860
```
3961

4062
## Argument Reference
@@ -43,6 +65,7 @@ This resource supports the following arguments:
4365

4466
* `imageName` - (Required) The name of the image. Must be unique to your account.
4567
* `baseImage` - (Required) The registry path of the container image on which this image version is based.
68+
* `aliases` - (Optional) A list of aliases for the image version.
4669
* `horovod` - (Optional) Indicates Horovod compatibility.
4770
* `jobType` - (Optional) Indicates SageMaker AI job type compatibility. Valid values are: `TRAINING`, `INFERENCE`, and `NOTEBOOK_KERNEL`.
4871
* `ml_framework` - (Optional) The machine learning framework vended in the image version.
@@ -83,7 +106,6 @@ class MyConvertedCode extends TerraformStack {
83106
);
84107
}
85108
}
86-
87109
```
88110

89111
Using `terraform import`, import SageMaker AI Image Versions using the `name`. For example:

website/docs/r/sagemaker_image_version.html.markdown

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,23 @@ resource "aws_sagemaker_image_version" "example" {
2121
}
2222
```
2323

24+
### With aliases
25+
26+
```terraform
27+
resource "aws_sagemaker_image_version" "test" {
28+
image_name = aws_sagemaker_image.test.id
29+
base_image = "012345678912.dkr.ecr.us-west-2.amazonaws.com/image:latest"
30+
aliases = ["latest", "stable"]
31+
}
32+
```
33+
2434
## Argument Reference
2535

2636
This resource supports the following arguments:
2737

2838
* `image_name` - (Required) The name of the image. Must be unique to your account.
2939
* `base_image` - (Required) The registry path of the container image on which this image version is based.
40+
* `aliases` - (Optional) A list of aliases for the image version.
3041
* `horovod` - (Optional) Indicates Horovod compatibility.
3142
* `job_type` - (Optional) Indicates SageMaker AI job type compatibility. Valid values are: `TRAINING`, `INFERENCE`, and `NOTEBOOK_KERNEL`.
3243
* `ml_framework` - (Optional) The machine learning framework vended in the image version.

0 commit comments

Comments
 (0)