Skip to content

Commit

Permalink
Template credentials (#34)
Browse files Browse the repository at this point in the history
* Update go-sdk to 1.5.0

* Add template Credential resource

* Add documentation

* go fmt

* go mod tidy

* Fix name + add example

* Fixes documentation

* Bumps go-sdk to 1.5.1

* Add update of the resource

* go fmt

* Update template_credential.md

* Update main.tf

* Update resource_template_credential.go

Co-authored-by: Marius <[email protected]>
  • Loading branch information
CARRIERE Etienne and Acconut authored Aug 22, 2022
1 parent bf81762 commit 63158be
Show file tree
Hide file tree
Showing 15 changed files with 444 additions and 10 deletions.
86 changes: 86 additions & 0 deletions docs/resources/template_credential.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
layout: "transloadit"
page_title: "Transloadit: template credential"
description: |-
Manages Transloadit Template Credential
---

# Resource: transloadit_template_credential

Manages Transloadit Templates Credential
For additional details please refer to the [Transloadit documentation](https://transloadit.com/docs/topics/template-credentials/).

## Example Usage

```hcl
provider "transloadit" {
}
resource "transloadit_template_credential" "s3" {
name = "S3_CREDENTIALS"
type = "s3"
content = <<EOT
{
"bucket" : "mybucket",
"bucket_region" : "us-east-1",
"key" : "mykey",
"secret" : "mysecret"
}
EOT
}
resource "transloadit_template" "my-terraform-template" {
name = "my-terraform-template"
template = <<EOT
{
"steps": {
":original": {
"robot": "/upload/handle"
},
[... different steps ...]
"exported": {
"use": [ ":original", "encoded", "thumbed"],
"credentials": "${transloadit_template_credential.s3.name}",
"robot": "/s3/store"
}
}
}
EOT
}
```

## Argument Reference

The following arguments are supported:

- `name` - (Required) Name of the Template credential to be added
- `type` - (Required) Type of Template credential to be added
- `content` - (Required) JSON of the template credential. Go to the [documentation](https://transloadit.com/docs/transcoding/) for information about the parameters needed.
Examples:
- s3 credentials: https://transloadit.com/docs/transcoding/file-importing/s3-import/#credentials
- backblaze: https://transloadit.com/docs/transcoding/file-importing/backblaze-import/#credentials
- sftp: https://transloadit.com/docs/transcoding/file-importing/sftp-import/#credentials

## Attributes Reference

- `id` - The Template credential ID reference from Transloadit, e.g. `908ab54f2c4b479184db637709320c85`
- `name` - The Template credential slug reference from Transloadit, e.g. `S3_CREDENTIALS`
- `type` - The Template credential type
- `content` - The Template credential content
- `created` - Creation date of the Template credential
- `modified` - Last modified date of the Template credential

## Update

`name` and `content` argument can be updated without recreating template credential.
Change of `type` will trigger a delete/creation of the resource

## Import

Template credential can be imported using the `id`, e.g.

```bash
$ terraform import transloadit_template_credential.my_template 908ab54f2c4b479184db637709320c85
```

42 changes: 42 additions & 0 deletions examples/template-credential/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
resource "transloadit_template_credential" "s3" {
name = "MY_S3_CREDENTIALS"
type = "s3"
content = <<EOT
{
"bucket" : "mybucket",
"bucket_region" : "us-east-1",
"key" : "mykey",
"secret" : "mysecret"
}
EOT
}

resource "transloadit_template" "my-terraform-template" {
name = "my-terraform-template"
template = <<EOT
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"encoded": {
"use": ":original",
"robot": "/video/encode",
"preset": "ipad-high",
"ffmpeg_stack": "v3.3.3"
},
"thumbed": {
"use": ":original",
"robot": "/video/thumbs",
"count": 4,
"ffmpeg_stack": "v3.3.3"
},
"exported": {
"use": [ ":original", "encoded", "thumbed"],
"credentials": "${transloadit_template_credential.s3.name}",
"robot": "/s3/store"
}
}
}
EOT
}
11 changes: 11 additions & 0 deletions examples/template-credential/providers.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
terraform {
required_providers {
transloadit = {
source = "transloadit/transloadit"
}
}
}

provider "transloadit" {
}

2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.18

require (
github.com/hashicorp/terraform-plugin-sdk v1.17.2
github.com/transloadit/go-sdk v1.4.1
github.com/transloadit/go-sdk v1.5.1
)

require (
Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/Y
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I=
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
github.com/apparentlymart/go-textseg/v12 v12.0.0 h1:bNEQyAGak9tojivJNkoqWErVCQbjdL7GzRt3F8NvfJ0=
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
Expand Down Expand Up @@ -310,11 +309,12 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/transloadit/go-sdk v1.4.1 h1:Op8dm6PB6sr42fiTyIDukxqyWJSm6NvI3X/d9DLP69c=
github.com/transloadit/go-sdk v1.4.1/go.mod h1:4gUsTnUsd4S+liSsPH3VUXJZOW4WMMXS0Rwd1BAf4Vs=
github.com/transloadit/go-sdk v1.5.0 h1:F34b1DcNMnjg10MBwiRX36mBRDYRAUMWGuTwU3fWHUQ=
github.com/transloadit/go-sdk v1.5.0/go.mod h1:4gUsTnUsd4S+liSsPH3VUXJZOW4WMMXS0Rwd1BAf4Vs=
github.com/transloadit/go-sdk v1.5.1 h1:m/lKJ3EoPDsyLb1ZKBfsebdNZgd7InMB3X6W1OrWG/Q=
github.com/transloadit/go-sdk v1.5.1/go.mod h1:4gUsTnUsd4S+liSsPH3VUXJZOW4WMMXS0Rwd1BAf4Vs=
github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/vmihailenco/msgpack v3.3.3+incompatible h1:wapg9xDUZDzGCNFlwc5SqI1rvcciqcxEHac4CYj89xI=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U=
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
Expand Down
3 changes: 2 additions & 1 deletion transloadit/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ func Provider() terraform.ResourceProvider {
},
},
ResourcesMap: map[string]*schema.Resource{
prefix + "template": resourceTemplate(),
prefix + "template": resourceTemplate(),
prefix + "template_credential": resourceTemplateCredential(),
},
ConfigureFunc: configureProvider,
}
Expand Down
125 changes: 125 additions & 0 deletions transloadit/resource_template_credential.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package transloadit

