Skip to content

Commit fe19ccc

Browse files
authored
Merge pull request #44417 from ramonvermeulen/f/opensearch-domain-enable-ai-features
feat(opensearch): add support for `aiml_options` to `aws_opensearch_domain`
2 parents f179fa2 + 0b60848 commit fe19ccc

File tree

4 files changed

+334
-11
lines changed

4 files changed

+334
-11
lines changed

.changelog/44417.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_opensearch_domain: Add `aiml_options` argument
3+
```

internal/service/opensearch/domain.go

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ func resourceDomain() *schema.Resource {
5252

5353
name := d.Id()
5454
ds, err := findDomainByName(ctx, conn, name)
55-
5655
if err != nil {
5756
return nil, fmt.Errorf("reading OpenSearch Domain (%s): %w", name, err)
5857
}
@@ -172,6 +171,47 @@ func resourceDomain() *schema.Resource {
172171
},
173172
},
174173
},
174+
"aiml_options": {
175+
Type: schema.TypeList,
176+
Optional: true,
177+
Computed: true,
178+
MaxItems: 1,
179+
Elem: &schema.Resource{
180+
Schema: map[string]*schema.Schema{
181+
"natural_language_query_generation_options": {
182+
Type: schema.TypeList,
183+
Optional: true,
184+
Computed: true,
185+
MaxItems: 1,
186+
Elem: &schema.Resource{
187+
Schema: map[string]*schema.Schema{
188+
"desired_state": {
189+
Type: schema.TypeString,
190+
Optional: true,
191+
Computed: true,
192+
ValidateDiagFunc: enum.Validate[awstypes.NaturalLanguageQueryGenerationDesiredState](),
193+
},
194+
},
195+
},
196+
},
197+
"s3_vectors_engine": {
198+
Type: schema.TypeList,
199+
Optional: true,
200+
Computed: true,
201+
MaxItems: 1,
202+
Elem: &schema.Resource{
203+
Schema: map[string]*schema.Schema{
204+
names.AttrEnabled: {
205+
Type: schema.TypeBool,
206+
Computed: true,
207+
Optional: true,
208+
},
209+
},
210+
},
211+
},
212+
},
213+
},
214+
},
175215
names.AttrARN: {
176216
Type: schema.TypeString,
177217
Computed: true,
@@ -716,6 +756,10 @@ func resourceDomainCreate(ctx context.Context, d *schema.ResourceData, meta any)
716756
input.AdvancedSecurityOptions = expandAdvancedSecurityOptions(v.([]any))
717757
}
718758

759+
if v, ok := d.GetOk("aiml_options"); ok && len(v.([]any)) > 0 && v.([]any)[0] != nil {
760+
input.AIMLOptions = expandAIMLOptionsInput(v.([]any)[0].(map[string]any))
761+
}
762+
719763
if v, ok := d.GetOk("auto_tune_options"); ok && len(v.([]any)) > 0 {
720764
input.AutoTuneOptions = expandAutoTuneOptionsInput(v.([]any)[0].(map[string]any))
721765
}
@@ -831,7 +875,6 @@ func resourceDomainCreate(ctx context.Context, d *schema.ResourceData, meta any)
831875
},
832876
domainErrorRetryable,
833877
)
834-
835878
if err != nil {
836879
return sdkdiag.AppendErrorf(diags, "creating OpenSearch Domain (%s): %s", name, err)
837880
}
@@ -854,7 +897,6 @@ func resourceDomainCreate(ctx context.Context, d *schema.ResourceData, meta any)
854897
},
855898
domainErrorRetryable,
856899
)
857-
858900
if err != nil {
859901
return sdkdiag.AppendErrorf(diags, "updating OpenSearch Domain (%s) Config: %s", d.Id(), err)
860902
}
@@ -887,7 +929,6 @@ func resourceDomainRead(ctx context.Context, d *schema.ResourceData, meta any) d
887929
output, err := conn.DescribeDomainConfig(ctx, &opensearch.DescribeDomainConfigInput{
888930
DomainName: aws.String(name),
889931
})
890-
891932
if err != nil {
892933
return sdkdiag.AppendErrorf(diags, "reading OpenSearch Domain (%s) Config: %s", d.Id(), err)
893934
}
@@ -916,6 +957,13 @@ func resourceDomainRead(ctx context.Context, d *schema.ResourceData, meta any) d
916957
return sdkdiag.AppendErrorf(diags, "setting advanced_security_options: %s", err)
917958
}
918959
}
960+
if ds.AIMLOptions != nil {
961+
if err := d.Set("aiml_options", []any{flattenAIMLOptionsOutput(ds.AIMLOptions)}); err != nil {
962+
return sdkdiag.AppendErrorf(diags, "setting aiml_options: %s", err)
963+
}
964+
} else {
965+
d.Set("aiml_options", nil)
966+
}
919967
d.Set(names.AttrARN, ds.ARN)
920968
if v := dc.AutoTuneOptions; v != nil {
921969
if err := d.Set("auto_tune_options", []any{flattenAutoTuneOptions(v.Options)}); err != nil {
@@ -1044,6 +1092,12 @@ func resourceDomainUpdate(ctx context.Context, d *schema.ResourceData, meta any)
10441092
input.AdvancedSecurityOptions = expandAdvancedSecurityOptions(d.Get("advanced_security_options").([]any))
10451093
}
10461094

1095+
if d.HasChange("aiml_options") {
1096+
if v, ok := d.GetOk("aiml_options"); ok && len(v.([]any)) > 0 && v.([]any)[0] != nil {
1097+
input.AIMLOptions = expandAIMLOptionsInput(v.([]any)[0].(map[string]any))
1098+
}
1099+
}
1100+
10471101
if d.HasChange("auto_tune_options") {
10481102
input.AutoTuneOptions = expandAutoTuneOptions(d.Get("auto_tune_options").([]any)[0].(map[string]any))
10491103
}
@@ -1172,7 +1226,6 @@ func resourceDomainUpdate(ctx context.Context, d *schema.ResourceData, meta any)
11721226
},
11731227
domainErrorRetryable,
11741228
)
1175-
11761229
if err != nil {
11771230
return sdkdiag.AppendErrorf(diags, "updating OpenSearch Domain (%s) Config: %s", d.Id(), err)
11781231
}
@@ -1188,7 +1241,6 @@ func resourceDomainUpdate(ctx context.Context, d *schema.ResourceData, meta any)
11881241
}
11891242

11901243
_, err := conn.UpgradeDomain(ctx, &input)
1191-
11921244
if err != nil {
11931245
return sdkdiag.AppendErrorf(diags, "upgrading OpenSearch Domain (%s): %s", d.Id(), err)
11941246
}

internal/service/opensearch/domain_structure.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,52 @@ func expandAdvancedSecurityOptions(m []any) *awstypes.AdvancedSecurityOptionsInp
5454
return &config
5555
}
5656

57+
func expandAIMLOptionsInput(tfMap map[string]any) *awstypes.AIMLOptionsInput {
58+
if tfMap == nil {
59+
return nil
60+
}
61+
62+
apiObject := &awstypes.AIMLOptionsInput{}
63+
64+
if v, ok := tfMap["natural_language_query_generation_options"].([]any); ok && len(v) > 0 && v[0] != nil {
65+
apiObject.NaturalLanguageQueryGenerationOptions = expandNaturalLanguageQueryGenerationOptionsInput(v[0].(map[string]any))
66+
}
67+
68+
if v, ok := tfMap["s3_vectors_engine"].([]any); ok && len(v) > 0 && v[0] != nil {
69+
apiObject.S3VectorsEngine = expandS3VectorsEngine(v[0].(map[string]any))
70+
}
71+
72+
return apiObject
73+
}
74+
75+
func expandNaturalLanguageQueryGenerationOptionsInput(tfMap map[string]any) *awstypes.NaturalLanguageQueryGenerationOptionsInput {
76+
if tfMap == nil {
77+
return nil
78+
}
79+
80+
apiObject := &awstypes.NaturalLanguageQueryGenerationOptionsInput{}
81+
82+
if v, ok := tfMap["desired_state"].(string); ok && v != "" {
83+
apiObject.DesiredState = awstypes.NaturalLanguageQueryGenerationDesiredState(v)
84+
}
85+
86+
return apiObject
87+
}
88+
89+
func expandS3VectorsEngine(tfMap map[string]any) *awstypes.S3VectorsEngine {
90+
if tfMap == nil {
91+
return nil
92+
}
93+
94+
apiObject := &awstypes.S3VectorsEngine{}
95+
96+
if v, ok := tfMap[names.AttrEnabled].(bool); ok {
97+
apiObject.Enabled = aws.Bool(v)
98+
}
99+
100+
return apiObject
101+
}
102+
57103
func expandAutoTuneOptions(tfMap map[string]any) *awstypes.AutoTuneOptions {
58104
if tfMap == nil {
59105
return nil
@@ -248,6 +294,48 @@ func flattenAdvancedSecurityOptions(advancedSecurityOptions *awstypes.AdvancedSe
248294
return []map[string]any{m}
249295
}
250296

297+
func flattenAIMLOptionsOutput(apiObject *awstypes.AIMLOptionsOutput) map[string]any {
298+
if apiObject == nil {
299+
return nil
300+
}
301+
302+
tfMap := map[string]any{}
303+
304+
if v := apiObject.NaturalLanguageQueryGenerationOptions; v != nil {
305+
tfMap["natural_language_query_generation_options"] = []any{flattenNaturalLanguageQueryGenerationOptionsOutput(v)}
306+
}
307+
308+
if v := apiObject.S3VectorsEngine; v != nil {
309+
tfMap["s3_vectors_engine"] = []any{flattenS3VectorsEngine(v)}
310+
}
311+
312+
return tfMap
313+
}
314+
315+
func flattenNaturalLanguageQueryGenerationOptionsOutput(apiObject *awstypes.NaturalLanguageQueryGenerationOptionsOutput) map[string]any {
316+
if apiObject == nil {
317+
return nil
318+
}
319+
320+
tfMap := map[string]any{
321+
"desired_state": apiObject.DesiredState,
322+
}
323+
324+
return tfMap
325+
}
326+
327+
func flattenS3VectorsEngine(apiObject *awstypes.S3VectorsEngine) map[string]any {
328+
if apiObject == nil {
329+
return nil
330+
}
331+
332+
tfMap := map[string]any{
333+
names.AttrEnabled: aws.ToBool(apiObject.Enabled),
334+
}
335+
336+
return tfMap
337+
}
338+
251339
func flattenAutoTuneOptions(autoTuneOptions *awstypes.AutoTuneOptions) map[string]any {
252340
if autoTuneOptions == nil {
253341
return nil

0 commit comments

Comments
 (0)