func getImageIDFromConfig(computeClient *gophercloud.ServiceClient, d *schema.ResourceData) (string, error) { // If block_device was used, an Image does not need to be specified. // If an Image was specified, ignore it if _, ok := d.GetOk("block_device"); ok { return "", nil } if imageId := d.Get("image_id").(string); imageId != "" { return imageId, nil } else { // try the OS_IMAGE_ID environment variable if v := os.Getenv("OS_IMAGE_ID"); v != "" { return v, nil } } imageName := d.Get("image_name").(string) if imageName == "" { // try the OS_IMAGE_NAME environment variable if v := os.Getenv("OS_IMAGE_NAME"); v != "" { imageName = v } } if imageName != "" { imageId, err := images.IDFromName(computeClient, imageName) if err != nil { return "", err } return imageId, nil } return "", fmt.Errorf("Neither a boot device, image ID, or image name were able to be determined.") }
// Create requests a server to be provisioned to the user in the current tenant. func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult { var res CreateResult reqBody, err := opts.ToServerCreateMap() if err != nil { res.Err = err return res } // If ImageRef isn't provided, use ImageName to ascertain the image ID. if reqBody["server"].(map[string]interface{})["imageRef"].(string) == "" { imageName := reqBody["server"].(map[string]interface{})["imageName"].(string) if imageName == "" { res.Err = errors.New("One and only one of ImageRef and ImageName must be provided.") return res } imageID, err := images.IDFromName(client, imageName) if err != nil { res.Err = err return res } reqBody["server"].(map[string]interface{})["imageRef"] = imageID } delete(reqBody["server"].(map[string]interface{}), "imageName") // If FlavorRef isn't provided, use FlavorName to ascertain the flavor ID. if reqBody["server"].(map[string]interface{})["flavorRef"].(string) == "" { flavorName := reqBody["server"].(map[string]interface{})["flavorName"].(string) if flavorName == "" { res.Err = errors.New("One and only one of FlavorRef and FlavorName must be provided.") return res } flavorID, err := flavors.IDFromName(client, flavorName) if err != nil { res.Err = err return res } reqBody["server"].(map[string]interface{})["flavorRef"] = flavorID } delete(reqBody["server"].(map[string]interface{}), "flavorName") _, res.Err = client.Post(listURL(client), reqBody, &res.Body, nil) return res }
func getImageIDFromConfig(computeClient *gophercloud.ServiceClient, d *schema.ResourceData) (string, error) { // If block_device was used, an Image does not need to be specified, unless an image/local // combination was used. This emulates normal boot behavior. Otherwise, ignore the image altogether. if vL, ok := d.GetOk("block_device"); ok { needImage := false for _, v := range vL.([]interface{}) { vM := v.(map[string]interface{}) if vM["source_type"] == "image" && vM["destination_type"] == "local" { needImage = true } } if !needImage { return "", nil } } if imageId := d.Get("image_id").(string); imageId != "" { return imageId, nil } else { // try the OS_IMAGE_ID environment variable if v := os.Getenv("OS_IMAGE_ID"); v != "" { return v, nil } } imageName := d.Get("image_name").(string) if imageName == "" { // try the OS_IMAGE_NAME environment variable if v := os.Getenv("OS_IMAGE_NAME"); v != "" { imageName = v } } if imageName != "" { imageId, err := images.IDFromName(computeClient, imageName) if err != nil { return "", err } return imageId, nil } return "", fmt.Errorf("Neither a boot device, image ID, or image name were able to be determined.") }