Skip to content

Commit

Permalink
Merge branch 'apparentlymart-influxdb-provider'
Browse files Browse the repository at this point in the history
Closes #3478
  • Loading branch information
phinze committed Mar 20, 2016
2 parents c3c3ea2 + f450584 commit b1d9bea
Show file tree
Hide file tree
Showing 21 changed files with 3,161 additions and 0 deletions.
12 changes: 12 additions & 0 deletions builtin/bins/provider-influxdb/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package main

import (
"github.com/hashicorp/terraform/builtin/providers/influxdb"
"github.com/hashicorp/terraform/plugin"
)

func main() {
plugin.Serve(&plugin.ServeOpts{
ProviderFunc: influxdb.Provider,
})
}
1 change: 1 addition & 0 deletions builtin/bins/provider-influxdb/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package main
73 changes: 73 additions & 0 deletions builtin/providers/influxdb/provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package influxdb

import (
"fmt"
"net/url"
"strings"

"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/terraform"
"github.com/influxdata/influxdb/client"
)

var quoteReplacer = strings.NewReplacer(`"`, `\"`)

// Provider returns a terraform.ResourceProvider.
func Provider() terraform.ResourceProvider {
return &schema.Provider{
ResourcesMap: map[string]*schema.Resource{
"influxdb_database": ResourceDatabase(),
},

Schema: map[string]*schema.Schema{
"url": &schema.Schema{
Type: schema.TypeString,
Optional: true,
DefaultFunc: schema.EnvDefaultFunc(
"INFLUXDB_URL", "http://localhost:8086/",
),
},
"username": &schema.Schema{
Type: schema.TypeString,
Optional: true,
DefaultFunc: schema.EnvDefaultFunc("INFLUXDB_USERNAME", ""),
},
"password": &schema.Schema{
Type: schema.TypeString,
Optional: true,
DefaultFunc: schema.EnvDefaultFunc("INFLUXDB_PASSWORD", ""),
},
},

ConfigureFunc: Configure,
}
}

func Configure(d *schema.ResourceData) (interface{}, error) {
url, err := url.Parse(d.Get("url").(string))
if err != nil {
return nil, fmt.Errorf("invalid InfluxDB URL: %s", err)
}

config := client.Config{
URL: *url,
Username: d.Get("username").(string),
Password: d.Get("password").(string),
}

conn, err := client.NewClient(config)
if err != nil {
return nil, err
}

_, _, err = conn.Ping()
if err != nil {
return nil, fmt.Errorf("error pinging server: %s", err)
}

return conn, nil
}

func quoteIdentifier(ident string) string {
return fmt.Sprintf(`"%s"`, quoteReplacer.Replace(ident))
}
36 changes: 36 additions & 0 deletions builtin/providers/influxdb/provider_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package influxdb

import (
"testing"

"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/terraform"
)

// To run these acceptance tests, you will need an InfluxDB server.
// If you download an InfluxDB distribution and run it with its default
// settings, on the same host where the tests are being run, then these tests
// should work with no further configuration.
//
// To run the tests against a remote InfluxDB server, set the INFLUXDB_URL,
// INFLUXDB_USERNAME and INFLUXDB_PASSWORD environment variables.

var testAccProviders map[string]terraform.ResourceProvider
var testAccProvider *schema.Provider

func init() {
testAccProvider = Provider().(*schema.Provider)
testAccProviders = map[string]terraform.ResourceProvider{
"influxdb": testAccProvider,
}
}

func TestProvider(t *testing.T) {
if err := Provider().(*schema.Provider).InternalValidate(); err != nil {
t.Fatalf("err: %s", err)
}
}

func TestProvider_impl(t *testing.T) {
var _ terraform.ResourceProvider = Provider()
}
99 changes: 99 additions & 0 deletions builtin/providers/influxdb/resource_database.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package influxdb

import (
"fmt"

"github.com/hashicorp/terraform/helper/schema"
"github.com/influxdata/influxdb/client"
)

func ResourceDatabase() *schema.Resource {
return &schema.Resource{
Create: CreateDatabase,
Read: ReadDatabase,
Delete: DeleteDatabase,

Schema: map[string]*schema.Schema{
"name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
},
}
}

func CreateDatabase(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*client.Client)

name := d.Get("name").(string)
queryStr := fmt.Sprintf("CREATE DATABASE %s", quoteIdentifier(name))
query := client.Query{
Command: queryStr,
}

resp, err := conn.Query(query)
if err != nil {
return err
}
if resp.Err != nil {
return resp.Err
}

d.SetId(name)

return nil
}

func ReadDatabase(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*client.Client)
name := d.Id()

// InfluxDB doesn't have a command to check the existence of a single
// database, so we instead must read the list of all databases and see
// if ours is present in it.
query := client.Query{
Command: "SHOW DATABASES",
}

resp, err := conn.Query(query)
if err != nil {
return err
}
if resp.Err != nil {
return resp.Err
}

for _, result := range resp.Results[0].Series[0].Values {
if result[0] == name {
return nil
}
}

// If we fell out here then we didn't find our database in the list.
d.SetId("")

return nil
}

func DeleteDatabase(d *schema.ResourceData, meta interface{}) error {
conn := meta.(*client.Client)
name := d.Id()

queryStr := fmt.Sprintf("DROP DATABASE %s", quoteIdentifier(name))
query := client.Query{
Command: queryStr,
}

resp, err := conn.Query(query)
if err != nil {
return err
}
if resp.Err != nil {
return resp.Err
}

d.SetId("")

return nil
}
31 changes: 31 additions & 0 deletions builtin/providers/influxdb/resource_database_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package influxdb

import (
"testing"

"github.com/hashicorp/terraform/helper/resource"
)

func TestAccDatabase(t *testing.T) {
resource.Test(t, resource.TestCase{
Providers: testAccProviders,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccDatabaseConfig,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(
"influxdb_database.test", "name", "terraform-test",
),
),
},
},
})
}

var testAccDatabaseConfig = `
resource "influxdb_database" "test" {
name = "terraform-test"
}
`
20 changes: 20 additions & 0 deletions vendor/github.com/influxdata/influxdb/LICENSE

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions vendor/github.com/influxdata/influxdb/LICENSE_OF_DEPENDENCIES.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit b1d9bea

Please sign in to comment.