Skip to content
This repository was archived by the owner on Jun 2, 2024. It is now read-only.

Commit

Permalink
#95: Implement basic import feature
Browse files Browse the repository at this point in the history
  • Loading branch information
gessnerfl committed Apr 10, 2021
1 parent cd54bb0 commit 9a0c645
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 8 deletions.
2 changes: 2 additions & 0 deletions instana/resource-api-token.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ var (

//NewAPITokenResourceHandle creates a ResourceHandle instance for the terraform resource API token
func NewAPITokenResourceHandle() ResourceHandle {
internalIDFieldName := APITokenFieldInternalID
return &apiTokenResource{
metaData: ResourceMetaData{
ResourceName: ResourceInstanaAPIToken,
Expand Down Expand Up @@ -299,6 +300,7 @@ func NewAPITokenResourceHandle() ResourceHandle {
},
SchemaVersion: 0,
SkipIDGeneration: true,
ResourceIDField: &internalIDFieldName,
},
}
}
Expand Down
31 changes: 23 additions & 8 deletions instana/terraform-provider-instana-resource.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package instana

import (
"context"
"fmt"

"github.com/gessnerfl/terraform-provider-instana/instana/restapi"
Expand All @@ -14,6 +15,7 @@ type ResourceMetaData struct {
Schema map[string]*schema.Schema
SchemaVersion int
SkipIDGeneration bool
ResourceIDField *string
}

//ResourceHandle resource specific implementation which provides meta data and maps data from/to terraform state. Together with TerraformResource terraform schema resources can be created
Expand Down Expand Up @@ -79,15 +81,11 @@ func (r *terraformResourceImpl) Create(d *schema.ResourceData, meta interface{})
func (r *terraformResourceImpl) Read(d *schema.ResourceData, meta interface{}) error {
providerMeta := meta.(*ProviderMeta)
instanaAPI := providerMeta.InstanaAPI
obj, err := r.resourceHandle.MapStateToDataObject(d, providerMeta.ResourceNameFormatter)
if err != nil {
return err
}
resourceID := obj.GetIDForResourcePath()
resourceID := r.getResourceID(d)
if len(resourceID) == 0 {
return fmt.Errorf("resource ID of %s is missing", r.resourceHandle.MetaData().ResourceName)
}
obj, err = r.resourceHandle.GetRestResource(instanaAPI).GetOne(resourceID)
obj, err := r.resourceHandle.GetRestResource(instanaAPI).GetOne(resourceID)
if err != nil {
if err == restapi.ErrEntityNotFound {
d.SetId("")
Expand All @@ -99,6 +97,13 @@ func (r *terraformResourceImpl) Read(d *schema.ResourceData, meta interface{}) e
return nil
}

func (r *terraformResourceImpl) getResourceID(d *schema.ResourceData) string {
if r.resourceHandle.MetaData().ResourceIDField != nil {
return d.Get(*r.resourceHandle.MetaData().ResourceIDField).(string)
}
return d.Id()
}

//Update defines the update operation for the terraform resource
func (r *terraformResourceImpl) Update(d *schema.ResourceData, meta interface{}) error {
providerMeta := meta.(*ProviderMeta)
Expand Down Expand Up @@ -136,12 +141,22 @@ func (r *terraformResourceImpl) Delete(d *schema.ResourceData, meta interface{})
func (r *terraformResourceImpl) ToSchemaResource() *schema.Resource {
metaData := r.resourceHandle.MetaData()
return &schema.Resource{
Create: r.Create,
Read: r.Read,
Create: r.Create,
Read: r.Read,
Importer: &schema.ResourceImporter{
StateContext: r.importState,
},
Update: r.Update,
Delete: r.Delete,
Schema: metaData.Schema,
SchemaVersion: metaData.SchemaVersion,
StateUpgraders: r.resourceHandle.StateUpgraders(),
}
}

func (r *terraformResourceImpl) importState(ctx context.Context, d *schema.ResourceData, m interface{}) ([]*schema.ResourceData, error) {
if r.resourceHandle.MetaData().ResourceIDField != nil {
d.Set(*r.resourceHandle.MetaData().ResourceIDField, d.Id())
}
return []*schema.ResourceData{d}, nil
}

0 comments on commit 9a0c645

Please sign in to comment.