// Update changes an existing endpoint with new data. // All fields are optional in the provided EndpointOpts. func Update(client *gophercloud.ServiceClient, endpointID string, opts EndpointOpts) UpdateResult { type endpoint struct { Interface *string `json:"interface,omitempty"` Name *string `json:"name,omitempty"` Region *string `json:"region,omitempty"` URL *string `json:"url,omitempty"` ServiceID *string `json:"service_id,omitempty"` } type request struct { Endpoint endpoint `json:"endpoint"` } reqBody := request{Endpoint: endpoint{}} reqBody.Endpoint.Interface = gophercloud.MaybeString(string(opts.Availability)) reqBody.Endpoint.Name = gophercloud.MaybeString(opts.Name) reqBody.Endpoint.Region = gophercloud.MaybeString(opts.Region) reqBody.Endpoint.URL = gophercloud.MaybeString(opts.URL) reqBody.Endpoint.ServiceID = gophercloud.MaybeString(opts.ServiceID) var result UpdateResult _, result.Err = client.Request("PATCH", endpointURL(client, endpointID), gophercloud.RequestOpts{ JSONBody: &reqBody, JSONResponse: &result.Body, OkCodes: []int{200}, }) return result }
// Update allows routers to be updated. You can update the name, administrative // state, and the external gateway. For more information about how to set the // external gateway for a router, see Create. This operation does not enable // the update of router interfaces. To do this, use the AddInterface and // RemoveInterface functions. func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResult { type router struct { Name *string `json:"name,omitempty"` AdminStateUp *bool `json:"admin_state_up,omitempty"` GatewayInfo *GatewayInfo `json:"external_gateway_info,omitempty"` } type request struct { Router router `json:"router"` } reqBody := request{Router: router{ Name: gophercloud.MaybeString(opts.Name), AdminStateUp: opts.AdminStateUp, }} if opts.GatewayInfo != nil { reqBody.Router.GatewayInfo = opts.GatewayInfo } // Send request to API var res UpdateResult _, res.Err = perigee.Request("PUT", resourceURL(c, id), perigee.Options{ MoreHeaders: c.AuthenticatedHeaders(), ReqBody: &reqBody, Results: &res.Body, OkCodes: []int{200}, }) return res }
// Create accepts a CreateOpts struct and uses the values to create a new // logical router. When it is created, the router does not have an internal // interface - it is not associated to any subnet. // // You can optionally specify an external gateway for a router using the // GatewayInfo struct. The external gateway for the router must be plugged into // an external network (it is external if its `router:external' field is set to // true). func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult { type router struct { Name *string `json:"name,omitempty"` AdminStateUp *bool `json:"admin_state_up,omitempty"` TenantID *string `json:"tenant_id,omitempty"` GatewayInfo *GatewayInfo `json:"external_gateway_info,omitempty"` } type request struct { Router router `json:"router"` } reqBody := request{Router: router{ Name: gophercloud.MaybeString(opts.Name), AdminStateUp: opts.AdminStateUp, TenantID: gophercloud.MaybeString(opts.TenantID), }} if opts.GatewayInfo != nil { reqBody.Router.GatewayInfo = opts.GatewayInfo } var res CreateResult _, res.Err = perigee.Request("POST", rootURL(c), perigee.Options{ MoreHeaders: c.AuthenticatedHeaders(), ReqBody: &reqBody, Results: &res.Body, OkCodes: []int{201}, }) return res }
// MeterStatistics gathers statistics based on filters, groups, and period options func MeterStatistics(client *gophercloud.ServiceClient, n string, optsBuilder MeterStatisticsOptsBuilder) statisticsResult { var ( res statisticsResult url = statisticsURL(client, n) opts gophercloud.RequestOpts err error kind OptsKind ) if optsBuilder != nil { kind = optsBuilder.Kind() } switch kind { case QueryOpts: query, err := optsBuilder.ToMeterStatisticsQuery() url += query case BodyContentOpts: opts.JSONBody, err = optsBuilder.ToMeterStatisticsQuery() } if err != nil { res.Err = err return res } _, res.Err = client.Get(url, &res.Body, &opts) return res }
// Enable is a function that enables/disables a CDN container. func Enable(c *gophercloud.ServiceClient, containerName string, opts EnableOptsBuilder) EnableResult { var res EnableResult h := c.AuthenticatedHeaders() if opts != nil { headers, err := opts.ToCDNContainerEnableMap() if err != nil { res.Err = err return res } for k, v := range headers { h[k] = v } } resp, err := c.Request("PUT", enableURL(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 }
// Update allows routers to be updated. You can update the name, administrative // state, and the external gateway. For more information about how to set the // external gateway for a router, see Create. This operation does not enable // the update of router interfaces. To do this, use the AddInterface and // RemoveInterface functions. func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResult { type router struct { Name *string `json:"name,omitempty"` AdminStateUp *bool `json:"admin_state_up,omitempty"` GatewayInfo *GatewayInfo `json:"external_gateway_info,omitempty"` Routes []Route `json:"routes"` } type request struct { Router router `json:"router"` } reqBody := request{Router: router{ Name: gophercloud.MaybeString(opts.Name), AdminStateUp: opts.AdminStateUp, }} if opts.GatewayInfo != nil { reqBody.Router.GatewayInfo = opts.GatewayInfo } if opts.Routes != nil { reqBody.Router.Routes = opts.Routes } // Send request to API var res UpdateResult _, res.Err = c.Put(resourceURL(c, id), reqBody, &res.Body, &gophercloud.RequestOpts{ OkCodes: []int{200}, }) 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 }
// 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 }
// 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 }
// 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 }
// 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 }
// 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 }
// Delete deletes the interface with interfaceID attached to the instance with // instanceID. func Delete(c *gophercloud.ServiceClient, instanceID, interfaceID string) DeleteResult { var res DeleteResult _, res.Err = c.Request("DELETE", deleteURL(c, instanceID, interfaceID), gophercloud.RequestOpts{ OkCodes: []int{200, 204}, }) 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 }
// Delete will delete objects or containers in bulk. func Delete(c *gophercloud.ServiceClient, opts DeleteOptsBuilder) DeleteResult { var res DeleteResult if opts == nil { return res } reqString, err := opts.ToBulkDeleteBody() if err != nil { res.Err = err return res } reqBody := strings.NewReader(reqString) resp, err := c.Request("DELETE", deleteURL(c), gophercloud.RequestOpts{ MoreHeaders: map[string]string{"Content-Type": "text/plain"}, OkCodes: []int{200}, JSONBody: reqBody, JSONResponse: &res.Body, }) 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 }
// 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 }
// Delete is the operation responsible for permanently deleting a VIP. func Delete(c *gophercloud.ServiceClient, lbID, vipID int) DeleteResult { var res DeleteResult _, res.Err = c.Request("DELETE", resourceURL(c, lbID, vipID), gophercloud.RequestOpts{ OkCodes: []int{202}, }) return res }
// Delete implements image delete request func Delete(client *gophercloud.ServiceClient, id string) DeleteResult { var res DeleteResult _, res.Err = client.Delete(deleteURL(client, id), &gophercloud.RequestOpts{ OkCodes: []int{204}, }) return res }
// Create accepts a CreateOpts struct and uses the values to create a new // logical router. When it is created, the router does not have an internal // interface - it is not associated to any subnet. // // You can optionally specify an external gateway for a router using the // GatewayInfo struct. The external gateway for the router must be plugged into // an external network (it is external if its `router:external' field is set to // true). func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult { type router struct { Name *string `json:"name,omitempty"` AdminStateUp *bool `json:"admin_state_up,omitempty"` TenantID *string `json:"tenant_id,omitempty"` GatewayInfo *GatewayInfo `json:"external_gateway_info,omitempty"` } type request struct { Router router `json:"router"` } reqBody := request{Router: router{ Name: gophercloud.MaybeString(opts.Name), AdminStateUp: opts.AdminStateUp, TenantID: gophercloud.MaybeString(opts.TenantID), }} if opts.GatewayInfo != nil { reqBody.Router.GatewayInfo = opts.GatewayInfo } var res CreateResult _, res.Err = c.Post(rootURL(c), reqBody, &res.Body, nil) return res }
// Delete is the operation responsible for deleting the SSL Termination // configuration for a load balancer. func Delete(c *gophercloud.ServiceClient, lbID int) DeleteResult { var res DeleteResult _, res.Err = c.Delete(rootURL(c, lbID), &gophercloud.RequestOpts{ OkCodes: []int{200}, }) return res }
// Delete will delete objects or containers in bulk. func Delete(c *gophercloud.ServiceClient, opts DeleteOptsBuilder) DeleteResult { var res DeleteResult if opts == nil { return res } reqString, err := opts.ToBulkDeleteBody() if err != nil { res.Err = err return res } reqBody := strings.NewReader(reqString) resp, err := perigee.Request("DELETE", deleteURL(c), perigee.Options{ ContentType: "text/plain", MoreHeaders: c.AuthenticatedHeaders(), OkCodes: []int{200}, ReqBody: reqBody, Results: &res.Body, }) res.Header = resp.HttpResponse.Header res.Err = err return res }
// GetPassword makes a request against the nova API to get the encrypted administrative password. func GetPassword(client *gophercloud.ServiceClient, serverId string) GetPasswordResult { var res GetPasswordResult _, res.Err = client.Request("GET", passwordURL(client, serverId), gophercloud.RequestOpts{ JSONResponse: &res.Body, }) return res }
// Delete will permanently delete a particular firewall rule based on its unique ID. func Delete(c *gophercloud.ServiceClient, id string) DeleteResult { var res DeleteResult _, res.Err = c.Request("DELETE", resourceURL(c, id), gophercloud.RequestOpts{ OkCodes: []int{204}, }) return res }
// Update allows floating IP resources to be updated. Currently, the only way to // "update" a floating IP is to associate it with a new internal port, or // disassociated it from all ports. See UpdateOpts for instructions of how to // do this. func Update(c *gophercloud.ServiceClient, id string, opts UpdateOpts) UpdateResult { type floatingIP struct { PortID *string `json:"port_id"` } type request struct { FloatingIP floatingIP `json:"floatingip"` } var portID *string if opts.PortID == "" { portID = nil } else { portID = &opts.PortID } reqBody := request{FloatingIP: floatingIP{PortID: portID}} // Send request to API var res UpdateResult _, res.Err = c.Put(resourceURL(c, id), reqBody, &res.Body, &gophercloud.RequestOpts{ OkCodes: []int{200}, }) return res }
// AddInterface attaches a subnet to an internal router interface. You must // specify either a SubnetID or PortID in the request body. If you specify both, // the operation will fail and an error will be returned. // // If you specify a SubnetID, the gateway IP address for that particular subnet // is used to create the router interface. Alternatively, if you specify a // PortID, the IP address associated with the port is used to create the router // interface. // // If you reference a port that is associated with multiple IP addresses, or // if the port is associated with zero IP addresses, the operation will fail and // a 400 Bad Request error will be returned. // // If you reference a port already in use, the operation will fail and a 409 // Conflict error will be returned. // // The PortID that is returned after using Extract() on the result of this // operation can either be the same PortID passed in or, on the other hand, the // identifier of a new port created by this operation. After the operation // completes, the device ID of the port is set to the router ID, and the // device owner attribute is set to `network:router_interface'. func AddInterface(c *gophercloud.ServiceClient, id string, opts InterfaceOpts) InterfaceResult { var res InterfaceResult // Validate if (opts.SubnetID == "" && opts.PortID == "") || (opts.SubnetID != "" && opts.PortID != "") { res.Err = errInvalidInterfaceOpts return res } type request struct { SubnetID string `json:"subnet_id,omitempty"` PortID string `json:"port_id,omitempty"` } body := request{SubnetID: opts.SubnetID, PortID: opts.PortID} _, res.Err = perigee.Request("PUT", addInterfaceURL(c, id), perigee.Options{ MoreHeaders: c.AuthenticatedHeaders(), ReqBody: &body, Results: &res.Body, OkCodes: []int{200}, }) return res }
// Create accepts a CreateOpts struct and uses the values provided to create a // new floating IP resource. You can create floating IPs on external networks // only. If you provide a FloatingNetworkID which refers to a network that is // not external (i.e. its `router:external' attribute is False), the operation // will fail and return a 400 error. // // If you do not specify a FloatingIP address value, the operation will // automatically allocate an available address for the new resource. If you do // choose to specify one, it must fall within the subnet range for the external // network - otherwise the operation returns a 400 error. If the FloatingIP // address is already in use, the operation returns a 409 error code. // // You can associate the new resource with an internal port by using the PortID // field. If you specify a PortID that is not valid, the operation will fail and // return 404 error code. // // You must also configure an IP address for the port associated with the PortID // you have provided - this is what the FixedIP refers to: an IP fixed to a port. // Because a port might be associated with multiple IP addresses, you can use // the FixedIP field to associate a particular IP address rather than have the // API assume for you. If you specify an IP address that is not valid, the // operation will fail and return a 400 error code. If the PortID and FixedIP // are already associated with another resource, the operation will fail and // returns a 409 error code. func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult { var res CreateResult // Validate if opts.FloatingNetworkID == "" { res.Err = errFloatingNetworkIDRequired return res } // Define structures type floatingIP struct { FloatingNetworkID string `json:"floating_network_id"` FloatingIP string `json:"floating_ip_address,omitempty"` PortID string `json:"port_id,omitempty"` FixedIP string `json:"fixed_ip_address,omitempty"` TenantID string `json:"tenant_id,omitempty"` } type request struct { FloatingIP floatingIP `json:"floatingip"` } // Populate request body reqBody := request{FloatingIP: floatingIP{ FloatingNetworkID: opts.FloatingNetworkID, FloatingIP: opts.FloatingIP, PortID: opts.PortID, FixedIP: opts.FixedIP, TenantID: opts.TenantID, }} _, res.Err = c.Post(rootURL(c), reqBody, &res.Body, nil) return res }
// Delete removes an existing service. // It either deletes all associated endpoints, or fails until all endpoints are deleted. func Delete(client *gophercloud.ServiceClient, serviceID string) DeleteResult { var res DeleteResult _, res.Err = client.Request("DELETE", serviceURL(client, serviceID), gophercloud.RequestOpts{ OkCodes: []int{204}, }) return res }
// Create accepts a CreateOpts struct and uses the values to create a new // load balancer pool. func Create(c *gophercloud.ServiceClient, opts CreateOpts) CreateResult { type pool struct { Name string `json:"name"` TenantID string `json:"tenant_id,omitempty"` Protocol string `json:"protocol"` SubnetID string `json:"subnet_id"` LBMethod string `json:"lb_method"` } type request struct { Pool pool `json:"pool"` } reqBody := request{Pool: pool{ Name: opts.Name, TenantID: opts.TenantID, Protocol: opts.Protocol, SubnetID: opts.SubnetID, LBMethod: opts.LBMethod, }} var res CreateResult _, res.Err = c.Request("POST", rootURL(c), gophercloud.RequestOpts{ JSONBody: &reqBody, JSONResponse: &res.Body, OkCodes: []int{201}, }) return res }