Skip to content

Commit

Permalink
Progress on tracing and profiling enablement
Browse files Browse the repository at this point in the history
  • Loading branch information
cloud-j-luna committed Dec 29, 2022
1 parent 183de94 commit 8bfe639
Show file tree
Hide file tree
Showing 9 changed files with 883 additions and 14 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Development
- Integration with Praetor's API through custom caching service
- Start using Akash's type definitions
- Tracing enabled on deployment creation

## [0.0.6] - 2022-11-16
### Added
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ install: build

test:
go test -i $(TEST) || exit 1
echo $(TEST) | xargs -t -n4 go test $(TESTARGS) -timeout=30s -parallel=4 --cover
echo $(TEST) | xargs -t -n4 go test $(TESTARGS) -timeout=30s -parallel=4 -cover

testacc:
TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m
Expand Down
24 changes: 14 additions & 10 deletions akash/client/providers-api/providers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package providers_api

import (
"encoding/json"
"log"
"errors"
"fmt"
"net/http"
"terraform-provider-akash/akash/client/types"
)
Expand All @@ -29,25 +30,25 @@ func New(host string) *ProvidersClient {
}
}

func (c *ProvidersClient) GetAllProviders() []types.Provider {
func (c *ProvidersClient) GetAllProviders() ([]types.Provider, error) {
req, err := http.NewRequest(http.MethodGet, c.host, nil)
if err != nil {
log.Fatalf("error: %s", err)
return nil, err
}

resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatalf("error: %s", err)
return nil, err
}

if resp.StatusCode != http.StatusOK {
log.Fatalf("error: %s", resp.Status)
return nil, errors.New(fmt.Sprintf("Response status code %d", resp.StatusCode))
}

var result []Provider
dec := json.NewDecoder(resp.Body)
if err := dec.Decode(&result); err != nil {
log.Fatalf("error: can't decode - %s", err)
return nil, err
}

providers := make([]types.Provider, 0, len(result))
Expand All @@ -63,11 +64,14 @@ func (c *ProvidersClient) GetAllProviders() []types.Provider {
})
}

return providers
return providers, err
}

func (c *ProvidersClient) GetActiveProviders() []types.Provider {
providers := c.GetAllProviders()
func (c *ProvidersClient) GetActiveProviders() ([]types.Provider, error) {
providers, err := c.GetAllProviders()
if err != nil {
return nil, err
}
activeProviders := make([]types.Provider, 0, len(providers))

for _, p := range providers {
Expand All @@ -76,5 +80,5 @@ func (c *ProvidersClient) GetActiveProviders() []types.Provider {
}
}

return activeProviders
return activeProviders, nil
}
67 changes: 67 additions & 0 deletions akash/client/providers-api/providers_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package providers_api

import (
"io"
"net/http"
"net/http/httptest"
"os"
"testing"
)

func TestGetAllProviders(t *testing.T) {
handler := http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
file, err := os.Open("../../../testdata/providers.json")
if err != nil {
t.Fatalf("Could not open file: %s", err)
}
if _, err = io.Copy(writer, file); err != nil {
t.Fatalf("Could not copy file content: %s", err)
}
})

t.Run("should return all providers", func(t *testing.T) {
server := httptest.NewServer(handler)
expectedProviders := 51
mockClient := New(server.URL)
providers, _ := mockClient.GetAllProviders()

if len(providers) != expectedProviders {
t.Fatalf("Expected %d providers, got %d", expectedProviders, len(providers))
}
})
}

func TestGetActiveProviders(t *testing.T) {
handler := http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
file, err := os.Open("../../../testdata/providers.json")
if err != nil {
t.Fatalf("Could not open file: %s", err)
}
if _, err = io.Copy(writer, file); err != nil {
t.Fatalf("Could not copy file content: %s", err)
}
})

t.Run("should return active providers", func(t *testing.T) {
server := httptest.NewServer(handler)
expectedProviders := 41
mockClient := New(server.URL)
providers, _ := mockClient.GetActiveProviders()

if len(providers) != expectedProviders {
t.Fatalf("Expected %d providers, got %d", expectedProviders, len(providers))
}
})

t.Run("should break if its not 200 OK", func(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(500)
}))

mockClient := New(server.URL)

if _, err := mockClient.GetActiveProviders(); err == nil {
t.Fatalf("Expected an error")
}
})
}
4 changes: 2 additions & 2 deletions akash/data_source_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,10 @@ func dataSourceProvidersRead(ctx context.Context, d *schema.ResourceData, m inte
var providers []types.Provider
if d.Get("all_providers").(bool) {
tflog.Info(ctx, "All providers requested")
providers = providersClient.GetAllProviders()
providers, _ = providersClient.GetAllProviders()
} else {
tflog.Info(ctx, "Active providers requested")
providers = providersClient.GetActiveProviders()
providers, _ = providersClient.GetActiveProviders()
}

if attributes, ok := d.GetOk("required_attributes"); ok {
Expand Down
8 changes: 8 additions & 0 deletions akash/extensions/string_extensions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,11 @@ func TestFindAll(t *testing.T) {
}
})
}

