Skip to content

Commit

Permalink
feat: added user datasource to retrieve user from username
Browse files Browse the repository at this point in the history
  • Loading branch information
williamokano committed Dec 25, 2023
1 parent 110d27f commit f7e0a67
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 1 deletion.
4 changes: 4 additions & 0 deletions examples/data-sources/litmus-chaos_user/data-source.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Reads a user
data "litmus-chaos_user" "user_foo" {
username = "foo.bar@fakecompany.net"
}
File renamed without changes.
22 changes: 22 additions & 0 deletions examples/user_data_source/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Configuration-based authentication

terraform {
required_providers {
litmus-chaos = {
source = "williamokano/litmus-chaos"
}
}
}

provider "litmus-chaos" {

}

# Create a new project
data "litmus-chaos_user" "user_foo" {
username = "william.okano@deliveryhero.com"
}

output "user_foo_id" {
value = data.litmus-chaos_user.user_foo.id
}
4 changes: 3 additions & 1 deletion internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,9 @@ func (p *litmusChaosProvider) Configure(ctx context.Context, req provider.Config

// DataSources defines the data sources implemented in the provider.
func (p *litmusChaosProvider) DataSources(_ context.Context) []func() datasource.DataSource {
return nil
return []func() datasource.DataSource{
NewUserDataSource,
}
}

// Resources defines the resources implemented in the provider.
Expand Down
118 changes: 118 additions & 0 deletions internal/provider/user_datasource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package provider

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/williamokano/litmus-chaos-thin-client/pkg/client"
)

var (
_ datasource.DataSource = &userDataSource{}
_ datasource.DataSourceWithConfigure = &userDataSource{}
)

type userDataSourceModel struct {
ID types.String `tfsdk:"id"`
Username types.String `tfsdk:"username"`
Role types.String `tfsdk:"role"`
Name types.String `tfsdk:"name"`
Email types.String `tfsdk:"email"`
}

type userDataSource struct {
client *client.LitmusClient
}

func NewUserDataSource() datasource.DataSource {
return &userDataSource{}
}

func (d *userDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) {
if req.ProviderData == nil {
return
}

litmusClient, ok := req.ProviderData.(*client.LitmusClient)

if !ok {
resp.Diagnostics.AddError(
"Unexpected Data Source Configure Type",
fmt.Sprintf("Expected *litmus.LitmusClient, got: %T. Please report this issue to the provider developers.", req.ProviderData),
)

return
}

d.client = litmusClient
}

func (d *userDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
resp.TypeName = req.ProviderTypeName + "_user"
}

func (d *userDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
resp.Schema = schema.Schema{
Attributes: map[string]schema.Attribute{
"id": schema.StringAttribute{
Description: "User ID",
Computed: true,
},
"username": schema.StringAttribute{
Description: "User username",
Required: true,
},
"email": schema.StringAttribute{
Description: "User email",
Computed: true,
},
"name": schema.StringAttribute{
Description: "User name",
Computed: true,
},
"role": schema.StringAttribute{
Description: "User role",
Computed: true,
},
},
}
}

func (d *userDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
var state userDataSourceModel
diags := req.Config.Get(ctx, &state)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}

user, err := d.client.FindUserByUsername(state.Username.ValueString())
if err != nil {
resp.Diagnostics.AddError(
"Error reading Litmus Chaos User",
"Could not read Litmus Chaos User with username "+state.Username.ValueString()+": "+err.Error(),
)
return
}

state.ID = types.StringValue(user.ID)
state.Name = types.StringValue(user.Name)
state.Role = types.StringValue(string(user.Role))

if user.Name != "" {
state.Name = types.StringValue(user.Name)
}

if user.Email != "" {
state.Email = types.StringValue(user.Email)
}

diags = resp.State.Set(ctx, state)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
}

0 comments on commit f7e0a67

Please sign in to comment.