Skip to content

Commit e3b1c6a

Browse files
committed
d/neptune_engine_version: New data source
1 parent 8d2750c commit e3b1c6a

File tree

4 files changed

+351
-0
lines changed

4 files changed

+351
-0
lines changed
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
package aws
2+
3+
import (
4+
"fmt"
5+
"log"
6+
7+
"github.com/aws/aws-sdk-go/aws"
8+
"github.com/aws/aws-sdk-go/service/neptune"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
func dataSourceAwsNeptuneEngineVersion() *schema.Resource {
13+
return &schema.Resource{
14+
Read: dataSourceAwsNeptuneEngineVersionRead,
15+
Schema: map[string]*schema.Schema{
16+
"engine": {
17+
Type: schema.TypeString,
18+
Optional: true,
19+
Default: "neptune",
20+
},
21+
22+
"engine_description": {
23+
Type: schema.TypeString,
24+
Computed: true,
25+
},
26+
27+
"exportable_log_types": {
28+
Type: schema.TypeList,
29+
Elem: &schema.Schema{Type: schema.TypeString},
30+
Computed: true,
31+
},
32+
33+
"parameter_group_name": {
34+
Type: schema.TypeString,
35+
Computed: true,
36+
Optional: true,
37+
},
38+
39+
"preferred_versions": {
40+
Type: schema.TypeList,
41+
Optional: true,
42+
Elem: &schema.Schema{Type: schema.TypeString},
43+
ConflictsWith: []string{"version"},
44+
},
45+
46+
"supported_timezones": {
47+
Type: schema.TypeSet,
48+
Elem: &schema.Schema{Type: schema.TypeString},
49+
Computed: true,
50+
Set: schema.HashString,
51+
},
52+
53+
"supports_log_exports_to_cloudwatch": {
54+
Type: schema.TypeBool,
55+
Computed: true,
56+
},
57+
58+
"supports_read_replica": {
59+
Type: schema.TypeBool,
60+
Computed: true,
61+
},
62+
63+
"valid_upgrade_targets": {
64+
Type: schema.TypeSet,
65+
Elem: &schema.Schema{Type: schema.TypeString},
66+
Computed: true,
67+
Set: schema.HashString,
68+
},
69+
70+
"version": {
71+
Type: schema.TypeString,
72+
Computed: true,
73+
Optional: true,
74+
ConflictsWith: []string{"preferred_versions"},
75+
},
76+
77+
"version_description": {
78+
Type: schema.TypeString,
79+
Computed: true,
80+
},
81+
},
82+
}
83+
}
84+
85+
func dataSourceAwsNeptuneEngineVersionRead(d *schema.ResourceData, meta interface{}) error {
86+
conn := meta.(*AWSClient).neptuneconn
87+
88+
input := &neptune.DescribeDBEngineVersionsInput{}
89+
90+
if v, ok := d.GetOk("engine"); ok {
91+
input.Engine = aws.String(v.(string))
92+
}
93+
94+
if v, ok := d.GetOk("parameter_group_name"); ok {
95+
input.DBParameterGroupFamily = aws.String(v.(string))
96+
}
97+
98+
if v, ok := d.GetOk("version"); ok {
99+
input.EngineVersion = aws.String(v.(string))
100+
}
101+
102+
if _, ok := d.GetOk("version"); !ok {
103+
if _, ok := d.GetOk("preferred_versions"); !ok {
104+
input.DefaultOnly = aws.Bool(true)
105+
}
106+
}
107+
108+
log.Printf("[DEBUG] Reading Neptune engine versions: %v", input)
109+
var engineVersions []*neptune.DBEngineVersion
110+
111+
err := conn.DescribeDBEngineVersionsPages(input, func(resp *neptune.DescribeDBEngineVersionsOutput, lastPage bool) bool {
112+
for _, engineVersion := range resp.DBEngineVersions {
113+
if engineVersion == nil {
114+
continue
115+
}
116+
117+
engineVersions = append(engineVersions, engineVersion)
118+
}
119+
return !lastPage
120+
})
121+
122+
if err != nil {
123+
return fmt.Errorf("error reading Neptune engine versions: %w", err)
124+
}
125+
126+
if len(engineVersions) == 0 {
127+
return fmt.Errorf("no Neptune engine versions found")
128+
}
129+
130+
// preferred versions
131+
var found *neptune.DBEngineVersion
132+
if l := d.Get("preferred_versions").([]interface{}); len(l) > 0 {
133+
for _, elem := range l {
134+
preferredVersion, ok := elem.(string)
135+
136+
if !ok {
137+
continue
138+
}
139+
140+
for _, engineVersion := range engineVersions {
141+
if preferredVersion == aws.StringValue(engineVersion.EngineVersion) {
142+
found = engineVersion
143+
break
144+
}
145+
}
146+
147+
if found != nil {
148+
break
149+
}
150+
}
151+
}
152+
153+
if found == nil && len(engineVersions) > 1 {
154+
return fmt.Errorf("multiple Neptune engine versions (%v) match the criteria", engineVersions)
155+
}
156+
157+
if found == nil && len(engineVersions) == 1 {
158+
found = engineVersions[0]
159+
}
160+
161+
if found == nil {
162+
return fmt.Errorf("no Neptune engine versions match the criteria")
163+
}
164+
165+
d.SetId(aws.StringValue(found.EngineVersion))
166+
167+
d.Set("engine", found.Engine)
168+
d.Set("engine_description", found.DBEngineDescription)
169+
d.Set("exportable_log_types", found.ExportableLogTypes)
170+
d.Set("parameter_group_name", found.DBParameterGroupFamily)
171+
172+
var timezones []string
173+
for _, tz := range found.SupportedTimezones {
174+
timezones = append(timezones, aws.StringValue(tz.TimezoneName))
175+
}
176+
d.Set("supported_timezones", timezones)
177+
178+
d.Set("supports_log_exports_to_cloudwatch", found.SupportsLogExportsToCloudwatchLogs)
179+
d.Set("supports_read_replica", found.SupportsReadReplica)
180+
181+
var upgradeTargets []string
182+
for _, ut := range found.ValidUpgradeTarget {
183+
upgradeTargets = append(upgradeTargets, aws.StringValue(ut.EngineVersion))
184+
}
185+
d.Set("valid_upgrade_targets", upgradeTargets)
186+
187+
d.Set("version", found.EngineVersion)
188+
d.Set("version_description", found.DBEngineVersionDescription)
189+
190+
return nil
191+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package aws
2+
3+
import (
4+
"fmt"
5+
"regexp"
6+
"testing"
7+
8+
"github.com/aws/aws-sdk-go/aws"
9+
"github.com/aws/aws-sdk-go/service/neptune"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
)
12+
13+
func TestAccAWSNeptuneEngineVersionDataSource_basic(t *testing.T) {
14+
dataSourceName := "data.aws_neptune_engine_version.test"
15+
version := "1.0.1.0"
16+
17+
resource.ParallelTest(t, resource.TestCase{
18+
PreCheck: func() { testAccPreCheck(t); testAccAWSNeptuneEngineVersionPreCheck(t) },
19+
Providers: testAccProviders,
20+
CheckDestroy: nil,
21+
Steps: []resource.TestStep{
22+
{
23+
Config: testAccAWSNeptuneEngineVersionDataSourceBasicConfig(version),
24+
Check: resource.ComposeTestCheckFunc(
25+
resource.TestCheckResourceAttr(dataSourceName, "engine", "neptune"),
26+
resource.TestCheckResourceAttr(dataSourceName, "version", version),
27+
resource.TestCheckResourceAttrSet(dataSourceName, "engine_description"),
28+
resource.TestMatchResourceAttr(dataSourceName, "exportable_log_types.#", regexp.MustCompile(`^[1-9][0-9]*`)),
29+
resource.TestCheckResourceAttrSet(dataSourceName, "parameter_group_name"),
30+
resource.TestMatchResourceAttr(dataSourceName, "supported_timezones.#", regexp.MustCompile(`^[0-9][0-9]*`)),
31+
resource.TestCheckResourceAttrSet(dataSourceName, "supports_log_exports_to_cloudwatch"),
32+
resource.TestCheckResourceAttrSet(dataSourceName, "supports_read_replica"),
33+
resource.TestMatchResourceAttr(dataSourceName, "valid_upgrade_targets.#", regexp.MustCompile(`^[1-9][0-9]*`)),
34+
resource.TestCheckResourceAttrSet(dataSourceName, "version_description"),
35+
),
36+
},
37+
},
38+
})
39+
}
40+
41+
func TestAccAWSNeptuneEngineVersionDataSource_preferred(t *testing.T) {
42+
dataSourceName := "data.aws_neptune_engine_version.test"
43+
44+
resource.ParallelTest(t, resource.TestCase{
45+
PreCheck: func() { testAccPreCheck(t); testAccAWSNeptuneEngineVersionPreCheck(t) },
46+
Providers: testAccProviders,
47+
CheckDestroy: nil,
48+
Steps: []resource.TestStep{
49+
{
50+
Config: testAccAWSNeptuneEngineVersionDataSourcePreferredConfig(),
51+
Check: resource.ComposeTestCheckFunc(
52+
resource.TestCheckResourceAttr(dataSourceName, "engine", "neptune"),
53+
resource.TestCheckResourceAttr(dataSourceName, "version", "1.0.3.0"),
54+
),
55+
},
56+
},
57+
})
58+
}
59+
60+
func TestAccAWSNeptuneEngineVersionDataSource_defaultOnly(t *testing.T) {
61+
dataSourceName := "data.aws_neptune_engine_version.test"
62+
63+
resource.ParallelTest(t, resource.TestCase{
64+
PreCheck: func() { testAccPreCheck(t); testAccAWSNeptuneEngineVersionPreCheck(t) },
65+
Providers: testAccProviders,
66+
CheckDestroy: nil,
67+
Steps: []resource.TestStep{
68+
{
69+
Config: testAccAWSNeptuneEngineVersionDataSourceDefaultOnlyConfig(),
70+
Check: resource.ComposeTestCheckFunc(
71+
resource.TestCheckResourceAttr(dataSourceName, "engine", "neptune"),
72+
resource.TestCheckResourceAttrSet(dataSourceName, "version"),
73+
),
74+
},
75+
},
76+
})
77+
}
78+
79+
func testAccAWSNeptuneEngineVersionPreCheck(t *testing.T) {
80+
conn := testAccProvider.Meta().(*AWSClient).neptuneconn
81+
82+
input := &neptune.DescribeDBEngineVersionsInput{
83+
Engine: aws.String("neptune"),
84+
DefaultOnly: aws.Bool(true),
85+
}
86+
87+
_, err := conn.DescribeDBEngineVersions(input)
88+
89+
if testAccPreCheckSkipError(err) {
90+
t.Skipf("skipping acceptance testing: %s", err)
91+
}
92+
93+
if err != nil {
94+
t.Fatalf("unexpected PreCheck error: %s", err)
95+
}
96+
}
97+
98+
func testAccAWSNeptuneEngineVersionDataSourceBasicConfig(version string) string {
99+
return fmt.Sprintf(`
100+
data "aws_neptune_engine_version" "test" {
101+
engine = "neptune"
102+
version = %q
103+
}
104+
`, version)
105+
}
106+
107+
func testAccAWSNeptuneEngineVersionDataSourcePreferredConfig() string {
108+
return fmt.Sprintf(`
109+
data "aws_neptune_engine_version" "test" {
110+
preferred_versions = ["85.9.12", "1.0.3.0", "1.0.2.2"]
111+
}
112+
`)
113+
}
114+
115+
func testAccAWSNeptuneEngineVersionDataSourceDefaultOnlyConfig() string {
116+
return fmt.Sprintf(`
117+
data "aws_neptune_engine_version" "test" {}
118+
`)
119+
}

aws/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ func Provider() *schema.Provider {
287287
"aws_msk_configuration": dataSourceAwsMskConfiguration(),
288288
"aws_nat_gateway": dataSourceAwsNatGateway(),
289289
"aws_neptune_orderable_db_instance": dataSourceAwsNeptuneOrderableDbInstance(),
290+
"aws_neptune_engine_version": dataSourceAwsNeptuneEngineVersion(),
290291
"aws_network_acls": dataSourceAwsNetworkAcls(),
291292
"aws_network_interface": dataSourceAwsNetworkInterface(),
292293
"aws_network_interfaces": dataSourceAwsNetworkInterfaces(),
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
subcategory: "Neptune"
3+
layout: "aws"
4+
page_title: "AWS: aws_neptune_engine_version"
5+
description: |-
6+
Information about a Neptune engine version.
7+
---
8+
9+
# Data Source: aws_neptune_engine_version
10+
11+
Information about a Neptune engine version.
12+
13+
## Example Usage
14+
15+
```hcl
16+
data "aws_neptune_engine_version" "test" {
17+
preferred_versions = ["1.0.3.0", "1.0.2.2", "1.0.2.1"]
18+
}
19+
```
20+
21+
## Argument Reference
22+
23+
The following arguments are supported:
24+
25+
* `engine` - (Optional) DB engine. (Default: `neptune`)
26+
* `parameter_group_name` - (Optional) The name of a specific DB parameter group family. An example parameter group family is `neptune1`.
27+
* `preferred_versions` - (Optional) Ordered list of preferred engine versions. The first match in this list will be returned. If no preferred matches are found and the original search returned more than one result, an error is returned.
28+
* `version` - (Optional) Version of the DB engine. For example, `1.0.1.0`, `1.0.2.2`, and `1.0.3.0`.
29+
30+
## Attribute Reference
31+
32+
In addition to all arguments above, the following attributes are exported:
33+
34+
* `engine_description` - The description of the database engine.
35+
* `exportable_log_types` - The types of logs that the database engine has available for export to CloudWatch Logs.
36+
* `supported_timezones` - A list of the time zones supported by this engine.
37+
* `supports_log_exports_to_cloudwatch` - Indicates whether the engine version supports exporting the log types specified by `exportable_log_types` to CloudWatch Logs.
38+
* `supports_read_replica` - Indicates whether the database engine version supports read replicas.
39+
* `valid_upgrade_targets` - A list of engine versions that this database engine version can be upgraded to.
40+
* `version_description` - The description of the database engine version.

0 commit comments

Comments
 (0)