func()

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
}