Skip to content

Commit

Permalink
Add Snapshot Repository API (#508)
Browse files Browse the repository at this point in the history
  • Loading branch information
Martin Häger authored and olivere committed Apr 10, 2017
1 parent 3e782b7 commit 10be2b8
Show file tree
Hide file tree
Showing 9 changed files with 673 additions and 4 deletions.
24 changes: 20 additions & 4 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1631,14 +1631,30 @@ func (c *Client) TasksList() *TasksListService {
// -- Snapshot and Restore --

// TODO Snapshot Create
// TODO Snapshot Create Repository
// TODO Snapshot Delete
// TODO Snapshot Delete Repository
// TODO Snapshot Get
// TODO Snapshot Get Repository
// TODO Snapshot Restore
// TODO Snapshot Status
// TODO Snapshot Verify Repository

// SnapshotCreateRepository creates or updates a snapshot repository.
func (c *Client) SnapshotCreateRepository(repository string) *SnapshotCreateRepositoryService {
return NewSnapshotCreateRepositoryService(c).Repository(repository)
}

// SnapshotDeleteRepository deletes a snapshot repository.
func (c *Client) SnapshotDeleteRepository(repositories ...string) *SnapshotDeleteRepositoryService {
return NewSnapshotDeleteRepositoryService(c).Repository(repositories...)
}

// SnapshotGetRepository gets a snapshot repository.
func (c *Client) SnapshotGetRepository(repositories ...string) *SnapshotGetRepositoryService {
return NewSnapshotGetRepositoryService(c).Repository(repositories...)
}

// SnapshotVerifyRepository verifies a snapshot repository.
func (c *Client) SnapshotVerifyRepository(repository string) *SnapshotVerifyRepositoryService {
return NewSnapshotVerifyRepositoryService(c).Repository(repository)
}

// -- Helpers and shortcuts --

Expand Down
157 changes: 157 additions & 0 deletions snapshot_create_repository.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
// Copyright 2012-2017 Oliver Eilhard. All rights reserved.
// Use of this source code is governed by a MIT-license.
// See http://olivere.mit-license.org/license.txt for details.

package elastic

import (
"context"
"encoding/json"
"fmt"
"net/url"

"gopkg.in/olivere/elastic.v5/uritemplates"
)

// SnapshotCreateRepositoryService is documented at https://www.elastic.co/guide/en/elasticsearch/reference/5.x/modules-snapshots.html.
type SnapshotCreateRepositoryService struct {
client *Client
pretty bool
repository string
masterTimeout string
timeout string
verify *bool
bodyJson interface{}
bodyString string
}

// NewSnapshotCreateRepositoryService creates a new SnapshotCreateRepositoryService.
func NewSnapshotCreateRepositoryService(client *Client) *SnapshotCreateRepositoryService {
return &SnapshotCreateRepositoryService{
client: client,
}
}

// Repository is documented as: A repository name.
func (s *SnapshotCreateRepositoryService) Repository(repository string) *SnapshotCreateRepositoryService {
s.repository = repository
return s
}

// MasterTimeout is documented as: Explicit operation timeout for connection to master node.
func (s *SnapshotCreateRepositoryService) MasterTimeout(masterTimeout string) *SnapshotCreateRepositoryService {
s.masterTimeout = masterTimeout
return s
}

// Timeout is documented as: Explicit operation timeout.
func (s *SnapshotCreateRepositoryService) Timeout(timeout string) *SnapshotCreateRepositoryService {
s.timeout = timeout
return s
}

// Verify is documented as: Whether to verify the repository after creation.
func (s *SnapshotCreateRepositoryService) Verify(verify bool) *SnapshotCreateRepositoryService {
s.verify = &verify
return s
}

// Pretty indicates that the JSON response be indented and human readable.
func (s *SnapshotCreateRepositoryService) Pretty(pretty bool) *SnapshotCreateRepositoryService {
s.pretty = pretty
return s
}

// BodyJson is documented as: The repository definition.
func (s *SnapshotCreateRepositoryService) BodyJson(body interface{}) *SnapshotCreateRepositoryService {
s.bodyJson = body
return s
}

// BodyString is documented as: The repository definition.
func (s *SnapshotCreateRepositoryService) BodyString(body string) *SnapshotCreateRepositoryService {
s.bodyString = body
return s
}

// buildURL builds the URL for the operation.
func (s *SnapshotCreateRepositoryService) buildURL() (string, url.Values, error) {
// Build URL
path, err := uritemplates.Expand("/_snapshot/{repository}", map[string]string{
"repository": s.repository,
})
if err != nil {
return "", url.Values{}, err
}

// Add query string parameters
params := url.Values{}
if s.pretty {
params.Set("pretty", "1")
}
if s.masterTimeout != "" {
params.Set("master_timeout", s.masterTimeout)
}
if s.timeout != "" {
params.Set("timeout", s.timeout)
}
if s.verify != nil {
params.Set("verify", fmt.Sprintf("%v", *s.verify))
}
return path, params, nil
}

// Validate checks if the operation is valid.
func (s *SnapshotCreateRepositoryService) Validate() error {
var invalid []string
if s.repository == "" {
invalid = append(invalid, "Repository")
}
if s.bodyString == "" && s.bodyJson == nil {
invalid = append(invalid, "BodyJson")
}
if len(invalid) > 0 {
return fmt.Errorf("missing required fields: %v", invalid)
}
return nil
}

// Do executes the operation.
func (s *SnapshotCreateRepositoryService) Do(ctx context.Context) (*SnapshotCreateRepositoryResponse, error) {
// Check pre-conditions
if err := s.Validate(); err != nil {
return nil, err
}

// Get URL for request
path, params, err := s.buildURL()
if err != nil {
return nil, err
}

// Setup HTTP request body
var body interface{}
if s.bodyJson != nil {
body = s.bodyJson
} else {
body = s.bodyString
}

// Get HTTP response
res, err := s.client.PerformRequest(ctx, "PUT", path, params, body)
if err != nil {
return nil, err
}

// Return operation response
ret := new(SnapshotCreateRepositoryResponse)
if err := json.Unmarshal(res.Body, ret); err != nil {
return nil, err
}
return ret, nil
}

// SnapshotCreateRepositoryResponse is the response of SnapshotCreateRepositoryService.Do.
type SnapshotCreateRepositoryResponse struct {
Acknowledged bool `json:"acknowledged"`
}
27 changes: 27 additions & 0 deletions snapshot_create_repository_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package elastic

import "testing"

func TestSnapshotPutRepositoryURL(t *testing.T) {
client := setupTestClient(t)

tests := []struct {
Repository string
Expected string
}{
{
"repo",
"/_snapshot/repo",
},
}

for _, test := range tests {
path, _, err := client.SnapshotCreateRepository(test.Repository).buildURL()
if err != nil {
t.Fatal(err)
}
if path != test.Expected {
t.Errorf("expected %q; got: %q", test.Expected, path)
}
}
}
124 changes: 124 additions & 0 deletions snapshot_delete_repository.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// Copyright 2012-2017 Oliver Eilhard. All rights reserved.
// Use of this source code is governed by a MIT-license.
// See http://olivere.mit-license.org/license.txt for details.

package elastic

import (
"context"
"encoding/json"
"fmt"
"net/url"
"strings"

"gopkg.in/olivere/elastic.v5/uritemplates"
)

// SnapshotDeleteRepositoryService is documented at https://www.elastic.co/guide/en/elasticsearch/reference/5.x/modules-snapshots.html.
type SnapshotDeleteRepositoryService struct {
client *Client
pretty bool
repository []string
masterTimeout string
timeout string
}

// NewSnapshotDeleteRepositoryService creates a new SnapshotDeleteRepositoryService.
func NewSnapshotDeleteRepositoryService(client *Client) *SnapshotDeleteRepositoryService {
return &SnapshotDeleteRepositoryService{
client: client,
repository: make([]string, 0),
}
}

// Repository is documented as: A comma-separated list of repository names.
func (s *SnapshotDeleteRepositoryService) Repository(repositories ...string) *SnapshotDeleteRepositoryService {
s.repository = append(s.repository, repositories...)
return s
}

// MasterTimeout is documented as: Explicit operation timeout for connection to master node.
func (s *SnapshotDeleteRepositoryService) MasterTimeout(masterTimeout string) *SnapshotDeleteRepositoryService {
s.masterTimeout = masterTimeout
return s
}

// Timeout is documented as: Explicit operation timeout.
func (s *SnapshotDeleteRepositoryService) Timeout(timeout string) *SnapshotDeleteRepositoryService {
s.timeout = timeout
return s
}

// Pretty indicates that the JSON response be indented and human readable.
func (s *SnapshotDeleteRepositoryService) Pretty(pretty bool) *SnapshotDeleteRepositoryService {
s.pretty = pretty
return s
}

// buildURL builds the URL for the operation.
func (s *SnapshotDeleteRepositoryService) buildURL() (string, url.Values, error) {
// Build URL
path, err := uritemplates.Expand("/_snapshot/{repository}", map[string]string{
"repository": strings.Join(s.repository, ","),
})
if err != nil {
return "", url.Values{}, err
}

// Add query string parameters
params := url.Values{}
if s.pretty {
params.Set("pretty", "1")
}
if s.masterTimeout != "" {
params.Set("master_timeout", s.masterTimeout)
}
if s.timeout != "" {
params.Set("timeout", s.timeout)
}
return path, params, nil
}

// Validate checks if the operation is valid.
func (s *SnapshotDeleteRepositoryService) Validate() error {
var invalid []string
if len(s.repository) == 0 {
invalid = append(invalid, "Repository")
}
if len(invalid) > 0 {
return fmt.Errorf("missing required fields: %v", invalid)
}
return nil
}

// Do executes the operation.
func (s *SnapshotDeleteRepositoryService) Do(ctx context.Context) (*SnapshotDeleteRepositoryResponse, error) {
// Check pre-conditions
if err := s.Validate(); err != nil {
return nil, err
}

// Get URL for request
path, params, err := s.buildURL()
if err != nil {
return nil, err
}

// Get HTTP response
res, err := s.client.PerformRequest(ctx, "DELETE", path, params, nil)
if err != nil {
return nil, err
}

// Return operation response
ret := new(SnapshotDeleteRepositoryResponse)
if err := json.Unmarshal(res.Body, ret); err != nil {
return nil, err
}
return ret, nil
}

// SnapshotDeleteRepositoryResponse is the response of SnapshotDeleteRepositoryService.Do.
type SnapshotDeleteRepositoryResponse struct {
Acknowledged bool `json:"acknowledged"`
}
31 changes: 31 additions & 0 deletions snapshot_delete_repository_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package elastic

import "testing"

func TestSnapshotDeleteRepositoryURL(t *testing.T) {
client := setupTestClient(t)

tests := []struct {
Repository []string
Expected string
}{
{
[]string{"repo1"},
"/_snapshot/repo1",
},
{
[]string{"repo1", "repo2"},
"/_snapshot/repo1%2Crepo2",
},
}

for _, test := range tests {
path, _, err := client.SnapshotDeleteRepository(test.Repository...).buildURL()
if err != nil {
t.Fatal(err)
}
if path != test.Expected {
t.Errorf("expected %q; got: %q", test.Expected, path)
}
}
}
Loading

0 comments on commit 10be2b8

Please sign in to comment.