Skip to content

Commit

Permalink
Merge pull request #366 from abhijeetgaiha/master
Browse files Browse the repository at this point in the history
ACI: Add support for Volume mounts
  • Loading branch information
tombuildsstuff authored Oct 5, 2017
2 parents 6b22662 + 4216ea2 commit 29f7276
Show file tree
Hide file tree
Showing 4 changed files with 356 additions and 61 deletions.
198 changes: 185 additions & 13 deletions azurerm/resource_arm_container_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,52 @@ func resourceArmContainerGroup() *schema.Resource {
Optional: true,
ForceNew: true,
},

"volume": {
Type: schema.TypeList,
Optional: true,
ForceNew: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},

"mount_path": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},

"read_only": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
Default: false,
},

"share_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},

"storage_account_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},

"storage_account_key": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
},
},
},
},
},
},
Expand All @@ -138,8 +184,7 @@ func resourceArmContainerGroupCreate(d *schema.ResourceData, meta interface{}) e
IPAddressType := d.Get("ip_address_type").(string)
tags := d.Get("tags").(map[string]interface{})

containers, containerGroupPorts := expandContainerGroupContainers(d)

containers, containerGroupPorts, containerGroupVolumes := expandContainerGroupContainers(d)
containerGroup := containerinstance.ContainerGroup{
Name: &name,
Location: &location,
Expand All @@ -150,7 +195,8 @@ func resourceArmContainerGroupCreate(d *schema.ResourceData, meta interface{}) e
Type: &IPAddressType,
Ports: containerGroupPorts,
},
OsType: containerinstance.OperatingSystemTypes(OSType),
OsType: containerinstance.OperatingSystemTypes(OSType),
Volumes: containerGroupVolumes,
},
}

Expand All @@ -172,6 +218,7 @@ func resourceArmContainerGroupCreate(d *schema.ResourceData, meta interface{}) e

return resourceArmContainerGroupRead(d, meta)
}

func resourceArmContainerGroupRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*ArmClient)
containterGroupsClient := client.containerGroupsClient
Expand Down Expand Up @@ -206,10 +253,12 @@ func resourceArmContainerGroupRead(d *schema.ResourceData, meta interface{}) err
d.Set("ip_address", address.IP)
}

containerConfigs := flattenContainerGroupContainers(resp.Containers)
err = d.Set("container", containerConfigs)
if err != nil {
return fmt.Errorf("Error setting `container`: %+v", err)
if props := resp.ContainerGroupProperties; props != nil {
containerConfigs := flattenContainerGroupContainers(d, resp.Containers, props.IPAddress.Ports, props.Volumes)
err = d.Set("container", containerConfigs)
if err != nil {
return fmt.Errorf("Error setting `container`: %+v", err)
}
}

return nil
Expand Down Expand Up @@ -240,7 +289,7 @@ func resourceArmContainerGroupDelete(d *schema.ResourceData, meta interface{}) e
return nil
}

