teamcity/ssh_key_data_source.go (90 lines of code) (raw):

package teamcity import ( "context" "fmt" "github.com/hashicorp/terraform-plugin-framework/types" "terraform-provider-teamcity/client" "terraform-provider-teamcity/models" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/path" ) var ( _ datasource.DataSource = &sshKeyDataSource{} _ datasource.DataSourceWithConfigure = &sshKeyDataSource{} ) func NewSshKeyDataSource() datasource.DataSource { return &sshKeyDataSource{} } type sshKeyDataSource struct { client *client.Client } func (d *sshKeyDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) { resp.TypeName = req.ProviderTypeName + "_ssh_key" } func (d *sshKeyDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) { resp.Schema = schema.Schema{ Description: "SSH Key from specific Project. More info [here](https://www.jetbrains.com/help/teamcity/ssh-keys-management.html)", Attributes: map[string]schema.Attribute{ "project_id": schema.StringAttribute{ Required: true, }, "name": schema.StringAttribute{ Required: true, }, }, } } func (d *sshKeyDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) { var model models.SshKeyDataModel diags := req.Config.Get(ctx, &model) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { return } sshKeys, err := d.client.GetSshKeys(model.ProjectId.ValueString()) if err != nil { resp.Diagnostics.AddError( fmt.Sprintf("Unable to read SSH keys in project %s", model.ProjectId.ValueString()), err.Error(), ) return } var requestedSshKey = "" for _, value := range sshKeys { if value == model.Name.ValueString() { requestedSshKey = value } } if requestedSshKey == "" { resp.Diagnostics.AddAttributeError( path.Root("name"), "SSH Key not found", "The Datasource cannot get SSH Key since there is no SSH Key with the provided name.", ) return } var state = models.SshKeyDataModel{ Name: types.StringValue(requestedSshKey), ProjectId: model.ProjectId, } diags = resp.State.Set(ctx, &state) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { return } } func (d *sshKeyDataSource) Configure(_ context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) { if req.ProviderData == nil { return } httpClient, ok := req.ProviderData.(*client.Client) if !ok { resp.Diagnostics.AddError( "Unexpected Data Source Configure Type", fmt.Sprintf("Expected *client.Client, got: %T.", req.ProviderData), ) return } d.client = httpClient }