// ToServerRebuildMap formats a RebuildOpts struct into a map for use in JSON func (opts RebuildOpts) ToServerRebuildMap() (map[string]interface{}, error) { b, err := gophercloud.BuildRequestBody(opts, "") if err != nil { return nil, err } // If ImageRef isn't provided, check if ImageName was provided to ascertain // the image ID. if opts.ImageID == "" { if opts.ImageName != "" { if opts.ServiceClient == nil { err := ErrNoClientProvidedForIDByName{} err.Argument = "ServiceClient" return nil, err } imageID, err := images.IDFromName(opts.ServiceClient, opts.ImageName) if err != nil { return nil, err } b["imageRef"] = imageID } } return map[string]interface{}{"rebuild": b}, nil }
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.") }
// ToServerCreateMap assembles a request body based on the contents of a CreateOpts. func (opts CreateOpts) ToServerCreateMap() (map[string]interface{}, error) { sc := opts.ServiceClient opts.ServiceClient = nil b, err := gophercloud.BuildRequestBody(opts, "") if err != nil { return nil, err } if opts.UserData != nil { var userData string if _, err := base64.StdEncoding.DecodeString(string(opts.UserData)); err != nil { userData = base64.StdEncoding.EncodeToString(opts.UserData) } else { userData = string(opts.UserData) } b["user_data"] = &userData } if len(opts.SecurityGroups) > 0 { securityGroups := make([]map[string]interface{}, len(opts.SecurityGroups)) for i, groupName := range opts.SecurityGroups { securityGroups[i] = map[string]interface{}{"name": groupName} } b["security_groups"] = securityGroups } if len(opts.Networks) > 0 { networks := make([]map[string]interface{}, len(opts.Networks)) for i, net := range opts.Networks { networks[i] = make(map[string]interface{}) if net.UUID != "" { networks[i]["uuid"] = net.UUID } if net.Port != "" { networks[i]["port"] = net.Port } if net.FixedIP != "" { networks[i]["fixed_ip"] = net.FixedIP } } b["networks"] = networks } // If ImageRef isn't provided, check if ImageName was provided to ascertain // the image ID. if opts.ImageRef == "" { if opts.ImageName != "" { if sc == nil { err := ErrNoClientProvidedForIDByName{} err.Argument = "ServiceClient" return nil, err } imageID, err := images.IDFromName(sc, opts.ImageName) if err != nil { return nil, err } b["imageRef"] = imageID } } // If FlavorRef isn't provided, use FlavorName to ascertain the flavor ID. if opts.FlavorRef == "" { if opts.FlavorName == "" { err := ErrNeitherFlavorIDNorFlavorNameProvided{} err.Argument = "FlavorRef/FlavorName" return nil, err } if sc == nil { err := ErrNoClientProvidedForIDByName{} err.Argument = "ServiceClient" return nil, err } flavorID, err := flavors.IDFromName(sc, opts.FlavorName) if err != nil { return nil, err } b["flavorRef"] = flavorID } return map[string]interface{}{"server": b}, nil }