Skip to content

Commit

Permalink
INTMDB-242: Fixes the bug when if you don set public/private key it w…
Browse files Browse the repository at this point in the history
…ould fail for getting realm client (#519)

* validate to see if its not empty public and private key before the work for realm client in config

* refactor: refactorized to another function to get the realm client

* fixes linter

* fixes linter

* refactor: made changes suggested by tony

* fixes linter

Co-authored-by: Edgar Lopez <edgarlopez@pop-os.localdomain>
  • Loading branch information
coderGo93 and Edgar Lopez committed Aug 20, 2021
1 parent 3ac8f0a commit 870d61e
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 34 deletions.
44 changes: 27 additions & 17 deletions mongodbatlas/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@ package mongodbatlas

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/logging"
"github.com/mongodb/terraform-provider-mongodbatlas/version"
"github.com/spf13/cast"
realmAuth "go.mongodb.org/realm/auth"

"github.com/mongodb-forks/digest"
matlasClient "go.mongodb.org/atlas/mongodbatlas"
realmAuth "go.mongodb.org/realm/auth"
"go.mongodb.org/realm/realm"
)

Expand All @@ -22,14 +24,14 @@ type Config struct {

// MongoDBClient client
type MongoDBClient struct {
Atlas *matlasClient.Client
Realm *realm.Client
Atlas *matlasClient.Client
Config *Config
}

// NewClient func...
func (c *Config) NewClient(ctx context.Context) (interface{}, diag.Diagnostics) {
// setup a transport to handle digest
transport := digest.NewTransport(c.PublicKey, c.PrivateKey)
transport := digest.NewTransport(cast.ToString(c.PublicKey), cast.ToString(c.PrivateKey))

// initialize the client
client, err := transport.Client()
Expand All @@ -40,7 +42,7 @@ func (c *Config) NewClient(ctx context.Context) (interface{}, diag.Diagnostics)
client.Transport = logging.NewTransport("MongoDB Atlas", transport)

optsAtlas := []matlasClient.ClientOpt{matlasClient.SetUserAgent("terraform-provider-mongodbatlas/" + version.ProviderVersion)}
if c.BaseURL != "" {
if len(c.BaseURL) > 0 {
optsAtlas = append(optsAtlas, matlasClient.SetBaseURL(c.BaseURL))
}

Expand All @@ -50,15 +52,28 @@ func (c *Config) NewClient(ctx context.Context) (interface{}, diag.Diagnostics)
return nil, diag.FromErr(err)
}

clients := &MongoDBClient{
Atlas: atlasClient,
Config: c,
}

return clients, nil
}

func (c *MongoDBClient) GetRealmClient(ctx context.Context) (*realm.Client, error) {
// Realm
if c.Config.PublicKey == "" && c.Config.PrivateKey == "" {
return nil, fmt.Errorf("please set `public_key` and `private_key` in order to use the realm client")
}

optsRealm := []realm.ClientOpt{realm.SetUserAgent("terraform-provider-mongodbatlas/" + version.ProviderVersion)}
if c.BaseURL != "" {
optsRealm = append(optsRealm, realm.SetBaseURL(c.BaseURL))
if len(c.Config.BaseURL) > 0 {
optsRealm = append(optsRealm, realm.SetBaseURL(c.Config.BaseURL))
}
authConfig := realmAuth.NewConfig(client)
token, err := authConfig.NewTokenFromCredentials(ctx, c.PublicKey, c.PrivateKey)
authConfig := realmAuth.NewConfig(nil)
token, err := authConfig.NewTokenFromCredentials(ctx, c.Config.PublicKey, c.Config.PrivateKey)
if err != nil {
return nil, diag.FromErr(err)
return nil, err
}

clientRealm := realmAuth.NewClient(realmAuth.BasicTokenSource(token))
Expand All @@ -67,13 +82,8 @@ func (c *Config) NewClient(ctx context.Context) (interface{}, diag.Diagnostics)
// Initialize the MongoDB Realm API Client.
realmClient, err := realm.New(clientRealm, optsRealm...)
if err != nil {
return nil, diag.FromErr(err)
return nil, err
}

clients := &MongoDBClient{
Atlas: atlasClient,
Realm: realmClient,
}

return clients, nil
return realmClient, nil
}
5 changes: 4 additions & 1 deletion mongodbatlas/data_source_mongodbatlas_event_trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,10 @@ func dataSourceMongoDBAtlasEventTrigger() *schema.Resource {
}

func dataSourceMongoDBAtlasEventTriggerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*MongoDBClient).Realm
conn, err := meta.(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return diag.FromErr(err)
}
projectID := d.Get("project_id").(string)
appID := d.Get("app_id").(string)
triggerID := getEncodedID(d.Get("trigger_id").(string), "trigger_id")
Expand Down
8 changes: 6 additions & 2 deletions mongodbatlas/data_source_mongodbatlas_event_triggers.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,16 @@ func dataSourceMongoDBAtlasEventTriggers() *schema.Resource {

func dataSourceMongoDBAtlasEventTriggersRead(d *schema.ResourceData, meta interface{}) error {
// Get client connection.
conn := meta.(*MongoDBClient).Realm
ctx := context.Background()
conn, err := meta.(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return err
}

projectID := d.Get("project_id").(string)
appID := d.Get("app_id").(string)

eventTriggers, _, err := conn.EventTriggers.List(context.Background(), projectID, appID)
eventTriggers, _, err := conn.EventTriggers.List(ctx, projectID, appID)
if err != nil {
return fmt.Errorf("error getting event triggers information: %s", err)
}
Expand Down
2 changes: 1 addition & 1 deletion mongodbatlas/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ func providerConfigure(ctx context.Context, d *schema.ResourceData) (interface{}
PrivateKey: d.Get("private_key").(string),
}

if baseURL := d.Get("base_url"); baseURL != nil {
if baseURL, ok := d.GetOk("base_url"); ok {
config.BaseURL = baseURL.(string)
}

Expand Down
32 changes: 23 additions & 9 deletions mongodbatlas/resource_mongodbatlas_event_trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,10 @@ func resourceMongoDBAtlasEventTriggers() *schema.Resource {
}

func resourceMongoDBAtlasEventTriggersCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*MongoDBClient).Realm

conn, err := meta.(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return diag.FromErr(err)
}
projectID := d.Get("project_id").(string)
appID := d.Get("app_id").(string)
typeTrigger := d.Get("type").(string)
Expand Down Expand Up @@ -294,7 +296,10 @@ func resourceMongoDBAtlasEventTriggersCreate(ctx context.Context, d *schema.Reso
}

func resourceMongoDBAtlasEventTriggersRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*MongoDBClient).Realm
conn, err := meta.(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return diag.FromErr(err)
}

ids := decodeStateID(d.Id())
projectID := ids["project_id"]
Expand Down Expand Up @@ -377,7 +382,10 @@ func resourceMongoDBAtlasEventTriggersRead(ctx context.Context, d *schema.Resour

func resourceMongoDBAtlasEventTriggersUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
// Get the client connection.
conn := meta.(*MongoDBClient).Realm
conn, err := meta.(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return diag.FromErr(err)
}

ids := decodeStateID(d.Id())
projectID := ids["project_id"]
Expand Down Expand Up @@ -416,7 +424,7 @@ func resourceMongoDBAtlasEventTriggersUpdate(ctx context.Context, d *schema.Reso

eventReq.Config = eventTriggerConfig

_, _, err := conn.EventTriggers.Update(ctx, projectID, appID, triggerID, eventReq)
_, _, err = conn.EventTriggers.Update(ctx, projectID, appID, triggerID, eventReq)
if err != nil {
return diag.FromErr(fmt.Errorf(errorEventTriggersUpdate, projectID, appID, err))
}
Expand All @@ -426,14 +434,17 @@ func resourceMongoDBAtlasEventTriggersUpdate(ctx context.Context, d *schema.Reso

func resourceMongoDBAtlasEventTriggersDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
// Get the client connection.
conn := meta.(*MongoDBClient).Realm
conn, err := meta.(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return diag.FromErr(err)
}
ids := decodeStateID(d.Id())

projectID := ids["project_id"]
appID := ids["app_id"]
triggerID := ids["trigger_id"]

_, err := conn.EventTriggers.Delete(ctx, projectID, appID, triggerID)
_, err = conn.EventTriggers.Delete(ctx, projectID, appID, triggerID)
if err != nil {
return diag.FromErr(fmt.Errorf(errorEventTriggersDelete, projectID, appID, err))
}
Expand Down Expand Up @@ -485,7 +496,10 @@ func flattenTriggerEventProcessorAWSEventBridge(eventProcessor map[string]interf
}

func resourceMongoDBAtlasEventTriggerImportState(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
conn := meta.(*MongoDBClient).Realm
conn, err := meta.(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return nil, err
}

parts := strings.Split(d.Id(), "--")
if len(parts) != 3 {
Expand All @@ -496,7 +510,7 @@ func resourceMongoDBAtlasEventTriggerImportState(ctx context.Context, d *schema.
appID := parts[1]
triggerID := parts[2]

_, _, err := conn.EventTriggers.Get(ctx, projectID, appID, triggerID)
_, _, err = conn.EventTriggers.Get(ctx, projectID, appID, triggerID)
if err != nil {
return nil, fmt.Errorf("couldn't import event trigger %s in project %s, error: %s", triggerID, projectID, err)
}
Expand Down
16 changes: 12 additions & 4 deletions mongodbatlas/resource_mongodbatlas_event_trigger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,11 @@ func TestAccResourceMongoDBAtlasEventTriggerSchedule_eventProcessor(t *testing.T

func testAccCheckMongoDBAtlasEventTriggerExists(resourceName string, eventTrigger *realm.EventTrigger) resource.TestCheckFunc {
return func(s *terraform.State) error {
conn := testAccProvider.Meta().(*MongoDBClient).Realm
ctx := context.Background()
conn, err := testAccProvider.Meta().(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return err
}

rs, ok := s.RootModule().Resources[resourceName]
if !ok {
Expand All @@ -395,7 +399,7 @@ func testAccCheckMongoDBAtlasEventTriggerExists(resourceName string, eventTrigge

log.Printf("[DEBUG] trigger_id ID: %s", ids["trigger_id"])

res, _, err := conn.EventTriggers.Get(context.Background(), ids["project_id"], ids["app_id"], ids["trigger_id"])
res, _, err := conn.EventTriggers.Get(ctx, ids["project_id"], ids["app_id"], ids["trigger_id"])
if err == nil {
*eventTrigger = *res
return nil
Expand All @@ -406,7 +410,11 @@ func testAccCheckMongoDBAtlasEventTriggerExists(resourceName string, eventTrigge
}

func testAccCheckMongoDBAtlasEventTriggerDestroy(s *terraform.State) error {
conn := testAccProvider.Meta().(*MongoDBClient).Realm
ctx := context.Background()
conn, err := testAccProvider.Meta().(*MongoDBClient).GetRealmClient(ctx)
if err != nil {
return err
}

for _, rs := range s.RootModule().Resources {
if rs.Type != "mongodbatlas_event_trigger" {
Expand All @@ -415,7 +423,7 @@ func testAccCheckMongoDBAtlasEventTriggerDestroy(s *terraform.State) error {

ids := decodeStateID(rs.Primary.ID)

res, _, _ := conn.EventTriggers.Get(context.Background(), ids["project_id"], ids["app_id"], ids["trigger_id"])
res, _, _ := conn.EventTriggers.Get(ctx, ids["project_id"], ids["app_id"], ids["trigger_id"])

if res != nil {
return fmt.Errorf("event trigger (%s) still exists", ids["trigger_id"])
Expand Down

0 comments on commit 870d61e

Please sign in to comment.