Skip to content

Commit

Permalink
Add Rancher provider and docs.
Browse files Browse the repository at this point in the history
  • Loading branch information
johnrengelman committed Oct 11, 2016
1 parent 2a65203 commit 12958f3
Show file tree
Hide file tree
Showing 29 changed files with 731 additions and 212 deletions.
15 changes: 15 additions & 0 deletions builtin/bins/provider-rancher/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package main

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

func main() {
plugin.Serve(&plugin.ServeOpts{
ProviderFunc: func() terraform.ResourceProvider {
return rancher.Provider()
},
})
}
22 changes: 6 additions & 16 deletions builtin/providers/rancher/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,20 @@ package rancher
import (
"log"

rancher "github.com/rancher/go-rancher/client"
rancherClient "github.com/rancher/go-rancher/client"
"github.com/raphink/go-rancher/catalog"
)

type Config struct {
*rancher.RancherClient
*rancherClient.RancherClient
APIURL string
AccessKey string
SecretKey string
}

// Create creates a generic Rancher client
func (c *Config) CreateClient() error {
if c.APIURL == "" || c.AccessKey == "" || c.SecretKey == "" {
return nil
}

client, err := rancher.NewRancherClient(&rancher.ClientOpts{
client, err := rancherClient.NewRancherClient(&rancherClient.ClientOpts{
Url: c.APIURL,
AccessKey: c.AccessKey,
SecretKey: c.SecretKey,
Expand All @@ -36,13 +32,10 @@ func (c *Config) CreateClient() error {
return nil
}

func (c *Config) EnvironmentClient(env string) (*rancher.RancherClient, error) {
if c.APIURL == "" || c.AccessKey == "" || c.SecretKey == "" {
return nil, nil
}
func (c *Config) EnvironmentClient(env string) (*rancherClient.RancherClient, error) {

url := c.APIURL + "/projects/" + env + "/schemas"
client, err := rancher.NewRancherClient(&rancher.ClientOpts{
client, err := rancherClient.NewRancherClient(&rancherClient.ClientOpts{
Url: url,
AccessKey: c.AccessKey,
SecretKey: c.SecretKey,
Expand All @@ -56,7 +49,7 @@ func (c *Config) EnvironmentClient(env string) (*rancher.RancherClient, error) {
return client, nil
}

func (c *Config) RegistryClient(id string) (*rancher.RancherClient, error) {
func (c *Config) RegistryClient(id string) (*rancherClient.RancherClient, error) {
reg, err := c.Registry.ById(id)
if err != nil {
return nil, err
Expand All @@ -66,9 +59,6 @@ func (c *Config) RegistryClient(id string) (*rancher.RancherClient, error) {
}

func (c *Config) CatalogClient() (*catalog.RancherClient, error) {
if c.APIURL == "" || c.AccessKey == "" || c.SecretKey == "" {
return nil, nil
}

url := c.APIURL + "-catalog/schemas"
client, err := catalog.NewRancherClient(&catalog.ClientOpts{
Expand Down
7 changes: 3 additions & 4 deletions builtin/providers/rancher/import_rancher_environment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,9 @@ func TestAccRancherEnvironment_importBasic(t *testing.T) {
},

resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{},
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package rancher

import (
"testing"

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

func TestAccRancherRegistrationToken_importBasic(t *testing.T) {
resourceName := "rancher_registration_token.foo"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckRancherRegistrationTokenDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccRancherRegistrationTokenConfig,
},

resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package rancher

import (
"testing"

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

func TestAccRancherRegistryCredential_importBasic(t *testing.T) {
resourceName := "rancher_registry_credential.foo"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckRancherRegistryCredentialDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccRancherRegistryCredentialConfig,
},

resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{
"secret_value"},
},
},
})
}
28 changes: 28 additions & 0 deletions builtin/providers/rancher/import_rancher_registry_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package rancher

import (
"testing"

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

func TestAccRancherRegistry_importBasic(t *testing.T) {
resourceName := "rancher_registry.foo"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckRancherRegistryDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccRancherRegistryConfig,
},

resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}
28 changes: 28 additions & 0 deletions builtin/providers/rancher/import_rancher_stack_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package rancher

import (
"testing"

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

func TestAccRancherStack_importBasic(t *testing.T) {
resourceName := "rancher_stack.foo"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckRancherStackDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccRancherStackConfig,
},

resource.TestStep{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}
9 changes: 4 additions & 5 deletions builtin/providers/rancher/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package rancher
import (
"github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/terraform"
// "github.com/rancher/go-rancher/client"
)

// Provider returns a terraform.ResourceProvider.
Expand All @@ -18,14 +17,14 @@ func Provider() terraform.ResourceProvider {
},
"access_key": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("RANCHER_ACCESS_KEY", nil),
Optional: true,
DefaultFunc: schema.EnvDefaultFunc("RANCHER_ACCESS_KEY", ""),
Description: descriptions["access_key"],
},
"secret_key": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("RANCHER_SECRET_KEY", nil),
Optional: true,
DefaultFunc: schema.EnvDefaultFunc("RANCHER_SECRET_KEY", ""),
Description: descriptions["secret_key"],
},
},
Expand Down
8 changes: 0 additions & 8 deletions builtin/providers/rancher/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,4 @@ func testAccPreCheck(t *testing.T) {
if v := os.Getenv("RANCHER_URL"); v == "" {
t.Fatal("RANCHER_URL must be set for acceptance tests")
}

if v := os.Getenv("RANCHER_ACCESS_KEY"); v == "" {
t.Fatal("RANCHER_ACCESS_KEY must be set for acceptance tests")
}

if v := os.Getenv("RANCHER_SECRET_KEY"); v == "" {
t.Fatal("RANCHER_SECRET_KEY must be set for acceptance tests")
}
}
20 changes: 17 additions & 3 deletions builtin/providers/rancher/resource_rancher_environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (

"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema"
rancher "github.com/rancher/go-rancher/client"
rancherClient "github.com/rancher/go-rancher/client"
)

func resourceRancherEnvironment() *schema.Resource {
Expand Down Expand Up @@ -58,11 +58,25 @@ func resourceRancherEnvironmentCreate(d *schema.ResourceData, meta interface{})

setOrchestrationFields(orchestration, data)

var newEnv rancher.Project
var newEnv rancherClient.Project
if err := client.Create("project", data, &newEnv); err != nil {
return err
}

stateConf := &resource.StateChangeConf{
Pending: []string{"active", "removed", "removing"},
Target: []string{"active"},
Refresh: EnvironmentStateRefreshFunc(client, newEnv.Id),
Timeout: 10 * time.Minute,
Delay: 1 * time.Second,
MinTimeout: 3 * time.Second,
}
_, waitErr := stateConf.WaitForState()
if waitErr != nil {
return fmt.Errorf(
"Error waiting for environment (%s) to be created: %s", newEnv.Id, waitErr)
}

d.SetId(newEnv.Id)
log.Printf("[INFO] Environment ID: %s", d.Id())

Expand Down Expand Up @@ -101,7 +115,7 @@ func resourceRancherEnvironmentUpdate(d *schema.ResourceData, meta interface{})

setOrchestrationFields(orchestration, data)

var newEnv rancher.Project
var newEnv rancherClient.Project
env, err := client.Project.ById(d.Id())
if err != nil {
return err
Expand Down
33 changes: 9 additions & 24 deletions builtin/providers/rancher/resource_rancher_environment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import (

"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
rancher "github.com/rancher/go-rancher/client"
rancherClient "github.com/rancher/go-rancher/client"
)

func TestAccRancherEnvironment(t *testing.T) {
var environment rancher.Project
var environment rancherClient.Project

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Expand All @@ -21,21 +21,25 @@ func TestAccRancherEnvironment(t *testing.T) {
Config: testAccRancherEnvironmentConfig,
Check: resource.ComposeTestCheckFunc(
testAccCheckRancherEnvironmentExists("rancher_environment.foo", &environment),
testAccCheckRancherEnvironmentAttributes(&environment, "foo", "Terraform acc test group", "cattle"),
resource.TestCheckResourceAttr("rancher_environment.foo", "name", "foo"),
resource.TestCheckResourceAttr("rancher_environment.foo", "description", "Terraform acc test group"),
resource.TestCheckResourceAttr("rancher_environment.foo", "orchestration", "cattle"),
),
},
resource.TestStep{
Config: testAccRancherEnvironmentUpdateConfig,
Check: resource.ComposeTestCheckFunc(
testAccCheckRancherEnvironmentExists("rancher_environment.foo", &environment),
testAccCheckRancherEnvironmentAttributes(&environment, "foo2", "Terraform acc test group - updated", "swarm"),
resource.TestCheckResourceAttr("rancher_environment.foo", "name", "foo2"),
resource.TestCheckResourceAttr("rancher_environment.foo", "description", "Terraform acc test group - updated"),
resource.TestCheckResourceAttr("rancher_environment.foo", "orchestration", "swarm"),
),
},
},
})
}

func testAccCheckRancherEnvironmentExists(n string, env *rancher.Project) resource.TestCheckFunc {
func testAccCheckRancherEnvironmentExists(n string, env *rancherClient.Project) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]

Expand Down Expand Up @@ -64,25 +68,6 @@ func testAccCheckRancherEnvironmentExists(n string, env *rancher.Project) resour
}
}

func testAccCheckRancherEnvironmentAttributes(env *rancher.Project, envName string, envDesc string, envOrchestration string) resource.TestCheckFunc {
return func(s *terraform.State) error {
if env.Name != envName {
return fmt.Errorf("Bad name: %s shoud be: %s", env.Name, envName)
}

if env.Description != envDesc {
return fmt.Errorf("Bad description: %s shoud be: %s", env.Description, envDesc)
}

orchestration := GetActiveOrchestration(env)
if orchestration != envOrchestration {
return fmt.Errorf("Bad orchestraion: %s shoud be: %s", orchestration, envOrchestration)
}

return nil
}
}

func testAccCheckRancherEnvironmentDestroy(s *terraform.State) error {
client := testAccProvider.Meta().(*Config)

Expand Down
Loading

0 comments on commit 12958f3

Please sign in to comment.