// 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 }
// ToServerCreateMap adds the block device mapping option to the base server // creation options. func (opts CreateOptsExt) ToServerCreateMap() (map[string]interface{}, error) { base, err := opts.CreateOptsBuilder.ToServerCreateMap() if err != nil { return nil, err } if len(opts.BlockDevice) == 0 { err := gophercloud.ErrMissingInput{} err.Argument = "bootfromvolume.CreateOptsExt.BlockDevice" return nil, err } serverMap := base["server"].(map[string]interface{}) blockDevice := make([]map[string]interface{}, len(opts.BlockDevice)) for i, bd := range opts.BlockDevice { b, err := gophercloud.BuildRequestBody(bd, "") if err != nil { return nil, err } blockDevice[i] = b } serverMap["block_device_mapping_v2"] = blockDevice return base, nil }
// ToRuleCreateMap builds the create rule options into a serializable format. func (opts CreateOpts) ToRuleCreateMap() (map[string]interface{}, error) { if opts.FromPort == 0 && strings.ToUpper(opts.IPProtocol) != "ICMP" { return nil, gophercloud.ErrMissingInput{Argument: "FromPort"} } if opts.ToPort == 0 && strings.ToUpper(opts.IPProtocol) != "ICMP" { return nil, gophercloud.ErrMissingInput{Argument: "ToPort"} } return gophercloud.BuildRequestBody(opts, "security_group_default_rule") }
// ToUserCreateMap assembles a request body based on the contents of a CreateOpts. func (opts CreateOpts) ToUserCreateMap() (map[string]interface{}, error) { if opts.Name == "" && opts.Username == "" { err := gophercloud.ErrMissingInput{} err.Argument = "users.CreateOpts.Name/users.CreateOpts.Username" err.Info = "Either a Name or Username must be provided" return nil, err } return gophercloud.BuildRequestBody(opts, "user") }
// ToLBMonitorUpdateMap allows UpdateOpts to satisfy the UpdateOptsBuilder // interface func (opts UpdateOpts) ToLBMonitorUpdateMap() (map[string]interface{}, error) { if opts.Delay > 0 && opts.Timeout > 0 && opts.Delay < opts.Timeout { err := gophercloud.ErrInvalidInput{} err.Argument = "monitors.CreateOpts.Delay/monitors.CreateOpts.Timeout" err.Value = fmt.Sprintf("%d/%d", opts.Delay, opts.Timeout) err.Info = "Delay must be greater than or equal to timeout" return nil, err } return gophercloud.BuildRequestBody(opts, "health_monitor") }
// ToMap is a convenience function for creating sub-maps for individual users. func (opts CreateOpts) ToMap() (map[string]interface{}, error) { if opts.Name == "root" { err := gophercloud.ErrInvalidInput{} err.Argument = "users.CreateOpts.Name" err.Value = "root" err.Info = "root is a reserved user name and cannot be used" return nil, err } return gophercloud.BuildRequestBody(opts, "") }
// ToMap is a helper function to convert individual DB create opt structures // into sub-maps. func (opts CreateOpts) ToMap() (map[string]interface{}, error) { if len(opts.Name) > 64 { err := gophercloud.ErrInvalidInput{} err.Argument = "databases.CreateOpts.Name" err.Value = opts.Name err.Info = "Must be less than 64 chars long" return nil, err } return gophercloud.BuildRequestBody(opts, "") }
// ToSubnetCreateMap casts a CreateOpts struct to a map. func (opts CreateOpts) ToSubnetCreateMap() (map[string]interface{}, error) { b, err := gophercloud.BuildRequestBody(opts, "subnet") if err != nil { return nil, err } if m := b["subnet"].(map[string]interface{}); m["gateway_ip"] == "" { m["gateway_ip"] = nil } return b, nil }
// ToRuleCreateMap casts a CreateOpts struct to a map. func (opts CreateOpts) ToRuleCreateMap() (map[string]interface{}, error) { b, err := gophercloud.BuildRequestBody(opts, "firewall_rule") if err != nil { return nil, err } if m := b["firewall_rule"].(map[string]interface{}); m["protocol"] == "any" { m["protocol"] = nil } return b, nil }
// ToImageCreateMap assembles a request body based on the contents of // a CreateOpts. func (opts CreateOpts) ToImageCreateMap() (map[string]interface{}, error) { b, err := gophercloud.BuildRequestBody(opts, "") if err != nil { return nil, err } if opts.Properties != nil { for k, v := range opts.Properties { b[k] = v } } return b, nil }
// BuildRequest takes an opts struct and builds a request body for // Gophercloud to execute func BuildRequest(opts interface{}, parent string) (map[string]interface{}, error) { b, err := gophercloud.BuildRequestBody(opts, "") if err != nil { return nil, err } if b["value_specs"] != nil { for k, v := range b["value_specs"].(map[string]interface{}) { b[k] = v } delete(b, "value_specs") } return map[string]interface{}{parent: b}, nil }
// ToStackCreateMap casts a CreateOpts struct to a map. func (opts CreateOpts) ToStackCreateMap() (map[string]interface{}, error) { b, err := gophercloud.BuildRequestBody(opts, "") if err != nil { return nil, err } if err := opts.TemplateOpts.Parse(); err != nil { return nil, err } if err := opts.TemplateOpts.getFileContents(opts.TemplateOpts.Parsed, ignoreIfTemplate, true); err != nil { return nil, err } opts.TemplateOpts.fixFileRefs() b["template"] = string(opts.TemplateOpts.Bin) files := make(map[string]string) for k, v := range opts.TemplateOpts.Files { files[k] = v } if opts.EnvironmentOpts != nil { if err := opts.EnvironmentOpts.Parse(); err != nil { return nil, err } if err := opts.EnvironmentOpts.getRRFileContents(ignoreIfEnvironment); err != nil { return nil, err } opts.EnvironmentOpts.fixFileRefs() for k, v := range opts.EnvironmentOpts.Files { files[k] = v } b["environment"] = string(opts.EnvironmentOpts.Bin) } if len(files) > 0 { b["files"] = files } if opts.Tags != nil { b["tags"] = strings.Join(opts.Tags, ",") } return b, nil }
// ToPortUpdateMap casts an UpdateOpts struct to a map. func (opts UpdateOpts) ToPortUpdateMap() (map[string]interface{}, error) { b1, err := opts.UpdateOptsBuilder.ToPortUpdateMap() if err != nil { return nil, err } b2, err := gophercloud.BuildRequestBody(opts, "") if err != nil { return nil, err } port := b1["port"].(map[string]interface{}) for k, v := range b2 { port[k] = v } return map[string]interface{}{"port": port}, nil }
// ToMonitorCreateMap casts a CreateOpts struct to a map. func (opts CreateOpts) ToMonitorCreateMap() (map[string]interface{}, error) { b, err := gophercloud.BuildRequestBody(opts, "healthmonitor") if err != nil { return nil, err } switch opts.Type { case TypeHTTP, TypeHTTPS: switch opts.URLPath { case "": return nil, fmt.Errorf("URLPath must be provided for HTTP and HTTPS") } switch opts.ExpectedCodes { case "": return nil, fmt.Errorf("ExpectedCodes must be provided for HTTP and HTTPS") } } return b, nil }
// ToLBMonitorCreateMap allows CreateOpts to satisfy the CreateOptsBuilder // interface func (opts CreateOpts) ToLBMonitorCreateMap() (map[string]interface{}, error) { if opts.Type == TypeHTTP || opts.Type == TypeHTTPS { if opts.URLPath == "" { err := gophercloud.ErrMissingInput{} err.Argument = "monitors.CreateOpts.URLPath" return nil, err } if opts.ExpectedCodes == "" { err := gophercloud.ErrMissingInput{} err.Argument = "monitors.CreateOpts.ExpectedCodes" return nil, err } } if opts.Delay < opts.Timeout { err := gophercloud.ErrInvalidInput{} err.Argument = "monitors.CreateOpts.Delay/monitors.CreateOpts.Timeout" err.Info = "Delay must be greater than or equal to timeout" return nil, err } return gophercloud.BuildRequestBody(opts, "health_monitor") }
// ToTokenV2CreateMap allows AuthOptions to satisfy the AuthOptionsBuilder // interface in the v2 tokens package func (opts AuthOptions) ToTokenV2CreateMap() (map[string]interface{}, error) { v2Opts := AuthOptionsV2{ TenantID: opts.TenantID, TenantName: opts.TenantName, } if opts.Password != "" { v2Opts.PasswordCredentials = &PasswordCredentialsV2{ Username: opts.Username, Password: opts.Password, } } else { v2Opts.TokenCredentials = &TokenCredentialsV2{ ID: opts.TokenID, } } b, err := gophercloud.BuildRequestBody(v2Opts, "auth") if err != nil { return nil, err } return b, nil }
// ToServerCreateImageMap formats a CreateImageOpts structure into a request body. func (opts CreateImageOpts) ToServerCreateImageMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "createImage") }
// ToServerRescueMap formats a RescueOpts as a map that can be used as a JSON // request body for the Rescue request. func (opts RescueOpts) ToServerRescueMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "rescue") }
// ToVolumeTerminateConnectionMap assembles a request body based on the contents of a // TerminateConnectionOpts. func (opts TerminateConnectionOpts) ToVolumeTerminateConnectionMap() (map[string]interface{}, error) { b, err := gophercloud.BuildRequestBody(opts, "connector") return map[string]interface{}{"os-terminate_connection": b}, err }
// ToVolumeDetachMap assembles a request body based on the contents of a // DetachOpts. func (opts DetachOpts) ToVolumeDetachMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "os-detach") }
// ToShareTypeCreateMap assembles a request body based on the contents of a // CreateOpts. func (opts CreateOpts) ToShareTypeCreateMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "share_type") }
func (opts CreateOpts) ToLBMemberCreateMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "member") }
// ToVolumeExtendSizeMap assembles a request body based on the contents of an // ExtendSizeOpts. func (opts ExtendSizeOpts) ToVolumeExtendSizeMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "os-extend") }
// ToFloatingIPCreateMap allows CreateOpts to satisfy the CreateOptsBuilder // interface func (opts CreateOpts) ToFloatingIPCreateMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "floatingip") }
func (opts UpdateOpts) ToEndpointUpdateMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "endpoint") }
// 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 }
// ToRuleCreateMap casts a CreateOpts struct to a map. func (opts CreateOpts) ToRuleCreateMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "firewall_rule") }
// ToServerUpdateMap formats an UpdateOpts structure into a request body. func (opts UpdateOpts) ToServerUpdateMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "server") }
func (opts CreateOptsWithCustomField) ToServerCreateMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "server") }
// ToServerRebootMap allows RebootOpts to satisfiy the RebootOptsBuilder // interface func (opts *RebootOpts) ToServerRebootMap() (map[string]interface{}, error) { return gophercloud.BuildRequestBody(opts, "reboot") }