Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 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
6 changes: 4 additions & 2 deletions iac/provider-gcp/nomad/jobs/orchestrator.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,12 @@ EOT
TEMPLATE_BUCKET_NAME = "${template_bucket_name}"
OTEL_COLLECTOR_GRPC_ENDPOINT = "${otel_collector_grpc_endpoint}"
ALLOW_SANDBOX_INTERNET = "${allow_sandbox_internet}"
SHARED_CHUNK_CACHE_PATH = "${shared_chunk_cache_path}"
SHARED_CHUNK_CACHE_PATH = "${shared_chunk_cache_path}"
CLICKHOUSE_CONNECTION_STRING = "${clickhouse_connection_string}"
REDIS_URL = "${redis_url}"
REDIS_CLUSTER_URL = "${redis_cluster_url}"
GRPC_PORT = "${port}"
PROXY_PORT = "${proxy_port}"

%{ if launch_darkly_api_key != "" }
LAUNCH_DARKLY_API_KEY = "${launch_darkly_api_key}"
Expand All @@ -82,7 +84,7 @@ EOT

config {
command = "/bin/bash"
args = ["-c", " chmod +x local/orchestrator && local/orchestrator --port ${port} --proxy-port ${proxy_port}"]
args = ["-c", " chmod +x local/orchestrator && local/orchestrator"]
}

