github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/executor/language/executor.go (about) 1 package language 2 3 /* 4 The language executor wraps either the python_wasm executor or the generic 5 docker executor, depending on whether determinism is required. 6 */ 7 8 import ( 9 "context" 10 "fmt" 11 12 "github.com/rs/zerolog/log" 13 14 "github.com/filecoin-project/bacalhau/pkg/executor" 15 "github.com/filecoin-project/bacalhau/pkg/model" 16 "github.com/filecoin-project/bacalhau/pkg/system" 17 ) 18 19 type Executor struct { 20 Jobs map[string]*model.Job 21 22 executors executor.ExecutorProvider 23 } 24 25 type LanguageSpec struct { 26 Language, Version string 27 } 28 29 var supportedVersions = map[LanguageSpec]model.Engine{ 30 {"python", "3.10"}: model.EnginePythonWasm, 31 {"wasm", "2.0"}: model.EngineWasm, 32 } 33 34 func NewExecutor( 35 ctx context.Context, 36 cm *system.CleanupManager, 37 executors executor.ExecutorProvider, 38 ) (*Executor, error) { 39 e := &Executor{ 40 executors: executors, 41 } 42 return e, nil 43 } 44 45 func (e *Executor) IsInstalled(ctx context.Context) (bool, error) { 46 return true, nil 47 } 48 49 func (e *Executor) HasStorageLocally(ctx context.Context, volume model.StorageSpec) (bool, error) { 50 return true, nil 51 } 52 53 func (e *Executor) GetVolumeSize(ctx context.Context, volumes model.StorageSpec) (uint64, error) { 54 return 0, nil 55 } 56 57 func (e *Executor) RunShard( 58 ctx context.Context, 59 shard model.JobShard, 60 jobResultsDir string, 61 ) (*model.RunCommandResult, error) { 62 executor, err := e.getDelegateExecutor(ctx, shard) 63 if err != nil { 64 return nil, err 65 } 66 return executor.RunShard(ctx, shard, jobResultsDir) 67 } 68 69 func (e *Executor) getDelegateExecutor(ctx context.Context, shard model.JobShard) (executor.Executor, error) { 70 requiredLang := LanguageSpec{ 71 Language: shard.Job.Spec.Language.Language, 72 Version: shard.Job.Spec.Language.LanguageVersion, 73 } 74 75 engineKey, exists := supportedVersions[requiredLang] 76 if !exists { 77 err := fmt.Errorf("%v is not supported", requiredLang) 78 return nil, err 79 } 80 81 if shard.Job.Spec.Language.Deterministic { 82 log.Ctx(ctx).Debug().Msgf("Running deterministic %v", requiredLang) 83 // Instantiate a python_wasm 84 // TODO: mutate job as needed? 85 executor, err := e.executors.Get(ctx, engineKey) 86 if err != nil { 87 return nil, err 88 } 89 return executor, nil 90 } else { 91 err := fmt.Errorf("non-deterministic %v not supported yet", requiredLang) 92 // TODO: Instantiate a docker with python:3.10 image 93 return nil, err 94 } 95 } 96 97 // Compile-time check that Executor implements the Executor interface. 98 var _ executor.Executor = (*Executor)(nil)