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)