func BenchmarkFindAll(b *testing.B) {
testSlice := []string{"A", "B", "C", "D", "test", "F"}

for i := 0; i < b.N; i++ {
FindAll(testSlice, []string{"yes", "test", "A", "there"})
}
}
20 changes: 19 additions & 1 deletion akash/resource_deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"github.com/hashicorp/terraform-plugin-log/tflog"
"runtime/trace"
"strings"
"terraform-provider-akash/akash/client"
"terraform-provider-akash/akash/client/types"
Expand Down Expand Up @@ -152,18 +153,25 @@ func resourceDeploymentCreate(ctx context.Context, d *schema.ResourceData, m int

var diags diag.Diagnostics

manifestLocation, err := CreateTemporaryDeploymentFile(ctx, d.Get("sdl").(string))
pctx, task := trace.NewTask(ctx, "Create")
defer task.End()

reg := trace.StartRegion(pctx, "CreateTemporaryDeploymentFile")
manifestLocation, err := CreateTemporaryDeploymentFile(ctx, d.Get("sdl").(string))
if err != nil {
diags = append(diags)
return diag.FromErr(err)
}
reg.End()

reg = trace.StartRegion(pctx, "CreateDeployment")
seqs, err := akash.CreateDeployment(manifestLocation)
if err != nil {
return diag.FromErr(err)
}
reg.End()

reg = trace.StartRegion(pctx, "queryBids")
bids, diagnostics := queryBids(ctx, akash, seqs)
if diagnostics != nil {
tflog.Warn(ctx, "No bids on deployment")
Expand All @@ -172,7 +180,9 @@ func resourceDeploymentCreate(ctx context.Context, d *schema.ResourceData, m int
}
return diagnostics
}
reg.End()

reg = trace.StartRegion(pctx, "selectProvider")
provider, err := selectProvider(ctx, d, bids)
if err != nil {
if err := akash.DeleteDeployment(seqs.Dseq, akash.Config.AccountAddress); err != nil {
Expand All @@ -181,7 +191,9 @@ func resourceDeploymentCreate(ctx context.Context, d *schema.ResourceData, m int

return diag.FromErr(err)
}
reg.End()

reg = trace.StartRegion(pctx, "createLease")
if diagnostics := createLease(ctx, akash, seqs, provider); diagnostics != nil {
tflog.Warn(ctx, "Could not create lease, deleting deployment")
err := akash.DeleteDeployment(seqs.Dseq, akash.Config.AccountAddress)
Expand All @@ -191,7 +203,9 @@ func resourceDeploymentCreate(ctx context.Context, d *schema.ResourceData, m int
}
return diagnostics
}
reg.End()

reg = trace.StartRegion(pctx, "sendManifest")
if diagnostics := sendManifest(ctx, akash, seqs, provider, manifestLocation); diagnostics != nil {
tflog.Warn(ctx, "Could not send manifest, deleting deployment")
err := akash.DeleteDeployment(seqs.Dseq, akash.Config.AccountAddress)
Expand All @@ -200,6 +214,9 @@ func resourceDeploymentCreate(ctx context.Context, d *schema.ResourceData, m int
}
return diagnostics
}
reg.End()

reg = trace.StartRegion(pctx, "setCreatedState")
tflog.Info(ctx, "Setting created state")
if diagnostics := setCreatedState(d, akash.Config.AccountAddress, seqs, provider); diagnostics != nil {
tflog.Warn(ctx, "Could not set state to created, deleting deployment")
Expand All @@ -209,6 +226,7 @@ func resourceDeploymentCreate(ctx context.Context, d *schema.ResourceData, m int
}
return diagnostics
}
reg.End()

d.SetId(seqs.Dseq + IdSeparator + seqs.Gseq + IdSeparator + seqs.Oseq + IdSeparator + akash.Config.AccountAddress + IdSeparator + provider)

Expand Down
5 changes: 5 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@ package main
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/plugin"
"os"
"runtime/pprof"
"terraform-provider-akash/akash"
)

// Generate the Terraform provider documentation using `tfplugindocs`:
//go:generate go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs

func main() {
pprof.StartCPUProfile(os.Stderr)
defer pprof.StopCPUProfile()

plugin.Serve(&plugin.ServeOpts{
ProviderFunc: func() *schema.Provider {
return akash.Provider()
Expand Down
Loading

0 comments on commit 8bfe639

Please sign in to comment.