New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add new component template APIs #1458
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// Copyright 2012-present 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" | ||
"testing" | ||
) | ||
|
||
func TestComponentTemplatesLifecycle(t *testing.T) { | ||
client := setupTestClientAndCreateIndex(t) | ||
|
||
const templateName = "template_1" | ||
|
||
// Always make sure the component template is deleted | ||
defer func() { | ||
_, _ = client.IndexDeleteComponentTemplate(templateName).Pretty(true).Do(context.Background()) | ||
}() | ||
|
||
// Create an component template | ||
{ | ||
resp, err := client.IndexPutComponentTemplate(templateName).Pretty(true).BodyString(`{ | ||
"template": { | ||
"settings": { | ||
"number_of_shards": 2, | ||
"number_of_replicas": 0 | ||
}, | ||
"mappings": { | ||
"_source": { "enabled": true } | ||
} | ||
} | ||
}`).Do(context.Background()) | ||
if err != nil { | ||
t.Fatalf("expected to successfully create component template, got %v", err) | ||
} | ||
if resp == nil { | ||
t.Fatal("expected response on creating component template") | ||
} | ||
if want, have := true, resp.Acknowledged; want != have { | ||
t.Errorf("expected Acknowledged=%v, got %v", want, have) | ||
} | ||
} | ||
|
||
// Get the component template | ||
{ | ||
resp, err := client.IndexGetComponentTemplate(templateName).Pretty(true).Do(context.Background()) | ||
if err != nil { | ||
t.Fatalf("expected to successfully get component template, got %v", err) | ||
} | ||
if resp == nil { | ||
t.Fatal("expected response on getting component template") | ||
} | ||
} | ||
|
||
// Delete the component template | ||
{ | ||
resp, err := client.IndexDeleteComponentTemplate(templateName).Pretty(true).Do(context.Background()) | ||
if err != nil { | ||
t.Fatalf("expected to successfully delete component template, got %v", err) | ||
} | ||
if resp == nil { | ||
t.Fatal("expected response on deleting component template") | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
// Copyright 2012-present 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" | ||
"fmt" | ||
"net/http" | ||
"net/url" | ||
"strings" | ||
|
||
"github.com/olivere/elastic/v7/uritemplates" | ||
) | ||
|
||
// IndicesDeleteComponentTemplateService deletes component templates. | ||
// | ||
// See https://www.elastic.co/guide/en/elasticsearch/reference/7.10/indices-delete-component-template.html | ||
// for more details. | ||
type IndicesDeleteComponentTemplateService struct { | ||
client *Client | ||
|
||
pretty *bool // pretty format the returned JSON response | ||
human *bool // return human readable values for statistics | ||
errorTrace *bool // include the stack trace of returned errors | ||
filterPath []string // list of filters used to reduce the response | ||
headers http.Header // custom request-level HTTP headers | ||
|
||
name string | ||
timeout string | ||
masterTimeout string | ||
} | ||
|
||
// NewIndicesDeleteComponentTemplateService creates a new IndicesDeleteComponentTemplateService. | ||
func NewIndicesDeleteComponentTemplateService(client *Client) *IndicesDeleteComponentTemplateService { | ||
return &IndicesDeleteComponentTemplateService{ | ||
client: client, | ||
} | ||
} | ||
|
||
// Pretty tells Elasticsearch whether to return a formatted JSON response. | ||
func (s *IndicesDeleteComponentTemplateService) Pretty(pretty bool) *IndicesDeleteComponentTemplateService { | ||
s.pretty = &pretty | ||
return s | ||
} | ||
|
||
// Human specifies whether human readable values should be returned in | ||
// the JSON response, e.g. "7.5mb". | ||
func (s *IndicesDeleteComponentTemplateService) Human(human bool) *IndicesDeleteComponentTemplateService { | ||
s.human = &human | ||
return s | ||
} | ||
|
||
// ErrorTrace specifies whether to include the stack trace of returned errors. | ||
func (s *IndicesDeleteComponentTemplateService) ErrorTrace(errorTrace bool) *IndicesDeleteComponentTemplateService { | ||
s.errorTrace = &errorTrace | ||
return s | ||
} | ||
|
||
// FilterPath specifies a list of filters used to reduce the response. | ||
func (s *IndicesDeleteComponentTemplateService) FilterPath(filterPath ...string) *IndicesDeleteComponentTemplateService { | ||
s.filterPath = filterPath | ||
return s | ||
} | ||
|
||
// Header adds a header to the request. | ||
func (s *IndicesDeleteComponentTemplateService) Header(name string, value string) *IndicesDeleteComponentTemplateService { | ||
if s.headers == nil { | ||
s.headers = http.Header{} | ||
} | ||
s.headers.Add(name, value) | ||
return s | ||
} | ||
|
||
// Headers specifies the headers of the request. | ||
func (s *IndicesDeleteComponentTemplateService) Headers(headers http.Header) *IndicesDeleteComponentTemplateService { | ||
s.headers = headers | ||
return s | ||
} | ||
|
||
// Name is the name of the template. | ||
func (s *IndicesDeleteComponentTemplateService) Name(name string) *IndicesDeleteComponentTemplateService { | ||
s.name = name | ||
return s | ||
} | ||
|
||
// Timeout is an explicit operation timeout. | ||
func (s *IndicesDeleteComponentTemplateService) Timeout(timeout string) *IndicesDeleteComponentTemplateService { | ||
s.timeout = timeout | ||
return s | ||
} | ||
|
||
// MasterTimeout specifies the timeout for connection to master. | ||
func (s *IndicesDeleteComponentTemplateService) MasterTimeout(masterTimeout string) *IndicesDeleteComponentTemplateService { | ||
s.masterTimeout = masterTimeout | ||
return s | ||
} | ||
|
||
// buildURL builds the URL for the operation. | ||
func (s *IndicesDeleteComponentTemplateService) buildURL() (string, url.Values, error) { | ||
// Build URL | ||
path, err := uritemplates.Expand("/_component_template/{name}", map[string]string{ | ||
"name": s.name, | ||
}) | ||
if err != nil { | ||
return "", url.Values{}, err | ||
} | ||
|
||
// Add query string parameters | ||
params := url.Values{} | ||
if v := s.pretty; v != nil { | ||
params.Set("pretty", fmt.Sprint(*v)) | ||
} | ||
if v := s.human; v != nil { | ||
params.Set("human", fmt.Sprint(*v)) | ||
} | ||
if v := s.errorTrace; v != nil { | ||
params.Set("error_trace", fmt.Sprint(*v)) | ||
} | ||
if len(s.filterPath) > 0 { | ||
params.Set("filter_path", strings.Join(s.filterPath, ",")) | ||
} | ||
if s.timeout != "" { | ||
params.Set("timeout", s.timeout) | ||
} | ||
if s.masterTimeout != "" { | ||
params.Set("master_timeout", s.masterTimeout) | ||
} | ||
return path, params, nil | ||
} | ||
|
||
// Validate checks if the operation is valid. | ||
func (s *IndicesDeleteComponentTemplateService) Validate() error { | ||
var invalid []string | ||
if s.name == "" { | ||
invalid = append(invalid, "Name") | ||
} | ||
if len(invalid) > 0 { | ||
return fmt.Errorf("missing required fields: %v", invalid) | ||
} | ||
return nil | ||
} | ||
|
||
// Do executes the operation. | ||
func (s *IndicesDeleteComponentTemplateService) Do(ctx context.Context) (*IndicesDeleteComponentTemplateResponse, 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, PerformRequestOptions{ | ||
Method: "DELETE", | ||
Path: path, | ||
Params: params, | ||
Headers: s.headers, | ||
}) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
// Return operation response | ||
ret := new(IndicesDeleteComponentTemplateResponse) | ||
if err := s.client.decoder.Decode(res.Body, ret); err != nil { | ||
return nil, err | ||
} | ||
return ret, nil | ||
} | ||
|
||
// IndicesDeleteComponentTemplateResponse is the response of IndicesDeleteComponentTemplateService.Do. | ||
type IndicesDeleteComponentTemplateResponse struct { | ||
Acknowledged bool `json:"acknowledged"` | ||
ShardsAcknowledged bool `json:"shards_acknowledged"` | ||
Index string `json:"index,omitempty"` | ||
Comment on lines
+180
to
+181
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I copied this from indices_delete_index_template.go but I didn't know where to check if these fields can appear in a response (they don't when I do a simple request to the API). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I guess only the |
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A Test Case for a missing template would be nice :)