artifact {
Expand Down
3 changes: 2 additions & 1 deletion iac/provider-gcp/nomad/jobs/template-manager.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ job "template-manager-system" {
SHARED_CHUNK_CACHE_PATH = "${shared_chunk_cache_path}"
CLICKHOUSE_CONNECTION_STRING = "${clickhouse_connection_string}"
DOCKERHUB_REMOTE_REPOSITORY_URL = "${dockerhub_remote_repository_url}"
GRPC_PORT = "${port}"
%{ if !update_stanza }
FORCE_STOP = "true"
%{ endif }
Expand All @@ -87,7 +88,7 @@ job "template-manager-system" {

config {
command = "/bin/bash"
args = ["-c", " chmod +x local/template-manager && local/template-manager --port ${port}"]
args = ["-c", " chmod +x local/template-manager && local/template-manager"]
}

artifact {
Expand Down
8 changes: 7 additions & 1 deletion packages/client-proxy/internal/proxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,13 @@ func catalogResolution(ctx context.Context, sandboxId string, c catalog.Sandboxe
return s.OrchestratorIP, nil
}

func NewClientProxy(meterProvider metric.MeterProvider, serviceName string, port uint, catalog catalog.SandboxesCatalog, useCatalogResolution bool, useDnsResolution bool) (*reverseproxy.Proxy, error) {
func NewClientProxy(
meterProvider metric.MeterProvider,
serviceName string,
port uint16,
catalog catalog.SandboxesCatalog,
useCatalogResolution, useDnsResolution bool,
) (*reverseproxy.Proxy, error) {
if !useCatalogResolution && !useDnsResolution {
return nil, errors.New("catalog resolution and DNS resolution are both disabled, at least one must be enabled")
}
Expand Down
8 changes: 7 additions & 1 deletion packages/client-proxy/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"log"
"math"
"net"
"net/http"
"os"
Expand Down Expand Up @@ -104,6 +105,11 @@ func run() int {
zap.ReplaceGlobals(logger)

proxyPort := internal.GetProxyServicePort()
if proxyPort <= 0 || proxyPort > int(math.MaxUint16) {
logger.Error("Proxy port is outside the valid uint16 range", zap.Int("value", proxyPort))
return 1
}

edgePort := internal.GetEdgeServicePort()
edgeSecret := internal.GetEdgeServiceSecret()
orchestratorPort := internal.GetOrchestratorServicePort()
Expand Down Expand Up @@ -155,7 +161,7 @@ func run() int {
}

// Proxy sandbox http traffic to orchestrator nodes
trafficProxy, err := e2bproxy.NewClientProxy(tel.MeterProvider, serviceName, uint(proxyPort), catalog, useProxyCatalogResolution, useDnsResolution)
trafficProxy, err := e2bproxy.NewClientProxy(tel.MeterProvider, serviceName, uint16(proxyPort), catalog, useProxyCatalogResolution, useDnsResolution)
if err != nil {
logger.Error("Failed to create client proxy", zap.Error(err))
return 1
Expand Down
15 changes: 10 additions & 5 deletions packages/orchestrator/cmd/build-template/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,22 @@ const (
)

func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
ctx := context.Background()

templateID := flag.String("template", "", "template id")
buildID := flag.String("build", "", "build id")
kernelVersion := flag.String("kernel", "", "kernel version")
fcVersion := flag.String("firecracker", "", "firecracker version")
flag.Parse()

err := buildTemplate(ctx, *kernelVersion, *fcVersion, *templateID, *buildID)
networkConfig, err := network.ParseConfig()
if err != nil {
log.Fatalf("error parsing config: %v", err)
}

err = buildTemplate(ctx, *kernelVersion, *fcVersion, *templateID, *buildID, networkConfig)
if err != nil {
log.Fatalf("error building template: %v", err) //nolint:gocritic // probably fine to bail if we're done?
log.Fatalf("error building template: %v", err)
}
}

Expand All @@ -59,6 +63,7 @@ func buildTemplate(
fcVersion,
templateID,
buildID string,
networkConfig network.Config,
) error {
ctx, cancel := context.WithTimeout(parentCtx, time.Minute*5)
defer cancel()
Expand Down Expand Up @@ -121,7 +126,7 @@ func buildTemplate(
}
}()

networkPool, err := network.NewPool(ctx, noop.MeterProvider{}, 8, 8, clientID)
networkPool, err := network.NewPool(ctx, noop.MeterProvider{}, 8, 8, clientID, networkConfig)
if err != nil {
return fmt.Errorf("could not create network pool: %w", err)
}
Expand Down
1 change: 1 addition & 0 deletions packages/orchestrator/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ require (
github.com/aws/aws-sdk-go-v2/service/ecr v1.44.0
github.com/bits-and-blooms/bitset v1.22.0
github.com/bmatcuk/doublestar/v4 v4.9.1
github.com/caarlos0/env/v11 v11.3.1
github.com/containernetworking/plugins v1.6.0
github.com/containers/storage v1.58.0
github.com/coreos/go-iptables v0.8.0
Expand Down
2 changes: 2 additions & 0 deletions packages/orchestrator/go.sum

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

29 changes: 29 additions & 0 deletions packages/orchestrator/internal/cfg/model.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package cfg

import (
"github.com/caarlos0/env/v11"

"github.com/e2b-dev/infra/packages/orchestrator/internal/sandbox/network"
)

type Config struct {
AllowSandboxInternet bool `env:"ALLOW_SANDBOX_INTERNET" envDefault:"true"`
ClickhouseConnectionString string `env:"CLICKHOUSE_CONNECTION_STRING"`
ForceStop bool `env:"FORCE_STOP"`
GRPCPort uint16 `env:"GRPC_PORT" envDefault:"5008"`
LaunchDarklyAPIKey string `env:"LAUNCH_DARKLY_API_KEY"`
OrchestratorBasePath string `env:"ORCHESTRATOR_BASE_PATH" envDefault:"/orchestrator"`
OrchestratorLockPath string `env:"ORCHESTRATOR_LOCK_PATH" envDefault:"/orchestrator.lock"`
ProxyPort uint16 `env:"PROXY_PORT" envDefault:"5007"`
RedisClusterURL string `env:"REDIS_CLUSTER_URL"`
RedisURL string `env:"REDIS_URL"`
Services []string `env:"ORCHESTRATOR_SERVICES" envDefault:"orchestrator"`

NetworkConfig network.Config
}

func Parse() (Config, error) {
var model Config
err := env.Parse(&model)
return model, err
}
35 changes: 35 additions & 0 deletions packages/orchestrator/internal/cfg/model_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package cfg

import (
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestParse(t *testing.T) {
t.Run("network config local flag defaults to false", func(t *testing.T) {
config, err := Parse()
require.NoError(t, err)

assert.False(t, config.NetworkConfig.UseLocalNamespaceStorage)
})

t.Run("network config is parsed correctly", func(t *testing.T) {
t.Setenv("USE_LOCAL_NAMESPACE_STORAGE", "true")

config, err := Parse()
require.NoError(t, err)

assert.True(t, config.NetworkConfig.UseLocalNamespaceStorage)
})

t.Run("multiple services parses correctly", func(t *testing.T) {
t.Setenv("ORCHESTRATOR_SERVICES", "service1,service2")

config, err := Parse()
require.NoError(t, err)

assert.Equal(t, []string{"service1", "service2"}, config.Services)
})
}
20 changes: 0 additions & 20 deletions packages/orchestrator/internal/consts.go

This file was deleted.

4 changes: 2 additions & 2 deletions packages/orchestrator/internal/grpcserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ func (g *GRPCServer) GRPCServer() *grpc.Server {
}

// Start launches
func (g *GRPCServer) Start(ctx context.Context, port uint) error {
func (g *GRPCServer) Start(ctx context.Context, port uint16) error {
var lisCfg net.ListenConfig
lis, err := lisCfg.Listen(ctx, "tcp", fmt.Sprintf(":%d", port))
if err != nil {
Expand All @@ -118,7 +118,7 @@ func (g *GRPCServer) Start(ctx context.Context, port uint) error {
// Match gRPC requests.
grpcL := m.Match(cmux.Any())

zap.L().Info("Starting GRPC server", zap.Uint("port", port))
zap.L().Info("Starting GRPC server", zap.Uint16("port", port))

go func() {
if err := g.grpc.Serve(grpcL); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion packages/orchestrator/internal/hyperloopserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import (

const maxUploadLimit = 1 << 28 // 256 MiB

func NewHyperloopServer(ctx context.Context, port uint, logger *zap.Logger, sandboxes *smap.Map[*sandbox.Sandbox]) (*http.Server, error) {
func NewHyperloopServer(ctx context.Context, port uint16, logger *zap.Logger, sandboxes *smap.Map[*sandbox.Sandbox]) (*http.Server, error) {
sandboxCollectorAddr := env.LogsCollectorAddress()
store := handlers.NewHyperloopStore(logger, sandboxes, sandboxCollectorAddr)
swagger, err := api.GetSwagger()
Expand Down
2 changes: 1 addition & 1 deletion packages/orchestrator/internal/proxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ type SandboxProxy struct {
proxy *reverseproxy.Proxy
}

func NewSandboxProxy(meterProvider metric.MeterProvider, port uint, sandboxes *smap.Map[*sandbox.Sandbox]) (*SandboxProxy, error) {
func NewSandboxProxy(meterProvider metric.MeterProvider, port uint16, sandboxes *smap.Map[*sandbox.Sandbox]) (*SandboxProxy, error) {
proxy := reverseproxy.New(
port,
idleTimeout,
Expand Down
6 changes: 2 additions & 4 deletions packages/orchestrator/internal/sandbox/network/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import (
"github.com/vishvananda/netlink"
"github.com/vishvananda/netns"
"go.uber.org/zap"

consts "github.com/e2b-dev/infra/packages/orchestrator/internal"
)

func (s *Slot) CreateNetwork() error {
Expand Down Expand Up @@ -220,7 +218,7 @@ func (s *Slot) CreateNetwork() error {
err = tables.Append(
"nat", "PREROUTING", "-i", s.VethName(),
"-p", "tcp", "-d", s.HyperloopIPString(), "--dport", "80",
"-j", "REDIRECT", "--to-port", consts.GetHyperloopProxyPort(),
"-j", "REDIRECT", "--to-port", s.hyperloopPort,
)
if err != nil {
return fmt.Errorf("error creating HTTP redirect rule to sandbox hyperloop proxy server: %w", err)
Expand Down Expand Up @@ -262,7 +260,7 @@ func (s *Slot) RemoveNetwork() error {
err = tables.Delete(
"nat", "PREROUTING", "-i", s.VethName(),
"-p", "tcp", "-d", s.HyperloopIPString(), "--dport", "80",
"-j", "REDIRECT", "--to-port", consts.GetHyperloopProxyPort(),
"-j", "REDIRECT", "--to-port", s.hyperloopPort,
)
if err != nil {
errs = append(errs, fmt.Errorf("error deleting sandbox hyperloop proxy redirect rule: %w", err))
Expand Down
20 changes: 18 additions & 2 deletions packages/orchestrator/internal/sandbox/network/pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"

"github.com/caarlos0/env/v11"
"go.opentelemetry.io/otel/metric"
"go.uber.org/zap"

Expand All @@ -16,7 +17,21 @@ const (
ReusedSlotsPoolSize = 100
)

type Config struct {
// Using reserver IPv4 in range that is used for experiments and documentation
// https://en.wikipedia.org/wiki/Reserved_IP_addresses
HyperloopIPAddress string `env:"SANDBOX_HYPERLOOP_IP" envDefault:"192.0.2.1"`
HyperloopProxyPort uint16 `env:"SANDBOX_HYPERLOOP_PROXY_PORT" envDefault:"5010"`
UseLocalNamespaceStorage bool `env:"USE_LOCAL_NAMESPACE_STORAGE"`
}

func ParseConfig() (Config, error) {
return env.ParseAs[Config]()
}

type Pool struct {
config Config

ctx context.Context //nolint:containedctx // todo: refactor so this can be removed
cancel context.CancelFunc

Expand All @@ -28,7 +43,7 @@ type Pool struct {
slotStorage Storage
}

func NewPool(ctx context.Context, meterProvider metric.MeterProvider, newSlotsPoolSize, reusedSlotsPoolSize int, nodeID string) (*Pool, error) {
func NewPool(ctx context.Context, meterProvider metric.MeterProvider, newSlotsPoolSize, reusedSlotsPoolSize int, nodeID string, config Config) (*Pool, error) {
newSlots := make(chan *Slot, newSlotsPoolSize-1)
reusedSlots := make(chan *Slot, reusedSlotsPoolSize)

Expand All @@ -44,13 +59,14 @@ func NewPool(ctx context.Context, meterProvider metric.MeterProvider, newSlotsPo
return nil, fmt.Errorf("failed to create reused slot counter: %w", err)
}

slotStorage, err := NewStorage(vrtSlotsSize, nodeID)
slotStorage, err := NewStorage(vrtSlotsSize, nodeID, config)
if err != nil {
return nil, fmt.Errorf("failed to create slot storage: %w", err)
}

ctx, cancel := context.WithCancel(ctx)
pool := &Pool{
config: config,
newSlots: newSlots,
reusedSlots: reusedSlots,
newSlotCounter: newSlotCounter,
Expand Down
9 changes: 5 additions & 4 deletions packages/orchestrator/internal/sandbox/network/slot.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"log"
"net"
"path/filepath"
"strconv"
"sync/atomic"

"github.com/containernetworking/plugins/pkg/ns"
Expand All @@ -14,7 +15,6 @@ import (
"go.opentelemetry.io/otel/trace"
netutils "k8s.io/utils/net"

"github.com/e2b-dev/infra/packages/orchestrator/internal"
"github.com/e2b-dev/infra/packages/shared/pkg/env"
)

Expand Down Expand Up @@ -76,10 +76,10 @@ type Slot struct {
hostNet *net.IPNet
hostCIDR string

hyperloopIP string
hyperloopIP, hyperloopPort string
}

func NewSlot(key string, idx int) (*Slot, error) {
func NewSlot(key string, idx int, config Config) (*Slot, error) {
if idx < 1 || idx > vrtSlotsSize {
return nil, fmt.Errorf("slot index %d is out of range [1, %d)", idx, vrtSlotsSize)
}
Expand Down Expand Up @@ -132,7 +132,8 @@ func NewSlot(key string, idx int) (*Slot, error) {
hostNet: hostNet,
hostCIDR: hostCIDR,

hyperloopIP: internal.GetHyperloopIP(),
hyperloopIP: config.HyperloopIPAddress,
hyperloopPort: strconv.FormatUint(uint64(config.HyperloopProxyPort), 10),
}

return slot, nil
Expand Down
Loading
Loading