Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit 27e7a0c

Browse files
authored
Merge pull request #475 from docker/aci_volume_keys
Get storage account key from azure login, no need to specify it in compose file or run -v option
2 parents d902c96 + 4ee5aa6 commit 27e7a0c

11 files changed

+189
-194
lines changed

aci/aci.go

+8-42
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import (
2424
"strings"
2525
"time"
2626

27-
"github.com/docker/api/errdefs"
28-
2927
"github.com/Azure/azure-sdk-for-go/services/containerinstance/mgmt/2018-10-01/containerinstance"
3028
"github.com/Azure/go-autorest/autorest"
3129
"github.com/Azure/go-autorest/autorest/to"
@@ -39,13 +37,12 @@ import (
3937
"github.com/docker/api/aci/login"
4038
"github.com/docker/api/containers"
4139
"github.com/docker/api/context/store"
40+
"github.com/docker/api/errdefs"
4241
"github.com/docker/api/progress"
4342
)
4443

45-
const aciDockerUserAgent = "docker-cli"
46-
4744
func createACIContainers(ctx context.Context, aciContext store.AciContext, groupDefinition containerinstance.ContainerGroup) error {
48-
containerGroupsClient, err := getContainerGroupsClient(aciContext.SubscriptionID)
45+
containerGroupsClient, err := login.NewContainerGroupsClient(aciContext.SubscriptionID)
4946
if err != nil {
5047
return errors.Wrapf(err, "cannot get container group client")
5148
}
@@ -69,7 +66,7 @@ func createACIContainers(ctx context.Context, aciContext store.AciContext, group
6966

7067
func createOrUpdateACIContainers(ctx context.Context, aciContext store.AciContext, groupDefinition containerinstance.ContainerGroup) error {
7168
w := progress.ContextWriter(ctx)
72-
containerGroupsClient, err := getContainerGroupsClient(aciContext.SubscriptionID)
69+
containerGroupsClient, err := login.NewContainerGroupsClient(aciContext.SubscriptionID)
7370
if err != nil {
7471
return errors.Wrapf(err, "cannot get container group client")
7572
}
@@ -124,7 +121,7 @@ func createOrUpdateACIContainers(ctx context.Context, aciContext store.AciContex
124121
}
125122

126123
func getACIContainerGroup(ctx context.Context, aciContext store.AciContext, containerGroupName string) (containerinstance.ContainerGroup, error) {
127-
containerGroupsClient, err := getContainerGroupsClient(aciContext.SubscriptionID)
124+
containerGroupsClient, err := login.NewContainerGroupsClient(aciContext.SubscriptionID)
128125
if err != nil {
129126
return containerinstance.ContainerGroup{}, fmt.Errorf("cannot get container group client: %v", err)
130127
}
@@ -133,7 +130,7 @@ func getACIContainerGroup(ctx context.Context, aciContext store.AciContext, cont
133130
}
134131

135132
func deleteACIContainerGroup(ctx context.Context, aciContext store.AciContext, containerGroupName string) (containerinstance.ContainerGroup, error) {
136-
containerGroupsClient, err := getContainerGroupsClient(aciContext.SubscriptionID)
133+
containerGroupsClient, err := login.NewContainerGroupsClient(aciContext.SubscriptionID)
137134
if err != nil {
138135
return containerinstance.ContainerGroup{}, fmt.Errorf("cannot get container group client: %v", err)
139136
}
@@ -142,7 +139,7 @@ func deleteACIContainerGroup(ctx context.Context, aciContext store.AciContext, c
142139
}
143140

144141
func stopACIContainerGroup(ctx context.Context, aciContext store.AciContext, containerGroupName string) error {
145-
containerGroupsClient, err := getContainerGroupsClient(aciContext.SubscriptionID)
142+
containerGroupsClient, err := login.NewContainerGroupsClient(aciContext.SubscriptionID)
146143
if err != nil {
147144
return fmt.Errorf("cannot get container group client: %v", err)
148145
}
@@ -155,7 +152,7 @@ func stopACIContainerGroup(ctx context.Context, aciContext store.AciContext, con
155152
}
156153

157154
func execACIContainer(ctx context.Context, aciContext store.AciContext, command, containerGroup string, containerName string) (c containerinstance.ContainerExecResponse, err error) {
158-
containerClient, err := getContainerClient(aciContext.SubscriptionID)
155+
containerClient, err := login.NewContainerClient(aciContext.SubscriptionID)
159156
if err != nil {
160157
return c, errors.Wrapf(err, "cannot get container client")
161158
}
@@ -248,7 +245,7 @@ func exec(ctx context.Context, address string, password string, request containe
248245
}
249246

250247
func getACIContainerLogs(ctx context.Context, aciContext store.AciContext, containerGroupName, containerName string, tail *int32) (string, error) {
251-
containerClient, err := getContainerClient(aciContext.SubscriptionID)
248+
containerClient, err := login.NewContainerClient(aciContext.SubscriptionID)
252249
if err != nil {
253250
return "", errors.Wrapf(err, "cannot get container client")
254251
}
@@ -311,34 +308,3 @@ func getBacktrackLines(lines []string, terminalWidth int) int {
311308

312309
return numLines
313310
}
314-
315-
func getContainerGroupsClient(subscriptionID string) (containerinstance.ContainerGroupsClient, error) {
316-
containerGroupsClient := containerinstance.NewContainerGroupsClient(subscriptionID)
317-
err := setupClient(&containerGroupsClient.Client)
318-
if err != nil {
319-
return containerinstance.ContainerGroupsClient{}, err
320-
}
321-
containerGroupsClient.PollingDelay = 5 * time.Second
322-
containerGroupsClient.RetryAttempts = 30
323-
containerGroupsClient.RetryDuration = 1 * time.Second
324-
return containerGroupsClient, nil
325-
}
326-
327-
func setupClient(aciClient *autorest.Client) error {
328-
aciClient.UserAgent = aciDockerUserAgent
329-
auth, err := login.NewAuthorizerFromLogin()
330-
if err != nil {
331-
return err
332-
}
333-
aciClient.Authorizer = auth
334-
return nil
335-
}
336-
337-
func getContainerClient(subscriptionID string) (containerinstance.ContainerClient, error) {
338-
containerClient := containerinstance.NewContainerClient(subscriptionID)
339-
err := setupClient(&containerClient.Client)
340-
if err != nil {
341-
return containerinstance.ContainerClient{}, err
342-
}
343-
return containerClient, nil
344-
}

aci/backend.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ type aciContainerService struct {
133133
}
134134

135135
func (cs *aciContainerService) List(ctx context.Context, all bool) ([]containers.Container, error) {
136-
groupsClient, err := getContainerGroupsClient(cs.ctx.SubscriptionID)
136+
groupsClient, err := login.NewContainerGroupsClient(cs.ctx.SubscriptionID)
137137
if err != nil {
138138
return nil, err
139139
}
@@ -209,7 +209,7 @@ func (cs *aciContainerService) Run(ctx context.Context, r containers.ContainerCo
209209
}
210210

211211
logrus.Debugf("Running container %q with name %q\n", r.Image, r.ID)
212-
groupDefinition, err := convert.ToContainerGroup(cs.ctx, project)
212+
groupDefinition, err := convert.ToContainerGroup(ctx, cs.ctx, project)
213213
if err != nil {
214214
return err
215215
}
@@ -232,7 +232,7 @@ func (cs *aciContainerService) Start(ctx context.Context, containerID string) er
232232
return errors.New(fmt.Sprintf(msg, containerName, groupName, groupName))
233233
}
234234

235-
containerGroupsClient, err := getContainerGroupsClient(cs.ctx.SubscriptionID)
235+
containerGroupsClient, err := login.NewContainerGroupsClient(cs.ctx.SubscriptionID)
236236
if err != nil {
237237
return err
238238
}
@@ -336,7 +336,7 @@ func (cs *aciContainerService) Delete(ctx context.Context, containerID string, r
336336
}
337337

338338
if !request.Force {
339-
containerGroupsClient, err := getContainerGroupsClient(cs.ctx.SubscriptionID)
339+
containerGroupsClient, err := login.NewContainerGroupsClient(cs.ctx.SubscriptionID)
340340
if err != nil {
341341
return err
342342
}
@@ -410,7 +410,7 @@ func (cs *aciComposeService) Up(ctx context.Context, opts cli.ProjectOptions) er
410410
return err
411411
}
412412
logrus.Debugf("Up on project with name %q\n", project.Name)
413-
groupDefinition, err := convert.ToContainerGroup(cs.ctx, *project)
413+
groupDefinition, err := convert.ToContainerGroup(ctx, cs.ctx, *project)
414414
addTag(&groupDefinition, composeContainerTag)
415415

416416
if err != nil {

aci/convert/convert.go

+17-8
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package convert
1818

1919
import (
20+
"context"
2021
"encoding/base64"
21-
"errors"
2222
"fmt"
2323
"io/ioutil"
2424
"math"
@@ -29,7 +29,9 @@ import (
2929
"github.com/Azure/azure-sdk-for-go/services/containerinstance/mgmt/2018-10-01/containerinstance"
3030
"github.com/Azure/go-autorest/autorest/to"
3131
"github.com/compose-spec/compose-go/types"
32+
"github.com/pkg/errors"
3233

34+
"github.com/docker/api/aci/login"
3335
"github.com/docker/api/containers"
3436
"github.com/docker/api/context/store"
3537
)
@@ -42,15 +44,22 @@ const (
4244
azureFileDriverName = "azure_file"
4345
volumeDriveroptsShareNameKey = "share_name"
4446
volumeDriveroptsAccountNameKey = "storage_account_name"
45-
volumeDriveroptsAccountKeyKey = "storage_account_key"
4647
secretInlineMark = "inline:"
4748
)
4849

4950
// ToContainerGroup converts a compose project into a ACI container group
50-
func ToContainerGroup(aciContext store.AciContext, p types.Project) (containerinstance.ContainerGroup, error) {
51+
func ToContainerGroup(ctx context.Context, aciContext store.AciContext, p types.Project) (containerinstance.ContainerGroup, error) {
5152
project := projectAciHelper(p)
5253
containerGroupName := strings.ToLower(project.Name)
53-
volumesCache, volumesSlice, err := project.getAciFileVolumes()
54+
loginService, err := login.NewAzureLoginService()
55+
if err != nil {
56+
return containerinstance.ContainerGroup{}, err
57+
}
58+
storageHelper := login.StorageAccountHelper{
59+
LoginService: *loginService,
60+
AciContext: aciContext,
61+
}
62+
volumesCache, volumesSlice, err := project.getAciFileVolumes(ctx, storageHelper)
5463
if err != nil {
5564
return containerinstance.ContainerGroup{}, err
5665
}
@@ -191,7 +200,7 @@ func (p projectAciHelper) getAciSecretVolumes() ([]containerinstance.Volume, err
191200
return secretVolumes, nil
192201
}
193202

194-
func (p projectAciHelper) getAciFileVolumes() (map[string]bool, []containerinstance.Volume, error) {
203+
func (p projectAciHelper) getAciFileVolumes(ctx context.Context, helper login.StorageAccountHelper) (map[string]bool, []containerinstance.Volume, error) {
195204
azureFileVolumesMap := make(map[string]bool, len(p.Volumes))
196205
var azureFileVolumesSlice []containerinstance.Volume
197206
for name, v := range p.Volumes {
@@ -204,9 +213,9 @@ func (p projectAciHelper) getAciFileVolumes() (map[string]bool, []containerinsta
204213
if !ok {
205214
return nil, nil, fmt.Errorf("cannot retrieve account name for Azurefile")
206215
}
207-
accountKey, ok := v.DriverOpts[volumeDriveroptsAccountKeyKey]
208-
if !ok {
209-
return nil, nil, fmt.Errorf("cannot retrieve account key for Azurefile")
216+
accountKey, err := helper.GetAzureStorageAccountKey(ctx, accountName)
217+
if err != nil {
218+
return nil, nil, err
210219
}
211220
aciVolume := containerinstance.Volume{
212221
Name: to.StringPtr(name),

aci/convert/convert_test.go

+13-12
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package convert
1818

1919
import (
20+
"context"
2021
"os"
2122
"testing"
2223

@@ -40,7 +41,7 @@ func TestProjectName(t *testing.T) {
4041
project := types.Project{
4142
Name: "TEST",
4243
}
43-
containerGroup, err := ToContainerGroup(convertCtx, project)
44+
containerGroup, err := ToContainerGroup(context.TODO(), convertCtx, project)
4445
assert.NilError(t, err)
4546
assert.Equal(t, *containerGroup.Name, "test")
4647
}
@@ -117,7 +118,7 @@ func TestComposeContainerGroupToContainerWithDnsSideCarSide(t *testing.T) {
117118
},
118119
}
119120

120-
group, err := ToContainerGroup(convertCtx, project)
121+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
121122
assert.NilError(t, err)
122123
assert.Assert(t, is.Len(*group.Containers, 3))
123124

@@ -142,7 +143,7 @@ func TestComposeSingleContainerGroupToContainerNoDnsSideCarSide(t *testing.T) {
142143
},
143144
}
144145

145-
group, err := ToContainerGroup(convertCtx, project)
146+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
146147
assert.NilError(t, err)
147148

148149
assert.Assert(t, is.Len(*group.Containers, 1))
@@ -165,7 +166,7 @@ func TestComposeSingleContainerRestartPolicy(t *testing.T) {
165166
},
166167
}
167168

168-
group, err := ToContainerGroup(convertCtx, project)
169+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
169170
assert.NilError(t, err)
170171

171172
assert.Assert(t, is.Len(*group.Containers, 1))
@@ -197,7 +198,7 @@ func TestComposeMultiContainerRestartPolicy(t *testing.T) {
197198
},
198199
}
199200

200-
group, err := ToContainerGroup(convertCtx, project)
201+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
201202
assert.NilError(t, err)
202203

203204
assert.Assert(t, is.Len(*group.Containers, 3))
@@ -231,7 +232,7 @@ func TestComposeInconsistentMultiContainerRestartPolicy(t *testing.T) {
231232
},
232233
}
233234

234-
_, err := ToContainerGroup(convertCtx, project)
235+
_, err := ToContainerGroup(context.TODO(), convertCtx, project)
235236
assert.Error(t, err, "ACI integration does not support specifying different restart policies on containers in the same compose application")
236237
}
237238

@@ -248,7 +249,7 @@ func TestLabelsErrorMessage(t *testing.T) {
248249
},
249250
}
250251

251-
_, err := ToContainerGroup(convertCtx, project)
252+
_, err := ToContainerGroup(context.TODO(), convertCtx, project)
252253
assert.Error(t, err, "ACI integration does not support labels in compose applications")
253254
}
254255

@@ -262,7 +263,7 @@ func TestComposeSingleContainerGroupToContainerDefaultRestartPolicy(t *testing.T
262263
},
263264
}
264265

265-
group, err := ToContainerGroup(convertCtx, project)
266+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
266267
assert.NilError(t, err)
267268

268269
assert.Assert(t, is.Len(*group.Containers, 1))
@@ -296,7 +297,7 @@ func TestComposeContainerGroupToContainerMultiplePorts(t *testing.T) {
296297
},
297298
}
298299

299-
group, err := ToContainerGroup(convertCtx, project)
300+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
300301
assert.NilError(t, err)
301302
assert.Assert(t, is.Len(*group.Containers, 3))
302303

@@ -335,7 +336,7 @@ func TestComposeContainerGroupToContainerResourceLimits(t *testing.T) {
335336
},
336337
}
337338

338-
group, err := ToContainerGroup(convertCtx, project)
339+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
339340
assert.NilError(t, err)
340341

341342
limits := *((*group.Containers)[0]).Resources.Limits
@@ -361,7 +362,7 @@ func TestComposeContainerGroupToContainerResourceLimitsDefaults(t *testing.T) {
361362
},
362363
}
363364

364-
group, err := ToContainerGroup(convertCtx, project)
365+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
365366
assert.NilError(t, err)
366367

367368
limits := *((*group.Containers)[0]).Resources.Limits
@@ -385,7 +386,7 @@ func TestComposeContainerGroupToContainerenvVar(t *testing.T) {
385386
},
386387
}
387388

388-
group, err := ToContainerGroup(convertCtx, project)
389+
group, err := ToContainerGroup(context.TODO(), convertCtx, project)
389390
assert.NilError(t, err)
390391

391392
envVars := *((*group.Containers)[0]).EnvironmentVariables

0 commit comments

Comments
 (0)