Skip to content

Commit

Permalink
feat: add secret data sources
Browse files Browse the repository at this point in the history
feat: add secret data sources
  • Loading branch information
s1ntaxe770r authored and andrew-s committed May 13, 2024
1 parent 0ae447c commit 274b99f
Show file tree
Hide file tree
Showing 5 changed files with 353 additions and 0 deletions.
35 changes: 35 additions & 0 deletions docs/data-sources/certificate_secret.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "qernal_certificate_secret Data Source - qernal"
subcategory: ""
description: |-
---

# qernal_certificate_secret (Data Source)





<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `name` (String) Name of the certficate
- `project_id` (String)

### Read-Only

- `certificate` (String) Public key of the certificate
- `date` (Attributes) (see [below for nested schema](#nestedatt--date))
- `revision` (Number)

<a id="nestedatt--date"></a>
### Nested Schema for `date`

Optional:

- `created_at` (String)
- `updated_at` (String)
35 changes: 35 additions & 0 deletions docs/data-sources/registry_secret.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "qernal_registry_secret Data Source - qernal"
subcategory: ""
description: |-
---

# qernal_registry_secret (Data Source)





<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `name` (String) Name of the registry secret
- `project_id` (String)

### Read-Only

- `date` (Attributes) (see [below for nested schema](#nestedatt--date))
- `registry` (String) url of the registry
- `revision` (Number)

<a id="nestedatt--date"></a>
### Nested Schema for `date`

Optional:

- `created_at` (String)
- `updated_at` (String)
2 changes: 2 additions & 0 deletions internal/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,9 @@ func (p *qernalProvider) Configure(ctx context.Context, req provider.ConfigureRe

func (p *qernalProvider) DataSources(_ context.Context) []func() datasource.DataSource {
return []func() datasource.DataSource{
qernalresource.NewcertificateDataSource,
qernalresource.NewenvironmentDataSource,
qernalresource.NewregistryDataSource,
}
}

Expand Down
140 changes: 140 additions & 0 deletions internal/resources/datasource_certificate_secret.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
package resources

import (
"context"
"fmt"
qernalclient "terraform-provider-qernal/internal/client"

"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
)

// Ensure the implementation satisfies the expected interfaces.
var (
_ datasource.DataSource = &certificateDataSource{}
)

func NewcertificateDataSource() datasource.DataSource {
return &certificateDataSource{}
}

type certificateDataSource struct {
client qernalclient.QernalAPIClient
}

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

client, ok := req.ProviderData.(qernalclient.QernalAPIClient)

if !ok {
resp.Diagnostics.AddError(
"Unexpected Data Source Configure Type",
fmt.Sprintf("Expected client.QernalAPIClient, got: %T. Please report this issue to the provider developers.", req.ProviderData),
)
return
}
r.client = client
}

// Metadata returns the data source type name.
func (d *certificateDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
resp.TypeName = req.ProviderTypeName + "_certificate_secret"
}

// Schema defines the schema for the data source.
func (d *certificateDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
resp.Schema = schema.Schema{
Attributes: map[string]schema.Attribute{
"project_id": schema.StringAttribute{
Required: true,
},

"name": schema.StringAttribute{
Required: true,
Description: "Name of the certficate",
},

"certificate": schema.StringAttribute{
Computed: true,
Description: "Public key of the certificate",
},

"revision": schema.Int64Attribute{
Computed: true,
Required: false,
},
"date": schema.SingleNestedAttribute{
Computed: true,
Required: false,
Attributes: map[string]schema.Attribute{
"created_at": schema.StringAttribute{
Optional: true,
},
"updated_at": schema.StringAttribute{
Optional: true,
},
},
},
},
}
}

// Read refreshes the Terraform data with the latest data.
func (d *certificateDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {

var data certificatesecretDataSourceModel

// Read Terraform configuration data into the model

diags := req.Config.Get(ctx, &data)
resp.Diagnostics.Append(diags...)

if resp.Diagnostics.HasError() {
return
}

secret, httpRes, err := d.client.SecretsAPI.ProjectsSecretsGet(ctx, data.ProjectID.ValueString(), data.Name.ValueString()).Execute()

if err != nil {

resData, _ := qernalclient.ParseResponseData(httpRes)
resp.Diagnostics.AddError(
"Error creating Secret",
"Could not create Secret, unexpected error: "+err.Error()+" with"+fmt.Sprintf(", detail: %v", resData))
return
}

data.Name = types.StringValue(secret.Name)

data.ProjectID = types.StringValue(data.ProjectID.ValueString())

data.Revision = types.Int64Value(int64(secret.Revision))

data.Certificate = types.StringValue(secret.Payload.SecretMetaResponseCertificatePayload.Certificate)
date := resourceDate{
CreatedAt: secret.Date.CreatedAt,
UpdatedAt: secret.Date.UpdatedAt,
}
data.Date = date.GetDateObject()

// Set refreshed data
diags = resp.State.Set(ctx, &data)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}

}

type certificatesecretDataSourceModel struct {
ProjectID types.String `tfsdk:"project_id"`
Name types.String `tfsdk:"name"`
Certificate types.String `tfsdk:"certificate"`
Revision types.Int64 `tfsdk:"revision"`
Date basetypes.ObjectValue `tfsdk:"date"`
}
141 changes: 141 additions & 0 deletions internal/resources/datasource_registry_secret.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
package resources

import (
"context"
"fmt"
qernalclient "terraform-provider-qernal/internal/client"

"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
)

// Ensure the implementation satisfies the expected interfaces.
var (
_ datasource.DataSource = &registryDataSource{}
)

func NewregistryDataSource() datasource.DataSource {
return &registryDataSource{}
}

type registryDataSource struct {
client qernalclient.QernalAPIClient
}

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

client, ok := req.ProviderData.(qernalclient.QernalAPIClient)

if !ok {
resp.Diagnostics.AddError(
"Unexpected Data Source Configure Type",
fmt.Sprintf("Expected client.QernalAPIClient, got: %T. Please report this issue to the provider developers.", req.ProviderData),
)
return
}
r.client = client
}

// Metadata returns the data source type name.
func (d *registryDataSource) Metadata(_ context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
resp.TypeName = req.ProviderTypeName + "_registry_secret"
}

// Schema defines the schema for the data source.
func (d *registryDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, resp *datasource.SchemaResponse) {
resp.Schema = schema.Schema{
Attributes: map[string]schema.Attribute{
"project_id": schema.StringAttribute{
Required: true,
},

"name": schema.StringAttribute{
Required: true,
Description: "Name of the registry secret",
},

"registry": schema.StringAttribute{
Computed: true,
Description: "url of the registry",
},

"revision": schema.Int64Attribute{
Computed: true,
Required: false,
},
"date": schema.SingleNestedAttribute{
Computed: true,
Required: false,
Attributes: map[string]schema.Attribute{
"created_at": schema.StringAttribute{
Optional: true,
},
"updated_at": schema.StringAttribute{
Optional: true,
},
},
},
},
}
}

// Read refreshes the Terraform data with the latest data.
func (d *registryDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {

var data registrysecretDataSourceModel

// Read Terraform configuration data into the model

diags := req.Config.Get(ctx, &data)
resp.Diagnostics.Append(diags...)

if resp.Diagnostics.HasError() {
return
}

secret, httpRes, err := d.client.SecretsAPI.ProjectsSecretsGet(ctx, data.ProjectID.ValueString(), data.Name.ValueString()).Execute()

if err != nil {

resData, _ := qernalclient.ParseResponseData(httpRes)
resp.Diagnostics.AddError(
"Error retreivng Secret",
"Could not get Secret, unexpected error: "+err.Error()+" with"+fmt.Sprintf(", detail: %v", resData))
return
}

data.Name = types.StringValue(secret.Name)

data.ProjectID = types.StringValue(data.ProjectID.ValueString())

data.Registry = types.StringValue(secret.Payload.SecretMetaResponseRegistryPayload.Registry)

data.Revision = types.Int64Value(int64(secret.Revision))

date := resourceDate{
CreatedAt: secret.Date.CreatedAt,
UpdatedAt: secret.Date.UpdatedAt,
}
data.Date = date.GetDateObject()

// Set refreshed data
diags = resp.State.Set(ctx, &data)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}

}

type registrysecretDataSourceModel struct {
ProjectID types.String `tfsdk:"project_id"`
Name types.String `tfsdk:"name"`
Registry types.String `tfsdk:"registry"`
Revision types.Int64 `tfsdk:"revision"`
Date basetypes.ObjectValue `tfsdk:"date"`
}

0 comments on commit 274b99f

Please sign in to comment.