Skip to content

Commit

Permalink
refactor: improve all the context handling in k8s creation (#129)
Browse files Browse the repository at this point in the history
* improve all the context handling

Signed-off-by: sh2 <[email protected]>

* fix missing arguments

Signed-off-by: sh2 <[email protected]>

---------

Signed-off-by: sh2 <[email protected]>
  • Loading branch information
shawnh2 authored Aug 21, 2023
1 parent eb80cbd commit 519bdff
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 37 deletions.
2 changes: 1 addition & 1 deletion pkg/cmd/gtctl/cluster/create/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ func NewCluster(args []string, options ClusterCliOptions, l logger.Logger) error
ctx, cancel = context.WithTimeout(ctx, time.Duration(options.Timeout)*time.Second)
defer cancel()
}
ctx, stop := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM)
ctx, stop := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
defer stop()

clusterDeployer, err := newDeployer(l, clusterName, &options)
Expand Down
36 changes: 18 additions & 18 deletions pkg/deployer/k8s/deployer.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,17 +121,17 @@ func (d *deployer) CreateGreptimeDBCluster(ctx context.Context, name string, opt
}
d.logger.V(3).Infof("create greptimedb cluster with values: %v", values)

downloadURL, err := d.getChartDownloadURL(GreptimeDBChartName, options.GreptimeDBChartVersion)
downloadURL, err := d.getChartDownloadURL(ctx, GreptimeDBChartName, options.GreptimeDBChartVersion)
if err != nil {
return err
}

chart, err := d.render.LoadChartFromRemoteCharts(downloadURL)
chart, err := d.render.LoadChartFromRemoteCharts(ctx, downloadURL)
if err != nil {
return err
}

manifests, err := d.render.GenerateManifests(resourceName, resourceNamespace, chart, values)
manifests, err := d.render.GenerateManifests(ctx, resourceName, resourceNamespace, chart, values)
if err != nil {
return err
}
Expand All @@ -142,11 +142,11 @@ func (d *deployer) CreateGreptimeDBCluster(ctx context.Context, name string, opt
return nil
}

if err := d.client.Apply(manifests); err != nil {
if err := d.client.Apply(ctx, manifests); err != nil {
return err
}

return d.client.WaitForClusterReady(resourceName, resourceNamespace, d.timeout)
return d.client.WaitForClusterReady(ctx, resourceName, resourceNamespace, d.timeout)
}

func (d *deployer) UpdateGreptimeDBCluster(ctx context.Context, name string, options *UpdateGreptimeDBClusterOptions) error {
Expand All @@ -164,7 +164,7 @@ func (d *deployer) UpdateGreptimeDBCluster(ctx context.Context, name string, opt
return err
}

return d.client.WaitForClusterReady(resourceName, resourceNamespace, d.timeout)
return d.client.WaitForClusterReady(ctx, resourceName, resourceNamespace, d.timeout)
}

