Skip to content

Commit

Permalink
implemented service_key [Finished #138564873]
Browse files Browse the repository at this point in the history
  • Loading branch information
mevansam committed Oct 11, 2017
1 parent 733d423 commit fbd643b
Show file tree
Hide file tree
Showing 5 changed files with 337 additions and 13 deletions.
94 changes: 93 additions & 1 deletion cloudfoundry/cfapi/service_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,21 @@ type CCUserProvidedServiceUpdateRequest struct {
Credentials map[string]interface{} `json:"credentials,omitempty"`
}

// CCServiceKey -
type CCServiceKey struct {
ID string

Name string `json:"name"`
ServiceGUID string `json:"service_instance_guid"`
Credentials map[string]interface{} `json:"credentials"`
}

// CCServiceKeyResource -
type CCServiceKeyResource struct {
Metadata resources.Metadata `json:"metadata"`
Entity CCServiceKey `json:"entity"`
}

// NewServiceManager -
func newServiceManager(config coreconfig.Reader, ccGateway net.Gateway, logger *Logger) (sm *ServiceManager, err error) {

Expand Down Expand Up @@ -475,7 +490,6 @@ func (sm *ServiceManager) FindServiceInstance(name string, spaceID string) (serv
return false
}
return true

})

if apiErr != nil {
Expand Down Expand Up @@ -571,6 +585,84 @@ func (sm *ServiceManager) DeleteUserProvidedService(serviceInstanceID string) (e
return
}

// CreateServiceKey -
func (sm *ServiceManager) CreateServiceKey(name, serviceID string, params map[string]interface{}) (serviceKey CCServiceKey, err error) {

body, err := json.Marshal(map[string]interface{}{
"name": name,
"service_instance_guid": serviceID,
"parameters": params,
})
if err != nil {
return
}

resource := CCServiceKeyResource{}
if err = sm.ccGateway.CreateResource(sm.apiEndpoint,
"/v2/service_keys", bytes.NewReader(body), &resource); err != nil {
return
}
serviceKey = resource.Entity
serviceKey.ID = resource.Metadata.GUID
return
}

// ReadServiceKey -
func (sm *ServiceManager) ReadServiceKey(serviceKeyID string) (serviceKey CCServiceKey, err error) {

url := fmt.Sprintf("%s/v2/service_keys/%s", sm.apiEndpoint, serviceKeyID)

resource := CCServiceKeyResource{}
err = sm.ccGateway.GetResource(url, &resource)
if err != nil {
return
}

serviceKey = resource.Entity
serviceKey.ID = resource.Metadata.GUID
return
}

// DeleteServiceKey -
func (sm *ServiceManager) DeleteServiceKey(serviceKeyID string) (err error) {

err = sm.ccGateway.DeleteResource(sm.apiEndpoint, fmt.Sprintf("/v2/service_keys/%s", serviceKeyID))
return
}

// FindServiceKey -
func (sm *ServiceManager) FindServiceKey(name string, serviceInstanceID string) (serviceKey CCServiceKey, err error) {

path := fmt.Sprintf("/v2/service_keys?q=%s", url.QueryEscape("name:"+name))

var found bool

apiErr := sm.ccGateway.ListPaginatedResources(
sm.apiEndpoint,
path,
CCServiceKeyResource{},
func(resource interface{}) bool {
if sk, ok := resource.(CCServiceKeyResource); ok {
if sk.Entity.ServiceGUID == serviceInstanceID {
serviceKey = sk.Entity
found = true
return false
}
}
return true
})

if apiErr != nil {
err = apiErr
} else {
if !found {
err = errors.NewModelNotFoundError("ServiceKey", name)
}
}

return
}

// FindSpaceService -
func (sm *ServiceManager) FindSpaceService(label string, spaceID string) (offering models.ServiceOffering, err error) {

Expand Down
1 change: 1 addition & 0 deletions cloudfoundry/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ func Provider() terraform.ResourceProvider {
"cf_service_broker": resourceServiceBroker(),
"cf_service_access": resourceServiceAccess(),
"cf_service_instance": resourceServiceInstance(),
"cf_service_key": resourceServiceKey(),
"cf_user_provided_service": resourceUserProvidedService(),
"cf_buildpack": resourceBuildpack(),
"cf_route": resourceRoute(),
Expand Down
100 changes: 100 additions & 0 deletions cloudfoundry/resource_cf_service_key.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package cloudfoundry

import (
"fmt"

"github.com/hashicorp/terraform/helper/schema"
"github.com/terraform-providers/terraform-provider-cf/cloudfoundry/cfapi"
)

func resourceServiceKey() *schema.Resource {

return &schema.Resource{

Create: resourceServiceKeyCreate,
Read: resourceServiceKeyRead,
Delete: resourceServiceKeyDelete,

Schema: map[string]*schema.Schema{

"name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"service_instance": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"params": &schema.Schema{
Type: schema.TypeMap,
Optional: true,
ForceNew: true,
},
"credentials": &schema.Schema{
Type: schema.TypeMap,
Computed: true,
},
},
}
}

func resourceServiceKeyCreate(d *schema.ResourceData, meta interface{}) (err error) {

session := meta.(*cfapi.Session)
if session == nil {
return fmt.Errorf("client is nil")
}

name := d.Get("name").(string)
serviceInstance := d.Get("service_instance").(string)
params := d.Get("params").(map[string]interface{})

sm := session.ServiceManager()
var serviceKey cfapi.CCServiceKey

if serviceKey, err = sm.CreateServiceKey(name, serviceInstance, params); err != nil {
return
}
session.Log.DebugMessage("Created Service Key: %# v", serviceKey)

d.Set("credentials", serviceKey.Credentials)
d.SetId(serviceKey.ID)
return
}

func resourceServiceKeyRead(d *schema.ResourceData, meta interface{}) (err error) {

session := meta.(*cfapi.Session)
if session == nil {
return fmt.Errorf("client is nil")
}
session.Log.DebugMessage("Reading Service Key with ID: %s", d.Id())

sm := session.ServiceManager()
var serviceKey cfapi.CCServiceKey

serviceKey, err = sm.ReadServiceKey(d.Id())
if err != nil {
return
}
d.Set("name", serviceKey.Name)
d.Set("service_instance", serviceKey.ServiceGUID)
d.Set("credentials", serviceKey.Credentials)

session.Log.DebugMessage("Read Service Instance : %# v", serviceKey)
return
}

func resourceServiceKeyDelete(d *schema.ResourceData, meta interface{}) (err error) {

session := meta.(*cfapi.Session)
if session == nil {
return fmt.Errorf("client is nil")
}
session.Log.DebugMessage("Reading Service Key with ID: %s", d.Id())

err = session.ServiceManager().DeleteServiceKey(d.Id())
return
}
127 changes: 127 additions & 0 deletions cloudfoundry/resource_cf_service_key_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package cloudfoundry

import (
"fmt"
"testing"

"code.cloudfoundry.org/cli/cf/errors"

"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
"github.com/terraform-providers/terraform-provider-cf/cloudfoundry/cfapi"
)

const serviceKeyResource = `
data "cf_org" "org" {
name = "pcfdev-org"
}
data "cf_space" "space" {
name = "pcfdev-space"
org = "${data.cf_org.org.id}"
}
data "cf_service" "mysql" {
name = "p-mysql"
}
resource "cf_service_instance" "mysql" {
name = "mysql"
space = "${data.cf_space.space.id}"
servicePlan = "${data.cf_service.mysql.service_plans["512mb"]}"
}
resource "cf_service_key" "mysql-key" {
name = "mysql-key"
service_instance = "${cf_service_instance.mysql.id}"
params {
"key1" = "aaaa"
"key2" = "bbbb"
}
}
`

func TestAccServiceKey_normal(t *testing.T) {

ref := "cf_service_key.mysql-key"

resource.Test(t,
resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckServiceKeyDestroyed("mysql-key", "cf_service_instance.mysql"),
Steps: []resource.TestStep{

resource.TestStep{
Config: serviceKeyResource,
Check: resource.ComposeTestCheckFunc(
testAccCheckServiceKeyExists(ref),
resource.TestCheckResourceAttr(
ref, "name", "mysql-key"),
),
},
},
})
}

func testAccCheckServiceKeyExists(resource string) resource.TestCheckFunc {

return func(s *terraform.State) (err error) {

session := testAccProvider.Meta().(*cfapi.Session)

rs, ok := s.RootModule().Resources[resource]
if !ok {
return fmt.Errorf("service instance '%s' not found in terraform state", resource)
}

session.Log.DebugMessage(
"terraform state for resource '%s': %# v",
resource, rs)

id := rs.Primary.ID
attributes := rs.Primary.Attributes

var serviceKey cfapi.CCServiceKey

sm := session.ServiceManager()
if serviceKey, err = sm.ReadServiceKey(id); err != nil {
return
}
session.Log.DebugMessage(
"retrieved service instance for resource '%s' with id '%s': %# v",
resource, id, serviceKey)

if err = assertEquals(attributes, "name", serviceKey.Name); err != nil {
return err
}
err = assertMapEquals("credentials", attributes, serviceKey.Credentials)
return
}
}

func testAccCheckServiceKeyDestroyed(name, serviceInstance string) resource.TestCheckFunc {

return func(s *terraform.State) error {

session := testAccProvider.Meta().(*cfapi.Session)

rs, ok := s.RootModule().Resources[serviceInstance]
if !ok {
return fmt.Errorf("service instance '%s' not found in terraform state", spaceResource)
}

session.Log.DebugMessage("checking ServiceKey is Destroyed %s", name)

if _, err := session.ServiceManager().FindServiceKey(name, rs.Primary.ID); err != nil {
switch err.(type) {
case *errors.ModelNotFoundError:
return nil

default:
return err
}
}
return fmt.Errorf("service instance with name '%s' still exists in cloud foundry", name)
}
}
Loading

0 comments on commit fbd643b

Please sign in to comment.