Skip to content

Commit 78efc97

Browse files
antontroshinJoshVanLyaron2cicoyle
authored
Merge release 1.15 to main (#3790)
Signed-off-by: Anton Troshin <[email protected]> Signed-off-by: joshvanl <[email protected]> Signed-off-by: yaron2 <[email protected]> Signed-off-by: Cassandra Coyle <[email protected]> Co-authored-by: Josh van Leeuwen <[email protected]> Co-authored-by: Yaron Schneider <[email protected]> Co-authored-by: Cassie Coyle <[email protected]>
1 parent 456330f commit 78efc97

File tree

6 files changed

+161
-27
lines changed

6 files changed

+161
-27
lines changed

bindings/gcp/bucket/bucket.go

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,7 @@ func (g *GCPStorage) Init(ctx context.Context, metadata bindings.Metadata) error
110110
return err
111111
}
112112

113-
b, err := json.Marshal(m)
114-
if err != nil {
115-
return err
116-
}
117-
118-
clientOptions := option.WithCredentialsJSON(b)
119-
client, err := storage.NewClient(ctx, clientOptions)
113+
client, err := g.getClient(ctx, m)
120114
if err != nil {
121115
return err
122116
}
@@ -127,6 +121,41 @@ func (g *GCPStorage) Init(ctx context.Context, metadata bindings.Metadata) error
127121
return nil
128122
}
129123

124+
func (g *GCPStorage) getClient(ctx context.Context, m *gcpMetadata) (*storage.Client, error) {
125+
var client *storage.Client
126+
var err error
127+
128+
if m.Bucket == "" {
129+
return nil, errors.New("missing property `bucket` in metadata")
130+
}
131+
if m.ProjectID == "" {
132+
return nil, errors.New("missing property `project_id` in metadata")
133+
}
134+
135+
// Explicit authentication
136+
if m.PrivateKeyID != "" {
137+
var b []byte
138+
b, err = json.Marshal(m)
139+
if err != nil {
140+
return nil, err
141+
}
142+
143+
clientOptions := option.WithCredentialsJSON(b)
144+
client, err = storage.NewClient(ctx, clientOptions)
145+
if err != nil {
146+
return nil, err
147+
}
148+
} else {
149+
// Implicit authentication, using GCP Application Default Credentials (ADC)
150+
// Credentials search order: https://cloud.google.com/docs/authentication/application-default-credentials#order
151+
client, err = storage.NewClient(ctx)
152+
if err != nil {
153+
return nil, err
154+
}
155+
}
156+
return client, nil
157+
}
158+
130159
func (g *GCPStorage) parseMetadata(meta bindings.Metadata) (*gcpMetadata, error) {
131160
m := gcpMetadata{}
132161
err := kitmd.DecodeMetadata(meta.Properties, &m)

bindings/gcp/bucket/bucket_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ package bucket
1515

1616
import (
1717
"encoding/json"
18+
"errors"
1819
"testing"
1920

2021
"github.com/stretchr/testify/assert"
@@ -234,6 +235,30 @@ func TestMergeWithRequestMetadata(t *testing.T) {
234235
})
235236
}
236237

238+
func TestInit(t *testing.T) {
239+
t.Run("Init missing bucket from metadata", func(t *testing.T) {
240+
m := bindings.Metadata{}
241+
m.Properties = map[string]string{
242+
"projectID": "my_project_id",
243+
}
244+
gs := GCPStorage{logger: logger.NewLogger("test")}
245+
err := gs.Init(t.Context(), m)
246+
require.Error(t, err)
247+
assert.Equal(t, err, errors.New("missing property `bucket` in metadata"))
248+
})
249+
250+
t.Run("Init missing projectID from metadata", func(t *testing.T) {
251+
m := bindings.Metadata{}
252+
m.Properties = map[string]string{
253+
"bucket": "my_bucket",
254+
}
255+
gs := GCPStorage{logger: logger.NewLogger("test")}
256+
err := gs.Init(t.Context(), m)
257+
require.Error(t, err)
258+
assert.Equal(t, err, errors.New("missing property `project_id` in metadata"))
259+
})
260+
}
261+
237262
func TestGetOption(t *testing.T) {
238263
gs := GCPStorage{logger: logger.NewLogger("test")}
239264
gs.metadata = &gcpMetadata{}

secretstores/gcp/secretmanager/secretmanager.go

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,38 @@ func (s *Store) Init(ctx context.Context, metadataRaw secretstores.Metadata) err
8888
}
8989

