Skip to content

Commit

Permalink
Working resource
Browse files Browse the repository at this point in the history
  • Loading branch information
therve committed Jan 29, 2024
1 parent e15e9e5 commit 77ab73e
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 140 deletions.
1 change: 1 addition & 0 deletions datadog/fwprovider/framework_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ var (
)

var Resources = []func() resource.Resource{
NewOpenapiApiResource,
NewAPIKeyResource,
NewApplicationKeyResource,
NewApmRetentionFilterResource,
Expand Down
203 changes: 82 additions & 121 deletions datadog/fwprovider/resource_datadog_openapi_api.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@

package fwprovider

import (
"context"
"io"
"strings"

"github.com/DataDog/datadog-api-client-go/v2/api/datadog"
"github.com/DataDog/datadog-api-client-go/v2/api/datadogV2"
"github.com/hashicorp/terraform-plugin-framework/diag"
frameworkPath "github.com/hashicorp/terraform-plugin-framework/path"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
"github.com/hashicorp/terraform-plugin-framework/types"

"github.com/google/uuid"
"github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils"
)

Expand All @@ -20,21 +20,16 @@ var (
_ resource.ResourceWithImportState = &openapiApiResource{}
)



type openapiApiResource struct {
Api *datadogV2.APIManagementApi
Auth context.Context
}

type openapiApiModel struct {
ID types.String `tfsdk:"id"`
Spec types.String `tfsdk:"spec"`
}





func NewOpenapiApiResource() resource.Resource {
return &openapiApiResource{}
}
Expand All @@ -49,13 +44,15 @@ func (r *openapiApiResource) Metadata(_ context.Context, request resource.Metada
response.TypeName = "openapi_api"
}



func (r *openapiApiResource) Schema(_ context.Context, _ resource.SchemaRequest, response *resource.SchemaResponse) {
response.Schema = schema.Schema{
Description: "Provides a Datadog OpenapiApi resource. This can be used to create and manage Datadog openapi_api.",
Attributes: map[string]schema.Attribute{
"id": utils.ResourceIDAttribute(),
"id": utils.ResourceIDAttribute(),
"spec": schema.StringAttribute{
Description: "The OpenAPI spec.",
Required: true,
},
},
}
}
Expand All @@ -65,14 +62,15 @@ func (r *openapiApiResource) ImportState(ctx context.Context, request resource.I
}

func (r *openapiApiResource) Read(ctx context.Context, request resource.ReadRequest, response *resource.ReadResponse) {
var state openapiApiModel
response.Diagnostics.Append(request.State.Get(ctx, &state)...)
if response.Diagnostics.HasError() {
return
}

id := state.ID.ValueString()
resp, httpResp, err := r.Api.GetOpenAPI(r.Auth, id,)
var state openapiApiModel
response.Diagnostics.Append(request.State.Get(ctx, &state)...)
if response.Diagnostics.HasError() {
return
}

id := state.ID.ValueString()
uuid, _ := uuid.Parse(id)
resp, httpResp, err := r.Api.GetOpenAPI(r.Auth, uuid)
if err != nil {
if httpResp != nil && httpResp.StatusCode == 404 {
response.State.RemoveResource(ctx)
Expand All @@ -81,96 +79,88 @@ func (r *openapiApiResource) Read(ctx context.Context, request resource.ReadRequ
response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving OpenapiApi"))
return
}
if err := utils.CheckForUnparsed(resp); err != nil {
response.Diagnostics.AddError("response contains unparsedObject", err.Error())
return
}

r.updateState(ctx, &state, &resp)
specData, err := io.ReadAll(resp)
if err != nil {
response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error reading spec"))
return
}
state.Spec = types.StringValue(string(specData))

// Save data into Terraform state
response.Diagnostics.Append(response.State.Set(ctx, &state)...)
// Save data into Terraform state
response.Diagnostics.Append(response.State.Set(ctx, &state)...)
}

func (r *openapiApiResource) Create(ctx context.Context, request resource.CreateRequest, response *resource.CreateResponse) {
var state openapiApiModel
response.Diagnostics.Append(request.Plan.Get(ctx, &state)...)
if response.Diagnostics.HasError() {
return
}

specFile := state.Spec.ValueString()

func (r *openapiApiResource) Create(ctx context.Context, request resource.CreateRequest, response *resource.CreateResponse) {
var state openapiApiModel
response.Diagnostics.Append(request.Plan.Get(ctx, &state)...)
if response.Diagnostics.HasError() {
return
}

specFile := state.SpecFile.ValueString()

body, diags := r.buildOpenapiApiRequestBody(ctx, &state)
response.Diagnostics.Append(diags...)
if response.Diagnostics.HasError() {
return
}

resp, _, err := r.Api.CreateOpenAPI(r.Auth, specFile, *body, )
var bodyReader io.Reader
bodyReader = strings.NewReader(specFile)
params := datadogV2.NewCreateOpenAPIOptionalParameters().WithOpenapiSpecFile(bodyReader)
resp, _, err := r.Api.CreateOpenAPI(r.Auth, *params)
if err != nil {
response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving OpenapiApi"))
return
response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving OpenapiApi"))
return
}
if err := utils.CheckForUnparsed(resp); err != nil {
response.Diagnostics.AddError("response contains unparsedObject", err.Error())
return
}
r.updateState(ctx, &state, &resp)

// Save data into Terraform state
response.Diagnostics.Append(response.State.Set(ctx, &state)...)
}

if err := utils.CheckForUnparsed(resp); err != nil {
response.Diagnostics.AddError("response contains unparsedObject", err.Error())
return
}
respData := resp.GetData()
state.ID = types.StringValue(respData.GetId().String())

// Save data into Terraform state
response.Diagnostics.Append(response.State.Set(ctx, &state)...)
}

func (r *openapiApiResource) Update(ctx context.Context, request resource.UpdateRequest, response *resource.UpdateResponse) {
var state openapiApiModel
response.Diagnostics.Append(request.Plan.Get(ctx, &state)...)
if response.Diagnostics.HasError() {
return
}
var state openapiApiModel
response.Diagnostics.Append(request.Plan.Get(ctx, &state)...)
if response.Diagnostics.HasError() {
return
}

id := state.ID.ValueString()

specFile := state.SpecFile.ValueString()

body, diags := r.buildOpenapiApiUpdateRequestBody(ctx, &state)
response.Diagnostics.Append(diags...)
if response.Diagnostics.HasError() {
return
}


resp, _, err := r.Api.UpdateOpenAPI(r.Auth, id, specFile, *body, )
uuid, _ := uuid.Parse(id)

specFile := state.Spec.ValueString()

var bodyReader io.Reader
bodyReader = strings.NewReader(specFile)
params := datadogV2.NewUpdateOpenAPIOptionalParameters().WithOpenapiSpecFile(bodyReader)

resp, _, err := r.Api.UpdateOpenAPI(r.Auth, uuid, *params)
if err != nil {
response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving OpenapiApi"))
return
response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving OpenapiApi"))
return
}
if err := utils.CheckForUnparsed(resp); err != nil {
response.Diagnostics.AddError("response contains unparsedObject", err.Error())
return
}
r.updateState(ctx, &state, &resp)

// Save data into Terraform state
response.Diagnostics.Append(response.State.Set(ctx, &state)...)
}

if err := utils.CheckForUnparsed(resp); err != nil {
response.Diagnostics.AddError("response contains unparsedObject", err.Error())
return
}
respData := resp.GetData()
state.ID = types.StringValue(respData.GetId().String())

// Save data into Terraform state
response.Diagnostics.Append(response.State.Set(ctx, &state)...)
}

func (r *openapiApiResource) Delete(ctx context.Context, request resource.DeleteRequest, response *resource.DeleteResponse) {
var state openapiApiModel
response.Diagnostics.Append(request.State.Get(ctx, &state)...)
if response.Diagnostics.HasError() {
return
}
var state openapiApiModel
response.Diagnostics.Append(request.State.Get(ctx, &state)...)
if response.Diagnostics.HasError() {
return
}

id := state.ID.ValueString()
id := state.ID.ValueString()
uuid, _ := uuid.Parse(id)

httpResp, err := r.Api.DeleteOpenAPI(r.Auth, id,)
httpResp, err := r.Api.DeleteOpenAPI(r.Auth, uuid)
if err != nil {
if httpResp != nil && httpResp.StatusCode == 404 {
return
Expand All @@ -179,32 +169,3 @@ func (r *openapiApiResource) Delete(ctx context.Context, request resource.Delete
return
}
}


func (r *openapiApiResource) updateState(ctx context.Context, state *openapiApiModel, resp *datadogV2.OpenAPIfile) {
state.ID = types.StringValue(resp.GetId())


if specFile, ok := resp.GetSpecFileOk(); ok {
state.SpecFile = types.StringValue(*specFile)
}
}




func (r *openapiApiResource) buildOpenapiApiRequestBody(ctx context.Context, state *openapiApiModel) (*datadogV2.string, diag.Diagnostics) {
diags := diag.Diagnostics{}


return req, diags
}



func (r *openapiApiResource) buildOpenapiApiUpdateRequestBody(ctx context.Context, state *openapiApiModel) (*datadogV2.string, diag.Diagnostics) {
diags := diag.Diagnostics{}


return req, diags
}
9 changes: 9 additions & 0 deletions datadog/internal/utils/api_instances_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ type ApiInstances struct {
webhooksIntegrationApiV1 *datadogV1.WebhooksIntegrationApi

//V2 APIs
apiManagementAPIV2 *datadogV2.APIManagementApi
apmRetentionFiltersApiV2 *datadogV2.APMRetentionFiltersApi
auditApiV2 *datadogV2.AuditApi
authNMappingsApiV2 *datadogV2.AuthNMappingsApi
Expand Down Expand Up @@ -617,3 +618,11 @@ func (i *ApiInstances) GetApmRetentionFiltersApiV2() *datadogV2.APMRetentionFilt
}
return i.apmRetentionFiltersApiV2
}

// GetAPIManagementApiV2 get instance of APIManagementApi
func (i *ApiInstances) GetAPIManagementApiV2() *datadogV2.APIManagementApi {
if i.apiManagementAPIV2 == nil {
i.apiManagementAPIV2 = datadogV2.NewAPIManagementApi(i.HttpClient)
}
return i.apiManagementAPIV2
}
31 changes: 14 additions & 17 deletions datadog/tests/resource_datadog_openapi_api_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

package test

import (
Expand All @@ -9,8 +8,8 @@ import (
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-plugin-testing/terraform"

"github.com/terraform-providers/terraform-provider-datadog/datadog/fwprovider"
"github.com/terraform-providers/terraform-provider-datadog/datadog"
"github.com/terraform-providers/terraform-provider-datadog/datadog/fwprovider"
"github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils"
)

Expand All @@ -21,22 +20,20 @@ func TestAccOpenapiApiBasic(t *testing.T) {

resource.Test(t, resource.TestCase{
ProtoV5ProviderFactories: accProviders,
CheckDestroy: testAccCheckDatadogOpenapiApiDestroy(providers.frameworkProvider),
CheckDestroy: testAccCheckDatadogOpenapiApiDestroy(providers.frameworkProvider),
Steps: []resource.TestStep{
{
Config: testAccCheckDatadogOpenapiApi(uniq),
Check: resource.ComposeTestCheckFunc(
testAccCheckDatadogOpenapiApiExists(providers.frameworkProvider),


),
},
},
})
}

func testAccCheckDatadogOpenapiApi(uniq string) string {
// Update me to make use of the unique value
// Update me to make use of the unique value
return fmt.Sprintf(`resource "datadog_openapi_api" "foo" {
spec_file = "UPDATE ME"
body = "UPDATE ME"
Expand All @@ -58,12 +55,12 @@ func testAccCheckDatadogOpenapiApiDestroy(accProvider *fwprovider.FrameworkProvi
func OpenapiApiDestroyHelper(auth context.Context, s *terraform.State, apiInstances *utils.ApiInstances) error {
err := utils.Retry(2, 10, func() error {
for _, r := range s.RootModule().Resources {
if r.Type != "resource_datadog_openapi_api" {
continue
}
id := r.Primary.ID
if r.Type != "resource_datadog_openapi_api" {
continue
}
id := r.Primary.ID

_, httpResp, err := apiInstances.GetAPIManagementApiV2().GetOpenAPI(auth, id,)
_, httpResp, err := apiInstances.GetAPIManagementApiV2().GetOpenAPI(auth, id)
if err != nil {
if httpResp != nil && httpResp.StatusCode == 404 {
return nil
Expand Down Expand Up @@ -91,15 +88,15 @@ func testAccCheckDatadogOpenapiApiExists(accProvider *fwprovider.FrameworkProvid

func openapiApiExistsHelper(auth context.Context, s *terraform.State, apiInstances *utils.ApiInstances) error {
for _, r := range s.RootModule().Resources {
if r.Type != "resource_datadog_openapi_api" {
continue
}
id := r.Primary.ID
if r.Type != "resource_datadog_openapi_api" {
continue
}
id := r.Primary.ID

_, httpResp, err := apiInstances.GetAPIManagementApiV2().GetOpenAPI(auth, id,)
_, httpResp, err := apiInstances.GetAPIManagementApiV2().GetOpenAPI(auth, id)
if err != nil {
return utils.TranslateClientError(err, httpResp, "error retrieving OpenapiApi")
}
}
return nil
}
}
4 changes: 2 additions & 2 deletions examples/resources/datadog_openapi_api/resource.tf
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Create new openapi_api resource

resource "datadog_openapi_api" "foo" {
spec_file = "UPDATE ME"
body = "UPDATE ME"
spec_file = "UPDATE ME"
body = "UPDATE ME"
}
Loading

0 comments on commit 77ab73e

Please sign in to comment.