Documentation ¶
Index ¶
- Constants
- Variables
- func IsPossiblyCanadianTenantSyncError(err error, url string) bool
- type APIError
- type AccessRule
- type CkRequest
- type CkValidationState
- type Client
- func (c *Client) CallAPI(method, path string, reqBody, result interface{}, queryParams url.Values, ...) error
- func (c *Client) CallAPIWithContext(ctx context.Context, method, path string, reqBody, result interface{}, ...) error
- func (c *Client) CreateNodePool(ctx context.Context, projectID string, clusterID string, ...) (*NodePool, error)
- func (c *Client) Delete(url string, result interface{}, queryParams url.Values) error
- func (c *Client) DeleteNodePool(ctx context.Context, projectID string, clusterID string, poolID string) (*NodePool, error)
- func (c *Client) DeleteUnAuth(url string, result interface{}, queryParams url.Values) error
- func (c *Client) DeleteUnAuthWithContext(ctx context.Context, url string, result interface{}, queryParams url.Values) error
- func (c *Client) DeleteWithContext(ctx context.Context, url string, result interface{}, queryParams url.Values) error
- func (c *Client) Do(req *http.Request) (*http.Response, error)
- func (c *Client) Get(url string, result interface{}, queryParams url.Values) error
- func (c *Client) GetNodePool(ctx context.Context, projectID string, clusterID string, poolID string) (*NodePool, error)
- func (c *Client) GetUnAuth(url string, result interface{}, queryParams url.Values) error
- func (c *Client) GetUnAuthWithContext(ctx context.Context, url string, result interface{}, queryParams url.Values) error
- func (c *Client) GetWithContext(ctx context.Context, url string, result interface{}, queryParams url.Values) error
- func (c *Client) ListClusterFlavors(ctx context.Context, projectID string, clusterID string) ([]Flavor, error)
- func (c *Client) ListNodePoolNodes(ctx context.Context, projectID string, clusterID string, poolID string) ([]Node, error)
- func (c *Client) ListNodePools(ctx context.Context, projectID, clusterID string) ([]NodePool, error)
- func (c *Client) NewCkRequest() *CkRequest
- func (c *Client) NewCkRequestWithRedirection(redirection string) *CkRequest
- func (c *Client) NewRequest(method, path string, reqBody interface{}, queryParams url.Values, ...) (*http.Request, error)
- func (c *Client) Ping() error
- func (c *Client) Post(url string, reqBody, result interface{}, queryParams url.Values) error
- func (c *Client) PostUnAuth(url string, reqBody, result interface{}, queryParams url.Values) error
- func (c *Client) PostUnAuthWithContext(ctx context.Context, url string, reqBody, result interface{}, ...) error
- func (c *Client) PostWithContext(ctx context.Context, url string, reqBody, result interface{}, ...) error
- func (c *Client) Put(url string, reqBody, result interface{}, queryParams url.Values) error
- func (c *Client) PutUnAuth(url string, reqBody, result interface{}, queryParams url.Values) error
- func (c *Client) PutUnAuthWithContext(ctx context.Context, url string, reqBody, result interface{}, ...) error
- func (c *Client) PutWithContext(ctx context.Context, url string, reqBody, result interface{}, ...) error
- func (c *Client) Time() (*time.Time, error)
- func (c *Client) TimeDelta() (time.Duration, error)
- func (c *Client) UnmarshalResponse(response *http.Response, result interface{}) error
- func (c *Client) UpdateNodePool(ctx context.Context, projectID string, clusterID string, poolID string, ...) (*NodePool, error)
- type ClientMock
- func (m *ClientMock) CreateNodePool(ctx context.Context, projectID string, clusterID string, ...) (*NodePool, error)
- func (m *ClientMock) DeleteNodePool(ctx context.Context, projectID string, clusterID string, poolID string) (*NodePool, error)
- func (m *ClientMock) ListClusterFlavors(ctx context.Context, projectID string, clusterID string) ([]Flavor, error)
- func (m *ClientMock) ListNodePoolNodes(ctx context.Context, projectID string, clusterID string, poolID string) ([]Node, error)
- func (m *ClientMock) ListNodePools(ctx context.Context, projectID string, clusterID string) ([]NodePool, error)
- func (m *ClientMock) UpdateNodePool(ctx context.Context, projectID string, clusterID string, poolID string, ...) (*NodePool, error)
- type CreateNodePoolOpts
- type Error
- type Flavor
- type Logger
- type Node
- type NodePool
- type NodePoolAutoscaling
- type OpenStackProvider
- type UpdateNodePoolOpts
Constants ¶
const ( OvhEU = "https://eu.api.ovh.com/1.0" OvhCA = "https://ca.api.ovh.com/1.0" OvhUS = "https://api.us.ovhcloud.com/1.0" KimsufiEU = "https://eu.api.kimsufi.com/1.0" KimsufiCA = "https://ca.api.kimsufi.com/1.0" SoyoustartEU = "https://eu.api.soyoustart.com/1.0" SoyoustartCA = "https://ca.api.soyoustart.com/1.0" RunaboveCA = "https://api.runabove.com/1.0" )
Endpoints
const DefaultExpirationTime = 23 * time.Hour
DefaultExpirationTime is the maximum time to be alive of an OpenStack keystone token.
const DefaultTimeout = 180 * time.Second
DefaultTimeout api requests after 180s
Variables ¶
var ( ReadOnly = []string{"GET"} ReadWrite = []string{"GET", "POST", "PUT", "DELETE"} ReadWriteSafe = []string{"GET", "POST", "PUT"} )
Map user friendly access level names to corresponding HTTP verbs
var Endpoints = map[string]string{ "ovh-eu": OvhEU, "ovh-ca": OvhCA, "ovh-us": OvhUS, "kimsufi-eu": KimsufiEU, "kimsufi-ca": KimsufiCA, "soyoustart-eu": SoyoustartEU, "soyoustart-ca": SoyoustartCA, "runabove-ca": RunaboveCA, }
Endpoints conveniently maps endpoints names to their URI for external configuration
var (
ErrAPIDown = errors.New("go-vh: the OVH API is down, it does't respond to /time anymore")
)
Errors
Functions ¶
func IsPossiblyCanadianTenantSyncError ¶
IsPossiblyCanadianTenantSyncError returns whether the given error and URL could be due to the tenant being canadian and too recent. This is a temporary fix until the issue is correctly handled
Types ¶
type APIError ¶
type APIError struct { // Error message. Message string // HTTP code. Code int // ID of the request QueryID string }
APIError represents an error that can occurred while calling the API.
type AccessRule ¶
type AccessRule struct { // Allowed HTTP Method for the requested AccessRule. // Can be set to GET/POST/PUT/DELETE. Method string `json:"method"` // Allowed path. // Can be an exact string or a string with '*' char. // Example : // /me : only /me is authorized // /* : all calls are authorized Path string `json:"path"` }
AccessRule represents a method allowed for a path
type CkRequest ¶
type CkRequest struct { AccessRules []AccessRule `json:"accessRules"` Redirection string `json:"redirection,omitempty"` // contains filtered or unexported fields }
CkRequest represents the parameters to fill in order to ask a new consumerKey.
func (*CkRequest) AddRecursiveRules ¶
AddRecursiveRules adds grant requests on "path" and "path/*", for all methods "ReadOnly", "ReadWrite" and "ReadWriteSafe" should be used for "methods" unless specific access are required.
func (*CkRequest) AddRules ¶
AddRules adds grant requests on "path" for all methods. "ReadOnly", "ReadWrite" and "ReadWriteSafe" should be used for "methods" unless specific access are required.
func (*CkRequest) Do ¶
func (ck *CkRequest) Do() (*CkValidationState, error)
Do executes the request. On success, set the consumer key in the client and return the URL the user needs to visit to validate the key
type CkValidationState ¶
type CkValidationState struct { // Consumer key, which need to be validated by customer. ConsumerKey string `json:"consumerKey"` // Current status, should be always "pendingValidation". State string `json:"state"` // URL to redirect user in order to log in. ValidationURL string `json:"validationUrl"` }
CkValidationState represents the response when asking a new consumerKey.
func (*CkValidationState) String ¶
func (ck *CkValidationState) String() string
type Client ¶
type Client struct { // Self generated tokens. Create one by visiting // https://eu.api.ovh.com/createApp/ // AppKey holds the Application key AppKey string // AppSecret holds the Application secret key AppSecret string // ConsumerKey holds the user/app specific token. It must have been validated before use. ConsumerKey string // Client is the underlying HTTP client used to run the requests. It may be overloaded but a default one is instanciated in “NewClient“ by default. Client *http.Client // Logger is used to log HTTP requests and responses. Logger Logger Timeout time.Duration // contains filtered or unexported fields }
Client represents a client to call the OVH API
func NewDefaultClient ¶
NewDefaultClient will load all it's parameter from environment or configuration files
func NewDefaultClientWithToken ¶
NewDefaultClientWithToken will load all it's parameter from environment or configuration files using an OpenStack keystone token
func NewEndpointClient ¶
NewEndpointClient will create an API client for specified endpoint and load all credentials from environment or configuration files
func (*Client) CallAPI ¶
func (c *Client) CallAPI(method, path string, reqBody, result interface{}, queryParams url.Values, needAuth bool) error
CallAPI is the lowest level call helper. If needAuth is true, inject authentication headers and sign the request.
Request signature is a sha1 hash on following fields, joined by '+': - applicationSecret (from Client instance) - consumerKey (from Client instance) - capitalized method (from arguments) - full request url, including any query string argument - full serialized request body - server current time (takes time delta into account)
Call will automatically assemble the target url from the endpoint configured in the client instance and the path argument. If the reqBody argument is not nil, it will also serialize it as json and inject the required Content-Type header.
If everything went fine, unmarshall response into result and return nil otherwise, return the error
func (*Client) CallAPIWithContext ¶
func (c *Client) CallAPIWithContext(ctx context.Context, method, path string, reqBody, result interface{}, queryParams url.Values, headers map[string]interface{}, needAuth bool) error
CallAPIWithContext is the lowest level call helper. If needAuth is true, inject authentication headers and sign the request.
Request signature is a sha1 hash on following fields, joined by '+': - applicationSecret (from Client instance) - consumerKey (from Client instance) - capitalized method (from arguments) - full request url, including any query string argument - full serialized request body - server current time (takes time delta into account)
Context is used by http.Client to handle context cancelation ¶
Call will automatically assemble the target url from the endpoint configured in the client instance and the path argument. If the reqBody argument is not nil, it will also serialize it as json and inject the required Content-Type header.
If everything went fine, unmarshall response into result and return nil otherwise, return the error
func (*Client) CreateNodePool ¶
func (c *Client) CreateNodePool(ctx context.Context, projectID string, clusterID string, opts *CreateNodePoolOpts) (*NodePool, error)
CreateNodePool allows to creates a node pool in a cluster
func (*Client) DeleteNodePool ¶
func (c *Client) DeleteNodePool(ctx context.Context, projectID string, clusterID string, poolID string) (*NodePool, error)
DeleteNodePool allows to delete a specific node pool
func (*Client) DeleteUnAuth ¶
DeleteUnAuth is a wrapper for the unauthenticated DELETE method
func (*Client) DeleteUnAuthWithContext ¶
func (c *Client) DeleteUnAuthWithContext(ctx context.Context, url string, result interface{}, queryParams url.Values) error
DeleteUnAuthWithContext is a wrapper for the unauthenticated DELETE method
func (*Client) DeleteWithContext ¶
func (c *Client) DeleteWithContext(ctx context.Context, url string, result interface{}, queryParams url.Values) error
DeleteWithContext is a wrapper for the DELETE method
func (*Client) GetNodePool ¶
func (c *Client) GetNodePool(ctx context.Context, projectID string, clusterID string, poolID string) (*NodePool, error)
GetNodePool allows to display information for a specific node pool
func (*Client) GetUnAuthWithContext ¶
func (c *Client) GetUnAuthWithContext(ctx context.Context, url string, result interface{}, queryParams url.Values) error
GetUnAuthWithContext is a wrapper for the unauthenticated GET method
func (*Client) GetWithContext ¶
func (c *Client) GetWithContext(ctx context.Context, url string, result interface{}, queryParams url.Values) error
GetWithContext is a wrapper for the GET method
func (*Client) ListClusterFlavors ¶
func (c *Client) ListClusterFlavors(ctx context.Context, projectID string, clusterID string) ([]Flavor, error)
ListClusterFlavors allows to display flavors available for nodes templates
func (*Client) ListNodePoolNodes ¶
func (c *Client) ListNodePoolNodes(ctx context.Context, projectID string, clusterID string, poolID string) ([]Node, error)
ListNodePoolNodes allows to display nodes contained in a parent node pool
func (*Client) ListNodePools ¶
func (c *Client) ListNodePools(ctx context.Context, projectID, clusterID string) ([]NodePool, error)
ListNodePools allows to list all node pools available in a cluster
func (*Client) NewCkRequest ¶
NewCkRequest helps create a new ck request
func (*Client) NewCkRequestWithRedirection ¶
NewCkRequestWithRedirection helps create a new ck request with a redirect URL
func (*Client) NewRequest ¶
func (c *Client) NewRequest(method, path string, reqBody interface{}, queryParams url.Values, headers map[string]interface{}, needAuth bool) (*http.Request, error)
NewRequest returns a new HTTP request
func (*Client) Ping ¶
Ping performs a ping to OVH API. In fact, ping is just a /auth/time call, in order to check if API is up.
func (*Client) PostUnAuth ¶
PostUnAuth is a wrapper for the unauthenticated POST method
func (*Client) PostUnAuthWithContext ¶
func (c *Client) PostUnAuthWithContext(ctx context.Context, url string, reqBody, result interface{}, queryParams url.Values) error
PostUnAuthWithContext is a wrapper for the unauthenticated POST method
func (*Client) PostWithContext ¶
func (c *Client) PostWithContext(ctx context.Context, url string, reqBody, result interface{}, queryParams url.Values) error
PostWithContext is a wrapper for the POST method
func (*Client) PutUnAuthWithContext ¶
func (c *Client) PutUnAuthWithContext(ctx context.Context, url string, reqBody, result interface{}, queryParams url.Values) error
PutUnAuthWithContext is a wrapper for the unauthenticated PUT method
func (*Client) PutWithContext ¶
func (c *Client) PutWithContext(ctx context.Context, url string, reqBody, result interface{}, queryParams url.Values) error
PutWithContext is a wrapper for the PUT method
func (*Client) TimeDelta ¶
TimeDelta represents the delay between the machine that runs the code and the OVH API. The delay shouldn't change, let's do it only once.
func (*Client) UnmarshalResponse ¶
UnmarshalResponse checks the response and unmarshals it into the response type if needed Helper function, called from CallAPI
type ClientMock ¶
ClientMock mocks the API client
func (*ClientMock) CreateNodePool ¶
func (m *ClientMock) CreateNodePool(ctx context.Context, projectID string, clusterID string, opts *CreateNodePoolOpts) (*NodePool, error)
CreateNodePool mocks API call for creating a new pool
func (*ClientMock) DeleteNodePool ¶
func (m *ClientMock) DeleteNodePool(ctx context.Context, projectID string, clusterID string, poolID string) (*NodePool, error)
DeleteNodePool mocks API call to delete an existing pool
func (*ClientMock) ListClusterFlavors ¶
func (m *ClientMock) ListClusterFlavors(ctx context.Context, projectID string, clusterID string) ([]Flavor, error)
ListClusterFlavors mocks API call for listing available flavors in cluster
func (*ClientMock) ListNodePoolNodes ¶
func (m *ClientMock) ListNodePoolNodes(ctx context.Context, projectID string, clusterID string, poolID string) ([]Node, error)
ListNodePoolNodes mocks API call for listing node in a pool
func (*ClientMock) ListNodePools ¶
func (m *ClientMock) ListNodePools(ctx context.Context, projectID string, clusterID string) ([]NodePool, error)
ListNodePools mocks API call for listing node pool in cluster
func (*ClientMock) UpdateNodePool ¶
func (m *ClientMock) UpdateNodePool(ctx context.Context, projectID string, clusterID string, poolID string, opts *UpdateNodePoolOpts) (*NodePool, error)
UpdateNodePool mocks API call to update size of a pool
type CreateNodePoolOpts ¶
type CreateNodePoolOpts struct { Name *string `json:"name,omitempty"` FlavorName string `json:"flavorName"` Autoscale bool `json:"autoscale"` MonthlyBilled bool `json:"monthlyBilled"` AntiAffinity bool `json:"antiAffinity"` DesiredNodes *uint32 `json:"desiredNodes,omitempty"` MinNodes *uint32 `json:"minNodes,omitempty"` MaxNodes *uint32 `json:"maxNodes,omitempty"` }
CreateNodePoolOpts defines required fields to create a node pool
type Flavor ¶
type Flavor struct { Name string `json:"name"` Category string `json:"category"` State string `json:"state"` VCPUs int `json:"vCPUs"` GPUs int `json:"gpus"` RAM int `json:"ram"` }
Flavor defines instances types available on OVHcloud
type Logger ¶
type Logger interface { // LogRequest logs an HTTP request. LogRequest(*http.Request) // LogResponse logs an HTTP response. LogResponse(*http.Response) }
Logger is the interface that should be implemented for loggers that wish to log HTTP requests and HTTP responses.
type Node ¶
type Node struct { ID string `json:"id"` InstanceID string `json:"instanceId"` NodePoolID string `json:"nodePoolId"` ProjectID string `json:"projectId"` Name string `json:"name"` Flavor string `json:"flavor"` Version string `json:"version"` UpToDate bool `json:"isUpToDate"` Status string `json:"status"` IP *string `json:"ip,omitempty"` PrivateIP *string `json:"privateIp,omitempty"` CreatedAt time.Time `json:"createdAt"` DeployedAt time.Time `json:"deployedAt"` UpdatedAt time.Time `json:"updatedAt"` }
Node defines the instance deployed on OVHcloud
type NodePool ¶
type NodePool struct { ID string `json:"id"` ProjectID string `json:"projectId"` Name string `json:"name"` Flavor string `json:"flavor"` Status string `json:"status"` SizeStatus string `json:"sizeStatus"` Autoscale bool `json:"autoscale"` MonthlyBilled bool `json:"monthlyBilled"` AntiAffinity bool `json:"antiAffinity"` DesiredNodes uint32 `json:"desiredNodes"` MinNodes uint32 `json:"minNodes"` MaxNodes uint32 `json:"maxNodes"` CurrentNodes uint32 `json:"currentNodes"` AvailableNodes uint32 `json:"availableNodes"` UpToDateNodes uint32 `json:"upToDateNodes"` Autoscaling *NodePoolAutoscaling `json:"autoscaling,omitempty"` Template struct { Metadata struct { Labels map[string]string `json:"labels"` Annotations map[string]string `json:"annotations"` Finalizers []string `json:"finalizers"` } `json:"metadata"` Spec struct { Unschedulable bool `json:"unschedulable"` Taints []v1.Taint `json:"taints"` } `json:"spec"` } `json:"template"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` }
NodePool defines the nodes group deployed on OVHcloud
type NodePoolAutoscaling ¶
type NodePoolAutoscaling struct { CpuMin float32 `json:"cpuMin"` CpuMax float32 `json:"cpuMax"` MemoryMin float32 `json:"memoryMin"` MemoryMax float32 `json:"memoryMax"` ScaleDownUtilizationThreshold float32 `json:"scaleDownUtilizationThreshold"` ScaleDownUnneededTimeSeconds int32 `json:"scaleDownUnneededTimeSeconds"` ScaleDownUnreadyTimeSeconds int32 `json:"scaleDownUnreadyTimeSeconds"` }
NodePoolAutoscaling defines the node group autoscaling options from OVHcloud API
type OpenStackProvider ¶
type OpenStackProvider struct { AuthUrl string Token string // contains filtered or unexported fields }
OpenStackProvider defines a custom OpenStack provider with a token to re-authenticate
func NewOpenStackProvider ¶
func NewOpenStackProvider(authUrl string, username string, password string, domain string, tenant string) (*OpenStackProvider, error)
NewOpenStackProvider initializes a client/token pair to interact with OpenStack
func (*OpenStackProvider) IsTokenExpired ¶
func (p *OpenStackProvider) IsTokenExpired() bool
IsTokenExpired checks if the current token is expired
func (*OpenStackProvider) ReauthenticateToken ¶
func (p *OpenStackProvider) ReauthenticateToken() error
ReauthenticateToken revoke the current provider token and re-create a new one
type UpdateNodePoolOpts ¶
type UpdateNodePoolOpts struct { DesiredNodes *uint32 `json:"desiredNodes,omitempty"` MinNodes *uint32 `json:"minNodes,omitempty"` MaxNodes *uint32 `json:"maxNodes,omitempty"` Autoscale *bool `json:"autoscale,omitempty"` NodesToRemove []string `json:"nodesToRemove,omitempty"` }
UpdateNodePoolOpts defines required fields to update a node pool