9090
func (s *Store) getClient(ctx context.Context, metadata *GcpSecretManagerMetadata) (*secretmanager.Client, error) {
91-
b, _ := json.Marshal(metadata)
92-
clientOptions := option.WithCredentialsJSON(b)
91+
var client *secretmanager.Client
92+
var err error
9393

94-
client, err := secretmanager.NewClient(ctx, clientOptions)
95-
if err != nil {
96-
return nil, err
94+
if metadata.ProjectID == "" {
95+
return nil, errors.New("missing property `project_id` in metadata")
96+
}
97+
98+
// Explicit authentication
99+
if metadata.PrivateKeyID != "" {
100+
if metadata.Type == "" {
101+
return nil, errors.New("missing property `type` in metadata")
102+
}
103+
if metadata.PrivateKey == "" {
104+
return nil, errors.New("missing property `private_key` in metadata")
105+
}
106+
if metadata.ClientEmail == "" {
107+
return nil, errors.New("missing property `client_email` in metadata")
108+
}
109+
110+
b, _ := json.Marshal(metadata)
111+
clientOptions := option.WithCredentialsJSON(b)
112+
client, err = secretmanager.NewClient(ctx, clientOptions)
113+
if err != nil {
114+
return nil, err
115+
}
116+
} else {
117+
// Implicit authentication, using GCP Application Default Credentials (ADC)
118+
// Credentials search order: https://cloud.google.com/docs/authentication/application-default-credentials#order
119+
client, err = secretmanager.NewClient(ctx)
120+
if err != nil {
121+
return nil, err
122+
}
97123
}
98124

99125
return client, nil
@@ -183,18 +209,9 @@ func (s *Store) parseSecretManagerMetadata(metadataRaw secretstores.Metadata) (*
183209
return nil, fmt.Errorf("failed to decode metadata: %w", err)
184210
}
185211

186-
if meta.Type == "" {
187-
return nil, errors.New("missing property `type` in metadata")
188-
}
189212
if meta.ProjectID == "" {
190213
return nil, errors.New("missing property `project_id` in metadata")
191214
}
192-
if meta.PrivateKey == "" {
193-
return nil, errors.New("missing property `private_key` in metadata")
194-
}
195-
if meta.ClientEmail == "" {
196-
return nil, errors.New("missing property `client_email` in metadata")
197-
}
198215

199216
return &meta, nil
200217
}

secretstores/gcp/secretmanager/secretmanager_test.go

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,47 @@ func TestInit(t *testing.T) {
7676

7777
t.Run("Init with missing `type` metadata", func(t *testing.T) {
7878
m.Properties = map[string]string{
79-
"dummy": "a",
79+
"dummy": "a",
80+
"private_key_id": "a",
81+
"project_id": "a",
8082
}
8183
err := sm.Init(ctx, m)
8284
require.Error(t, err)
83-
assert.Equal(t, err, errors.New("missing property `type` in metadata"))
85+
assert.Equal(t, errors.New("failed to setup secretmanager client: missing property `type` in metadata"), err)
86+
})
87+
88+
t.Run("Init with missing `private_key` metadata", func(t *testing.T) {
89+
m.Properties = map[string]string{
90+
"dummy": "a",
91+
"private_key_id": "a",
92+
"type": "a",
93+
"project_id": "a",
94+
}
95+
err := sm.Init(ctx, m)
96+
require.Error(t, err)
97+
assert.Equal(t, errors.New("failed to setup secretmanager client: missing property `private_key` in metadata"), err)
98+
})
99+
100+
t.Run("Init with missing `client_email` metadata", func(t *testing.T) {
101+
m.Properties = map[string]string{
102+
"dummy": "a",
103+
"private_key_id": "a",
104+
"private_key": "a",
105+
"type": "a",
106+
"project_id": "a",
107+
}
108+
err := sm.Init(ctx, m)
109+
require.Error(t, err)
110+
assert.Equal(t, errors.New("failed to setup secretmanager client: missing property `client_email` in metadata"), err)
111+
})
112+
113+
t.Run("Init with missing `project_id` metadata", func(t *testing.T) {
114+
m.Properties = map[string]string{
115+
"type": "service_account",
116+
}
117+
err := sm.Init(ctx, m)
118+
require.Error(t, err)
119+
assert.Equal(t, err, errors.New("missing property `project_id` in metadata"))
84120
})
85121

86122
t.Run("Init with missing `project_id` metadata", func(t *testing.T) {
@@ -91,6 +127,13 @@ func TestInit(t *testing.T) {
91127
require.Error(t, err)
92128
assert.Equal(t, err, errors.New("missing property `project_id` in metadata"))
93129
})
130+
131+
t.Run("Init with empty metadata", func(t *testing.T) {
132+
m.Properties = map[string]string{}
133+
err := sm.Init(ctx, m)
134+
require.Error(t, err)
135+
assert.Equal(t, err, errors.New("missing property `project_id` in metadata"))
136+
})
94137
}
95138

96139
func TestGetSecret(t *testing.T) {

state/alicloud/tablestore/mock_client.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package tablestore
1616
import (
1717
"bytes"
1818
"encoding/binary"
19+
"sync"
1920

2021
"github.com/aliyun/aliyun-tablestore-go-sdk/tablestore"
2122
)
@@ -24,6 +25,7 @@ type mockClient struct {
2425
tablestore.TableStoreClient
2526

2627
data map[string][]byte
28+
mu sync.RWMutex
2729
}
2830

2931
func (m *mockClient) DeleteRow(request *tablestore.DeleteRowRequest) (*tablestore.DeleteRowResponse, error) {
@@ -36,7 +38,9 @@ func (m *mockClient) DeleteRow(request *tablestore.DeleteRowRequest) (*tablestor
3638
}
3739
}
3840

41+
m.mu.Lock()
3942
delete(m.data, key)
43+
m.mu.Unlock()
4044

4145
return nil, nil
4246
}
@@ -51,7 +55,9 @@ func (m *mockClient) GetRow(request *tablestore.GetRowRequest) (*tablestore.GetR
5155
}
5256
}
5357

58+
m.mu.RLock()
5459
val := m.data[key]
60+
m.mu.RUnlock()
5561

5662
resp := &tablestore.GetRowResponse{
5763
Columns: []*tablestore.AttributeColumn{{
@@ -87,7 +93,9 @@ func (m *mockClient) UpdateRow(req *tablestore.UpdateRowRequest) (*tablestore.Up
8793
}
8894
}
8995

96+
m.mu.Lock()
9097
m.data[key] = val
98+
m.mu.Unlock()
9199

92100
return nil, nil
93101
}
@@ -97,6 +105,7 @@ func (m *mockClient) BatchGetRow(request *tablestore.BatchGetRowRequest) (*table
97105
TableToRowsResult: map[string][]tablestore.RowResult{},
98106
}
99107

108+
m.mu.RLock()
100109
for _, criteria := range request.MultiRowQueryCriteria {
101110
tableRes := resp.TableToRowsResult[criteria.TableName]
102111
if tableRes == nil {
@@ -136,12 +145,14 @@ func (m *mockClient) BatchGetRow(request *tablestore.BatchGetRowRequest) (*table
136145
}
137146
}
138147
}
148+
m.mu.RUnlock()
139149

140150
return resp, nil
141151
}
142152

143153
func (m *mockClient) BatchWriteRow(request *tablestore.BatchWriteRowRequest) (*tablestore.BatchWriteRowResponse, error) {
144154
resp := &tablestore.BatchWriteRowResponse{}
155+
m.mu.Lock()
145156
for _, changes := range request.RowChangesGroupByTable {
146157
for _, change := range changes {
147158
switch inst := change.(type) {
@@ -174,6 +185,7 @@ func (m *mockClient) BatchWriteRow(request *tablestore.BatchWriteRowRequest) (*t
174185
}
175186
}
176187
}
188+
m.mu.Unlock()
177189

178190
return resp, nil
179191
}

state/oracledatabase/oracledatabaseaccess.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,16 @@ func (o *oracleDatabaseAccess) ensureStateTable(stateTableName string) error {
514514
}
515515

516516
func tableExists(db *sql.DB, tableName string) (bool, error) {
517-
var tblCount int32
518-
err := db.QueryRow("SELECT count(table_name) tbl_count FROM user_tables WHERE table_name = upper(:tablename)", tableName).Scan(&tblCount)
519-
exists := tblCount > 0
520-
return exists, err
517+
//nolint:gosec
518+
query := fmt.Sprintf("SELECT 1 FROM %s WHERE ROWNUM = 1", tableName)
519+
520+
var dummy int
521+
err := db.QueryRow(query).Scan(&dummy)
522+
if err != nil {
523+
if errors.Is(err, sql.ErrNoRows) {
524+
return true, nil // Table exists but is empty
525+
}
526+
return false, nil // Likely a table does not exist error
527+
}
528+
return true, nil
521529
}

0 commit comments

Comments
 (0)