From 86859d19e5af3358c48629922341cbaf12692a74 Mon Sep 17 00:00:00 2001 From: Yee Hing Tong Date: Fri, 23 Aug 2024 15:24:02 -0700 Subject: [PATCH] Auth/prevent lookup per call (#5686) * save values Signed-off-by: Yee Hing Tong * move things up Signed-off-by: Yee Hing Tong * tests Signed-off-by: Yee Hing Tong * unit test Signed-off-by: Yee Hing Tong * imports for client test Signed-off-by: Yee Hing Tong * more test Signed-off-by: Yee Hing Tong * don't test admin connection Signed-off-by: Yee Hing Tong * disable client for config Signed-off-by: Yee Hing Tong * make generate Signed-off-by: Yee Hing Tong * hide behind a once Signed-off-by: Yee Hing Tong * typo Signed-off-by: Yee Hing Tong * reset client builder test Signed-off-by: Yee Hing Tong * reset client test Signed-off-by: Yee Hing Tong * revert propeller Signed-off-by: Yee Hing Tong * delay invocation even further Signed-off-by: Yee Hing Tong --------- Signed-off-by: Yee Hing Tong Signed-off-by: Bugra Gedik --- flytectl/cmd/configuration/configuration.go | 10 +- flytectl/cmd/core/cmd_test.go | 4 +- flyteidl/clients/go/admin/auth_interceptor.go | 108 +++++++++++++----- .../clients/go/admin/auth_interceptor_test.go | 88 ++++++++++++-- flyteidl/clients/go/admin/client.go | 3 +- flyteidl/gen/pb_rust/datacatalog.rs | 9 +- flyteidl/gen/pb_rust/flyteidl.admin.rs | 49 ++++---- flyteidl/gen/pb_rust/flyteidl.cacheservice.rs | 7 +- flyteidl/gen/pb_rust/flyteidl.core.rs | 41 +++---- flyteidl/gen/pb_rust/flyteidl.event.rs | 1 + .../gen/pb_rust/flyteidl.plugins.kubeflow.rs | 3 +- flyteidl/gen/pb_rust/flyteidl.plugins.rs | 11 +- flyteidl/gen/pb_rust/flyteidl.service.rs | 9 +- 13 files changed, 238 insertions(+), 105 deletions(-) diff --git a/flytectl/cmd/configuration/configuration.go b/flytectl/cmd/configuration/configuration.go index ecbedba721..fa9d87a00a 100644 --- a/flytectl/cmd/configuration/configuration.go +++ b/flytectl/cmd/configuration/configuration.go @@ -63,9 +63,13 @@ func CreateConfigCommand() *cobra.Command { configCmd := viper.GetConfigCommand() getResourcesFuncs := map[string]cmdcore.CommandEntry{ - "init": {CmdFunc: configInitFunc, Aliases: []string{""}, ProjectDomainNotRequired: true, - Short: initCmdShort, - Long: initCmdLong, PFlagProvider: initConfig.DefaultConfig}, + "init": { + CmdFunc: configInitFunc, + Aliases: []string{""}, + ProjectDomainNotRequired: true, + DisableFlyteClient: true, + Short: initCmdShort, + Long: initCmdLong, PFlagProvider: initConfig.DefaultConfig}, } configCmd.Flags().BoolVar(&initConfig.DefaultConfig.Force, "force", false, "Force to overwrite the default config file without confirmation") diff --git a/flytectl/cmd/core/cmd_test.go b/flytectl/cmd/core/cmd_test.go index e3a1843105..3f5b3b19a5 100644 --- a/flytectl/cmd/core/cmd_test.go +++ b/flytectl/cmd/core/cmd_test.go @@ -21,7 +21,7 @@ func TestGenerateCommandFunc(t *testing.T) { adminCfg.Endpoint = config.URL{URL: url.URL{Host: "dummyHost"}} adminCfg.AuthType = admin.AuthTypePkce rootCmd := &cobra.Command{} - cmdEntry := CommandEntry{CmdFunc: testCommandFunc, ProjectDomainNotRequired: true} + cmdEntry := CommandEntry{CmdFunc: testCommandFunc, ProjectDomainNotRequired: true, DisableFlyteClient: true} fn := generateCommandFunc(cmdEntry) assert.Nil(t, fn(rootCmd, []string{})) }) @@ -30,7 +30,7 @@ func TestGenerateCommandFunc(t *testing.T) { adminCfg := admin.GetConfig(context.Background()) adminCfg.Endpoint = config.URL{URL: url.URL{Host: ""}} rootCmd := &cobra.Command{} - cmdEntry := CommandEntry{CmdFunc: testCommandFunc, ProjectDomainNotRequired: true} + cmdEntry := CommandEntry{CmdFunc: testCommandFunc, ProjectDomainNotRequired: true, DisableFlyteClient: true} fn := generateCommandFunc(cmdEntry) assert.Nil(t, fn(rootCmd, []string{})) }) diff --git a/flyteidl/clients/go/admin/auth_interceptor.go b/flyteidl/clients/go/admin/auth_interceptor.go index 4cebf6440f..5d3d9fd92f 100644 --- a/flyteidl/clients/go/admin/auth_interceptor.go +++ b/flyteidl/clients/go/admin/auth_interceptor.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net/http" + "sync" "golang.org/x/oauth2" "google.golang.org/grpc" @@ -20,33 +21,10 @@ const ProxyAuthorizationHeader = "proxy-authorization" // MaterializeCredentials will attempt to build a TokenSource given the anonymously available information exposed by the server. // Once established, it'll invoke PerRPCCredentialsFuture.Store() on perRPCCredentials to populate it with the appropriate values. -func MaterializeCredentials(ctx context.Context, cfg *Config, tokenCache cache.TokenCache, - perRPCCredentials *PerRPCCredentialsFuture, proxyCredentialsFuture *PerRPCCredentialsFuture) error { - authMetadataClient, err := InitializeAuthMetadataClient(ctx, cfg, proxyCredentialsFuture) - if err != nil { - return fmt.Errorf("failed to initialized Auth Metadata Client. Error: %w", err) - } - - tokenSourceProvider, err := NewTokenSourceProvider(ctx, cfg, tokenCache, authMetadataClient) - if err != nil { - return fmt.Errorf("failed to initialized token source provider. Err: %w", err) - } - - authorizationMetadataKey := cfg.AuthorizationHeader - if len(authorizationMetadataKey) == 0 { - clientMetadata, err := authMetadataClient.GetPublicClientConfig(ctx, &service.PublicClientAuthConfigRequest{}) - if err != nil { - return fmt.Errorf("failed to fetch client metadata. Error: %v", err) - } - authorizationMetadataKey = clientMetadata.AuthorizationMetadataKey - } - - tokenSource, err := tokenSourceProvider.GetTokenSource(ctx) - if err != nil { - return fmt.Errorf("failed to get token source. Error: %w", err) - } +func MaterializeCredentials(tokenSource oauth2.TokenSource, cfg *Config, authorizationMetadataKey string, + perRPCCredentials *PerRPCCredentialsFuture) error { - _, err = tokenSource.Token() + _, err := tokenSource.Token() if err != nil { return fmt.Errorf("failed to issue token. Error: %w", err) } @@ -127,6 +105,60 @@ func setHTTPClientContext(ctx context.Context, cfg *Config, proxyCredentialsFutu return context.WithValue(ctx, oauth2.HTTPClient, httpClient) } +type OauthMetadataProvider struct { + authorizationMetadataKey string + tokenSource oauth2.TokenSource + once sync.Once +} + +func (o *OauthMetadataProvider) getTokenSourceAndMetadata(cfg *Config, tokenCache cache.TokenCache, proxyCredentialsFuture *PerRPCCredentialsFuture) error { + ctx := context.Background() + + authMetadataClient, err := InitializeAuthMetadataClient(ctx, cfg, proxyCredentialsFuture) + if err != nil { + return fmt.Errorf("failed to initialized Auth Metadata Client. Error: %w", err) + } + + tokenSourceProvider, err := NewTokenSourceProvider(ctx, cfg, tokenCache, authMetadataClient) + if err != nil { + return fmt.Errorf("failed to initialize token source provider. Err: %w", err) + } + + authorizationMetadataKey := cfg.AuthorizationHeader + if len(authorizationMetadataKey) == 0 { + clientMetadata, err := authMetadataClient.GetPublicClientConfig(ctx, &service.PublicClientAuthConfigRequest{}) + if err != nil { + return fmt.Errorf("failed to fetch client metadata. Error: %v", err) + } + authorizationMetadataKey = clientMetadata.AuthorizationMetadataKey + } + + tokenSource, err := tokenSourceProvider.GetTokenSource(ctx) + if err != nil { + return fmt.Errorf("failed to get token source. Error: %w", err) + } + + o.authorizationMetadataKey = authorizationMetadataKey + o.tokenSource = tokenSource + + return nil +} + +func (o *OauthMetadataProvider) GetOauthMetadata(cfg *Config, tokenCache cache.TokenCache, proxyCredentialsFuture *PerRPCCredentialsFuture) error { + // Ensure loadTokenRelated() is only executed once + var err error + o.once.Do(func() { + err = o.getTokenSourceAndMetadata(cfg, tokenCache, proxyCredentialsFuture) + if err != nil { + logger.Errorf(context.Background(), "Failed to load token related config. Error: %v", err) + } + }) + if err != nil { + return err + } + return nil +} + // NewAuthInterceptor creates a new grpc.UnaryClientInterceptor that forwards the grpc call and inspects the error. // It will first invoke the grpc pipeline (to proceed with the request) with no modifications. It's expected for the grpc // pipeline to already have a grpc.WithPerRPCCredentials() DialOption. If the perRPCCredentials has already been initialized, @@ -138,13 +170,26 @@ func setHTTPClientContext(ctx context.Context, cfg *Config, proxyCredentialsFutu // a token source has been created, it'll invoke the grpc pipeline again, this time the grpc.PerRPCCredentials should // be able to find and acquire a valid AccessToken to annotate the request with. func NewAuthInterceptor(cfg *Config, tokenCache cache.TokenCache, credentialsFuture *PerRPCCredentialsFuture, proxyCredentialsFuture *PerRPCCredentialsFuture) grpc.UnaryClientInterceptor { + + oauthMetadataProvider := OauthMetadataProvider{ + once: sync.Once{}, + } + return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + ctx = setHTTPClientContext(ctx, cfg, proxyCredentialsFuture) // If there is already a token in the cache (e.g. key-ring), we should use it immediately... t, _ := tokenCache.GetToken() if t != nil { - err := MaterializeCredentials(ctx, cfg, tokenCache, credentialsFuture, proxyCredentialsFuture) + err := oauthMetadataProvider.GetOauthMetadata(cfg, tokenCache, proxyCredentialsFuture) + if err != nil { + return err + } + authorizationMetadataKey := oauthMetadataProvider.authorizationMetadataKey + tokenSource := oauthMetadataProvider.tokenSource + + err = MaterializeCredentials(tokenSource, cfg, authorizationMetadataKey, credentialsFuture) if err != nil { return fmt.Errorf("failed to materialize credentials. Error: %v", err) } @@ -157,6 +202,13 @@ func NewAuthInterceptor(cfg *Config, tokenCache cache.TokenCache, credentialsFut if st, ok := status.FromError(err); ok { // If the error we receive from executing the request expects if shouldAttemptToAuthenticate(st.Code()) { + err := oauthMetadataProvider.GetOauthMetadata(cfg, tokenCache, proxyCredentialsFuture) + if err != nil { + return err + } + authorizationMetadataKey := oauthMetadataProvider.authorizationMetadataKey + tokenSource := oauthMetadataProvider.tokenSource + err = func() error { if !tokenCache.TryLock() { tokenCache.CondWait() @@ -171,7 +223,7 @@ func NewAuthInterceptor(cfg *Config, tokenCache cache.TokenCache, credentialsFut } logger.Debugf(ctx, "Request failed due to [%v]. Attempting to establish an authenticated connection and trying again.", st.Code()) - newErr := MaterializeCredentials(ctx, cfg, tokenCache, credentialsFuture, proxyCredentialsFuture) + newErr := MaterializeCredentials(tokenSource, cfg, authorizationMetadataKey, credentialsFuture) if newErr != nil { errString := fmt.Sprintf("authentication error! Original Error: %v, Auth Error: %v", err, newErr) logger.Errorf(ctx, errString) diff --git a/flyteidl/clients/go/admin/auth_interceptor_test.go b/flyteidl/clients/go/admin/auth_interceptor_test.go index 10c96625b7..0f47e97b9c 100644 --- a/flyteidl/clients/go/admin/auth_interceptor_test.go +++ b/flyteidl/clients/go/admin/auth_interceptor_test.go @@ -24,6 +24,7 @@ import ( "github.com/flyteorg/flyte/flyteidl/clients/go/admin/cache/mocks" adminMocks "github.com/flyteorg/flyte/flyteidl/clients/go/admin/mocks" + "github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/service" "github.com/flyteorg/flyte/flytestdlib/config" "github.com/flyteorg/flyte/flytestdlib/logger" @@ -141,11 +142,34 @@ func Test_newAuthInterceptor(t *testing.T) { err := json.Unmarshal(plan, &tokenData) assert.NoError(t, err) t.Run("Other Error", func(t *testing.T) { + ctx := context.Background() + httpPort := rand.IntnRange(10000, 60000) + grpcPort := rand.IntnRange(10000, 60000) + m := &adminMocks.AuthMetadataServiceServer{} + m.OnGetOAuth2MetadataMatch(mock.Anything, mock.Anything).Return(&service.OAuth2MetadataResponse{ + AuthorizationEndpoint: fmt.Sprintf("http://localhost:%d/oauth2/authorize", httpPort), + TokenEndpoint: fmt.Sprintf("http://localhost:%d/oauth2/token", httpPort), + JwksUri: fmt.Sprintf("http://localhost:%d/oauth2/jwks", httpPort), + }, nil) + + m.OnGetPublicClientConfigMatch(mock.Anything, mock.Anything).Return(&service.PublicClientAuthConfigResponse{ + Scopes: []string{"all"}, + }, nil) + + s := newAuthMetadataServer(t, grpcPort, httpPort, m) + assert.NoError(t, s.Start(ctx)) + defer s.Close() + u, err := url.Parse(fmt.Sprintf("dns:///localhost:%d", grpcPort)) + assert.NoError(t, err) f := NewPerRPCCredentialsFuture() p := NewPerRPCCredentialsFuture() mockTokenCache := &mocks.TokenCache{} mockTokenCache.OnGetTokenMatch().Return(&tokenData, nil) - interceptor := NewAuthInterceptor(&Config{}, mockTokenCache, f, p) + mockTokenCache.OnSaveTokenMatch(mock.Anything).Return(nil) + interceptor := NewAuthInterceptor(&Config{ + Endpoint: config.URL{URL: *u}, + UseInsecureConnection: true, + }, mockTokenCache, f, p) otherError := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, opts ...grpc.CallOption) error { return status.New(codes.Canceled, "").Err() } @@ -209,6 +233,14 @@ func Test_newAuthInterceptor(t *testing.T) { httpPort := rand.IntnRange(10000, 60000) grpcPort := rand.IntnRange(10000, 60000) m := &adminMocks.AuthMetadataServiceServer{} + m.OnGetOAuth2MetadataMatch(mock.Anything, mock.Anything).Return(&service.OAuth2MetadataResponse{ + AuthorizationEndpoint: fmt.Sprintf("http://localhost:%d/oauth2/authorize", httpPort), + TokenEndpoint: fmt.Sprintf("http://localhost:%d/oauth2/token", httpPort), + JwksUri: fmt.Sprintf("http://localhost:%d/oauth2/jwks", httpPort), + }, nil) + m.OnGetPublicClientConfigMatch(mock.Anything, mock.Anything).Return(&service.PublicClientAuthConfigResponse{ + Scopes: []string{"all"}, + }, nil) s := newAuthMetadataServer(t, grpcPort, httpPort, m) ctx := context.Background() assert.NoError(t, s.Start(ctx)) @@ -283,12 +315,13 @@ func Test_newAuthInterceptor(t *testing.T) { }) } -func TestMaterializeCredentials(t *testing.T) { +func TestNewAuthInterceptorAndMaterialize(t *testing.T) { t.Run("No oauth2 metadata endpoint or Public client config lookup", func(t *testing.T) { httpPort := rand.IntnRange(10000, 60000) grpcPort := rand.IntnRange(10000, 60000) + fakeToken := &oauth2.Token{} c := &mocks.TokenCache{} - c.OnGetTokenMatch().Return(nil, nil) + c.OnGetTokenMatch().Return(fakeToken, nil) c.OnSaveTokenMatch(mock.Anything).Return(nil) m := &adminMocks.AuthMetadataServiceServer{} m.OnGetOAuth2MetadataMatch(mock.Anything, mock.Anything).Return(nil, errors.New("unexpected call to get oauth2 metadata")) @@ -304,7 +337,7 @@ func TestMaterializeCredentials(t *testing.T) { f := NewPerRPCCredentialsFuture() p := NewPerRPCCredentialsFuture() - err = MaterializeCredentials(ctx, &Config{ + cfg := &Config{ Endpoint: config.URL{URL: *u}, UseInsecureConnection: true, AuthType: AuthTypeClientSecret, @@ -312,14 +345,22 @@ func TestMaterializeCredentials(t *testing.T) { Scopes: []string{"all"}, Audience: "http://localhost:30081", AuthorizationHeader: "authorization", - }, c, f, p) + } + + intercept := NewAuthInterceptor(cfg, c, f, p) + // Invoke Materialize inside the intercept + err = intercept(ctx, "GET", nil, nil, nil, func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, opts ...grpc.CallOption) error { + return nil + }) assert.NoError(t, err) }) + t.Run("Failed to fetch client metadata", func(t *testing.T) { httpPort := rand.IntnRange(10000, 60000) grpcPort := rand.IntnRange(10000, 60000) c := &mocks.TokenCache{} - c.OnGetTokenMatch().Return(nil, nil) + fakeToken := &oauth2.Token{} + c.OnGetTokenMatch().Return(fakeToken, nil) c.OnSaveTokenMatch(mock.Anything).Return(nil) m := &adminMocks.AuthMetadataServiceServer{} m.OnGetOAuth2MetadataMatch(mock.Anything, mock.Anything).Return(nil, errors.New("unexpected call to get oauth2 metadata")) @@ -333,17 +374,44 @@ func TestMaterializeCredentials(t *testing.T) { u, err := url.Parse(fmt.Sprintf("dns:///localhost:%d", grpcPort)) assert.NoError(t, err) + cfg := &Config{ + Endpoint: config.URL{URL: *u}, + UseInsecureConnection: true, + AuthType: AuthTypeClientSecret, + TokenURL: fmt.Sprintf("http://localhost:%d/api/v1/token", httpPort), + Scopes: []string{"all"}, + } f := NewPerRPCCredentialsFuture() p := NewPerRPCCredentialsFuture() + intercept := NewAuthInterceptor(cfg, c, f, p) + err = intercept(ctx, "GET", nil, nil, nil, func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, opts ...grpc.CallOption) error { + return nil + }) + assert.EqualError(t, err, "failed to fetch client metadata. Error: rpc error: code = Unknown desc = expected err") + }) +} + +func TestSimpleMaterializeCredentials(t *testing.T) { + t.Run("simple materialize", func(t *testing.T) { + httpPort := rand.IntnRange(10000, 60000) + grpcPort := rand.IntnRange(10000, 60000) + u, err := url.Parse(fmt.Sprintf("dns:///localhost:%d", grpcPort)) + assert.NoError(t, err) + + f := NewPerRPCCredentialsFuture() - err = MaterializeCredentials(ctx, &Config{ + dummySource := DummyTestTokenSource{} + + err = MaterializeCredentials(dummySource, &Config{ Endpoint: config.URL{URL: *u}, UseInsecureConnection: true, AuthType: AuthTypeClientSecret, - TokenURL: fmt.Sprintf("http://localhost:%d/api/v1/token", httpPort), + TokenURL: fmt.Sprintf("http://localhost:%d/oauth2/token", httpPort), Scopes: []string{"all"}, - }, c, f, p) - assert.EqualError(t, err, "failed to fetch client metadata. Error: rpc error: code = Unknown desc = expected err") + Audience: "http://localhost:30081", + AuthorizationHeader: "authorization", + }, "authorization", f) + assert.NoError(t, err) }) } diff --git a/flyteidl/clients/go/admin/client.go b/flyteidl/clients/go/admin/client.go index 9758bd9dec..757f25b160 100644 --- a/flyteidl/clients/go/admin/client.go +++ b/flyteidl/clients/go/admin/client.go @@ -179,8 +179,9 @@ func initializeClients(ctx context.Context, cfg *Config, tokenCache cache.TokenC credentialsFuture := NewPerRPCCredentialsFuture() proxyCredentialsFuture := NewPerRPCCredentialsFuture() + authInterceptor := NewAuthInterceptor(cfg, tokenCache, credentialsFuture, proxyCredentialsFuture) opts = append(opts, - grpc.WithChainUnaryInterceptor(NewAuthInterceptor(cfg, tokenCache, credentialsFuture, proxyCredentialsFuture)), + grpc.WithChainUnaryInterceptor(authInterceptor), grpc.WithPerRPCCredentials(credentialsFuture)) if cfg.DefaultServiceConfig != "" { diff --git a/flyteidl/gen/pb_rust/datacatalog.rs b/flyteidl/gen/pb_rust/datacatalog.rs index f181704954..b49cab340c 100644 --- a/flyteidl/gen/pb_rust/datacatalog.rs +++ b/flyteidl/gen/pb_rust/datacatalog.rs @@ -1,4 +1,5 @@ // @generated +// This file is @generated by prost-build. /// /// Request message for creating a Dataset. #[allow(clippy::derive_partial_eq_without_eq)] @@ -10,7 +11,7 @@ pub struct CreateDatasetRequest { /// /// Response message for creating a Dataset #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct CreateDatasetResponse { } /// @@ -74,7 +75,7 @@ pub struct CreateArtifactRequest { /// /// Response message for creating an Artifact. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct CreateArtifactResponse { } /// @@ -88,7 +89,7 @@ pub struct AddTagRequest { /// /// Response message for tagging an Artifact. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct AddTagResponse { } /// List the artifacts that belong to the Dataset, optionally filtered using filtered expression. @@ -245,7 +246,7 @@ pub struct ReleaseReservationRequest { } /// Response to release reservation #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ReleaseReservationResponse { } /// diff --git a/flyteidl/gen/pb_rust/flyteidl.admin.rs b/flyteidl/gen/pb_rust/flyteidl.admin.rs index ca3270264b..30f39ab45d 100644 --- a/flyteidl/gen/pb_rust/flyteidl.admin.rs +++ b/flyteidl/gen/pb_rust/flyteidl.admin.rs @@ -1,4 +1,5 @@ // @generated +// This file is @generated by prost-build. /// Represents a subset of runtime task execution metadata that are relevant to external plugins. /// /// ID of the task execution @@ -194,7 +195,7 @@ pub struct DeleteTaskRequest { } /// Response to delete a task. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct DeleteTaskResponse { } /// A message containing the agent metadata. @@ -246,7 +247,7 @@ pub struct GetAgentResponse { } /// A request to list all agents. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ListAgentsRequest { } /// A response containing a list of agents. @@ -608,7 +609,7 @@ pub struct NamedEntityUpdateRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct NamedEntityUpdateResponse { } /// Shared request structure to fetch a single resource. @@ -1003,7 +1004,7 @@ pub struct WorkflowExecutionEventRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct WorkflowExecutionEventResponse { } /// Request to send a notification that a node execution event has occurred. @@ -1019,7 +1020,7 @@ pub struct NodeExecutionEventRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct NodeExecutionEventResponse { } /// Request to send a notification that a task execution event has occurred. @@ -1035,7 +1036,7 @@ pub struct TaskExecutionEventRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct TaskExecutionEventResponse { } /// Defines a set of overridable task resource attributes set during task registration. @@ -1717,7 +1718,7 @@ pub struct ExecutionTerminateRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ExecutionTerminateResponse { } /// Request structure to fetch inputs, output and other data produced by an execution. @@ -1774,7 +1775,7 @@ pub struct ExecutionStateChangeDetails { pub principal: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ExecutionUpdateResponse { } /// WorkflowExecutionGetMetricsRequest represents a request to retrieve metrics for the specified workflow execution. @@ -1828,7 +1829,7 @@ impl ExecutionState { } /// Option for schedules run at a certain frequency e.g. every 2 minutes. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct FixedRate { #[prost(uint32, tag="1")] pub value: u32, @@ -1919,7 +1920,7 @@ pub struct LaunchPlanCreateRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct LaunchPlanCreateResponse { } /// A LaunchPlan provides the capability to templatize workflow executions. @@ -2084,7 +2085,7 @@ pub struct LaunchPlanUpdateRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct LaunchPlanUpdateResponse { } /// Represents a request struct for finding an active launch plan for a given NamedEntityIdentifier @@ -2460,7 +2461,7 @@ pub struct EmailMessage { } /// Empty request for GetDomain #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct GetDomainRequest { } /// Namespace within a project commonly used to differentiate between different service instances. @@ -2596,12 +2597,12 @@ pub struct ProjectRegisterRequest { } /// Purposefully empty, may be updated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ProjectRegisterResponse { } /// Purposefully empty, may be updated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ProjectUpdateResponse { } #[allow(clippy::derive_partial_eq_without_eq)] @@ -2652,7 +2653,7 @@ pub struct ProjectAttributesUpdateRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ProjectAttributesUpdateResponse { } /// Request to get an individual project level attribute override. @@ -2699,7 +2700,7 @@ pub struct ProjectAttributesDeleteRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ProjectAttributesDeleteResponse { } /// Defines a set of custom matching attributes which defines resource defaults for a project and domain. @@ -2730,7 +2731,7 @@ pub struct ProjectDomainAttributesUpdateRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ProjectDomainAttributesUpdateResponse { } /// Request to get an individual project domain attribute override. @@ -2785,7 +2786,7 @@ pub struct ProjectDomainAttributesDeleteRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ProjectDomainAttributesDeleteResponse { } /// SignalGetOrCreateRequest represents a request structure to retrieve or create a signal. @@ -2857,7 +2858,7 @@ pub struct SignalSetRequest { /// /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct SignalSetResponse { } /// Signal encapsulates a unique identifier, associated metadata, and a value for a single Flyte @@ -2895,7 +2896,7 @@ pub struct TaskCreateRequest { /// /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct TaskCreateResponse { } /// Flyte workflows are composed of many ordered tasks. That is small, reusable, self-contained logical blocks @@ -3155,7 +3156,7 @@ pub struct Version { } /// Empty request for GetVersion #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct GetVersionRequest { } /// Represents a request structure to create a revision of a workflow. @@ -3174,7 +3175,7 @@ pub struct WorkflowCreateRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct WorkflowCreateResponse { } /// Represents the workflow structure stored in the Admin @@ -3295,7 +3296,7 @@ pub struct WorkflowAttributesUpdateRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct WorkflowAttributesUpdateResponse { } /// Request to get an individual workflow attribute override. @@ -3357,7 +3358,7 @@ pub struct WorkflowAttributesDeleteRequest { } /// Purposefully empty, may be populated in the future. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct WorkflowAttributesDeleteResponse { } // @@protoc_insertion_point(module) diff --git a/flyteidl/gen/pb_rust/flyteidl.cacheservice.rs b/flyteidl/gen/pb_rust/flyteidl.cacheservice.rs index ff3264c633..d63e4d31bf 100644 --- a/flyteidl/gen/pb_rust/flyteidl.cacheservice.rs +++ b/flyteidl/gen/pb_rust/flyteidl.cacheservice.rs @@ -1,4 +1,5 @@ // @generated +// This file is @generated by prost-build. /// /// Additional metadata as key-value pairs #[allow(clippy::derive_partial_eq_without_eq)] @@ -88,7 +89,7 @@ pub struct PutCacheRequest { /// /// Empty, success indicated by no errors #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct PutCacheResponse { } /// @@ -105,7 +106,7 @@ pub struct DeleteCacheRequest { /// /// Empty, success indicated by no errors #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct DeleteCacheResponse { } /// A reservation including owner, heartbeat interval, expiration timestamp, and various metadata. @@ -166,7 +167,7 @@ pub struct ReleaseReservationRequest { /// /// Empty, success indicated by no errors #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ReleaseReservationResponse { } include!("flyteidl.cacheservice.tonic.rs"); diff --git a/flyteidl/gen/pb_rust/flyteidl.core.rs b/flyteidl/gen/pb_rust/flyteidl.core.rs index 0876c70d6f..f2b73c9b11 100644 --- a/flyteidl/gen/pb_rust/flyteidl.core.rs +++ b/flyteidl/gen/pb_rust/flyteidl.core.rs @@ -1,4 +1,5 @@ // @generated +// This file is @generated by prost-build. /// Defines schema columns and types to strongly type-validate schemas interoperability. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] @@ -375,7 +376,7 @@ pub mod primitive { /// Used to denote a nil/null/None assignment to a scalar value. The underlying LiteralType for Void is intentionally /// undefined since it can be assigned to a scalar of any LiteralType. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct Void { } /// Refers to an offloaded set of files. It encapsulates the type of the store and a unique uri for where the data is. @@ -600,7 +601,7 @@ pub struct KeyValuePair { } /// Retry strategy associated with an executable unit. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct RetryStrategy { /// Number of retries. Retries will be consumed when the job fails with a recoverable error. /// The number of retries must be less than or equals to 10. @@ -770,7 +771,7 @@ pub struct InputBindingData { pub var: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct RuntimeBinding { } #[allow(clippy::derive_partial_eq_without_eq)] @@ -1390,7 +1391,7 @@ pub mod task_metadata { /// Identify whether task is interruptible #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] +#[derive(Clone, Copy, PartialEq, ::prost::Oneof)] pub enum InterruptibleValue { #[prost(bool, tag="8")] Interruptible(bool), @@ -1460,7 +1461,7 @@ pub mod task_template { /// Defines port properties for a container. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ContainerPort { /// Number of port to expose on the pod's IP address. /// This must be a valid port number, 0 < x < 65536. @@ -1551,7 +1552,7 @@ pub mod container { } /// Strategy to use when dealing with Blob, Schema, or multipart blob data (large datasets) #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct IoStrategy { /// Mode to use to manage downloads #[prost(enumeration="io_strategy::DownloadMode", tag="1")] @@ -1926,7 +1927,7 @@ pub mod conjunction_expression { } /// Indicates various phases of Workflow Execution #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct WorkflowExecution { } /// Nested message and enum types in `WorkflowExecution`. @@ -1984,7 +1985,7 @@ pub mod workflow_execution { } /// Indicates various phases of Node Execution that only include the time spent to run the nodes/workflows #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct NodeExecution { } /// Nested message and enum types in `NodeExecution`. @@ -2046,7 +2047,7 @@ pub mod node_execution { /// Phases that task plugins can go through. Not all phases may be applicable to a specific plugin task, /// but this is the cumulative list that customers may want to know about for their task. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct TaskExecution { } /// Nested message and enum types in `TaskExecution`. @@ -2200,7 +2201,7 @@ pub mod task_log { } /// Represents customized execution run-time attributes. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct QualityOfServiceSpec { /// Indicates how much queueing delay an execution can tolerate. #[prost(message, optional, tag="1")] @@ -2208,7 +2209,7 @@ pub struct QualityOfServiceSpec { } /// Indicates the priority of an execution. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct QualityOfService { #[prost(oneof="quality_of_service::Designation", tags="1, 2")] pub designation: ::core::option::Option, @@ -2249,7 +2250,7 @@ pub mod quality_of_service { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] +#[derive(Clone, Copy, PartialEq, ::prost::Oneof)] pub enum Designation { #[prost(enumeration="Tier", tag="1")] Tier(i32), @@ -2369,7 +2370,7 @@ pub struct SignalCondition { } /// SleepCondition represents a dependency on waiting for the specified duration. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct SleepCondition { /// The overall duration for this sleep. #[prost(message, optional, tag="1")] @@ -2448,7 +2449,7 @@ pub mod array_node { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] +#[derive(Clone, Copy, PartialEq, ::prost::Oneof)] pub enum ParallelismOption { /// parallelism defines the minimum number of instances to bring up concurrently at any given /// point. Note that this is an optimistic restriction and that, due to network partitioning or @@ -2458,7 +2459,7 @@ pub mod array_node { Parallelism(u32), } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] +#[derive(Clone, Copy, PartialEq, ::prost::Oneof)] pub enum SuccessCriteria { /// min_successes is an absolute number of the minimum number of successful completions of /// sub-nodes. As soon as this criteria is met, the ArrayNode will be marked as successful @@ -2502,14 +2503,14 @@ pub struct NodeMetadata { pub mod node_metadata { /// Identify whether node is interruptible #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] +#[derive(Clone, Copy, PartialEq, ::prost::Oneof)] pub enum InterruptibleValue { #[prost(bool, tag="6")] Interruptible(bool), } /// Identify whether a node should have it's outputs cached. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] +#[derive(Clone, Copy, PartialEq, ::prost::Oneof)] pub enum CacheableValue { #[prost(bool, tag="7")] Cacheable(bool), @@ -2523,7 +2524,7 @@ pub mod node_metadata { } /// Identify whether caching operations involving this node should be serialized. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] +#[derive(Clone, Copy, PartialEq, ::prost::Oneof)] pub enum CacheSerializableValue { #[prost(bool, tag="9")] CacheSerializable(bool), @@ -2653,7 +2654,7 @@ pub mod workflow_metadata { /// If you are adding a setting that applies to both the Workflow itself, and everything underneath it, it should be /// added to both this object and the WorkflowMetadata object above. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct WorkflowMetadataDefaults { /// Whether child nodes of the workflow are interruptible. #[prost(bool, tag="1")] @@ -2884,7 +2885,7 @@ pub mod catalog_metadata { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct CatalogReservation { } /// Nested message and enum types in `CatalogReservation`. diff --git a/flyteidl/gen/pb_rust/flyteidl.event.rs b/flyteidl/gen/pb_rust/flyteidl.event.rs index 281ee07daa..80a8a11442 100644 --- a/flyteidl/gen/pb_rust/flyteidl.event.rs +++ b/flyteidl/gen/pb_rust/flyteidl.event.rs @@ -1,4 +1,5 @@ // @generated +// This file is @generated by prost-build. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct WorkflowExecutionEvent { diff --git a/flyteidl/gen/pb_rust/flyteidl.plugins.kubeflow.rs b/flyteidl/gen/pb_rust/flyteidl.plugins.kubeflow.rs index 9eebb7bc9e..b2a4d69f57 100644 --- a/flyteidl/gen/pb_rust/flyteidl.plugins.kubeflow.rs +++ b/flyteidl/gen/pb_rust/flyteidl.plugins.kubeflow.rs @@ -1,6 +1,7 @@ // @generated +// This file is @generated by prost-build. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct RunPolicy { /// Defines the policy to kill pods after the job completes. Default to None. #[prost(enumeration="CleanPodPolicy", tag="1")] diff --git a/flyteidl/gen/pb_rust/flyteidl.plugins.rs b/flyteidl/gen/pb_rust/flyteidl.plugins.rs index 28c2f77e97..0252c9d882 100644 --- a/flyteidl/gen/pb_rust/flyteidl.plugins.rs +++ b/flyteidl/gen/pb_rust/flyteidl.plugins.rs @@ -1,8 +1,9 @@ // @generated +// This file is @generated by prost-build. /// Describes a job that can process independent pieces of data concurrently. Multiple copies of the runnable component /// will be executed concurrently. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ArrayJob { /// Defines the maximum number of instances to bring up concurrently at any given point. Note that this is an /// optimistic restriction and that, due to network partitioning or other failures, the actual number of currently @@ -20,7 +21,7 @@ pub struct ArrayJob { /// Nested message and enum types in `ArrayJob`. pub mod array_job { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] +#[derive(Clone, Copy, PartialEq, ::prost::Oneof)] pub enum SuccessCriteria { /// An absolute number of the minimum number of successful completions of subtasks. As soon as this criteria is met, /// the array job will be marked as successful and outputs will be computed. This has to be a non-negative number if @@ -120,7 +121,7 @@ pub struct DaskWorkerGroup { /// MPI operator proposal /// Custom proto for plugin that enables distributed training using #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct DistributedMpiTrainingTask { /// number of worker spawned in the cluster for this job #[prost(int32, tag="1")] @@ -277,7 +278,7 @@ pub struct WorkerGroupSpec { pub ray_start_params: ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct SparkApplication { } /// Nested message and enum types in `SparkApplication`. @@ -347,7 +348,7 @@ pub struct SparkJob { } /// Custom proto for plugin that enables distributed training using #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct DistributedTensorflowTrainingTask { /// number of worker replicas spawned in the cluster for this job #[prost(int32, tag="1")] diff --git a/flyteidl/gen/pb_rust/flyteidl.service.rs b/flyteidl/gen/pb_rust/flyteidl.service.rs index 2fb065da4e..8c5a33de9a 100644 --- a/flyteidl/gen/pb_rust/flyteidl.service.rs +++ b/flyteidl/gen/pb_rust/flyteidl.service.rs @@ -1,6 +1,7 @@ // @generated +// This file is @generated by prost-build. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct OAuth2MetadataRequest { } /// OAuth2MetadataResponse defines an RFC-Compliant response for /.well-known/oauth-authorization-server metadata @@ -44,7 +45,7 @@ pub struct OAuth2MetadataResponse { pub device_authorization_endpoint: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct PublicClientAuthConfigRequest { } /// FlyteClientResponse encapsulates public information that flyte clients (CLIs... etc.) can use to authenticate users. @@ -335,7 +336,7 @@ pub struct TaskDeleteRequest { } /// Response to delete a task. #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct TaskDeleteResponse { } /// The state of the execution is used to control its visibility in the UI/CLI. @@ -375,7 +376,7 @@ impl State { } } #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct UserInfoRequest { } /// See the OpenID Connect spec at for more information.