Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions _run/common-commands.mk
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ provider-update:
provider-status:
$(PROVIDER_SERVICES) status $(PROVIDER_ADDRESS)

.PHONY: provider-bid-check
provider-bid-check:
$(PROVIDER_SERVICES) bid-pre-check $(PROVIDER_ADDRESS) $(SDL_PATH)

.PHONY: authenticate
authenticate:
$(PROVIDER_SERVICES) authenticate \
Expand Down
1 change: 1 addition & 0 deletions _run/kube/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ provider-run:
--deployment-ingress-domain "$(GATEWAY_HOSTNAME)" \
--cluster-node-port-quantity 100 \
--cluster-public-hostname "$(GATEWAY_HOSTNAME)" \
--provider-config "$(PROVIDER_CONFIG_PATH)" \
--bid-price-strategy "randomRange" \
--deployment-runtime-class "none" \
--ip-operator=true
Expand Down
11 changes: 7 additions & 4 deletions _run/kube/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ The counter on the left side of the messages is regularly in the 120 range. If
there may be a problem.


| Option | __t1 Step: 1__ | Explanation |
|---------------------------------------------------|------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Map random local port to port 80 of your workload | `make kind-cluster-setup` | This is less error-prone, but makes it difficult to access your app through the browser. |
| Map localhost port 80 to workload | `KIND_CONFIG=kind-config-80.yaml make kind-cluster-create` | If anything else is listening on port 80 (any other web server), this method will fail. If it does succeed, you will be able to browse your app from the browser. |
| Option | __t1 Step: 1__ | Explanation |
|---------------------------------------------------|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Map random local port to port 80 of your workload | `make kind-cluster-setup` | This is less error-prone, but makes it difficult to access your app through the browser. |
| Map localhost port 80 to workload | `KIND_CONFIG=kind-config-80.yaml make kube-cluster-create-kind` | If anything else is listening on port 80 (any other web server), this method will fail. If it does succeed, you will be able to browse your app from the browser. |

## Build Akash binaries and initialize network

Expand Down Expand Up @@ -288,3 +288,6 @@ __t1 teardown__
```sh
make deployment-close
```

## Iterate development

71 changes: 71 additions & 0 deletions _run/kube/deployment-group.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
version: "2.0"

services:
web:
image: quay.io/ovrclk/demo-app
expose:
- port: 80
as: 80
http_options:
max_body_size: 2097152
next_cases:
- off
accept:
- hello.localhost
to:
- global: true
bew:
image: quay.io/ovrclk/demo-app
expose:
- port: 80
as: 80
accept:
- hello1.localhost
to:
- global: true

profiles:
compute:
small:
resources:
cpu:
units: 0.1
memory:
size: 16Mi
storage:
size: 128Mi
big:
resources:
cpu:
units: 2
memory:
size: 256Mi
storage:
size: 1Gi
placement:
westcoast:
attributes:
region: us-west
pricing:
small:
denom: uakt
amount: 1000
eastcoast:
attributes:
region: us-east
pricing:
big:
denom: uakt
amount: 1


deployment:
web:
westcoast:
profile: small
count: 1
bew:
eastcoast:
profile: big
count: 1
2 changes: 1 addition & 1 deletion bidengine/provider_attributes.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ type providerAttrSignatureService struct {
attr types.Attributes
}

func newProviderAttrSignatureService(s session.Session, bus pubsub.Bus) (*providerAttrSignatureService, error) {
func NewProviderAttrSignatureService(s session.Session, bus pubsub.Bus) (*providerAttrSignatureService, error) {
return newProviderAttrSignatureServiceInternal(s, bus, 18*time.Hour)
}

Expand Down
2 changes: 1 addition & 1 deletion bidengine/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func NewService(
return nil, err
}

providerAttrService, err := newProviderAttrSignatureService(session, bus)
providerAttrService, err := NewProviderAttrSignatureService(session, bus)
if err != nil {
return nil, err
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/mocks/client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/mocks/cluster.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/mocks/read_client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/mocks/service.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/types/v1beta3/clients/ip/mocks/client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/types/v1beta3/mocks/hostname_service_client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/types/v1beta3/mocks/i_deployment.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/types/v1beta3/mocks/reservation.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cluster/types/v1beta3/mocks/reservation_group.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

72 changes: 72 additions & 0 deletions cmd/provider-services/cmd/bidPreCheck.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package cmd

import (
"encoding/json"
"fmt"

apclient "github.com/akash-network/akash-api/go/provider/client"
"github.com/cosmos/cosmos-sdk/client"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/spf13/cobra"

"github.com/akash-network/node/sdl"
aclient "github.com/akash-network/provider/client"
)

func bidPreCheckCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "bid-pre-check <address> <manifest-file>",
Short: "perform a pre-bid check using a manifest file",
SilenceUsage: true,
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
return doPreBidCheck(cmd, args[0], args[1])
},
}