import (
"context"
"encoding/json"
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
transloadit "github.com/transloadit/go-sdk"
)

func resourceTemplateCredential() *schema.Resource {
return &schema.Resource{
Create: resourceTemplateCredentialCreate,
Read: resourceTemplateCredentialRead,
Delete: resourceTemplateCredentialDelete,
Update: resourceTemplateCredentialUpdate,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: false,
Description: "Template credential name",
},
"type": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Template credential type",
},
"content": {
Type: schema.TypeString,
Required: true,
ForceNew: false,
Description: "Template credential content in JSON",
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
bool, _ := AreEqualJSON(old, new)
return bool
},
},
"created": {
Type: schema.TypeString,
Computed: true,
},
"modified": {
Type: schema.TypeString,
Computed: true,
},
},
}
}

func resourceTemplateCredentialCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*transloadit.Client)
templateCredentialContent, err := jsonStringToTemplateCredentialContent(d.Get("content").(string))
if err != nil {
return err
}
payload := transloadit.TemplateCredential{
Name: d.Get("name").(string),
Type: d.Get("type").(string),
Content: *templateCredentialContent,
}
templateId, err := client.CreateTemplateCredential(context.Background(), payload)
if err != nil {
return err
}
d.SetId(templateId)
return resourceTemplateCredentialRead(d, meta)
}

func resourceTemplateCredentialRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*transloadit.Client)
templateCredential, err := client.GetTemplateCredential(context.Background(), d.Id())
if err != nil {
return err
}
toSave := BatchSet{
"name": templateCredential.Name,
"type": templateCredential.Type,
"created": templateCredential.Created,
"modified": templateCredential.Modified,
}
result, err := json.Marshal(templateCredential.Content)
if err != nil {
return fmt.Errorf("Content field can't be marshalled to json +%v", templateCredential.Content)
}
toSave["content"] = string(result)
return saveToState(d, toSave)
}

func resourceTemplateCredentialDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*transloadit.Client)
err := client.DeleteTemplateCredential(context.Background(), d.Id())
return err
}

func resourceTemplateCredentialUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*transloadit.Client)
templateCredentialContent, err := jsonStringToTemplateCredentialContent(d.Get("content").(string))
if err != nil {
return err
}
payload := transloadit.TemplateCredential{
Name: d.Get("name").(string),
Type: d.Get("type").(string),
Content: *templateCredentialContent,
}
err = client.UpdateTemplateCredential(context.Background(), d.Id(), payload)
return err
}

func jsonStringToTemplateCredentialContent(src string) (*map[string]interface{}, error) {
var content map[string]interface{}
err := json.Unmarshal([]byte(src), &content)
if err != nil {
return nil, err
}

return &content, nil
}
63 changes: 63 additions & 0 deletions transloadit/resource_template_credential_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package transloadit

import (
"fmt"
"math/rand"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
)

func TestAccTemplateCredential_basic(t *testing.T) {

randInt := rand.Int() % 1000
template1_name := fmt.Sprintf("templatecredentialbasic%d", randInt)
template2_name := fmt.Sprintf("templatecredentialbasic%d", randInt+1)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: nil,
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(testAccTemplateCredential_basic_1, template1_name, template2_name),
Check: resource.ComposeTestCheckFunc(
testAccCheckExistingResource("transloadit_template_credential.s3"),
testAccCheckExistingResource("transloadit_template_credential.backblaze"),
resource.TestCheckResourceAttr("transloadit_template_credential.s3", "name", template1_name),
resource.TestCheckResourceAttr("transloadit_template_credential.s3", "type", "s3"),
resource.TestCheckResourceAttr("transloadit_template_credential.s3", "content", "{\"bucket\":\"mybucket\",\"bucket_region\":\"us-east-1\",\"key\":\"mykey\",\"secret\":\"mysecret\"}"),
resource.TestCheckResourceAttr("transloadit_template_credential.backblaze", "name", template2_name),
resource.TestCheckResourceAttr("transloadit_template_credential.backblaze", "type", "backblaze"),
resource.TestCheckResourceAttr("transloadit_template_credential.backblaze", "content", "{\"app_key\":\"mykey\",\"app_key_id\":\"mykeyid\",\"bucket\":\"mybucket\"}"),
),
},
},
})
}

const testAccTemplateCredential_basic_1 = `
resource "transloadit_template_credential" "s3" {
name = "%s"
type = "s3"
content = <<EOT
{
"bucket" : "mybucket",
"bucket_region" : "us-east-1",
"key" : "mykey",
"secret" : "mysecret"
}
EOT
}
resource "transloadit_template_credential" "backblaze" {
name = "%s"
type = "backblaze"
content = <<EOT
{
"bucket" : "mybucket",
"app_key_id" : "mykeyid",
"app_key" : "mykey"
}
EOT
}
`
13 changes: 13 additions & 0 deletions transloadit/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package transloadit
import (
"encoding/json"
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"reflect"
)

Expand All @@ -22,3 +23,15 @@ func AreEqualJSON(s1, s2 string) (bool, error) {

return reflect.DeepEqual(o1, o2), nil
}

type BatchSet map[string]interface{}

func saveToState(d *schema.ResourceData, m BatchSet) error {
for key, value := range m {
err := d.Set(key, value)
if err != nil {
return fmt.Errorf("Impossible to save %s = %s in state", key, value)
}
}
return nil
}
Loading

0 comments on commit 63158be

Please sign in to comment.