func (d *deployer) DeleteGreptimeDBCluster(ctx context.Context, name string, options *DeleteGreptimeDBClusterOption) error {
Expand All @@ -187,17 +187,17 @@ func (d *deployer) CreateEtcdCluster(ctx context.Context, name string, options *
}
d.logger.V(3).Infof("create etcd cluster with values: %v", values)

downloadURL, err := d.getChartDownloadURL(GreptimeDBEtcdChartName, options.EtcdChartVersion)
downloadURL, err := d.getChartDownloadURL(ctx, GreptimeDBEtcdChartName, options.EtcdChartVersion)
if err != nil {
return err
}

chart, err := d.render.LoadChartFromRemoteCharts(downloadURL)
chart, err := d.render.LoadChartFromRemoteCharts(ctx, downloadURL)
if err != nil {
return err
}

manifests, err := d.render.GenerateManifests(resourceName, resourceNamespace, chart, values)
manifests, err := d.render.GenerateManifests(ctx, resourceName, resourceNamespace, chart, values)
if err != nil {
return err
}
Expand All @@ -208,11 +208,11 @@ func (d *deployer) CreateEtcdCluster(ctx context.Context, name string, options *
return nil
}

if err := d.client.Apply(manifests); err != nil {
if err := d.client.Apply(ctx, manifests); err != nil {
return err
}

return d.client.WaitForEtcdReady(resourceName, resourceNamespace, d.timeout)
return d.client.WaitForEtcdReady(ctx, resourceName, resourceNamespace, d.timeout)
}

func (d *deployer) DeleteEtcdCluster(ctx context.Context, name string, options *DeleteEtcdClusterOption) error {
Expand All @@ -236,17 +236,17 @@ func (d *deployer) CreateGreptimeDBOperator(ctx context.Context, name string, op
}
d.logger.V(3).Infof("create greptimedb-operator with values: %v", values)

downloadURL, err := d.getChartDownloadURL(GreptimeDBOperatorChartName, options.GreptimeDBOperatorChartVersion)
downloadURL, err := d.getChartDownloadURL(ctx, GreptimeDBOperatorChartName, options.GreptimeDBOperatorChartVersion)
if err != nil {
return err
}

chart, err := d.render.LoadChartFromRemoteCharts(downloadURL)
chart, err := d.render.LoadChartFromRemoteCharts(ctx, downloadURL)
if err != nil {
return err
}

manifests, err := d.render.GenerateManifests(GreptimeDBOperatorChartName, resourceNamespace, chart, values)
manifests, err := d.render.GenerateManifests(ctx, GreptimeDBOperatorChartName, resourceNamespace, chart, values)
if err != nil {
return err
}
Expand All @@ -257,11 +257,11 @@ func (d *deployer) CreateGreptimeDBOperator(ctx context.Context, name string, op
return nil
}

if err := d.client.Apply(manifests); err != nil {
if err := d.client.Apply(ctx, manifests); err != nil {
return err
}

return d.client.WaitForDeploymentReady(resourceName, resourceNamespace, d.timeout)
return d.client.WaitForDeploymentReady(ctx, resourceName, resourceNamespace, d.timeout)
}

func (d *deployer) splitNamescapedName(name string) (string, string, error) {
Expand All @@ -277,8 +277,8 @@ func (d *deployer) splitNamescapedName(name string) (string, string, error) {
return split[0], split[1], nil
}

func (d *deployer) getChartDownloadURL(chartName, version string) (string, error) {
indexFile, err := d.render.GetIndexFile(GreptimeChartIndexURL)
func (d *deployer) getChartDownloadURL(ctx context.Context, chartName, version string) (string, error) {
indexFile, err := d.render.GetIndexFile(ctx, GreptimeChartIndexURL)
if err != nil {
return "", err
}
Expand Down
25 changes: 18 additions & 7 deletions pkg/helm/helm.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const (
)

type TemplateRender interface {
GenerateManifests(releaseName, namespace string, chart *chart.Chart, values map[string]interface{}) ([]byte, error)
GenerateManifests(ctx context.Context, releaseName, namespace string, chart *chart.Chart, values map[string]interface{}) ([]byte, error)
}

type Render struct {
Expand All @@ -47,8 +47,13 @@ type Render struct {

var _ TemplateRender = &Render{}

func (r *Render) LoadChartFromRemoteCharts(downloadURL string) (*chart.Chart, error) {
rsp, err := http.Get(downloadURL)
func (r *Render) LoadChartFromRemoteCharts(ctx context.Context, downloadURL string) (*chart.Chart, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, downloadURL, nil)
if err != nil {
return nil, err
}

rsp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
Expand All @@ -66,13 +71,14 @@ func (r *Render) LoadChartFromLocalDirectory(directory string) (*chart.Chart, er
return loader.LoadDir(directory)
}

func (r *Render) GenerateManifests(releaseName, namespace string, chart *chart.Chart, values map[string]interface{}) ([]byte, error) {
func (r *Render) GenerateManifests(ctx context.Context, releaseName, namespace string,
chart *chart.Chart, values map[string]interface{}) ([]byte, error) {
client, err := r.newHelmClient(releaseName, namespace)
if err != nil {
return nil, err
}

rel, err := client.RunWithContext(context.TODO(), chart, values)
rel, err := client.RunWithContext(ctx, chart, values)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -134,12 +140,17 @@ func (r *Render) GetLatestChart(indexFile *IndexFile, chartName string) (*ChartV
return nil, fmt.Errorf("chart %s not found", chartName)
}

func (r *Render) GetIndexFile(indexURL string) (*IndexFile, error) {
func (r *Render) GetIndexFile(ctx context.Context, indexURL string) (*IndexFile, error) {
if r.indexFile != nil {
return r.indexFile, nil
}

rsp, err := http.Get(indexURL)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, indexURL, nil)
if err != nil {
return nil, err
}

rsp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
Expand Down
5 changes: 3 additions & 2 deletions pkg/helm/helm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package helm

import (
"context"
"sort"
"strings"
"testing"
Expand Down Expand Up @@ -45,7 +46,7 @@ func TestRender_GetIndexFile(t *testing.T) {
r := &Render{}
for _, tt := range tests {
t.Run(tt.url, func(t *testing.T) {
_, err := r.GetIndexFile(tt.url)
_, err := r.GetIndexFile(context.Background(), tt.url)
if err != nil {
t.Errorf("fetch index '%s' failed, err: %v", tt.url, err)
}
Expand All @@ -64,7 +65,7 @@ func TestRender_GetLatestChartLatestChart(t *testing.T) {
r := &Render{}
for _, tt := range tests {
t.Run(tt.url, func(t *testing.T) {
indexFile, err := r.GetIndexFile(tt.url)
indexFile, err := r.GetIndexFile(context.Background(), tt.url)
if err != nil {
t.Errorf("fetch index '%s' failed, err: %v", tt.url, err)
}
Expand Down
16 changes: 7 additions & 9 deletions pkg/kube/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ func NewClient(kubeconfig string) (*Client, error) {
}, nil
}

func (c *Client) Apply(manifests []byte) error {
func (c *Client) Apply(ctx context.Context, manifests []byte) error {
builder := resource.NewLocalBuilder().
// Configure with a scheme to get typed objects in the versions registered with the scheme.
// As an alternative, could call Unstructured() to get unstructured objects.
Expand Down Expand Up @@ -154,8 +154,6 @@ func (c *Client) Apply(manifests []byte) error {
Resource: strings.ToLower(gvk.Kind) + "s",
}

ctx := context.TODO()

if isNamespaced[gvr.Resource] {
ns := "default"
if item.Namespace != "" {
Expand Down Expand Up @@ -214,9 +212,9 @@ func (c *Client) DeleteEtcdCluster(ctx context.Context, name, namespace string)
return nil
}

func (c *Client) WaitForDeploymentReady(name, namespace string, timeout time.Duration) error {
func (c *Client) WaitForDeploymentReady(ctx context.Context, name, namespace string, timeout time.Duration) error {
conditionFunc := func() (bool, error) {
return c.isDeploymentReady(context.TODO(), name, namespace)
return c.isDeploymentReady(ctx, name, namespace)
}

if int(timeout) < 0 {
Expand All @@ -225,9 +223,9 @@ func (c *Client) WaitForDeploymentReady(name, namespace string, timeout time.Dur
return wait.PollImmediate(time.Second, timeout, conditionFunc)
}

func (c *Client) WaitForClusterReady(name, namespace string, timeout time.Duration) error {
func (c *Client) WaitForClusterReady(ctx context.Context, name, namespace string, timeout time.Duration) error {
conditionFunc := func() (bool, error) {
return c.isClusterReady(context.TODO(), name, namespace)
return c.isClusterReady(ctx, name, namespace)
}

if int(timeout) < 0 {
Expand All @@ -236,9 +234,9 @@ func (c *Client) WaitForClusterReady(name, namespace string, timeout time.Durati
return wait.PollImmediate(time.Second, timeout, conditionFunc)
}

func (c *Client) WaitForEtcdReady(name, namespace string, timeout time.Duration) error {
func (c *Client) WaitForEtcdReady(ctx context.Context, name, namespace string, timeout time.Duration) error {
conditionFunc := func() (bool, error) {
return c.IsStatefulSetReady(context.TODO(), name, namespace)
return c.IsStatefulSetReady(ctx, name, namespace)
}

if int(timeout) < 0 {
Expand Down

0 comments on commit 519bdff

Please sign in to comment.