/
azureclient.go
98 lines (83 loc) · 3.16 KB
/
azureclient.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
package azureclient
//go:generate go get github.com/golang/mock/mockgen
//go:generate mockgen -destination=../../util/mocks/mock_$GOPACKAGE/azureclient.go github.com/openshift/openshift-azure/pkg/util/$GOPACKAGE Client
//go:generate gofmt -s -l -w ../../util/mocks/mock_$GOPACKAGE/azureclient.go
//go:generate go get golang.org/x/tools/cmd/goimports
//go:generate goimports -local=github.com/openshift/openshift-azure -e -w ../../util/mocks/mock_$GOPACKAGE/azureclient.go
import (
"context"
"fmt"
"net/http"
"net/http/httputil"
"os"
"time"
"github.com/Azure/go-autorest/autorest"
"github.com/Azure/go-autorest/autorest/azure"
"github.com/Azure/go-autorest/autorest/azure/auth"
"github.com/sirupsen/logrus"
"github.com/openshift/openshift-azure/pkg/api"
)
const KeyVaultEndpoint = "https://vault.azure.net" // beware of the leopard
// Client returns the Client
type Client interface {
Client() autorest.Client
}
func addAcceptLanguages(acceptLanguages []string) autorest.PrepareDecorator {
return func(p autorest.Preparer) autorest.Preparer {
return autorest.PreparerFunc(func(r *http.Request) (*http.Request, error) {
r, err := p.Prepare(r)
if err != nil {
return r, err
}
for _, language := range acceptLanguages {
r.Header.Add("Accept-Language", language)
}
return r, nil
})
}
}
type loggingSender struct {
autorest.Sender
}
func (ls *loggingSender) Do(req *http.Request) (*http.Response, error) {
b, _ := httputil.DumpRequestOut(req, true)
fmt.Printf("%s\n\n", string(b))
resp, err := ls.Sender.Do(req)
if resp != nil {
b, _ = httputil.DumpResponse(resp, true)
fmt.Printf("%s\n\n", string(b))
}
return resp, err
}
func SetupClient(ctx context.Context, log *logrus.Entry, clientName string, client *autorest.Client, authorizer autorest.Authorizer) {
// if context does not provide languages (sync pod, tests) - use default
var languages []string
if ctx.Value(api.ContextAcceptLanguages) != nil {
languages = ctx.Value(api.ContextAcceptLanguages).([]string)
}
client.Authorizer = authorizer
client.RequestInspector = addAcceptLanguages(languages)
client.PollingDelay = 10 * time.Second
client.Sender = &retrySender{Sender: client.Sender, log: log, clientName: clientName}
//client.Sender = &loggingSender{client.Sender}
}
func NewAuthorizer(clientID, clientSecret, tenantID, resource string) (autorest.Authorizer, error) {
if resource == azure.PublicCloud.KeyVaultEndpoint {
return nil, fmt.Errorf("resource azure.PublicCloud.KeyVaultEndpoint doesn't work: use azureclient.KeyVaultEndpoint")
}
config := auth.NewClientCredentialsConfig(clientID, clientSecret, tenantID)
if resource != "" {
config.Resource = resource
}
return config.Authorizer()
}
func GetAuthorizerFromContext(ctx context.Context, key interface{}) (autorest.Authorizer, error) {
authorizer, ok := ctx.Value(key).(autorest.Authorizer)
if !ok {
return nil, fmt.Errorf("failed to get authorizer, key %s not found within context", key)
}
return authorizer, nil
}
func NewAuthorizerFromEnvironment(resource string) (autorest.Authorizer, error) {
return NewAuthorizer(os.Getenv("AZURE_CLIENT_ID"), os.Getenv("AZURE_CLIENT_SECRET"), os.Getenv("AZURE_TENANT_ID"), resource)
}