1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
13 "git.curoverse.com/arvados.git/sdk/go/arvados"
14 "git.curoverse.com/arvados.git/sdk/go/config"
15 "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-06-01/compute"
16 "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2018-06-01/network"
17 "github.com/Azure/go-autorest/autorest"
18 "github.com/Azure/go-autorest/autorest/azure"
19 "github.com/Azure/go-autorest/autorest/to"
20 check "gopkg.in/check.v1"
23 type AzureProviderSuite struct{}
25 var _ = check.Suite(&AzureProviderSuite{})
27 type VirtualMachinesClientStub struct{}
29 func (*VirtualMachinesClientStub) CreateOrUpdate(ctx context.Context,
30 resourceGroupName string,
32 parameters compute.VirtualMachine) (result compute.VirtualMachine, err error) {
33 parameters.ID = &VMName
34 return parameters, nil
37 func (*VirtualMachinesClientStub) Delete(ctx context.Context, resourceGroupName string, VMName string) (result *http.Response, err error) {
41 func (*VirtualMachinesClientStub) ListComplete(ctx context.Context, resourceGroupName string) (result compute.VirtualMachineListResultIterator, err error) {
42 return compute.VirtualMachineListResultIterator{}, nil
45 type InterfacesClientStub struct{}
47 func (*InterfacesClientStub) CreateOrUpdate(ctx context.Context,
48 resourceGroupName string,
50 parameters network.Interface) (result network.Interface, err error) {
51 parameters.ID = to.StringPtr(nicName)
52 (*parameters.IPConfigurations)[0].PrivateIPAddress = to.StringPtr("192.168.5.5")
53 return parameters, nil
56 func (*InterfacesClientStub) Delete(ctx context.Context, resourceGroupName string, VMName string) (result *http.Response, err error) {
60 func (*InterfacesClientStub) ListComplete(ctx context.Context, resourceGroupName string) (result network.InterfaceListResultIterator, err error) {
61 return network.InterfaceListResultIterator{}, nil
64 var live = flag.String("live-azure-cfg", "", "Test with real azure API, provide config file")
66 func GetProvider() (Provider, ImageID, arvados.Cluster, error) {
67 cluster := arvados.Cluster{
68 InstanceTypes: arvados.InstanceTypeMap(map[string]arvados.InstanceType{
69 "tiny": arvados.InstanceType{
71 ProviderType: "Standard_D1_v2",
80 cfg := AzureProviderConfig{}
81 err := config.LoadFile(&cfg, *live)
83 return nil, ImageID(""), cluster, err
85 ap, err := NewAzureProvider(cfg, cluster)
86 return ap, ImageID(cfg.Image), cluster, err
89 azconfig: AzureProviderConfig{
90 BlobContainer: "vhds",
94 ap.vmClient = &VirtualMachinesClientStub{}
95 ap.netClient = &InterfacesClientStub{}
96 return &ap, ImageID("blob"), cluster, nil
100 func (*AzureProviderSuite) TestCreate(c *check.C) {
101 ap, img, cluster, err := GetProvider()
103 c.Fatal("Error making provider", err)
106 inst, err := ap.Create(context.Background(),
107 cluster.InstanceTypes["tiny"],
108 img, []InstanceTag{"tag1"})
110 c.Assert(err, check.IsNil)
112 log.Printf("Result %v %v", inst.String(), inst.Address())
115 func (*AzureProviderSuite) TestListInstances(c *check.C) {
116 ap, _, _, err := GetProvider()
118 c.Fatal("Error making provider", err)
121 l, err := ap.Instances(context.Background())
123 c.Assert(err, check.IsNil)
125 for _, i := range l {
126 log.Printf("%v %v %v", i.String(), i.Address(), i.InstanceType())
130 func (*AzureProviderSuite) TestManageNics(c *check.C) {
131 ap, _, _, err := GetProvider()
133 c.Fatal("Error making provider", err)
136 ap.(*AzureProvider).ManageNics(context.Background())
139 func (*AzureProviderSuite) TestManageBlobs(c *check.C) {
140 ap, _, _, err := GetProvider()
142 c.Fatal("Error making provider", err)
145 ap.(*AzureProvider).ManageBlobs(context.Background())
148 func (*AzureProviderSuite) TestDestroyInstances(c *check.C) {
149 ap, _, _, err := GetProvider()
151 c.Fatal("Error making provider", err)
154 l, err := ap.Instances(context.Background())
155 c.Assert(err, check.IsNil)
157 for _, i := range l {
158 c.Check(i.Destroy(context.Background()), check.IsNil)
162 func (*AzureProviderSuite) TestDeleteFake(c *check.C) {
163 ap, _, _, err := GetProvider()
165 c.Fatal("Error making provider", err)
168 _, err = ap.(*AzureProvider).netClient.Delete(context.Background(), "fakefakefake", "fakefakefake")
170 rq := err.(autorest.DetailedError).Original.(*azure.RequestError)
172 log.Printf("%v %q %q", rq.Response.StatusCode, rq.ServiceError.Code, rq.ServiceError.Message)
175 func (*AzureProviderSuite) TestWrapError(c *check.C) {
176 retryError := autorest.DetailedError{
177 Original: &azure.RequestError{
178 DetailedError: autorest.DetailedError{
179 Response: &http.Response{
181 Header: map[string][]string{"Retry-After": []string{"123"}},
184 ServiceError: &azure.ServiceError{},
187 wrapped := WrapAzureError(retryError)
188 _, ok := wrapped.(RateLimitError)
189 c.Check(ok, check.Equals, true)
191 quotaError := autorest.DetailedError{
192 Original: &azure.RequestError{
193 DetailedError: autorest.DetailedError{
194 Response: &http.Response{
198 ServiceError: &azure.ServiceError{
199 Message: "No more quota",
203 wrapped = WrapAzureError(quotaError)
204 _, ok = wrapped.(QuotaError)
205 c.Check(ok, check.Equals, true)