Skip to content

Commit 47b0fa8

Browse files
[KeyVault] Adding performance tests (Azure#17492)
* certificates perf * keys perf tests * adding perf tests for keys and secrets * making edits * name changes * self review * removing embedded stuff * fixing pipeline failures * making things public * heaths comments * fixing errors
1 parent e2214ac commit 47b0fa8

File tree

16 files changed

+1081
-0
lines changed

16 files changed

+1081
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
package main
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"os"
10+
"time"
11+
12+
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
13+
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
14+
"github.com/Azure/azure-sdk-for-go/sdk/internal/perf"
15+
"github.com/Azure/azure-sdk-for-go/sdk/keyvault/azcertificates"
16+
)
17+
18+
type getCertificatesTestOptions struct{}
19+
20+
var getCertTestOpts getCertificatesTestOptions = getCertificatesTestOptions{}
21+
22+
type getCertificateTest struct {
23+
perf.PerfTestOptions
24+
certificateName string
25+
client *azcertificates.Client
26+
}
27+
28+
// newGetCertificateTest is called once per process
29+
func newGetCertificateTest(ctx context.Context, options perf.PerfTestOptions) (perf.GlobalPerfTest, error) {
30+
certName := "livekvtestgetcertperfcert"
31+
d := &getCertificateTest{
32+
PerfTestOptions: options,
33+
certificateName: certName,
34+
}
35+
36+
vaultURL, ok := os.LookupEnv("AZURE_KEYVAULT_URL")
37+
if !ok {
38+
return nil, fmt.Errorf("the environment variable 'AZURE_KEYVAULT_URL' could not be found")
39+
}
40+
41+
cred, err := azidentity.NewDefaultAzureCredential(nil)
42+
if err != nil {
43+
panic(err)
44+
}
45+
46+
client, err := azcertificates.NewClient(vaultURL, cred, &azcertificates.ClientOptions{
47+
ClientOptions: azcore.ClientOptions{
48+
Transport: options.Transporter,
49+
},
50+
})
51+
if err != nil {
52+
return nil, err
53+
}
54+
55+
poller, err := client.BeginCreateCertificate(ctx, d.certificateName, azcertificates.NewDefaultCertificatePolicy(), nil)
56+
if err != nil {
57+
return nil, err
58+
}
59+
_, err = poller.PollUntilDone(ctx, 500*time.Millisecond)
60+
if err != nil {
61+
return nil, err
62+
}
63+
64+
d.client = client
65+
return d, nil
66+
}
67+
68+
func (gct *getCertificateTest) GlobalCleanup(ctx context.Context) error {
69+
poller, err := gct.client.BeginDeleteCertificate(ctx, gct.certificateName, nil)
70+
if err != nil {
71+
return err
72+
}
73+
74+
_, err = poller.PollUntilDone(ctx, 500*time.Millisecond)
75+
if err != nil {
76+
return err
77+
}
78+
79+
_, err = gct.client.PurgeDeletedCertificate(ctx, gct.certificateName, nil)
80+
return err
81+
}
82+
83+
type getCertificatePerfTest struct {
84+
*getCertificateTest
85+
perf.PerfTestOptions
86+
client *azcertificates.Client
87+
certificateName string
88+
}
89+
90+
// NewPerfTest is called once per goroutine
91+
func (gct *getCertificateTest) NewPerfTest(ctx context.Context, options *perf.PerfTestOptions) (perf.PerfTest, error) {
92+
return &getCertificatePerfTest{
93+
getCertificateTest: gct,
94+
PerfTestOptions: *options,
95+
client: gct.client,
96+
certificateName: gct.certificateName,
97+
}, nil
98+
}
99+
100+
func (gcpt *getCertificatePerfTest) Run(ctx context.Context) error {
101+
_, err := gcpt.client.GetCertificate(ctx, gcpt.certificateName, nil)
102+
return err
103+
}
104+
105+
func (*getCertificatePerfTest) Cleanup(ctx context.Context) error {
106+
return nil
107+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module github.com/Azure/azure-sdk-for-go/sdk/keyvault/azcertificates/testdata/perf
2+
3+
go 1.18
4+
5+
require (
6+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.14.0
7+
github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2
8+
github.com/Azure/azure-sdk-for-go/sdk/keyvault/azcertificates v0.3.0
9+
)
10+
11+
require (
12+
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.0 // indirect
13+
github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.3.0 // indirect
14+
github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0 // indirect
15+
github.com/golang-jwt/jwt v3.2.1+incompatible // indirect
16+
github.com/google/uuid v1.1.1 // indirect
17+
github.com/kylelemons/godebug v1.1.0 // indirect
18+
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 // indirect
19+
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 // indirect
20+
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect
21+
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect
22+
golang.org/x/text v0.3.7 // indirect
23+
)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.0 h1:D7l5jspkc4kwBYRWoZE4DQnu6LVpLwDsMZjBKS4wZLQ=
2+
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.23.0/go.mod h1:w5pDIZuawUmY3Bj4tVx3Xb8KS96ToB0j315w9rqpAg0=
3+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.14.0 h1:NVS/4LOQfkBpk+B1VopIzv1ptmYeEskA8w/3K/w7vjo=
4+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.14.0/go.mod h1:RG0cZndeZM17StwohYclmcXSr4oOJ8b1I5hB8llIc6Y=
5+
github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2 h1:Px2KVERcYEg2Lv25AqC2hVr0xUWaq94wuEObLIkYzmA=
6+
github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.2/go.mod h1:CdSJQNNzZhCkwDaV27XV1w48ZBPtxe7mlrZAsPNxD5g=
7+
github.com/Azure/azure-sdk-for-go/sdk/keyvault/azcertificates v0.3.0 h1:XA+SA4ftUu4YuI+WKhSuGC5IubhBVjv2uat2zYlfF+0=
8+
github.com/Azure/azure-sdk-for-go/sdk/keyvault/azcertificates v0.3.0/go.mod h1:wsBD1Qnm3+LVvHC4JOLGNwosCz4veZ9mmClsBOctQSA=
9+
github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.3.0 h1:0gy84rslo34rGGBe2cDxfs4iDMwbKc0/4yDna1S7j8Q=
10+
github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.3.0/go.mod h1:mu846WjGmdK5vWqWv25J416znWpnFjZp4+O34KW8H7U=
11+
github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0 h1:WVsrXCnHlDDX8ls+tootqRE87/hL9S/g4ewig9RsD/c=
12+
github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4=
13+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
14+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
15+
github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c=
16+
github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
17+
github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c=
18+
github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
19+
github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU=
20+
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
21+
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
22+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
23+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
24+
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
25+
github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
26+
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI=
27+
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ=
28+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
29+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
30+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
31+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
32+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
33+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
34+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
35+
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
36+
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
37+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
38+
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
39+
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
40+
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
41+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
42+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
43+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
44+
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
45+
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
46+
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
47+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
48+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
49+
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
50+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
51+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
52+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
53+
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
54+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
55+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
56+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
57+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
package main
5+
6+
import "github.com/Azure/azure-sdk-for-go/sdk/internal/perf"
7+
8+
func main() {
9+
perf.Run(map[string]perf.PerfMethods{
10+
"GetCertificateTest": {Register: nil, New: newGetCertificateTest},
11+
})
12+
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
package main
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"math/rand"
10+
"os"
11+
"time"
12+
13+
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
14+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
15+
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
16+
"github.com/Azure/azure-sdk-for-go/sdk/internal/perf"
17+
"github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys"
18+
"github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys/crypto"
19+
)
20+
21+
type decryptTestOptions struct{}
22+
23+
var decryptTestOpts decryptTestOptions = decryptTestOptions{}
24+
25+
type decryptTest struct {
26+
perf.PerfTestOptions
27+
keyName string
28+
client *azkeys.Client
29+
cryptoClient *crypto.Client
30+
encrypAlg crypto.EncryptionAlg
31+
cipherText []byte
32+
}
33+
34+
// newDecryptTest is called once per process
35+
func newDecryptTest(ctx context.Context, options perf.PerfTestOptions) (perf.GlobalPerfTest, error) {
36+
d := &decryptTest{
37+
PerfTestOptions: options,
38+
keyName: "livekvtestdecryptperfkey",
39+
encrypAlg: crypto.EncryptionAlgRSAOAEP256,
40+
}
41+
42+
vaultURL, ok := os.LookupEnv("AZURE_KEYVAULT_URL")
43+
if !ok {
44+
return nil, fmt.Errorf("the environment variable 'AZURE_KEYVAULT_URL' could not be found")
45+
}
46+
47+
cred, err := azidentity.NewDefaultAzureCredential(nil)
48+
if err != nil {
49+
panic(err)
50+
}
51+
52+
client, err := azkeys.NewClient(vaultURL, cred, &azkeys.ClientOptions{
53+
ClientOptions: azcore.ClientOptions{
54+
Transport: options.Transporter,
55+
},
56+
})
57+
if err != nil {
58+
return nil, err
59+
}
60+
61+
resp, err := client.CreateRSAKey(ctx, d.keyName, &azkeys.CreateRSAKeyOptions{Size: to.Ptr(int32(2048))})
62+
if err != nil {
63+
return nil, err
64+
}
65+
66+
cryptoClient, err := crypto.NewClient(*resp.ID, cred, &crypto.ClientOptions{
67+
ClientOptions: azcore.ClientOptions{
68+
Transport: options.Transporter,
69+
},
70+
})
71+
if err != nil {
72+
return nil, err
73+
}
74+
75+
d.cryptoClient = cryptoClient
76+
d.client = client
77+
78+
b := make([]byte, 32)
79+
_, err = rand.Read(b)
80+
if err != nil {
81+
return nil, err
82+
}
83+
84+
result, err := d.cryptoClient.Encrypt(ctx, d.encrypAlg, b, nil)
85+
if err != nil {
86+
return nil, err
87+
}
88+
d.cipherText = result.Ciphertext
89+
return d, nil
90+
}
91+
92+
func (gct *decryptTest) GlobalCleanup(ctx context.Context) error {
93+
poller, err := gct.client.BeginDeleteKey(ctx, gct.keyName, nil)
94+
if err != nil {
95+
return err
96+
}
97+
98+
_, err = poller.PollUntilDone(ctx, 500*time.Millisecond)
99+
if err != nil {
100+
return err
101+
}
102+
103+
_, err = gct.client.PurgeDeletedKey(ctx, gct.keyName, nil)
104+
return err
105+
}
106+
107+
type decryptPerfTest struct {
108+
*decryptTest
109+
perf.PerfTestOptions
110+
cryptoClient *crypto.Client
111+
alg crypto.EncryptionAlg
112+
cipher []byte
113+
}
114+
115+
// NewPerfTest is called once per goroutine
116+
func (gct *decryptTest) NewPerfTest(ctx context.Context, options *perf.PerfTestOptions) (perf.PerfTest, error) {
117+
return &decryptPerfTest{
118+
decryptTest: gct,
119+
PerfTestOptions: *options,
120+
alg: gct.encrypAlg,
121+
cipher: gct.cipherText,
122+
}, nil
123+
}
124+
125+
func (gcpt *decryptPerfTest) Run(ctx context.Context) error {
126+
_, err := gcpt.cryptoClient.Decrypt(ctx, gcpt.alg, gcpt.cipher, nil)
127+
return err
128+
}
129+
130+
func (*decryptPerfTest) Cleanup(ctx context.Context) error {
131+
return nil
132+
}

0 commit comments

Comments
 (0)