diff --git a/internal/provider/provider.go b/internal/provider/provider.go index c05a5cec1e..428ebfdf5a 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -21,6 +21,7 @@ import ( "github.com/hashicorp/terraform-plugin-go/tfprotov6" "github.com/hashicorp/terraform-plugin-mux/tf5to6server" "github.com/hashicorp/terraform-plugin-mux/tf6muxserver" + "github.com/mongodb/terraform-provider-mongodbatlas/internal/service/myip" "github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion" "github.com/mongodb/terraform-provider-mongodbatlas/internal/common/validate" @@ -429,6 +430,7 @@ func (p *MongodbtlasProvider) DataSources(context.Context) []func() datasource.D alertconfiguration.DataSource, alertconfiguration.PluralDataSource, projectipaccesslist.DataSource, + myip.DataSource, atlasuser.DataSource, atlasuser.PluralDataSource, searchdeployment.DataSource, diff --git a/internal/service/myip/data_source_my_ip.go b/internal/service/myip/data_source_my_ip.go new file mode 100644 index 0000000000..5440890a61 --- /dev/null +++ b/internal/service/myip/data_source_my_ip.go @@ -0,0 +1,68 @@ +package myip + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/datasource" + "github.com/hashicorp/terraform-plugin-framework/datasource/schema" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/mongodb/terraform-provider-mongodbatlas/internal/config" +) + +const ( + myIP = "my_ip" +) + +type ds struct { + config.DSCommon +} + +func DataSource() datasource.DataSource { + return &ds{ + DSCommon: config.DSCommon{ + DataSourceName: myIP, + }, + } +} + +var _ datasource.DataSource = &ds{} +var _ datasource.DataSourceWithConfigure = &ds{} + +type Model struct { + IPAddress types.String `tfsdk:"ip_address"` +} + +func (d *ds) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) { + resp.Schema = schema.Schema{ + MarkdownDescription: "My IP", + Attributes: map[string]schema.Attribute{ + "ip_address": schema.StringAttribute{ + MarkdownDescription: "The IP.", + Computed: true, + }, + }, + } +} + +func (d *ds) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { + var databaseDSUserConfig *Model + var err error + resp.Diagnostics.Append(req.Config.Get(ctx, &databaseDSUserConfig)...) + if resp.Diagnostics.HasError() { + return + } + + info, _, err := d.Client.Atlas.IPInfo.Get(ctx) + if err != nil { + resp.Diagnostics.AddError("error getting access list entry", err.Error()) + return + } + + accessListEntry := &Model{ + IPAddress: types.StringValue(info.CurrentIPv4Address), + } + resp.Diagnostics.Append(resp.State.Set(ctx, &accessListEntry)...) + if resp.Diagnostics.HasError() { + return + } +}