return cmd
}

func doPreBidCheck(cmd *cobra.Command, addr, manifestPath string) error {
ctx := cmd.Context()

cctx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}

cl, err := aclient.DiscoverQueryClient(ctx, cctx)
if err != nil {
return err
}

// Load the manifest file
sdlFile, err := sdl.ReadFile(manifestPath)
if err != nil {
return fmt.Errorf("failed to read manifest file: %w", err)
}
groups, err := sdlFile.DeploymentGroups()
if err != nil {
return fmt.Errorf("failed to parse manifest: %w", err)
}

prov, err := sdk.AccAddressFromBech32(addr)
if err != nil {
return fmt.Errorf("invalid provider address: %w", err)
}

// Create provider client with authentication
gclient, err := apclient.NewClient(ctx, cl, prov)
if err != nil {
return fmt.Errorf("failed to create provider client: %w", err)
}

result, err := gclient.Validate(ctx, groups)
if err != nil {
return fmt.Errorf("validation failed: %w", err)
}

enc := json.NewEncoder(cmd.OutOrStdout())
enc.SetIndent("", " ")
return enc.Encode(result)
}
1 change: 1 addition & 0 deletions cmd/provider-services/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ func NewRootCmd() *cobra.Command {
cmd.AddCommand(SDL2ManifestCmd())
cmd.AddCommand(MigrateHostnamesCmd())
cmd.AddCommand(MigrateEndpointsCmd())
cmd.AddCommand(bidPreCheckCmd())

cmd.AddCommand(operator.OperatorsCmd())
cmd.AddCommand(operator.ToolsCmd())
Expand Down
2 changes: 1 addition & 1 deletion cmd/provider-services/cmd/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -820,7 +820,7 @@ func doRunCmd(ctx context.Context, cmd *cobra.Command, _ []string) error {
return err
}

err = gwgrpc.NewServer(ctx, grpcaddr, accQuerier, service)
err = gwgrpc.NewServer(ctx, grpcaddr, accQuerier, service, &config)
if err != nil {
return err
}
Expand Down
31 changes: 29 additions & 2 deletions gateway/grpc/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"net"
"time"

"github.com/akash-network/akash-api/go/node/deployment/v1beta3"
ajwt "github.com/akash-network/akash-api/go/util/jwt"
"golang.org/x/net/context"
"google.golang.org/grpc"
Expand All @@ -32,7 +33,8 @@ const (

type grpcProviderV1 struct {
ctx context.Context
client provider.StatusClient
client provider.Client
config *provider.Config
}

var _ providerv1.ProviderRPCServer = (*grpcProviderV1)(nil)
Expand All @@ -50,7 +52,7 @@ func ClaimsFromCtx(ctx context.Context) *ajwt.Claims {
return val.(*ajwt.Claims)
}

func NewServer(ctx context.Context, endpoint string, cquery gwutils.CertGetter, client provider.StatusClient) error {
func NewServer(ctx context.Context, endpoint string, cquery gwutils.CertGetter, client provider.Client, config *provider.Config) error {
tlsCfg, err := gwutils.NewServerTLSConfig(ctx, cquery, endpoint)
if err != nil {
return err
Expand All @@ -71,6 +73,7 @@ func NewServer(ctx context.Context, endpoint string, cquery gwutils.CertGetter,
pRPC := &grpcProviderV1{
ctx: ctx,
client: client,
config: config,
}

providerv1.RegisterProviderRPCServer(grpcSrv, pRPC)
Expand Down Expand Up @@ -153,3 +156,27 @@ func (gm *grpcProviderV1) StreamStatus(_ *emptypb.Empty, stream providerv1.Provi
}
}
}

func (gm *grpcProviderV1) BidPreCheck(ctx context.Context, req *providerv1.BidPreCheckRequest) (*providerv1.BidPreCheckResponse, error) {
claims := ClaimsFromCtx(ctx)
if claims == nil || claims.Issuer == "" {
return nil, fmt.Errorf("no claims found in context")
}
if len(req.Groups) == 0 {
return nil, fmt.Errorf("no groups provided")
}
specs := make(v1beta3.GroupSpecs, len(req.Groups))
for i, group := range req.Groups {
specs[i] = &v1beta3.GroupSpec{
Name: group.Name,
Requirements: group.Requirements,
Resources: group.Resources,
}
}
results, err := gm.client.Validate(ctx, claims.IssuerAddress(), specs)
if err != nil {
return nil, err
}

return &results, nil
}
Loading
Loading