From 627380022d1c21bea3ceb3ba4ecf8a2266642a6d Mon Sep 17 00:00:00 2001 From: Jim Carrothers Date: Fri, 23 Mar 2018 14:20:53 -0700 Subject: [PATCH] add data provider cf_service_instance --- cloudfoundry/cfapi/service_manager.go | 3 +- .../data_source_cf_service_instance.go | 81 +++++++++++++++++++ .../import_cf_service_instance_test.go | 2 +- cloudfoundry/provider.go | 21 ++--- .../resource_cf_service_instance_test.go | 2 +- .../resource_cf_user_provided_service_test.go | 2 +- 6 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 cloudfoundry/data_source_cf_service_instance.go diff --git a/cloudfoundry/cfapi/service_manager.go b/cloudfoundry/cfapi/service_manager.go index 110622cf4..e09654611 100644 --- a/cloudfoundry/cfapi/service_manager.go +++ b/cloudfoundry/cfapi/service_manager.go @@ -473,7 +473,7 @@ func (sm *ServiceManager) ReadServiceInstance(serviceInstanceID string) (service } // FindServiceInstance - -func (sm *ServiceManager) FindServiceInstance(name string, spaceID string) (serviceInstance CCServiceInstance, err error) { +func (sm *ServiceManager) FindServiceInstance(name string, spaceID string) (guid string, serviceInstance CCServiceInstance, err error) { path := fmt.Sprintf("/v2/spaces/%s/service_instances?return_user_provided_service_instances=true&q=%s&inline-relations-depth=1", spaceID, url.QueryEscape("name:"+name)) @@ -487,6 +487,7 @@ func (sm *ServiceManager) FindServiceInstance(name string, spaceID string) (serv func(resource interface{}) bool { if sp, ok := resource.(CCServiceInstanceResource); ok { serviceInstance = sp.Entity // there should 1 or 0 instances in the space with that name + guid = sp.Metadata.GUID found = true return false } diff --git a/cloudfoundry/data_source_cf_service_instance.go b/cloudfoundry/data_source_cf_service_instance.go new file mode 100644 index 000000000..c863f49de --- /dev/null +++ b/cloudfoundry/data_source_cf_service_instance.go @@ -0,0 +1,81 @@ +package cloudfoundry + +import ( + "fmt" + + "github.com/satori/go.uuid" + + "github.com/hashicorp/terraform/helper/schema" + "github.com/terraform-providers/terraform-provider-cf/cloudfoundry/cfapi" +) + +func dataSourceServiceInstance() *schema.Resource { + + return &schema.Resource{ + + Read: dataSourceServiceInstanceRead, + + Schema: map[string]*schema.Schema{ + + "name_or_id": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + "space": &schema.Schema{ + Type: schema.TypeString, + Required: true, + }, + "name": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + }, + "service_plan_id": &schema.Schema{ + Type: schema.TypeString, + Computed: true, + }, + "tags": &schema.Schema{ + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + } +} + +func dataSourceServiceInstanceRead(d *schema.ResourceData, meta interface{}) (err error) { + + session := meta.(*cfapi.Session) + if session == nil { + return fmt.Errorf("client is nil") + } + + sm := session.ServiceManager() + + var ( + name_or_id string + space string + guid string + serviceInstance cfapi.CCServiceInstance + ) + + name_or_id = d.Get("name_or_id").(string) + space = d.Get("space").(string) + + isUUID := uuid.FromStringOrNil(name_or_id) + if &isUUID == nil || uuid.Equal(isUUID, uuid.Nil) { + guid, serviceInstance, err = sm.FindServiceInstance(name_or_id, space) + } else { + guid = name_or_id + serviceInstance, err = sm.ReadServiceInstance(name_or_id) + } + if err != nil { + return err + } + + d.SetId(guid) + d.Set("name", serviceInstance.Name) + d.Set("service_plan_id", serviceInstance.ServicePlanGUID) + d.Set("tags", serviceInstance.Tags) + + return +} diff --git a/cloudfoundry/import_cf_service_instance_test.go b/cloudfoundry/import_cf_service_instance_test.go index 205716be4..346a0a30a 100644 --- a/cloudfoundry/import_cf_service_instance_test.go +++ b/cloudfoundry/import_cf_service_instance_test.go @@ -50,7 +50,7 @@ func testAccCheckServiceInstanceDestroyedImportState(names []string, serviceInst session.Log.DebugMessage("checking ServiceInstance is Destroyed %s", n) - if _, err := session.ServiceManager().FindServiceInstance(n, spaceId); err != nil { + if _, _, err := session.ServiceManager().FindServiceInstance(n, spaceId); err != nil { switch err.(type) { case *errors.ModelNotFoundError: return nil diff --git a/cloudfoundry/provider.go b/cloudfoundry/provider.go index f7c1c5930..83217ca29 100644 --- a/cloudfoundry/provider.go +++ b/cloudfoundry/provider.go @@ -48,16 +48,17 @@ func Provider() terraform.ResourceProvider { }, DataSourcesMap: map[string]*schema.Resource{ - "cf_info": dataSourceInfo(), - "cf_stack": dataSourceStack(), - "cf_router_group": dataSourceRouterGroup(), - "cf_user": dataSourceUser(), - "cf_domain": dataSourceDomain(), - "cf_asg": dataSourceAsg(), - "cf_quota": dataSourceQuota(), - "cf_org": dataSourceOrg(), - "cf_space": dataSourceSpace(), - "cf_service": dataSourceService(), + "cf_info": dataSourceInfo(), + "cf_stack": dataSourceStack(), + "cf_router_group": dataSourceRouterGroup(), + "cf_user": dataSourceUser(), + "cf_domain": dataSourceDomain(), + "cf_asg": dataSourceAsg(), + "cf_quota": dataSourceQuota(), + "cf_org": dataSourceOrg(), + "cf_space": dataSourceSpace(), + "cf_service": dataSourceService(), + "cf_service_instance": dataSourceServiceInstance(), }, ResourcesMap: map[string]*schema.Resource{ diff --git a/cloudfoundry/resource_cf_service_instance_test.go b/cloudfoundry/resource_cf_service_instance_test.go index 754495a8c..13f1fef19 100644 --- a/cloudfoundry/resource_cf_service_instance_test.go +++ b/cloudfoundry/resource_cf_service_instance_test.go @@ -147,7 +147,7 @@ func testAccCheckServiceInstanceDestroyed(names []string, spaceResource string) session.Log.DebugMessage("checking ServiceInstance is Destroyed %s", n) - if _, err := session.ServiceManager().FindServiceInstance(n, rs.Primary.ID); err != nil { + if _, _, err := session.ServiceManager().FindServiceInstance(n, rs.Primary.ID); err != nil { switch err.(type) { case *errors.ModelNotFoundError: return nil diff --git a/cloudfoundry/resource_cf_user_provided_service_test.go b/cloudfoundry/resource_cf_user_provided_service_test.go index e7a1e0db8..bda332b0f 100644 --- a/cloudfoundry/resource_cf_user_provided_service_test.go +++ b/cloudfoundry/resource_cf_user_provided_service_test.go @@ -243,7 +243,7 @@ func testAccCheckUserProvidedServiceDestroyed(name string, spaceResource string) session.Log.DebugMessage("checking User Provided Service is Destroyed %s", name) - if _, err := session.ServiceManager().FindServiceInstance(name, rs.Primary.ID); err != nil { + if _, _, err := session.ServiceManager().FindServiceInstance(name, rs.Primary.ID); err != nil { switch err.(type) { case *errors.ModelNotFoundError: return nil