// Create is an operation which provisions a new security group with default // security group rules for the IPv4 and IPv6 ether types. func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult { var res CreateResult // Validate required opts if opts.Name == "" { res.Err = errNameRequired return res } type secgroup struct { Name string `json:"name"` Description string `json:"description,omitempty"` } type request struct { SecGroup secgroup `json:"security_group"` } reqBody := request{SecGroup: secgroup{ Name: opts.Name, Description: opts.Description, }} _, res.Err = c.Post(rootURL(c), reqBody, &res.Body, nil) return res }
// Create is a function that creates a new object or replaces an existing object. func Create(c *gophercloud.ServiceClient, containerName, objectName string, content io.ReadSeeker, opts CreateOptsBuilder) CreateResult { var res CreateResult url := createURL(c, containerName, objectName) h := make(map[string]string) if opts != nil { headers, query, err := opts.ToObjectCreateParams() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } url += query } ropts := gophercloud.RequestOpts{ RawBody: content, MoreHeaders: h, } resp, err := c.Request("PUT", url, ropts) if resp != nil { res.Header = resp.Header } res.Err = err return res }
// Delete is a function that deletes a container. func Delete(c *gophercloud.ServiceClient, containerName string) DeleteResult { var res DeleteResult _, res.Err = c.Delete(deleteURL(c, containerName), &gophercloud.RequestOpts{ ErrorContext: &ContainerError{name: containerName}, }) return res }
// Update is a function that creates, updates, or deletes an object's metadata. func Update(c *gophercloud.ServiceClient, containerName, objectName string, opts UpdateOptsBuilder) UpdateResult { var res UpdateResult h := c.AuthenticatedHeaders() if opts != nil { headers, err := opts.ToObjectUpdateMap() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } } url := updateURL(c, containerName, objectName) resp, err := c.Request("POST", url, gophercloud.RequestOpts{ MoreHeaders: h, }) if resp != nil { res.Header = resp.Header } res.Err = err return res }
// Get is a function that retrieves an account's metadata. To extract just the // custom metadata, call the ExtractMetadata method on the GetResult. To extract // all the headers that are returned (including the metadata), call the // ExtractHeader method on the GetResult. func Get(c *gophercloud.ServiceClient, opts GetOptsBuilder) GetResult { var res GetResult h := c.AuthenticatedHeaders() if opts != nil { headers, err := opts.ToAccountGetMap() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } } resp, err := c.Request("HEAD", getURL(c), gophercloud.RequestOpts{ MoreHeaders: h, OkCodes: []int{204}, }) if resp != nil { res.Header = resp.Header } res.Err = err return res }
// Reboot requests that a given server reboot. // Two methods exist for rebooting a server: // // HardReboot (aka PowerCycle) restarts the server instance by physically cutting power to the machine, or if a VM, // terminating it at the hypervisor level. // It's done. Caput. Full stop. // Then, after a brief while, power is restored or the VM instance restarted. // // SoftReboot (aka OSReboot) simply tells the OS to restart under its own procedures. // E.g., in Linux, asking it to enter runlevel 6, or executing "sudo shutdown -r now", or by asking Windows to restart the machine. func Reboot(client *gophercloud.ServiceClient, id string, how RebootMethod) ActionResult { var res ActionResult if (how != SoftReboot) && (how != HardReboot) { res.Err = &ErrInvalidHowParameterProvided{ &gophercloud.InvalidInputError{ BaseError: gophercloud.BaseError{ Function: "servers.Reboot", }, Argument: "how", Value: how, }, } return res } reqBody := struct { C map[string]string `json:"reboot"` }{ map[string]string{"type": string(how)}, } _, res.Err = client.Post(actionURL(client, id), reqBody, nil, &gophercloud.RequestOpts{ ErrorContext: &ServerError{id: id}, }) return res }
// Delete requests that a server previously provisioned be removed from your account. func Delete(client *gophercloud.ServiceClient, id string) DeleteResult { var res DeleteResult _, res.Err = client.Delete(deleteURL(client, id), &gophercloud.RequestOpts{ ErrorContext: &ServerError{id: id}, }) return res }
// Revoke immediately makes specified token invalid. func Revoke(c *gophercloud.ServiceClient, token string) RevokeResult { var res RevokeResult _, res.Err = c.Delete(tokenURL(c), &gophercloud.RequestOpts{ MoreHeaders: subjectTokenHeaders(c, token), }) return res }
// Get requests details on a single server, by ID. func Get(client *gophercloud.ServiceClient, id string) GetResult { var result GetResult _, result.Err = client.Get(getURL(client, id), &result.Body, &gophercloud.RequestOpts{ OkCodes: []int{200, 203}, }) return result }
// Create is a function that creates a new container. func Create(c *gophercloud.ServiceClient, containerName string, opts CreateOptsBuilder) CreateResult { var res CreateResult h := c.AuthenticatedHeaders() if opts != nil { headers, err := opts.ToContainerCreateMap() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } } resp, err := c.Request("PUT", createURL(c, containerName), gophercloud.RequestOpts{ MoreHeaders: h, OkCodes: []int{201, 202, 204}, }) if resp != nil { res.Header = resp.Header } res.Err = err return res }
// DeleteMetadatum will delete the key-value pair with the given key for the given server ID. func DeleteMetadatum(client *gophercloud.ServiceClient, id, key string) DeleteMetadatumResult { var res DeleteMetadatumResult _, res.Err = client.Delete(metadatumURL(client, id, key), &gophercloud.RequestOpts{ JSONResponse: &res.Body, }) return res }
// 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 = &ErrNeitherImageIDNorImageNameProvided{ &gophercloud.InvalidInputError{ BaseError: gophercloud.BaseError{ Function: "servers.Create", }, Argument: "ImageRef/ImageName", }, } 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 = &ErrNeitherFlavorIDNorFlavorNameProvided{ &gophercloud.InvalidInputError{ BaseError: gophercloud.BaseError{ Function: "servers.Create", }, Argument: "FlavorRef/FlavorName", }, } 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, &gophercloud.RequestOpts{ ErrorContext: &ServerError{}, }) return res }
// Download is a function that retrieves the content and metadata for an object. // To extract just the content, pass the DownloadResult response to the // ExtractContent function. func Download(c *gophercloud.ServiceClient, containerName, objectName string, opts DownloadOptsBuilder) DownloadResult { var res DownloadResult url := downloadURL(c, containerName, objectName) h := c.AuthenticatedHeaders() if opts != nil { headers, query, err := opts.ToObjectDownloadParams() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } url += query } resp, err := c.Request("GET", url, gophercloud.RequestOpts{ MoreHeaders: h, OkCodes: []int{200, 304}, }) if resp != nil { res.Header = resp.Header res.Body = resp.Body } res.Err = err return res }
// Update is a function that creates, updates, or deletes an account's metadata. // To extract the headers returned, call the Extract method on the UpdateResult. func Update(c *gophercloud.ServiceClient, opts UpdateOptsBuilder) UpdateResult { var res UpdateResult h := make(map[string]string) if opts != nil { headers, err := opts.ToAccountUpdateMap() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } } resp, err := c.Request("POST", updateURL(c), gophercloud.RequestOpts{ MoreHeaders: h, OkCodes: []int{201, 202, 204}, }) if resp != nil { res.Header = resp.Header } res.Err = err return res }
// Metadatum requests the key-value pair with the given key for the given server ID. func Metadatum(client *gophercloud.ServiceClient, id, key string) GetMetadatumResult { var res GetMetadatumResult _, res.Err = client.Request("GET", metadatumURL(client, id, key), gophercloud.RequestOpts{ JSONResponse: &res.Body, }) return res }
// Copy is a function that copies one object to another. func Copy(c *gophercloud.ServiceClient, containerName, objectName string, opts CopyOptsBuilder) CopyResult { var res CopyResult h := c.AuthenticatedHeaders() headers, err := opts.ToObjectCopyMap() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } url := copyURL(c, containerName, objectName) resp, err := c.Request("COPY", url, gophercloud.RequestOpts{ MoreHeaders: h, OkCodes: []int{201}, }) if resp != nil { res.Header = resp.Header } res.Err = err return res }
// Rescue instructs the provider to place the server into RESCUE mode. func Rescue(client *gophercloud.ServiceClient, id string, opts RescueOptsBuilder) RescueResult { var result RescueResult if id == "" { result.Err = &ErrNoIDProvided{ &gophercloud.InvalidInputError{ BaseError: gophercloud.BaseError{ Function: "servers.Rescue", }, Argument: "id", }, } return result } reqBody, err := opts.ToServerRescueMap() if err != nil { result.Err = err return result } _, result.Err = client.Post(actionURL(client, id), reqBody, &result.Body, &gophercloud.RequestOpts{ OkCodes: []int{200}, ErrorContext: &ServerError{id: id}, }) return result }
// Update requests that various attributes of the indicated server be changed. func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) UpdateResult { var result UpdateResult reqBody := opts.ToServerUpdateMap() _, result.Err = client.Put(updateURL(client, id), reqBody, &result.Body, &gophercloud.RequestOpts{ OkCodes: []int{200}, }) return result }
// RevertResize cancels a previous resize operation on a server. // See Resize() for more details. func RevertResize(client *gophercloud.ServiceClient, id string) ActionResult { var res ActionResult reqBody := map[string]interface{}{"revertResize": nil} _, res.Err = client.Post(actionURL(client, id), reqBody, nil, &gophercloud.RequestOpts{ ErrorContext: &ServerError{id: id}, }) return res }
// ConfirmResize confirms a previous resize operation on a server. // See Resize() for more details. func ConfirmResize(client *gophercloud.ServiceClient, id string) ActionResult { var res ActionResult reqBody := map[string]interface{}{"confirmResize": nil} _, res.Err = client.Post(actionURL(client, id), reqBody, nil, &gophercloud.RequestOpts{ OkCodes: []int{201, 202, 204}, }) return res }
// Resize instructs the provider to change the flavor of the server. // Note that this implies rebuilding it. // Unfortunately, one cannot pass rebuild parameters to the resize function. // When the resize completes, the server will be in RESIZE_VERIFY state. // While in this state, you can explore the use of the new server's configuration. // If you like it, call ConfirmResize() to commit the resize permanently. // Otherwise, call RevertResize() to restore the old configuration. func Resize(client *gophercloud.ServiceClient, id string, opts ResizeOptsBuilder) ActionResult { var res ActionResult reqBody, err := opts.ToServerResizeMap() if err != nil { res.Err = err return res } _, res.Err = client.Post(actionURL(client, id), reqBody, nil, nil) return res }
// Validate determines if a specified token is valid or not. func Validate(c *gophercloud.ServiceClient, token string) (bool, error) { response, err := c.Request("HEAD", tokenURL(c), gophercloud.RequestOpts{ MoreHeaders: subjectTokenHeaders(c, token), OkCodes: []int{204, 404}, }) if err != nil { return false, err } return response.StatusCode == 204, nil }
// Get is a function that retrieves the metadata of a container. To extract just // the custom metadata, pass the GetResult response to the ExtractMetadata // function. func Get(c *gophercloud.ServiceClient, containerName string) GetResult { var res GetResult resp, err := c.Request("HEAD", getURL(c, containerName), gophercloud.RequestOpts{ OkCodes: []int{200, 204}, }) if resp != nil { res.Header = resp.Header } res.Err = err return res }
// Create is a function that creates a new object or replaces an existing object. If the returned response's ETag // header fails to match the local checksum, the failed request will automatically be retried up to a maximum of 3 times. func Create(c *gophercloud.ServiceClient, containerName, objectName string, content io.ReadSeeker, opts CreateOptsBuilder) CreateResult { var res CreateResult url := createURL(c, containerName, objectName) h := make(map[string]string) if opts != nil { headers, query, err := opts.ToObjectCreateParams() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } url += query } hash := md5.New() contentBuffer := bytes.NewBuffer([]byte{}) _, err := io.Copy(contentBuffer, io.TeeReader(content, hash)) if err != nil { res.Err = err return res } localChecksum := hash.Sum(nil) h["ETag"] = fmt.Sprintf("%x", localChecksum) ropts := gophercloud.RequestOpts{ RawBody: strings.NewReader(contentBuffer.String()), MoreHeaders: h, } for i := 1; i <= 3; i++ { resp, err := c.Request("PUT", url, ropts) if resp != nil { res.Header = resp.Header } if resp.Header.Get("ETag") == fmt.Sprintf("%x", localChecksum) { res.Err = err break } if i == 3 { res.Err = fmt.Errorf("Local checksum does not match API ETag header") return res } } return res }
// Create accepts a CreateOpts struct and creates a new network using the values // provided. You must remember to provide a NetworkID value. func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult { var res CreateResult reqBody, err := opts.ToPortCreateMap() if err != nil { res.Err = err return res } _, res.Err = c.Post(createURL(c), reqBody, &res.Body, nil) return res }
// Create authenticates to the identity service and attempts to acquire a Token. // If successful, the CreateResult // Generally, rather than interact with this call directly, end users should call openstack.AuthenticatedClient(), // which abstracts all of the gory details about navigating service catalogs and such. func Create(client *gophercloud.ServiceClient, auth AuthOptionsBuilder) CreateResult { request, err := auth.ToTokenCreateMap() if err != nil { return CreateResult{gophercloud.Result{Err: err}} } var result CreateResult _, result.Err = client.Post(CreateURL(client), request, &result.Body, &gophercloud.RequestOpts{ OkCodes: []int{200, 203}, }) return result }
// UpdateMetadata updates (or creates) all the metadata specified by opts for the given server ID. // This operation does not affect already-existing metadata that is not specified // by opts. func UpdateMetadata(client *gophercloud.ServiceClient, id string, opts UpdateMetadataOptsBuilder) UpdateMetadataResult { var res UpdateMetadataResult metadata, err := opts.ToMetadataUpdateMap() if err != nil { res.Err = err return res } _, res.Err = client.Post(metadataURL(client, id), metadata, &res.Body, &gophercloud.RequestOpts{ OkCodes: []int{200}, }) return res }
// Get validates and retrieves information about another token. func Get(c *gophercloud.ServiceClient, token string) GetResult { var result GetResult var response *http.Response response, result.Err = c.Get(tokenURL(c), &result.Body, &gophercloud.RequestOpts{ MoreHeaders: subjectTokenHeaders(c, token), OkCodes: []int{200, 203}, }) if result.Err != nil { return result } result.Header = response.Header return result }
// ChangeAdminPassword alters the administrator or root password for a specified server. func ChangeAdminPassword(client *gophercloud.ServiceClient, id, newPassword string) ActionResult { var req struct { ChangePassword struct { AdminPass string `json:"adminPass"` } `json:"changePassword"` } req.ChangePassword.AdminPass = newPassword var res ActionResult _, res.Err = client.Post(actionURL(client, id), req, nil, nil) return res }
// CreateMetadatum will create or update the key-value pair with the given key for the given server ID. func CreateMetadatum(client *gophercloud.ServiceClient, id string, opts MetadatumOptsBuilder) CreateMetadatumResult { var res CreateMetadatumResult metadatum, key, err := opts.ToMetadatumCreateMap() if err != nil { res.Err = err return res } _, res.Err = client.Put(metadatumURL(client, id, key), metadatum, &res.Body, &gophercloud.RequestOpts{ OkCodes: []int{200}, }) return res }