From d2baa0907f7b4ca527bbcc5677483ae8692fd7e6 Mon Sep 17 00:00:00 2001 From: Iaroslav Ciupin Date: Sat, 1 Oct 2022 01:08:01 +0300 Subject: [PATCH] Specify cluster pool when creating execution (#355) * Create execution with specifying clusterPool Signed-off-by: Iaroslav Ciupin * format Signed-off-by: Iaroslav Ciupin * update flyteidl Signed-off-by: Iaroslav Ciupin * refactor Signed-off-by: Iaroslav Ciupin * Address comments Signed-off-by: Iaroslav Ciupin * update flyteidl Signed-off-by: Iaroslav Ciupin * increase coverage Signed-off-by: Iaroslav Ciupin Signed-off-by: Iaroslav Ciupin --- cmd/create/execution.go | 29 ++- cmd/create/execution_test.go | 237 +++++++++++------- cmd/create/execution_util.go | 14 +- cmd/create/executionconfig_flags.go | 1 + cmd/create/executionconfig_flags_test.go | 14 ++ .../task_execution_spec_with_iamrole.yaml | 1 + go.mod | 2 +- go.sum | 6 +- 8 files changed, 196 insertions(+), 108 deletions(-) diff --git a/cmd/create/execution.go b/cmd/create/execution.go index b3711c49..0d0c8786 100644 --- a/cmd/create/execution.go +++ b/cmd/create/execution.go @@ -4,10 +4,11 @@ import ( "context" "fmt" - "github.com/flyteorg/flytectl/cmd/config" - cmdCore "github.com/flyteorg/flytectl/cmd/core" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flytestdlib/logger" + + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" ) const ( @@ -132,6 +133,13 @@ The generated file would look similar to this. Here, empty values have been dump task: core.type_system.custom_objects.add version: v3 +9. If you have configured a plugin that implements github.com/flyteorg/flyteadmin/pkg/workflowengine/interfaces/WorkflowExecutor + that supports cluster pools, then when creating a new execution, you can assign it to a specific cluster pool: + +:: + + flytectl create execution --execFile execution_spec.yaml -p flytesnacks -d development --clusterPool my-gpu-cluster + Usage ` ) @@ -150,6 +158,7 @@ type ExecutionConfig struct { Recover string `json:"recover" pflag:",execution id to be recreated from the last known failure point."` DryRun bool `json:"dryRun" pflag:",execute command without making any modifications."` Version string `json:"version" pflag:",specify version of execution workflow/task."` + ClusterPool string `json:"clusterPool" pflag:",specify which cluster pool to assign execution to."` // Non plfag section is read from the execution config generated by get task/launch plan Workflow string `json:"workflow,omitempty"` Task string `json:"task,omitempty"` @@ -170,13 +179,9 @@ type ExecutionParams struct { execType ExecutionType } -var ( - executionConfig = &ExecutionConfig{} -) +var executionConfig = &ExecutionConfig{} func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.CommandContext) error { - var execParams ExecutionParams - var err error sourceProject := config.GetConfig().Project sourceDomain := config.GetConfig().Domain @@ -185,7 +190,8 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C targetExecName = args[0] } - if execParams, err = readConfigAndValidate(config.GetConfig().Project, config.GetConfig().Domain); err != nil { + execParams, err := readConfigAndValidate(config.GetConfig().Project, config.GetConfig().Domain) + if err != nil { return err } var executionRequest *admin.ExecutionCreateRequest @@ -195,16 +201,19 @@ func createExecutionCommand(ctx context.Context, args []string, cmdCtx cmdCore.C case Recover: return recoverExecution(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName) case Task: - if executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName); err != nil { + executionRequest, err = createExecutionRequestForTask(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName) + if err != nil { return err } case Workflow: - if executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName); err != nil { + executionRequest, err = createExecutionRequestForWorkflow(ctx, execParams.name, sourceProject, sourceDomain, cmdCtx, executionConfig, targetExecName) + if err != nil { return err } default: return fmt.Errorf("invalid execution type %v", execParams.execType) } + if executionConfig.DryRun { logger.Debugf(ctx, "skipping CreateExecution request (DryRun)") } else { diff --git a/cmd/create/execution_test.go b/cmd/create/execution_test.go index cad187f9..7aabf589 100644 --- a/cmd/create/execution_test.go +++ b/cmd/create/execution_test.go @@ -4,28 +4,39 @@ import ( "fmt" "testing" - "github.com/flyteorg/flytectl/cmd/config" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - "github.com/flyteorg/flytectl/cmd/testutils" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" - - "github.com/stretchr/testify/assert" + "github.com/golang/protobuf/proto" "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/suite" "google.golang.org/protobuf/types/known/timestamppb" + + "github.com/flyteorg/flytectl/cmd/config" + cmdCore "github.com/flyteorg/flytectl/cmd/core" + "github.com/flyteorg/flytectl/cmd/testutils" ) -type TestStruct struct { - executionConfig *ExecutionConfig - args []string +type createSuite struct { + suite.Suite + testutils.TestStruct + originalExecConfig ExecutionConfig } -// This function needs to be called after testutils.Steup() -func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { - ctx := s.Ctx - t.executionConfig = &ExecutionConfig{} +func (s *createSuite) SetupTest() { + s.TestStruct = setup() + // TODO: migrate to new command context from testutils s.CmdCtx = cmdCore.NewCommandContext(s.MockClient, s.MockOutStream) + s.originalExecConfig = *executionConfig +} + +func (s *createSuite) TearDownTest() { + orig := s.originalExecConfig + executionConfig = &orig + s.MockAdminClient.AssertExpectations(s.T()) +} + +func (s *createSuite) onGetTask() { sortedListLiteralType := core.Variable{ Type: &core.LiteralType{ Type: &core.LiteralType_CollectionType{ @@ -60,7 +71,10 @@ func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { }, }, } - s.MockAdminClient.OnGetTaskMatch(ctx, mock.Anything).Return(task1, nil) + s.MockAdminClient.OnGetTaskMatch(s.Ctx, mock.Anything).Return(task1, nil) +} + +func (s *createSuite) onGetLaunchPlan() { parameterMap := map[string]*core.Parameter{ "numbers": { Var: &core.Variable{ @@ -132,20 +146,14 @@ func createExecutionSetup(s *testutils.TestStruct) (t TestStruct) { Project: config.GetConfig().Project, Domain: config.GetConfig().Domain, Name: "core.control_flow.merge_sort.merge_sort", - Version: "v2", + Version: "v3", }, } - s.MockAdminClient.OnGetLaunchPlanMatch(ctx, objectGetRequest).Return(launchPlan1, nil) - - return TestStruct{ - executionConfig: executionConfig, - args: []string{}, - } + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, objectGetRequest).Return(launchPlan1, nil).Once() } -func TestCreateTaskExecutionFunc(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) +func (s *createSuite) Test_CreateTaskExecution() { + s.onGetTask() executionCreateResponseTask := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -153,31 +161,73 @@ func TestCreateTaskExecutionFunc(t *testing.T) { Name: "ff513c0e44b5b4a35aa5", }, } + expected := &admin.ExecutionCreateRequest{ + Project: "dummyProject", + Domain: "dummyDomain", + Spec: &admin.ExecutionSpec{ + LaunchPlan: &core.Identifier{ + ResourceType: core.ResourceType_TASK, + Project: "dummyProject", + Domain: "dummyDomain", + Name: "task1", + Version: "v2", + }, + Metadata: &admin.ExecutionMetadata{Mode: admin.ExecutionMetadata_MANUAL, Principal: "sdk", Nesting: 0}, + AuthRole: &admin.AuthRole{ + KubernetesServiceAccount: executionConfig.KubeServiceAcct, + AssumableIamRole: "iamRoleARN", + }, + SecurityContext: &core.SecurityContext{ + RunAs: &core.Identity{ + K8SServiceAccount: executionConfig.KubeServiceAcct, + IamRole: "iamRoleARN", + }, + }, + ClusterAssignment: &admin.ClusterAssignment{ClusterPoolName: "gpu"}, + }, + } + s.MockAdminClient. + OnCreateExecutionMatch(s.Ctx, mock.Anything). + Run(func(args mock.Arguments) { + actual := args.Get(1).(*admin.ExecutionCreateRequest) + actual.Name = "" + actual.Inputs = nil + s.True(proto.Equal(expected, actual), actual.String()) + }). + Return(executionCreateResponseTask, nil). + Once() + executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) - ctx := s.Ctx - s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseTask, nil) - ts.executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) - tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) + s.NoError(err) + tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"ff513c0e44b5b4a35aa5" `) } -func TestCreateTaskExecutionFuncError(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) - ctx := s.Ctx - s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(nil, fmt.Errorf("error launching task")) - ts.executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("error launching task"), err) - s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) +func (s *createSuite) Test_CreateTaskExecution_GetTaskError() { + expected := fmt.Errorf("error") + s.MockAdminClient.OnGetTaskMatch(s.Ctx, mock.Anything).Return(nil, expected).Once() + executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + + s.Equal(expected, err) +} + +func (s *createSuite) Test_CreateTaskExecution_CreateExecutionError() { + s.onGetTask() + s.MockAdminClient. + OnCreateExecutionMatch(s.Ctx, mock.Anything). + Return(nil, fmt.Errorf("error launching task")). + Once() + executionConfig.ExecFile = testDataFolder + "task_execution_spec.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + + s.EqualError(err, "error launching task") } -func TestCreateLaunchPlanExecutionFunc(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) +func (s *createSuite) Test_CreateLaunchPlanExecution() { executionCreateResponseLP := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -185,20 +235,27 @@ func TestCreateLaunchPlanExecutionFunc(t *testing.T) { Name: "f652ea3596e7f4d80a0e", }, } + s.onGetLaunchPlan() + s.MockAdminClient.OnCreateExecutionMatch(s.Ctx, mock.Anything).Return(executionCreateResponseLP, nil) + executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) - ctx := s.Ctx - s.MockAdminClient.OnCreateExecutionMatch(ctx, mock.Anything).Return(executionCreateResponseLP, nil) - ts.executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "CreateExecution", ctx, mock.Anything) - tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) + s.NoError(err) + tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e" `) } -func TestCreateRelaunchExecutionFunc(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) - defer func() { ts.executionConfig.Relaunch = "" }() +func (s *createSuite) Test_CreateLaunchPlan_GetLaunchPlanError() { + expected := fmt.Errorf("error") + s.MockAdminClient.OnGetLaunchPlanMatch(s.Ctx, mock.Anything).Return(nil, expected).Once() + executionConfig.ExecFile = testDataFolder + "launchplan_execution_spec.yaml" + + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + + s.Equal(expected, err) +} + +func (s *createSuite) Test_CreateRelaunchExecution() { relaunchExecResponse := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ Project: "flytesnacks", @@ -206,8 +263,7 @@ func TestCreateRelaunchExecutionFunc(t *testing.T) { Name: "f652ea3596e7f4d80a0e", }, } - - ts.executionConfig.Relaunch = relaunchExecResponse.Id.Name + executionConfig.Relaunch = relaunchExecResponse.Id.Name relaunchRequest := &admin.ExecutionRelaunchRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: executionConfig.Relaunch, @@ -215,19 +271,15 @@ func TestCreateRelaunchExecutionFunc(t *testing.T) { Domain: config.GetConfig().Domain, }, } - ctx := s.Ctx - s.MockAdminClient.OnRelaunchExecutionMatch(ctx, relaunchRequest).Return(relaunchExecResponse, nil) - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "RelaunchExecution", ctx, relaunchRequest) - tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) -} + s.MockAdminClient.OnRelaunchExecutionMatch(s.Ctx, relaunchRequest).Return(relaunchExecResponse, nil).Once() -func TestCreateRecoverExecutionFunc(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) - defer func() { ts.executionConfig.Recover = "" }() + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + s.NoError(err) + tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) +} + +func (s *createSuite) Test_CreateRecoverExecution() { originalExecutionName := "abc123" recoverExecResponse := &admin.ExecutionCreateResponse{ Id: &core.WorkflowExecutionIdentifier{ @@ -236,8 +288,7 @@ func TestCreateRecoverExecutionFunc(t *testing.T) { Name: "f652ea3596e7f4d80a0e", }, } - - ts.executionConfig.Recover = originalExecutionName + executionConfig.Recover = originalExecutionName recoverRequest := &admin.ExecutionRecoverRequest{ Id: &core.WorkflowExecutionIdentifier{ Name: originalExecutionName, @@ -245,31 +296,39 @@ func TestCreateRecoverExecutionFunc(t *testing.T) { Domain: config.GetConfig().Domain, }, } + s.MockAdminClient.OnRecoverExecutionMatch(s.Ctx, recoverRequest).Return(recoverExecResponse, nil).Once() - ctx := s.Ctx - s.MockAdminClient.OnRecoverExecutionMatch(ctx, recoverRequest).Return(recoverExecResponse, nil) - err := createExecutionCommand(ctx, ts.args, s.CmdCtx) - assert.Nil(t, err) - s.MockAdminClient.AssertCalled(t, "RecoverExecution", ctx, recoverRequest) - tearDownAndVerify(t, s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) - ts.executionConfig.Relaunch = "" + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + + s.NoError(err) + tearDownAndVerify(s.T(), s.Writer, `execution identifier project:"flytesnacks" domain:"development" name:"f652ea3596e7f4d80a0e"`) } -func TestCreateExecutionFuncInvalid(t *testing.T) { - s := setup() - ts := createExecutionSetup(&s) - executionConfig := ts.executionConfig +func (s *createSuite) TestCreateExecutionFuncInvalid() { executionConfig.Relaunch = "" executionConfig.ExecFile = "" - err := createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("executionConfig, relaunch and recover can't be empty. Run the flytectl get task/launchplan to generate the config"), err) + err := createExecutionCommand(s.Ctx, nil, s.CmdCtx) + s.EqualError(err, "executionConfig, relaunch and recover can't be empty. Run the flytectl get task/launchplan to generate the config") + executionConfig.ExecFile = "Invalid-file" - err = createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("unable to read from %v yaml file", executionConfig.ExecFile), err) + err = createExecutionCommand(s.Ctx, nil, s.CmdCtx) + s.EqualError(err, fmt.Sprintf("unable to read from %v yaml file", executionConfig.ExecFile)) + executionConfig.ExecFile = testDataFolder + "invalid_execution_spec.yaml" - err = createExecutionCommand(s.Ctx, ts.args, s.CmdCtx) - assert.NotNil(t, err) - assert.Equal(t, fmt.Errorf("either task or workflow name should be specified to launch an execution"), err) + err = createExecutionCommand(s.Ctx, nil, s.CmdCtx) + s.EqualError(err, "either task or workflow name should be specified to launch an execution") +} + +func (s *createSuite) Test_CreateTaskExecution_DryRun() { + s.onGetTask() + executionConfig.DryRun = true + executionConfig.ExecFile = testDataFolder + "task_execution_spec_with_iamrole.yaml" + + err := createExecutionCommand(s.Ctx, []string{"target"}, s.CmdCtx) + + s.NoError(err) +} + +func TestCreateSuite(t *testing.T) { + suite.Run(t, &createSuite{originalExecConfig: *executionConfig}) } diff --git a/cmd/create/execution_util.go b/cmd/create/execution_util.go index 41c438f2..85f9dd34 100644 --- a/cmd/create/execution_util.go +++ b/cmd/create/execution_util.go @@ -6,13 +6,14 @@ import ( "io/ioutil" "strings" - cmdCore "github.com/flyteorg/flytectl/cmd/core" - cmdGet "github.com/flyteorg/flytectl/cmd/get" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/admin" "github.com/flyteorg/flyteidl/gen/pb-go/flyteidl/core" "github.com/flyteorg/flytestdlib/logger" "github.com/google/uuid" "sigs.k8s.io/yaml" + + cmdCore "github.com/flyteorg/flytectl/cmd/core" + cmdGet "github.com/flyteorg/flytectl/cmd/get" ) func createExecutionRequestForWorkflow(ctx context.Context, workflowName, project, domain string, @@ -148,6 +149,10 @@ func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securi if len(targetExecName) == 0 { targetExecName = "f" + strings.ReplaceAll(uuid.New().String(), "-", "")[:19] } + var clusterAssignment *admin.ClusterAssignment + if executionConfig.ClusterPool != "" { + clusterAssignment = &admin.ClusterAssignment{ClusterPoolName: executionConfig.ClusterPool} + } return &admin.ExecutionCreateRequest{ Project: executionConfig.TargetProject, Domain: executionConfig.TargetDomain, @@ -159,8 +164,9 @@ func createExecutionRequest(ID *core.Identifier, inputs *core.LiteralMap, securi Principal: "sdk", Nesting: 0, }, - AuthRole: authRole, - SecurityContext: securityContext, + AuthRole: authRole, + SecurityContext: securityContext, + ClusterAssignment: clusterAssignment, }, Inputs: inputs, } diff --git a/cmd/create/executionconfig_flags.go b/cmd/create/executionconfig_flags.go index 621a53d2..052d0a74 100755 --- a/cmd/create/executionconfig_flags.go +++ b/cmd/create/executionconfig_flags.go @@ -59,6 +59,7 @@ func (cfg ExecutionConfig) GetPFlagSet(prefix string) *pflag.FlagSet { cmdFlags.StringVar(&executionConfig.Recover, fmt.Sprintf("%v%v", prefix, "recover"), executionConfig.Recover, "execution id to be recreated from the last known failure point.") cmdFlags.BoolVar(&executionConfig.DryRun, fmt.Sprintf("%v%v", prefix, "dryRun"), executionConfig.DryRun, "execute command without making any modifications.") cmdFlags.StringVar(&executionConfig.Version, fmt.Sprintf("%v%v", prefix, "version"), executionConfig.Version, "specify version of execution workflow/task.") + cmdFlags.StringVar(&executionConfig.ClusterPool, fmt.Sprintf("%v%v", prefix, "clusterPool"), executionConfig.ClusterPool, "specify which cluster pool to assign execution to.") cmdFlags.StringVar(&executionConfig.Workflow, fmt.Sprintf("%v%v", prefix, "workflow"), executionConfig.Workflow, "") cmdFlags.StringVar(&executionConfig.Task, fmt.Sprintf("%v%v", prefix, "task"), executionConfig.Task, "") return cmdFlags diff --git a/cmd/create/executionconfig_flags_test.go b/cmd/create/executionconfig_flags_test.go index dcae9e65..ac59b4fe 100755 --- a/cmd/create/executionconfig_flags_test.go +++ b/cmd/create/executionconfig_flags_test.go @@ -225,6 +225,20 @@ func TestExecutionConfig_SetFlags(t *testing.T) { } }) }) + t.Run("Test_clusterPool", func(t *testing.T) { + + t.Run("Override", func(t *testing.T) { + testValue := "1" + + cmdFlags.Set("clusterPool", testValue) + if vString, err := cmdFlags.GetString("clusterPool"); err == nil { + testDecodeJson_ExecutionConfig(t, fmt.Sprintf("%v", vString), &actual.ClusterPool) + + } else { + assert.FailNow(t, err.Error()) + } + }) + }) t.Run("Test_workflow", func(t *testing.T) { t.Run("Override", func(t *testing.T) { diff --git a/cmd/testdata/task_execution_spec_with_iamrole.yaml b/cmd/testdata/task_execution_spec_with_iamrole.yaml index c74db53e..30aea6cb 100644 --- a/cmd/testdata/task_execution_spec_with_iamrole.yaml +++ b/cmd/testdata/task_execution_spec_with_iamrole.yaml @@ -13,3 +13,4 @@ targetDomain: "development" targetProject: "flytesnacks" task: core.control_flow.merge_sort.merge version: v2 +clusterPool: gpu diff --git a/go.mod b/go.mod index 3cc27ebf..cc7402ff 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/docker/docker v20.10.7+incompatible github.com/docker/go-connections v0.4.0 github.com/enescakir/emoji v1.0.0 - github.com/flyteorg/flyteidl v1.1.15 + github.com/flyteorg/flyteidl v1.1.19 github.com/flyteorg/flytestdlib v1.0.0 github.com/ghodss/yaml v1.0.0 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 diff --git a/go.sum b/go.sum index 3a940fe8..eea38f8a 100644 --- a/go.sum +++ b/go.sum @@ -398,10 +398,8 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/flyteorg/flyteidl v1.0.0/go.mod h1:JW0z1ZaHS9zWvDAwSMIyGhsf+V4zrzBBgh5IuqzMFCM= -github.com/flyteorg/flyteidl v1.1.13 h1:xRUOu9+6c/zTZRTv+He1s4kX7uxmd/K5y7tAP598f8A= -github.com/flyteorg/flyteidl v1.1.13/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= -github.com/flyteorg/flyteidl v1.1.15 h1:h+T8yeya5OEt7POav0wZkjPdtUatilraVTuwrioqzuA= -github.com/flyteorg/flyteidl v1.1.15/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= +github.com/flyteorg/flyteidl v1.1.19 h1:1CtSbuFhFHwUbKdv66PqbcER01iacAJU+snh0eTsXc4= +github.com/flyteorg/flyteidl v1.1.19/go.mod h1:SLTYz2JgIKvM5MbPVlMP7uILb65fnuuZQZFHHIEYh2U= github.com/flyteorg/flyteplugins v1.0.0 h1:77hUJjiIxBmQ9rd3+cXjSGnzOVAFrSzCd59aIaYFB/8= github.com/flyteorg/flyteplugins v1.0.0/go.mod h1:4Cpn+9RfanIieTTh2XsuL6zPYXtsR5UDe8YaEmXONT4= github.com/flyteorg/flytepropeller v1.1.1 h1:z9OFS7VAsoFOyIGSfIszaMrERG8MOvS17yzpuiusb64=