func flattenContainerGroupContainers(containers *[]containerinstance.Container) []interface{} {
func flattenContainerGroupContainers(d *schema.ResourceData, containers *[]containerinstance.Container, containerGroupPorts *[]containerinstance.Port, containerGroupVolumes *[]containerinstance.Volume) []interface{} {

containerConfigs := make([]interface{}, 0, len(*containers))
for _, container := range *containers {
Expand All @@ -256,9 +305,21 @@ func flattenContainerGroupContainers(containers *[]containerinstance.Container)
}

if len(*container.Ports) > 0 {
containerConfig["port"] = *(*container.Ports)[0].Port
containerPort := *(*container.Ports)[0].Port
containerConfig["port"] = containerPort
// protocol isn't returned in container config, have to search in container group ports
protocol := ""
if containerGroupPorts != nil {
for _, cgPort := range *containerGroupPorts {
if *cgPort.Port == containerPort {
protocol = string(cgPort.Protocol)
}
}
}
if protocol != "" {
containerConfig["protocol"] = protocol
}
}
// protocol isn't returned in container config

if container.EnvironmentVariables != nil {
if len(*container.EnvironmentVariables) > 0 {
Expand All @@ -270,6 +331,25 @@ func flattenContainerGroupContainers(containers *[]containerinstance.Container)
containerConfig["command"] = strings.Join(*command, " ")
}

if containerGroupVolumes != nil && container.VolumeMounts != nil {
// Also pass in the container volume config from schema
var containerVolumesConfig *[]interface{}
containersConfigRaw := d.Get("container").([]interface{})
for _, containerConfigRaw := range containersConfigRaw {
data := containerConfigRaw.(map[string]interface{})
nameRaw := data["name"].(string)
if nameRaw == *container.Name {
// found container config for current container
// extract volume mounts from config
if v, ok := data["volume"]; ok {
containerVolumesRaw := v.([]interface{})
containerVolumesConfig = &containerVolumesRaw
}
}
}
containerConfig["volume"] = flattenContainerVolumes(container.VolumeMounts, containerGroupVolumes, containerVolumesConfig)
}

containerConfigs = append(containerConfigs, containerConfig)
}

Expand All @@ -289,10 +369,51 @@ func flattenContainerEnvironmentVariables(input *[]containerinstance.Environment
return output
}

func expandContainerGroupContainers(d *schema.ResourceData) (*[]containerinstance.Container, *[]containerinstance.Port) {
func flattenContainerVolumes(volumeMounts *[]containerinstance.VolumeMount, containerGroupVolumes *[]containerinstance.Volume, containerVolumesConfig *[]interface{}) []interface{} {
volumeConfigs := make([]interface{}, 0)

for _, vm := range *volumeMounts {
volumeConfig := make(map[string]interface{})
volumeConfig["name"] = *vm.Name
volumeConfig["mount_path"] = *vm.MountPath
if vm.ReadOnly != nil {
volumeConfig["read_only"] = *vm.ReadOnly
}

// find corresponding volume in container group volumes
// and use the data
for _, cgv := range *containerGroupVolumes {
if *cgv.Name == *vm.Name {
if cgv.AzureFile != nil {
volumeConfig["share_name"] = *(*cgv.AzureFile).ShareName
volumeConfig["storage_account_name"] = *(*cgv.AzureFile).StorageAccountName
// skip storage_account_key, is always nil
}
}
}

// find corresponding volume in config
// and use the data
for _, cvr := range *containerVolumesConfig {
cv := cvr.(map[string]interface{})
rawName := cv["name"].(string)
if *vm.Name == rawName {
storageAccountKey := cv["storage_account_key"].(string)
volumeConfig["storage_account_key"] = storageAccountKey
}
}

volumeConfigs = append(volumeConfigs, volumeConfig)
}

return volumeConfigs
}

func expandContainerGroupContainers(d *schema.ResourceData) (*[]containerinstance.Container, *[]containerinstance.Port, *[]containerinstance.Volume) {
containersConfig := d.Get("container").([]interface{})
containers := make([]containerinstance.Container, 0, len(containersConfig))
containerGroupPorts := make([]containerinstance.Port, 0, len(containersConfig))
containerGroupVolumes := make([]containerinstance.Volume, 0)

for _, containerConfig := range containersConfig {
data := containerConfig.(map[string]interface{})
Expand Down Expand Up @@ -323,7 +444,6 @@ func expandContainerGroupContainers(d *schema.ResourceData) (*[]containerinstanc
containerPort := containerinstance.ContainerPort{
Port: &port,
}

container.Ports = &[]containerinstance.ContainerPort{containerPort}

// container group port (port number + protocol)
Expand All @@ -348,10 +468,18 @@ func expandContainerGroupContainers(d *schema.ResourceData) (*[]containerinstanc
container.Command = &command
}

if v, ok := data["volume"]; ok {
volumeMounts, containerGroupVolumesPartial := expandContainerVolumes(v)
container.VolumeMounts = volumeMounts
if containerGroupVolumesPartial != nil {
containerGroupVolumes = append(containerGroupVolumes, *containerGroupVolumesPartial...)
}
}

containers = append(containers, container)
}

return &containers, &containerGroupPorts
return &containers, &containerGroupPorts, &containerGroupVolumes
}

func expandContainerEnvironmentVariables(input interface{}) *[]containerinstance.EnvironmentVariable {
Expand All @@ -368,3 +496,47 @@ func expandContainerEnvironmentVariables(input interface{}) *[]containerinstance

return &output
}

func expandContainerVolumes(input interface{}) (*[]containerinstance.VolumeMount, *[]containerinstance.Volume) {
volumesRaw := input.([]interface{})

if len(volumesRaw) == 0 {
return nil, nil
}

volumeMounts := make([]containerinstance.VolumeMount, 0, len(volumesRaw))
containerGroupVolumes := make([]containerinstance.Volume, 0, len(volumesRaw))

for _, volumeRaw := range volumesRaw {
volumeConfig := volumeRaw.(map[string]interface{})

name := volumeConfig["name"].(string)
mountPath := volumeConfig["mount_path"].(string)
readOnly := volumeConfig["read_only"].(bool)
shareName := volumeConfig["share_name"].(string)
storageAccountName := volumeConfig["storage_account_name"].(string)
storageAccountKey := volumeConfig["storage_account_key"].(string)

vm := containerinstance.VolumeMount{
Name: &name,
MountPath: &mountPath,
ReadOnly: &readOnly,
}

volumeMounts = append(volumeMounts, vm)

cv := containerinstance.Volume{
Name: &name,
AzureFile: &containerinstance.AzureFileVolume{
ShareName: &shareName,
ReadOnly: &readOnly,
StorageAccountName: &storageAccountName,
StorageAccountKey: &storageAccountKey,
},
}

containerGroupVolumes = append(containerGroupVolumes, cv)
}

return &volumeMounts, &containerGroupVolumes
}
Loading

0 comments on commit 29f7276

Please sign in to comment.