/vendor/github.com/quobyte/api/quobyte.go

https://github.com/turbonomic/kubeturbo · Go · 245 lines · 185 code · 39 blank · 21 comment · 33 complexity · 717b96339341b6c08b0b662c9365580d MD5 · raw file

  1. // Package quobyte represents a golang API for the Quobyte Storage System
  2. package quobyte
  3. import (
  4. "net/http"
  5. "regexp"
  6. )
  7. // retry policy codes
  8. const (
  9. RetryNever string = "NEVER"
  10. RetryInteractive string = "INTERACTIVE"
  11. RetryInfinitely string = "INFINITELY"
  12. RetryOncePerTarget string = "ONCE_PER_TARGET"
  13. )
  14. var UUIDValidator = regexp.MustCompile("^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[8|9|aA|bB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$")
  15. type QuobyteClient struct {
  16. client *http.Client
  17. url string
  18. username string
  19. password string
  20. apiRetryPolicy string
  21. }
  22. func (client *QuobyteClient) SetAPIRetryPolicy(retry string) {
  23. client.apiRetryPolicy = retry
  24. }
  25. func (client *QuobyteClient) GetAPIRetryPolicy() string {
  26. return client.apiRetryPolicy
  27. }
  28. func (client *QuobyteClient) SetTransport(t http.RoundTripper) {
  29. client.client.Transport = t
  30. }
  31. // NewQuobyteClient creates a new Quobyte API client
  32. func NewQuobyteClient(url string, username string, password string) *QuobyteClient {
  33. return &QuobyteClient{
  34. client: &http.Client{},
  35. url: url,
  36. username: username,
  37. password: password,
  38. apiRetryPolicy: RetryInteractive,
  39. }
  40. }
  41. // CreateVolume creates a new Quobyte volume. Its root directory will be owned by given user and group
  42. func (client QuobyteClient) CreateVolume(request *CreateVolumeRequest) (string, error) {
  43. var response volumeUUID
  44. tenantUUID, err := client.GetTenantUUID(request.TenantID)
  45. if err != nil {
  46. return "", err
  47. }
  48. request.TenantID = tenantUUID
  49. if err = client.sendRequest("createVolume", request, &response); err != nil {
  50. return "", err
  51. }
  52. return response.VolumeUUID, nil
  53. }
  54. // GetVolumeUUID resolves the volumeUUID for the given volume and tenant name.
  55. // This method should be used when it is not clear if the given string is volume UUID or Name.
  56. func (client QuobyteClient) GetVolumeUUID(volume, tenant string) (string, error) {
  57. if len(volume) != 0 && !IsValidUUID(volume) {
  58. tenantUUID, err := client.GetTenantUUID(tenant)
  59. if err != nil {
  60. return "", err
  61. }
  62. volUUID, err := client.ResolveVolumeNameToUUID(volume, tenantUUID)
  63. if err != nil {
  64. return "", err
  65. }
  66. return volUUID, nil
  67. }
  68. return volume, nil
  69. }
  70. // GetTenantUUID resolves the tenatnUUID for the given name
  71. // This method should be used when it is not clear if the given string is Tenant UUID or Name.
  72. func (client QuobyteClient) GetTenantUUID(tenant string) (string, error) {
  73. if len(tenant) != 0 && !IsValidUUID(tenant) {
  74. tenantUUID, err := client.ResolveTenantNameToUUID(tenant)
  75. if err != nil {
  76. return "", err
  77. }
  78. return tenantUUID, nil
  79. }
  80. return tenant, nil
  81. }
  82. // ResolveVolumeNameToUUID resolves a volume name to a UUID
  83. func (client *QuobyteClient) ResolveVolumeNameToUUID(volumeName, tenant string) (string, error) {
  84. request := &resolveVolumeNameRequest{
  85. VolumeName: volumeName,
  86. TenantDomain: tenant,
  87. }
  88. var response volumeUUID
  89. if err := client.sendRequest("resolveVolumeName", request, &response); err != nil {
  90. return "", err
  91. }
  92. return response.VolumeUUID, nil
  93. }
  94. // DeleteVolumeByResolvingNamesToUUID deletes the volume by resolving the volume name and tenant name to
  95. // respective UUID if required.
  96. // This method should be used if the given volume, tenant information is name or UUID.
  97. func (client *QuobyteClient) DeleteVolumeByResolvingNamesToUUID(volume, tenant string) error {
  98. volumeUUID, err := client.GetVolumeUUID(volume, tenant)
  99. if err != nil {
  100. return err
  101. }
  102. return client.DeleteVolume(volumeUUID)
  103. }
  104. // DeleteVolume deletes a Quobyte volume
  105. func (client *QuobyteClient) DeleteVolume(UUID string) error {
  106. return client.sendRequest(
  107. "deleteVolume",
  108. &volumeUUID{
  109. VolumeUUID: UUID,
  110. },
  111. nil)
  112. }
  113. // DeleteVolumeByName deletes a volume by a given name
  114. func (client *QuobyteClient) DeleteVolumeByName(volumeName, tenant string) error {
  115. uuid, err := client.ResolveVolumeNameToUUID(volumeName, tenant)
  116. if err != nil {
  117. return err
  118. }
  119. return client.DeleteVolume(uuid)
  120. }
  121. // GetClientList returns a list of all active clients
  122. func (client *QuobyteClient) GetClientList(tenant string) (GetClientListResponse, error) {
  123. request := &getClientListRequest{
  124. TenantDomain: tenant,
  125. }
  126. var response GetClientListResponse
  127. if err := client.sendRequest("getClientListRequest", request, &response); err != nil {
  128. return response, err
  129. }
  130. return response, nil
  131. }
  132. // SetVolumeQuota sets a Quota to the specified Volume
  133. func (client *QuobyteClient) SetVolumeQuota(volumeUUID string, quotaSize uint64) error {
  134. request := &setQuotaRequest{
  135. Quotas: []*quota{
  136. &quota{
  137. Consumer: []*consumingEntity{
  138. &consumingEntity{
  139. Type: "VOLUME",
  140. Identifier: volumeUUID,
  141. },
  142. },
  143. Limits: []*resource{
  144. &resource{
  145. Type: "LOGICAL_DISK_SPACE",
  146. Value: quotaSize,
  147. },
  148. },
  149. },
  150. },
  151. }
  152. return client.sendRequest("setQuota", request, nil)
  153. }
  154. // GetTenant returns the Tenant configuration for all specified tenants
  155. func (client *QuobyteClient) GetTenant(tenantIDs []string) (GetTenantResponse, error) {
  156. request := &getTenantRequest{TenantIDs: tenantIDs}
  157. var response GetTenantResponse
  158. err := client.sendRequest("getTenant", request, &response)
  159. if err != nil {
  160. return response, err
  161. }
  162. return response, nil
  163. }
  164. // GetTenantMap returns a map that contains all tenant names and there ID's
  165. func (client *QuobyteClient) GetTenantMap() (map[string]string, error) {
  166. result := map[string]string{}
  167. response, err := client.GetTenant([]string{})
  168. if err != nil {
  169. return result, err
  170. }
  171. for _, tenant := range response.Tenants {
  172. result[tenant.Name] = tenant.TenantID
  173. }
  174. return result, nil
  175. }
  176. // SetTenant creates a Tenant with the specified name
  177. func (client *QuobyteClient) SetTenant(tenantName string) (string, error) {
  178. request := &setTenantRequest{
  179. &TenantDomainConfiguration{
  180. Name: tenantName,
  181. },
  182. retryPolicy{client.GetAPIRetryPolicy()},
  183. }
  184. var response setTenantResponse
  185. err := client.sendRequest("setTenant", request, &response)
  186. if err != nil {
  187. return "", err
  188. }
  189. return response.TenantID, nil
  190. }
  191. // IsValidUUID Validates the given uuid
  192. func IsValidUUID(uuid string) bool {
  193. return UUIDValidator.MatchString(uuid)
  194. }
  195. // ResolveTenantNameToUUID Returns UUID for given name, error if not found.
  196. func (client *QuobyteClient) ResolveTenantNameToUUID(name string) (string, error) {
  197. request := &resolveTenantNameRequest{
  198. TenantName: name,
  199. }
  200. var response resolveTenantNameResponse
  201. err := client.sendRequest("resolveTenantName", request, &response)
  202. if err != nil {
  203. return "", err
  204. }
  205. return response.TenantID, nil
  206. }