in providers/openstack/compute.go [36:125]
func (g *ComputeGenerator) createResources(list *pagination.Pager, volclient *gophercloud.ServiceClient) []terraformutils.Resource {
resources := []terraformutils.Resource{}
err := list.EachPage(func(page pagination.Page) (bool, error) {
servers, err := servers.ExtractServers(page)
if err != nil {
return false, err
}
for _, s := range servers {
var bds = []map[string]interface{}{}
var vol []volumes.Volume
t := map[string]interface{}{}
if volclient != nil {
for _, av := range s.AttachedVolumes {
onevol, err := volumes.Get(volclient, av.ID).Extract()
if err == nil {
vol = append(vol, *onevol)
}
}
sort.SliceStable(vol, func(i, j int) bool {
return vol[i].Attachments[0].Device < vol[j].Attachments[0].Device
})
var bindex = 0
var dependsOn = ""
for _, v := range vol {
if v.Bootable == "true" && v.VolumeImageMetadata != nil {
bds = append(bds, map[string]interface{}{
"source_type": "image",
"uuid": v.VolumeImageMetadata["image_id"],
"volume_size": strconv.Itoa(v.Size),
"boot_index": strconv.Itoa(bindex),
"destination_type": "volume",
"delete_on_termination": "false",
})
bindex++
} else {
tv := map[string]interface{}{}
if dependsOn != "" {
tv["depends_on"] = []string{dependsOn}
}
name := s.Name + strings.ReplaceAll(v.Attachments[0].Device, "/dev/", "")
rid := s.ID + "/" + v.ID
resource := terraformutils.NewResource(
rid,
name,
"openstack_compute_volume_attach_v2",
"openstack",
map[string]string{},
[]string{},
tv,
)
dependsOn = "openstack_compute_volume_attach_v2." + terraformutils.TfSanitize(name)
tv["instance_name"] = terraformutils.TfSanitize(s.Name)
if v.Name == "" {
v.Name = v.ID
}
tv["volume_name"] = terraformutils.TfSanitize(v.Name)
resources = append(resources, resource)
}
}
}
if len(bds) > 0 {
t = map[string]interface{}{"block_device": bds}
}
resource := terraformutils.NewResource(
s.ID,
s.Name,
"openstack_compute_instance_v2",
"openstack",
map[string]string{},
[]string{},
t,
)
resources = append(resources, resource)
}
return true, nil
})
if err != nil {
log.Println(err)
}
return resources
}