-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcallPropertiesCreator.go
139 lines (119 loc) · 5.47 KB
/
callPropertiesCreator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Copyright 2024 Coralogix Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cxsdk
import (
"context"
"crypto/tls"
"fmt"
"runtime"
"time"
"github.com/google/uuid"
grpc_retry "github.com/grpc-ecosystem/go-grpc-middleware/retry"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/metadata"
)
// CallPropertiesCreator is a struct that creates CallProperties objects.
type CallPropertiesCreator struct {
coraglogixRegion string
teamsLevelAPIKey string
userLevelAPIKey string
correlationID string
sdkVersion string
//allowRetry bool
}
// CallProperties is a struct that holds the context, connection, and call options for a gRPC call.
type CallProperties struct {
Ctx context.Context
Connection *grpc.ClientConn
CallOptions []grpc.CallOption
}
// GetTeamsLevelCallProperties returns a new CallProperties object built from a team-level API key. It essentially prepares the context, connection, and call options for a gRPC call.
func (c CallPropertiesCreator) GetTeamsLevelCallProperties(ctx context.Context) (*CallProperties, error) {
ctx = createContext(ctx, c.teamsLevelAPIKey, c.correlationID, c.sdkVersion)
endpoint := CoralogixGrpcEndpointFromRegion(c.coraglogixRegion)
conn, err := createSecureConnection(endpoint)
if err != nil {
return nil, err
}
callOptions := createCallOptions()
return &CallProperties{Ctx: ctx, Connection: conn, CallOptions: callOptions}, nil
}
// GetUserLevelCallProperties returns a new CallProperties object built from a user-level API key. It essentially prepares the context, connection, and call options for a gRPC call.
func (c CallPropertiesCreator) GetUserLevelCallProperties(ctx context.Context) (*CallProperties, error) {
ctx = createContext(ctx, c.userLevelAPIKey, c.correlationID, c.sdkVersion)
endpoint := CoralogixGrpcEndpointFromRegion(c.coraglogixRegion)
conn, err := createSecureConnection(endpoint)
if err != nil {
return nil, err
}
callOptions := createCallOptions()
return &CallProperties{Ctx: ctx, Connection: conn, CallOptions: callOptions}, nil
}
func createCallOptions() []grpc.CallOption {
var callOptions []grpc.CallOption
callOptions = append(callOptions, grpc_retry.WithMax(5))
callOptions = append(callOptions, grpc_retry.WithBackoff(grpc_retry.BackoffLinear(time.Second)))
return callOptions
}
func createSecureConnection(targetURL string) (*grpc.ClientConn, error) {
// We cannot use grpc.NewClient because it doesn't work behind a proxy: https://github.com/grpc/grpc-go/releases/tag/v1.69.0
return grpc.Dial(targetURL,
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
}
func createContext(ctx context.Context, apiKey string, corrleationID string, sdkVersion string) context.Context {
md := metadata.New(map[string]string{"Authorization": fmt.Sprintf("Bearer %s", apiKey), sdkVersionHeaderName: sdkVersion, sdkLanguageHeaderName: "go", sdkGoVersionHeaderName: runtime.Version(), sdkCorrelationIDHeaderName: corrleationID})
ctx = metadata.NewOutgoingContext(ctx, md)
return ctx
}
// NewCallPropertiesCreator creates a new CallPropertiesCreator object.
func NewCallPropertiesCreator(region string, authContext AuthContext) *CallPropertiesCreator {
return &CallPropertiesCreator{
coraglogixRegion: region,
teamsLevelAPIKey: authContext.teamLevelAPIKey,
userLevelAPIKey: authContext.userLevelAPIKey,
correlationID: uuid.New().String(),
sdkVersion: fmt.Sprint("sdk-", vanillaSdkVersion),
}
}
// NewCallPropertiesCreatorTerraform creates a new CallPropertiesCreator object, specifying which version of the Terraform Operator is being used.
func NewCallPropertiesCreatorTerraform(region string, authContext AuthContext, terraformProviderVersion string) *CallPropertiesCreator {
return &CallPropertiesCreator{
coraglogixRegion: region,
teamsLevelAPIKey: authContext.teamLevelAPIKey,
userLevelAPIKey: authContext.userLevelAPIKey,
correlationID: uuid.New().String(),
sdkVersion: fmt.Sprint("terraform-", terraformProviderVersion),
}
}
// NewCallPropertiesCreatorOperator creates a new CallPropertiesCreator object, specifying which version of the Operator Operator is being used.
func NewCallPropertiesCreatorOperator(region string, authContext AuthContext, cxOperator string) *CallPropertiesCreator {
return &CallPropertiesCreator{
coraglogixRegion: region,
teamsLevelAPIKey: authContext.teamLevelAPIKey,
userLevelAPIKey: authContext.userLevelAPIKey,
correlationID: uuid.New().String(),
sdkVersion: fmt.Sprint("cxo-", cxOperator),
}
}
// NewCallPropertiesCreatorCustomSdk creates a new CallPropertiesCreator object with a custom version.
func NewCallPropertiesCreatorCustomSdk(region string, authContext AuthContext, customSdkVersion string) *CallPropertiesCreator {
return &CallPropertiesCreator{
coraglogixRegion: region,
teamsLevelAPIKey: authContext.teamLevelAPIKey,
userLevelAPIKey: authContext.userLevelAPIKey,
correlationID: uuid.New().String(),
sdkVersion: fmt.Sprint("custom-", customSdkVersion),
}
}