From ec06bc568b62edb066f944aadd4385320ebd4f01 Mon Sep 17 00:00:00 2001 From: Jillian Inapurapu Date: Wed, 6 Sep 2023 16:22:28 -0700 Subject: [PATCH] Moved add bucket replication rule to screen from modal WIP build issues Style improvements, working better Added selector for replicate existing objects Removed unused imports Updated swagger WIP field validation, fixed error handling redirect behavior Fixed position of formlayout Validate fields Added missing dependencies disabled exhausitive deps Moved url validation to external function removed unused import --- models/admin_info_response.go | 15 + models/bucket.go | 20 + models/bucket_encryption_request.go | 5 + models/bucket_event_request.go | 1 + models/bucket_lifecycle_response.go | 5 + models/bucket_replication_response.go | 5 + models/bucket_replication_rule.go | 5 + models/bucket_versioning_response.go | 5 + models/configuration.go | 5 + models/configuration_k_v.go | 5 + models/get_bucket_retention_config.go | 8 + models/iam_policy.go | 5 + models/idp_list_configurations_response.go | 5 + models/idp_server_configuration.go | 5 + models/kms_a_p_is_response.go | 5 + models/kms_describe_self_identity_response.go | 5 + models/kms_list_identities_response.go | 5 + models/kms_list_keys_response.go | 5 + models/kms_list_policies_response.go | 5 + models/kms_metrics_response.go | 5 + models/kms_status_response.go | 5 + models/ldap_entities.go | 15 + models/list_access_rules_response.go | 5 + models/list_bucket_events_response.go | 5 + models/list_buckets_response.go | 5 + models/list_config_response.go | 5 + models/list_objects_response.go | 5 + models/list_policies_response.go | 5 + models/list_remote_buckets_response.go | 5 + models/list_users_response.go | 5 + models/login_details.go | 5 + models/login_request.go | 5 + models/make_bucket_request.go | 15 + models/multi_bucket_replication.go | 5 + models/multi_bucket_response_state.go | 5 + models/multi_lifecycle_result.go | 5 + models/notif_endpoint_response.go | 5 + models/notification_config.go | 4 + models/notification_delete_request.go | 4 + models/notification_endpoint.go | 1 + models/notification_endpoint_item.go | 4 + models/object_bucket_lifecycle.go | 15 + models/put_bucket_retention_request.go | 2 + models/put_object_legal_hold_request.go | 1 + models/put_object_retention_request.go | 1 + models/release_info.go | 5 + models/release_list_response.go | 5 + models/release_metadata.go | 5 + models/result_target.go | 5 + models/rewind_response.go | 5 + models/server_properties.go | 5 + models/service_accounts.go | 5 + models/session_response.go | 10 + models/set_bucket_policy_request.go | 1 + models/set_config_request.go | 5 + models/set_notification_endpoint_response.go | 1 + models/set_policy_multiple_name_request.go | 8 + models/set_policy_name_request.go | 1 + models/set_policy_request.go | 1 + models/site_replication_add_request.go | 5 + models/site_replication_info_response.go | 5 + models/start_profiling_list.go | 5 + models/subnet_login_response.go | 5 + models/tier.go | 20 + models/tier_list_response.go | 5 + models/user_service_account_summary.go | 5 + models/widget.go | 15 + models/widget_details.go | 15 + portal-ui/src/api/consoleApi.ts | 7 +- .../src/common/SecureComponent/permissions.ts | 4 + .../BucketDetails/AddBucketReplication.tsx | 477 ++++++++++++++++++ .../BucketDetails/BucketReplicationPanel.tsx | 13 +- portal-ui/src/screens/Console/Console.tsx | 13 + portal-ui/src/screens/Console/helpTopics.json | 81 +++ restapi/operations/console_api.go | 2 +- 75 files changed, 992 insertions(+), 8 deletions(-) create mode 100644 portal-ui/src/screens/Console/Buckets/BucketDetails/AddBucketReplication.tsx diff --git a/models/admin_info_response.go b/models/admin_info_response.go index 4d1faacd9b..1349867c18 100644 --- a/models/admin_info_response.go +++ b/models/admin_info_response.go @@ -228,6 +228,11 @@ func (m *AdminInfoResponse) ContextValidate(ctx context.Context, formats strfmt. func (m *AdminInfoResponse) contextValidateBackend(ctx context.Context, formats strfmt.Registry) error { if m.Backend != nil { + + if swag.IsZero(m.Backend) { // not required + return nil + } + if err := m.Backend.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("backend") @@ -246,6 +251,11 @@ func (m *AdminInfoResponse) contextValidateServers(ctx context.Context, formats for i := 0; i < len(m.Servers); i++ { if m.Servers[i] != nil { + + if swag.IsZero(m.Servers[i]) { // not required + return nil + } + if err := m.Servers[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("servers" + "." + strconv.Itoa(i)) @@ -266,6 +276,11 @@ func (m *AdminInfoResponse) contextValidateWidgets(ctx context.Context, formats for i := 0; i < len(m.Widgets); i++ { if m.Widgets[i] != nil { + + if swag.IsZero(m.Widgets[i]) { // not required + return nil + } + if err := m.Widgets[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("widgets" + "." + strconv.Itoa(i)) diff --git a/models/bucket.go b/models/bucket.go index 64c597c983..2fc06bca45 100644 --- a/models/bucket.go +++ b/models/bucket.go @@ -185,6 +185,11 @@ func (m *Bucket) ContextValidate(ctx context.Context, formats strfmt.Registry) e func (m *Bucket) contextValidateAccess(ctx context.Context, formats strfmt.Registry) error { if m.Access != nil { + + if swag.IsZero(m.Access) { // not required + return nil + } + if err := m.Access.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("access") @@ -201,6 +206,11 @@ func (m *Bucket) contextValidateAccess(ctx context.Context, formats strfmt.Regis func (m *Bucket) contextValidateDetails(ctx context.Context, formats strfmt.Registry) error { if m.Details != nil { + + if swag.IsZero(m.Details) { // not required + return nil + } + if err := m.Details.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("details") @@ -217,6 +227,11 @@ func (m *Bucket) contextValidateDetails(ctx context.Context, formats strfmt.Regi func (m *Bucket) contextValidateRwAccess(ctx context.Context, formats strfmt.Registry) error { if m.RwAccess != nil { + + if swag.IsZero(m.RwAccess) { // not required + return nil + } + if err := m.RwAccess.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("rw_access") @@ -322,6 +337,11 @@ func (m *BucketDetails) ContextValidate(ctx context.Context, formats strfmt.Regi func (m *BucketDetails) contextValidateQuota(ctx context.Context, formats strfmt.Registry) error { if m.Quota != nil { + + if swag.IsZero(m.Quota) { // not required + return nil + } + if err := m.Quota.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("details" + "." + "quota") diff --git a/models/bucket_encryption_request.go b/models/bucket_encryption_request.go index 771272c824..e24f70ea13 100644 --- a/models/bucket_encryption_request.go +++ b/models/bucket_encryption_request.go @@ -92,6 +92,11 @@ func (m *BucketEncryptionRequest) ContextValidate(ctx context.Context, formats s func (m *BucketEncryptionRequest) contextValidateEncType(ctx context.Context, formats strfmt.Registry) error { if m.EncType != nil { + + if swag.IsZero(m.EncType) { // not required + return nil + } + if err := m.EncType.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("encType") diff --git a/models/bucket_event_request.go b/models/bucket_event_request.go index fed36b93dd..5f65f1461d 100644 --- a/models/bucket_event_request.go +++ b/models/bucket_event_request.go @@ -95,6 +95,7 @@ func (m *BucketEventRequest) ContextValidate(ctx context.Context, formats strfmt func (m *BucketEventRequest) contextValidateConfiguration(ctx context.Context, formats strfmt.Registry) error { if m.Configuration != nil { + if err := m.Configuration.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("configuration") diff --git a/models/bucket_lifecycle_response.go b/models/bucket_lifecycle_response.go index 2a9d3a52a8..c8b922cc4c 100644 --- a/models/bucket_lifecycle_response.go +++ b/models/bucket_lifecycle_response.go @@ -99,6 +99,11 @@ func (m *BucketLifecycleResponse) contextValidateLifecycle(ctx context.Context, for i := 0; i < len(m.Lifecycle); i++ { if m.Lifecycle[i] != nil { + + if swag.IsZero(m.Lifecycle[i]) { // not required + return nil + } + if err := m.Lifecycle[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("lifecycle" + "." + strconv.Itoa(i)) diff --git a/models/bucket_replication_response.go b/models/bucket_replication_response.go index 9c6d22067e..70c6723783 100644 --- a/models/bucket_replication_response.go +++ b/models/bucket_replication_response.go @@ -99,6 +99,11 @@ func (m *BucketReplicationResponse) contextValidateRules(ctx context.Context, fo for i := 0; i < len(m.Rules); i++ { if m.Rules[i] != nil { + + if swag.IsZero(m.Rules[i]) { // not required + return nil + } + if err := m.Rules[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("rules" + "." + strconv.Itoa(i)) diff --git a/models/bucket_replication_rule.go b/models/bucket_replication_rule.go index fe7064ecdd..6a68308763 100644 --- a/models/bucket_replication_rule.go +++ b/models/bucket_replication_rule.go @@ -224,6 +224,11 @@ func (m *BucketReplicationRule) ContextValidate(ctx context.Context, formats str func (m *BucketReplicationRule) contextValidateDestination(ctx context.Context, formats strfmt.Registry) error { if m.Destination != nil { + + if swag.IsZero(m.Destination) { // not required + return nil + } + if err := m.Destination.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("destination") diff --git a/models/bucket_versioning_response.go b/models/bucket_versioning_response.go index 5f41d26d56..131ea78559 100644 --- a/models/bucket_versioning_response.go +++ b/models/bucket_versioning_response.go @@ -108,6 +108,11 @@ func (m *BucketVersioningResponse) contextValidateExcludedPrefixes(ctx context.C for i := 0; i < len(m.ExcludedPrefixes); i++ { if m.ExcludedPrefixes[i] != nil { + + if swag.IsZero(m.ExcludedPrefixes[i]) { // not required + return nil + } + if err := m.ExcludedPrefixes[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("excludedPrefixes" + "." + strconv.Itoa(i)) diff --git a/models/configuration.go b/models/configuration.go index e5f565b7a0..51b6a0973b 100644 --- a/models/configuration.go +++ b/models/configuration.go @@ -102,6 +102,11 @@ func (m *Configuration) contextValidateKeyValues(ctx context.Context, formats st for i := 0; i < len(m.KeyValues); i++ { if m.KeyValues[i] != nil { + + if swag.IsZero(m.KeyValues[i]) { // not required + return nil + } + if err := m.KeyValues[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("key_values" + "." + strconv.Itoa(i)) diff --git a/models/configuration_k_v.go b/models/configuration_k_v.go index 68c296a357..08f78bc745 100644 --- a/models/configuration_k_v.go +++ b/models/configuration_k_v.go @@ -95,6 +95,11 @@ func (m *ConfigurationKV) ContextValidate(ctx context.Context, formats strfmt.Re func (m *ConfigurationKV) contextValidateEnvOverride(ctx context.Context, formats strfmt.Registry) error { if m.EnvOverride != nil { + + if swag.IsZero(m.EnvOverride) { // not required + return nil + } + if err := m.EnvOverride.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("env_override") diff --git a/models/get_bucket_retention_config.go b/models/get_bucket_retention_config.go index aaa4f327ce..4de0906394 100644 --- a/models/get_bucket_retention_config.go +++ b/models/get_bucket_retention_config.go @@ -117,6 +117,10 @@ func (m *GetBucketRetentionConfig) ContextValidate(ctx context.Context, formats func (m *GetBucketRetentionConfig) contextValidateMode(ctx context.Context, formats strfmt.Registry) error { + if swag.IsZero(m.Mode) { // not required + return nil + } + if err := m.Mode.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("mode") @@ -131,6 +135,10 @@ func (m *GetBucketRetentionConfig) contextValidateMode(ctx context.Context, form func (m *GetBucketRetentionConfig) contextValidateUnit(ctx context.Context, formats strfmt.Registry) error { + if swag.IsZero(m.Unit) { // not required + return nil + } + if err := m.Unit.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("unit") diff --git a/models/iam_policy.go b/models/iam_policy.go index a59abbeb42..ac03e1ab1a 100644 --- a/models/iam_policy.go +++ b/models/iam_policy.go @@ -102,6 +102,11 @@ func (m *IamPolicy) contextValidateStatement(ctx context.Context, formats strfmt for i := 0; i < len(m.Statement); i++ { if m.Statement[i] != nil { + + if swag.IsZero(m.Statement[i]) { // not required + return nil + } + if err := m.Statement[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("statement" + "." + strconv.Itoa(i)) diff --git a/models/idp_list_configurations_response.go b/models/idp_list_configurations_response.go index b2cd13d933..5fc47549ed 100644 --- a/models/idp_list_configurations_response.go +++ b/models/idp_list_configurations_response.go @@ -99,6 +99,11 @@ func (m *IdpListConfigurationsResponse) contextValidateResults(ctx context.Conte for i := 0; i < len(m.Results); i++ { if m.Results[i] != nil { + + if swag.IsZero(m.Results[i]) { // not required + return nil + } + if err := m.Results[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("results" + "." + strconv.Itoa(i)) diff --git a/models/idp_server_configuration.go b/models/idp_server_configuration.go index 8c2604a78b..e999427443 100644 --- a/models/idp_server_configuration.go +++ b/models/idp_server_configuration.go @@ -111,6 +111,11 @@ func (m *IdpServerConfiguration) contextValidateInfo(ctx context.Context, format for i := 0; i < len(m.Info); i++ { if m.Info[i] != nil { + + if swag.IsZero(m.Info[i]) { // not required + return nil + } + if err := m.Info[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("info" + "." + strconv.Itoa(i)) diff --git a/models/kms_a_p_is_response.go b/models/kms_a_p_is_response.go index 08ed9625c7..01689f36af 100644 --- a/models/kms_a_p_is_response.go +++ b/models/kms_a_p_is_response.go @@ -99,6 +99,11 @@ func (m *KmsAPIsResponse) contextValidateResults(ctx context.Context, formats st for i := 0; i < len(m.Results); i++ { if m.Results[i] != nil { + + if swag.IsZero(m.Results[i]) { // not required + return nil + } + if err := m.Results[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("results" + "." + strconv.Itoa(i)) diff --git a/models/kms_describe_self_identity_response.go b/models/kms_describe_self_identity_response.go index a241b3f108..9d2c386072 100644 --- a/models/kms_describe_self_identity_response.go +++ b/models/kms_describe_self_identity_response.go @@ -104,6 +104,11 @@ func (m *KmsDescribeSelfIdentityResponse) ContextValidate(ctx context.Context, f func (m *KmsDescribeSelfIdentityResponse) contextValidatePolicy(ctx context.Context, formats strfmt.Registry) error { if m.Policy != nil { + + if swag.IsZero(m.Policy) { // not required + return nil + } + if err := m.Policy.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("policy") diff --git a/models/kms_list_identities_response.go b/models/kms_list_identities_response.go index 059ed4bc48..4bbc20bd60 100644 --- a/models/kms_list_identities_response.go +++ b/models/kms_list_identities_response.go @@ -99,6 +99,11 @@ func (m *KmsListIdentitiesResponse) contextValidateResults(ctx context.Context, for i := 0; i < len(m.Results); i++ { if m.Results[i] != nil { + + if swag.IsZero(m.Results[i]) { // not required + return nil + } + if err := m.Results[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("results" + "." + strconv.Itoa(i)) diff --git a/models/kms_list_keys_response.go b/models/kms_list_keys_response.go index 4dcd6beba6..069307108d 100644 --- a/models/kms_list_keys_response.go +++ b/models/kms_list_keys_response.go @@ -99,6 +99,11 @@ func (m *KmsListKeysResponse) contextValidateResults(ctx context.Context, format for i := 0; i < len(m.Results); i++ { if m.Results[i] != nil { + + if swag.IsZero(m.Results[i]) { // not required + return nil + } + if err := m.Results[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("results" + "." + strconv.Itoa(i)) diff --git a/models/kms_list_policies_response.go b/models/kms_list_policies_response.go index 0ced461d82..d7ff50a11f 100644 --- a/models/kms_list_policies_response.go +++ b/models/kms_list_policies_response.go @@ -99,6 +99,11 @@ func (m *KmsListPoliciesResponse) contextValidateResults(ctx context.Context, fo for i := 0; i < len(m.Results); i++ { if m.Results[i] != nil { + + if swag.IsZero(m.Results[i]) { // not required + return nil + } + if err := m.Results[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("results" + "." + strconv.Itoa(i)) diff --git a/models/kms_metrics_response.go b/models/kms_metrics_response.go index e153c70c72..27bdbaf18f 100644 --- a/models/kms_metrics_response.go +++ b/models/kms_metrics_response.go @@ -309,6 +309,11 @@ func (m *KmsMetricsResponse) contextValidateLatencyHistogram(ctx context.Context for i := 0; i < len(m.LatencyHistogram); i++ { if m.LatencyHistogram[i] != nil { + + if swag.IsZero(m.LatencyHistogram[i]) { // not required + return nil + } + if err := m.LatencyHistogram[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("latencyHistogram" + "." + strconv.Itoa(i)) diff --git a/models/kms_status_response.go b/models/kms_status_response.go index 481bf9d634..74515425dd 100644 --- a/models/kms_status_response.go +++ b/models/kms_status_response.go @@ -105,6 +105,11 @@ func (m *KmsStatusResponse) contextValidateEndpoints(ctx context.Context, format for i := 0; i < len(m.Endpoints); i++ { if m.Endpoints[i] != nil { + + if swag.IsZero(m.Endpoints[i]) { // not required + return nil + } + if err := m.Endpoints[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("endpoints" + "." + strconv.Itoa(i)) diff --git a/models/ldap_entities.go b/models/ldap_entities.go index 83bafe382f..cc9d1110a7 100644 --- a/models/ldap_entities.go +++ b/models/ldap_entities.go @@ -176,6 +176,11 @@ func (m *LdapEntities) contextValidateGroups(ctx context.Context, formats strfmt for i := 0; i < len(m.Groups); i++ { if m.Groups[i] != nil { + + if swag.IsZero(m.Groups[i]) { // not required + return nil + } + if err := m.Groups[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("groups" + "." + strconv.Itoa(i)) @@ -196,6 +201,11 @@ func (m *LdapEntities) contextValidatePolicies(ctx context.Context, formats strf for i := 0; i < len(m.Policies); i++ { if m.Policies[i] != nil { + + if swag.IsZero(m.Policies[i]) { // not required + return nil + } + if err := m.Policies[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("policies" + "." + strconv.Itoa(i)) @@ -216,6 +226,11 @@ func (m *LdapEntities) contextValidateUsers(ctx context.Context, formats strfmt. for i := 0; i < len(m.Users); i++ { if m.Users[i] != nil { + + if swag.IsZero(m.Users[i]) { // not required + return nil + } + if err := m.Users[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("users" + "." + strconv.Itoa(i)) diff --git a/models/list_access_rules_response.go b/models/list_access_rules_response.go index 3d91ecafa7..fcebf28c12 100644 --- a/models/list_access_rules_response.go +++ b/models/list_access_rules_response.go @@ -102,6 +102,11 @@ func (m *ListAccessRulesResponse) contextValidateAccessRules(ctx context.Context for i := 0; i < len(m.AccessRules); i++ { if m.AccessRules[i] != nil { + + if swag.IsZero(m.AccessRules[i]) { // not required + return nil + } + if err := m.AccessRules[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("accessRules" + "." + strconv.Itoa(i)) diff --git a/models/list_bucket_events_response.go b/models/list_bucket_events_response.go index 6617417d2b..52754b7214 100644 --- a/models/list_bucket_events_response.go +++ b/models/list_bucket_events_response.go @@ -102,6 +102,11 @@ func (m *ListBucketEventsResponse) contextValidateEvents(ctx context.Context, fo for i := 0; i < len(m.Events); i++ { if m.Events[i] != nil { + + if swag.IsZero(m.Events[i]) { // not required + return nil + } + if err := m.Events[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("events" + "." + strconv.Itoa(i)) diff --git a/models/list_buckets_response.go b/models/list_buckets_response.go index b74a6bbdc6..985fb8cbab 100644 --- a/models/list_buckets_response.go +++ b/models/list_buckets_response.go @@ -102,6 +102,11 @@ func (m *ListBucketsResponse) contextValidateBuckets(ctx context.Context, format for i := 0; i < len(m.Buckets); i++ { if m.Buckets[i] != nil { + + if swag.IsZero(m.Buckets[i]) { // not required + return nil + } + if err := m.Buckets[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("buckets" + "." + strconv.Itoa(i)) diff --git a/models/list_config_response.go b/models/list_config_response.go index c42a0f9216..e7460150a3 100644 --- a/models/list_config_response.go +++ b/models/list_config_response.go @@ -102,6 +102,11 @@ func (m *ListConfigResponse) contextValidateConfigurations(ctx context.Context, for i := 0; i < len(m.Configurations); i++ { if m.Configurations[i] != nil { + + if swag.IsZero(m.Configurations[i]) { // not required + return nil + } + if err := m.Configurations[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("configurations" + "." + strconv.Itoa(i)) diff --git a/models/list_objects_response.go b/models/list_objects_response.go index 0b3da4a4b2..e6cafc5175 100644 --- a/models/list_objects_response.go +++ b/models/list_objects_response.go @@ -102,6 +102,11 @@ func (m *ListObjectsResponse) contextValidateObjects(ctx context.Context, format for i := 0; i < len(m.Objects); i++ { if m.Objects[i] != nil { + + if swag.IsZero(m.Objects[i]) { // not required + return nil + } + if err := m.Objects[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("objects" + "." + strconv.Itoa(i)) diff --git a/models/list_policies_response.go b/models/list_policies_response.go index e31785f7b0..d071d65dd8 100644 --- a/models/list_policies_response.go +++ b/models/list_policies_response.go @@ -102,6 +102,11 @@ func (m *ListPoliciesResponse) contextValidatePolicies(ctx context.Context, form for i := 0; i < len(m.Policies); i++ { if m.Policies[i] != nil { + + if swag.IsZero(m.Policies[i]) { // not required + return nil + } + if err := m.Policies[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("policies" + "." + strconv.Itoa(i)) diff --git a/models/list_remote_buckets_response.go b/models/list_remote_buckets_response.go index 398fb40f0b..86ddfef740 100644 --- a/models/list_remote_buckets_response.go +++ b/models/list_remote_buckets_response.go @@ -102,6 +102,11 @@ func (m *ListRemoteBucketsResponse) contextValidateBuckets(ctx context.Context, for i := 0; i < len(m.Buckets); i++ { if m.Buckets[i] != nil { + + if swag.IsZero(m.Buckets[i]) { // not required + return nil + } + if err := m.Buckets[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("buckets" + "." + strconv.Itoa(i)) diff --git a/models/list_users_response.go b/models/list_users_response.go index 08fb842736..6402e70275 100644 --- a/models/list_users_response.go +++ b/models/list_users_response.go @@ -99,6 +99,11 @@ func (m *ListUsersResponse) contextValidateUsers(ctx context.Context, formats st for i := 0; i < len(m.Users); i++ { if m.Users[i] != nil { + + if swag.IsZero(m.Users[i]) { // not required + return nil + } + if err := m.Users[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("users" + "." + strconv.Itoa(i)) diff --git a/models/login_details.go b/models/login_details.go index ad162ca069..3055f7336f 100644 --- a/models/login_details.go +++ b/models/login_details.go @@ -163,6 +163,11 @@ func (m *LoginDetails) contextValidateRedirectRules(ctx context.Context, formats for i := 0; i < len(m.RedirectRules); i++ { if m.RedirectRules[i] != nil { + + if swag.IsZero(m.RedirectRules[i]) { // not required + return nil + } + if err := m.RedirectRules[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("redirectRules" + "." + strconv.Itoa(i)) diff --git a/models/login_request.go b/models/login_request.go index a68b1fed95..4bf70f936e 100644 --- a/models/login_request.go +++ b/models/login_request.go @@ -98,6 +98,11 @@ func (m *LoginRequest) ContextValidate(ctx context.Context, formats strfmt.Regis func (m *LoginRequest) contextValidateFeatures(ctx context.Context, formats strfmt.Registry) error { if m.Features != nil { + + if swag.IsZero(m.Features) { // not required + return nil + } + if err := m.Features.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("features") diff --git a/models/make_bucket_request.go b/models/make_bucket_request.go index 369652e01f..903e0379c8 100644 --- a/models/make_bucket_request.go +++ b/models/make_bucket_request.go @@ -170,6 +170,11 @@ func (m *MakeBucketRequest) ContextValidate(ctx context.Context, formats strfmt. func (m *MakeBucketRequest) contextValidateQuota(ctx context.Context, formats strfmt.Registry) error { if m.Quota != nil { + + if swag.IsZero(m.Quota) { // not required + return nil + } + if err := m.Quota.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("quota") @@ -186,6 +191,11 @@ func (m *MakeBucketRequest) contextValidateQuota(ctx context.Context, formats st func (m *MakeBucketRequest) contextValidateRetention(ctx context.Context, formats strfmt.Registry) error { if m.Retention != nil { + + if swag.IsZero(m.Retention) { // not required + return nil + } + if err := m.Retention.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("retention") @@ -202,6 +212,11 @@ func (m *MakeBucketRequest) contextValidateRetention(ctx context.Context, format func (m *MakeBucketRequest) contextValidateVersioning(ctx context.Context, formats strfmt.Registry) error { if m.Versioning != nil { + + if swag.IsZero(m.Versioning) { // not required + return nil + } + if err := m.Versioning.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("versioning") diff --git a/models/multi_bucket_replication.go b/models/multi_bucket_replication.go index c904284a54..2b39153d0b 100644 --- a/models/multi_bucket_replication.go +++ b/models/multi_bucket_replication.go @@ -244,6 +244,11 @@ func (m *MultiBucketReplication) contextValidateBucketsRelation(ctx context.Cont for i := 0; i < len(m.BucketsRelation); i++ { if m.BucketsRelation[i] != nil { + + if swag.IsZero(m.BucketsRelation[i]) { // not required + return nil + } + if err := m.BucketsRelation[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("bucketsRelation" + "." + strconv.Itoa(i)) diff --git a/models/multi_bucket_response_state.go b/models/multi_bucket_response_state.go index 50c9f08f38..9998444332 100644 --- a/models/multi_bucket_response_state.go +++ b/models/multi_bucket_response_state.go @@ -99,6 +99,11 @@ func (m *MultiBucketResponseState) contextValidateReplicationState(ctx context.C for i := 0; i < len(m.ReplicationState); i++ { if m.ReplicationState[i] != nil { + + if swag.IsZero(m.ReplicationState[i]) { // not required + return nil + } + if err := m.ReplicationState[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("replicationState" + "." + strconv.Itoa(i)) diff --git a/models/multi_lifecycle_result.go b/models/multi_lifecycle_result.go index b2c73fbaf2..25889c2e99 100644 --- a/models/multi_lifecycle_result.go +++ b/models/multi_lifecycle_result.go @@ -99,6 +99,11 @@ func (m *MultiLifecycleResult) contextValidateResults(ctx context.Context, forma for i := 0; i < len(m.Results); i++ { if m.Results[i] != nil { + + if swag.IsZero(m.Results[i]) { // not required + return nil + } + if err := m.Results[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("results" + "." + strconv.Itoa(i)) diff --git a/models/notif_endpoint_response.go b/models/notif_endpoint_response.go index 3bf2ad92bb..1eb4cbd37e 100644 --- a/models/notif_endpoint_response.go +++ b/models/notif_endpoint_response.go @@ -99,6 +99,11 @@ func (m *NotifEndpointResponse) contextValidateNotificationEndpoints(ctx context for i := 0; i < len(m.NotificationEndpoints); i++ { if m.NotificationEndpoints[i] != nil { + + if swag.IsZero(m.NotificationEndpoints[i]) { // not required + return nil + } + if err := m.NotificationEndpoints[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("notification_endpoints" + "." + strconv.Itoa(i)) diff --git a/models/notification_config.go b/models/notification_config.go index eeb1de01ba..8c1210df3d 100644 --- a/models/notification_config.go +++ b/models/notification_config.go @@ -120,6 +120,10 @@ func (m *NotificationConfig) contextValidateEvents(ctx context.Context, formats for i := 0; i < len(m.Events); i++ { + if swag.IsZero(m.Events[i]) { // not required + return nil + } + if err := m.Events[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("events" + "." + strconv.Itoa(i)) diff --git a/models/notification_delete_request.go b/models/notification_delete_request.go index 707e8d2ce6..d681e9db8d 100644 --- a/models/notification_delete_request.go +++ b/models/notification_delete_request.go @@ -130,6 +130,10 @@ func (m *NotificationDeleteRequest) contextValidateEvents(ctx context.Context, f for i := 0; i < len(m.Events); i++ { + if swag.IsZero(m.Events[i]) { // not required + return nil + } + if err := m.Events[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("events" + "." + strconv.Itoa(i)) diff --git a/models/notification_endpoint.go b/models/notification_endpoint.go index d081809bda..add7cc1d40 100644 --- a/models/notification_endpoint.go +++ b/models/notification_endpoint.go @@ -130,6 +130,7 @@ func (m *NotificationEndpoint) ContextValidate(ctx context.Context, formats strf func (m *NotificationEndpoint) contextValidateService(ctx context.Context, formats strfmt.Registry) error { if m.Service != nil { + if err := m.Service.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("service") diff --git a/models/notification_endpoint_item.go b/models/notification_endpoint_item.go index d763e88290..55ae1a45e8 100644 --- a/models/notification_endpoint_item.go +++ b/models/notification_endpoint_item.go @@ -92,6 +92,10 @@ func (m *NotificationEndpointItem) ContextValidate(ctx context.Context, formats func (m *NotificationEndpointItem) contextValidateService(ctx context.Context, formats strfmt.Registry) error { + if swag.IsZero(m.Service) { // not required + return nil + } + if err := m.Service.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("service") diff --git a/models/object_bucket_lifecycle.go b/models/object_bucket_lifecycle.go index 321df21f8e..09d7ab7995 100644 --- a/models/object_bucket_lifecycle.go +++ b/models/object_bucket_lifecycle.go @@ -166,6 +166,11 @@ func (m *ObjectBucketLifecycle) ContextValidate(ctx context.Context, formats str func (m *ObjectBucketLifecycle) contextValidateExpiration(ctx context.Context, formats strfmt.Registry) error { if m.Expiration != nil { + + if swag.IsZero(m.Expiration) { // not required + return nil + } + if err := m.Expiration.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("expiration") @@ -184,6 +189,11 @@ func (m *ObjectBucketLifecycle) contextValidateTags(ctx context.Context, formats for i := 0; i < len(m.Tags); i++ { if m.Tags[i] != nil { + + if swag.IsZero(m.Tags[i]) { // not required + return nil + } + if err := m.Tags[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("tags" + "." + strconv.Itoa(i)) @@ -202,6 +212,11 @@ func (m *ObjectBucketLifecycle) contextValidateTags(ctx context.Context, formats func (m *ObjectBucketLifecycle) contextValidateTransition(ctx context.Context, formats strfmt.Registry) error { if m.Transition != nil { + + if swag.IsZero(m.Transition) { // not required + return nil + } + if err := m.Transition.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("transition") diff --git a/models/put_bucket_retention_request.go b/models/put_bucket_retention_request.go index aa42ac1646..9bb3b8738f 100644 --- a/models/put_bucket_retention_request.go +++ b/models/put_bucket_retention_request.go @@ -149,6 +149,7 @@ func (m *PutBucketRetentionRequest) ContextValidate(ctx context.Context, formats func (m *PutBucketRetentionRequest) contextValidateMode(ctx context.Context, formats strfmt.Registry) error { if m.Mode != nil { + if err := m.Mode.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("mode") @@ -165,6 +166,7 @@ func (m *PutBucketRetentionRequest) contextValidateMode(ctx context.Context, for func (m *PutBucketRetentionRequest) contextValidateUnit(ctx context.Context, formats strfmt.Registry) error { if m.Unit != nil { + if err := m.Unit.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("unit") diff --git a/models/put_object_legal_hold_request.go b/models/put_object_legal_hold_request.go index 7e3a20801d..c7124d9b1c 100644 --- a/models/put_object_legal_hold_request.go +++ b/models/put_object_legal_hold_request.go @@ -96,6 +96,7 @@ func (m *PutObjectLegalHoldRequest) ContextValidate(ctx context.Context, formats func (m *PutObjectLegalHoldRequest) contextValidateStatus(ctx context.Context, formats strfmt.Registry) error { if m.Status != nil { + if err := m.Status.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("status") diff --git a/models/put_object_retention_request.go b/models/put_object_retention_request.go index a4ed13cb2a..8bede7193c 100644 --- a/models/put_object_retention_request.go +++ b/models/put_object_retention_request.go @@ -116,6 +116,7 @@ func (m *PutObjectRetentionRequest) ContextValidate(ctx context.Context, formats func (m *PutObjectRetentionRequest) contextValidateMode(ctx context.Context, formats strfmt.Registry) error { if m.Mode != nil { + if err := m.Mode.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("mode") diff --git a/models/release_info.go b/models/release_info.go index aa84bae7a9..d4a65f5e56 100644 --- a/models/release_info.go +++ b/models/release_info.go @@ -104,6 +104,11 @@ func (m *ReleaseInfo) ContextValidate(ctx context.Context, formats strfmt.Regist func (m *ReleaseInfo) contextValidateMetadata(ctx context.Context, formats strfmt.Registry) error { if m.Metadata != nil { + + if swag.IsZero(m.Metadata) { // not required + return nil + } + if err := m.Metadata.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("metadata") diff --git a/models/release_list_response.go b/models/release_list_response.go index 9f5d59b5c3..47cb95bc2d 100644 --- a/models/release_list_response.go +++ b/models/release_list_response.go @@ -99,6 +99,11 @@ func (m *ReleaseListResponse) contextValidateResults(ctx context.Context, format for i := 0; i < len(m.Results); i++ { if m.Results[i] != nil { + + if swag.IsZero(m.Results[i]) { // not required + return nil + } + if err := m.Results[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("results" + "." + strconv.Itoa(i)) diff --git a/models/release_metadata.go b/models/release_metadata.go index 68364ff4c8..5ababa5939 100644 --- a/models/release_metadata.go +++ b/models/release_metadata.go @@ -134,6 +134,11 @@ func (m *ReleaseMetadata) ContextValidate(ctx context.Context, formats strfmt.Re func (m *ReleaseMetadata) contextValidateAuthor(ctx context.Context, formats strfmt.Registry) error { if m.Author != nil { + + if swag.IsZero(m.Author) { // not required + return nil + } + if err := m.Author.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("author") diff --git a/models/result_target.go b/models/result_target.go index 6e63bb711d..278e98a85d 100644 --- a/models/result_target.go +++ b/models/result_target.go @@ -105,6 +105,11 @@ func (m *ResultTarget) contextValidateResult(ctx context.Context, formats strfmt for i := 0; i < len(m.Result); i++ { if m.Result[i] != nil { + + if swag.IsZero(m.Result[i]) { // not required + return nil + } + if err := m.Result[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("result" + "." + strconv.Itoa(i)) diff --git a/models/rewind_response.go b/models/rewind_response.go index ac5b520de8..297ee0dca4 100644 --- a/models/rewind_response.go +++ b/models/rewind_response.go @@ -99,6 +99,11 @@ func (m *RewindResponse) contextValidateObjects(ctx context.Context, formats str for i := 0; i < len(m.Objects); i++ { if m.Objects[i] != nil { + + if swag.IsZero(m.Objects[i]) { // not required + return nil + } + if err := m.Objects[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("objects" + "." + strconv.Itoa(i)) diff --git a/models/server_properties.go b/models/server_properties.go index aab493808a..98cc236fce 100644 --- a/models/server_properties.go +++ b/models/server_properties.go @@ -120,6 +120,11 @@ func (m *ServerProperties) contextValidateDrives(ctx context.Context, formats st for i := 0; i < len(m.Drives); i++ { if m.Drives[i] != nil { + + if swag.IsZero(m.Drives[i]) { // not required + return nil + } + if err := m.Drives[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("drives" + "." + strconv.Itoa(i)) diff --git a/models/service_accounts.go b/models/service_accounts.go index 6d5c22b66b..f98ad08895 100644 --- a/models/service_accounts.go +++ b/models/service_accounts.go @@ -71,6 +71,11 @@ func (m ServiceAccounts) ContextValidate(ctx context.Context, formats strfmt.Reg for i := 0; i < len(m); i++ { if m[i] != nil { + + if swag.IsZero(m[i]) { // not required + return nil + } + if err := m[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName(strconv.Itoa(i)) diff --git a/models/session_response.go b/models/session_response.go index 763e8ded86..ece2c13f5e 100644 --- a/models/session_response.go +++ b/models/session_response.go @@ -196,6 +196,11 @@ func (m *SessionResponse) contextValidateAllowResources(ctx context.Context, for for i := 0; i < len(m.AllowResources); i++ { if m.AllowResources[i] != nil { + + if swag.IsZero(m.AllowResources[i]) { // not required + return nil + } + if err := m.AllowResources[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("allowResources" + "." + strconv.Itoa(i)) @@ -214,6 +219,11 @@ func (m *SessionResponse) contextValidateAllowResources(ctx context.Context, for func (m *SessionResponse) contextValidateEnvConstants(ctx context.Context, formats strfmt.Registry) error { if m.EnvConstants != nil { + + if swag.IsZero(m.EnvConstants) { // not required + return nil + } + if err := m.EnvConstants.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("envConstants") diff --git a/models/set_bucket_policy_request.go b/models/set_bucket_policy_request.go index a0af7a7d26..59a327df84 100644 --- a/models/set_bucket_policy_request.go +++ b/models/set_bucket_policy_request.go @@ -99,6 +99,7 @@ func (m *SetBucketPolicyRequest) ContextValidate(ctx context.Context, formats st func (m *SetBucketPolicyRequest) contextValidateAccess(ctx context.Context, formats strfmt.Registry) error { if m.Access != nil { + if err := m.Access.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("access") diff --git a/models/set_config_request.go b/models/set_config_request.go index e336e82597..42f175ea5d 100644 --- a/models/set_config_request.go +++ b/models/set_config_request.go @@ -112,6 +112,11 @@ func (m *SetConfigRequest) contextValidateKeyValues(ctx context.Context, formats for i := 0; i < len(m.KeyValues); i++ { if m.KeyValues[i] != nil { + + if swag.IsZero(m.KeyValues[i]) { // not required + return nil + } + if err := m.KeyValues[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("key_values" + "." + strconv.Itoa(i)) diff --git a/models/set_notification_endpoint_response.go b/models/set_notification_endpoint_response.go index 7219e1cd47..d56861cbac 100644 --- a/models/set_notification_endpoint_response.go +++ b/models/set_notification_endpoint_response.go @@ -133,6 +133,7 @@ func (m *SetNotificationEndpointResponse) ContextValidate(ctx context.Context, f func (m *SetNotificationEndpointResponse) contextValidateService(ctx context.Context, formats strfmt.Registry) error { if m.Service != nil { + if err := m.Service.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("service") diff --git a/models/set_policy_multiple_name_request.go b/models/set_policy_multiple_name_request.go index 352ba590ca..eb978948b0 100644 --- a/models/set_policy_multiple_name_request.go +++ b/models/set_policy_multiple_name_request.go @@ -128,6 +128,10 @@ func (m *SetPolicyMultipleNameRequest) contextValidateGroups(ctx context.Context for i := 0; i < len(m.Groups); i++ { + if swag.IsZero(m.Groups[i]) { // not required + return nil + } + if err := m.Groups[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("groups" + "." + strconv.Itoa(i)) @@ -146,6 +150,10 @@ func (m *SetPolicyMultipleNameRequest) contextValidateUsers(ctx context.Context, for i := 0; i < len(m.Users); i++ { + if swag.IsZero(m.Users[i]) { // not required + return nil + } + if err := m.Users[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("users" + "." + strconv.Itoa(i)) diff --git a/models/set_policy_name_request.go b/models/set_policy_name_request.go index abb5654150..dc5309a5ec 100644 --- a/models/set_policy_name_request.go +++ b/models/set_policy_name_request.go @@ -130,6 +130,7 @@ func (m *SetPolicyNameRequest) ContextValidate(ctx context.Context, formats strf func (m *SetPolicyNameRequest) contextValidateEntityType(ctx context.Context, formats strfmt.Registry) error { if m.EntityType != nil { + if err := m.EntityType.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("entityType") diff --git a/models/set_policy_request.go b/models/set_policy_request.go index 4829b36be8..de5a1ba57c 100644 --- a/models/set_policy_request.go +++ b/models/set_policy_request.go @@ -113,6 +113,7 @@ func (m *SetPolicyRequest) ContextValidate(ctx context.Context, formats strfmt.R func (m *SetPolicyRequest) contextValidateEntityType(ctx context.Context, formats strfmt.Registry) error { if m.EntityType != nil { + if err := m.EntityType.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("entityType") diff --git a/models/site_replication_add_request.go b/models/site_replication_add_request.go index 7bce345f91..8123372ec0 100644 --- a/models/site_replication_add_request.go +++ b/models/site_replication_add_request.go @@ -71,6 +71,11 @@ func (m SiteReplicationAddRequest) ContextValidate(ctx context.Context, formats for i := 0; i < len(m); i++ { if m[i] != nil { + + if swag.IsZero(m[i]) { // not required + return nil + } + if err := m[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName(strconv.Itoa(i)) diff --git a/models/site_replication_info_response.go b/models/site_replication_info_response.go index ef59fa1bd0..394770163d 100644 --- a/models/site_replication_info_response.go +++ b/models/site_replication_info_response.go @@ -108,6 +108,11 @@ func (m *SiteReplicationInfoResponse) contextValidateSites(ctx context.Context, for i := 0; i < len(m.Sites); i++ { if m.Sites[i] != nil { + + if swag.IsZero(m.Sites[i]) { // not required + return nil + } + if err := m.Sites[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("sites" + "." + strconv.Itoa(i)) diff --git a/models/start_profiling_list.go b/models/start_profiling_list.go index 80c73f9c2b..5ad9346168 100644 --- a/models/start_profiling_list.go +++ b/models/start_profiling_list.go @@ -102,6 +102,11 @@ func (m *StartProfilingList) contextValidateStartResults(ctx context.Context, fo for i := 0; i < len(m.StartResults); i++ { if m.StartResults[i] != nil { + + if swag.IsZero(m.StartResults[i]) { // not required + return nil + } + if err := m.StartResults[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("startResults" + "." + strconv.Itoa(i)) diff --git a/models/subnet_login_response.go b/models/subnet_login_response.go index fc2596d25d..56df2b7caa 100644 --- a/models/subnet_login_response.go +++ b/models/subnet_login_response.go @@ -108,6 +108,11 @@ func (m *SubnetLoginResponse) contextValidateOrganizations(ctx context.Context, for i := 0; i < len(m.Organizations); i++ { if m.Organizations[i] != nil { + + if swag.IsZero(m.Organizations[i]) { // not required + return nil + } + if err := m.Organizations[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("organizations" + "." + strconv.Itoa(i)) diff --git a/models/tier.go b/models/tier.go index 1d8b08528d..0034ca1955 100644 --- a/models/tier.go +++ b/models/tier.go @@ -243,6 +243,11 @@ func (m *Tier) ContextValidate(ctx context.Context, formats strfmt.Registry) err func (m *Tier) contextValidateAzure(ctx context.Context, formats strfmt.Registry) error { if m.Azure != nil { + + if swag.IsZero(m.Azure) { // not required + return nil + } + if err := m.Azure.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("azure") @@ -259,6 +264,11 @@ func (m *Tier) contextValidateAzure(ctx context.Context, formats strfmt.Registry func (m *Tier) contextValidateGcs(ctx context.Context, formats strfmt.Registry) error { if m.Gcs != nil { + + if swag.IsZero(m.Gcs) { // not required + return nil + } + if err := m.Gcs.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("gcs") @@ -275,6 +285,11 @@ func (m *Tier) contextValidateGcs(ctx context.Context, formats strfmt.Registry) func (m *Tier) contextValidateMinio(ctx context.Context, formats strfmt.Registry) error { if m.Minio != nil { + + if swag.IsZero(m.Minio) { // not required + return nil + } + if err := m.Minio.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("minio") @@ -291,6 +306,11 @@ func (m *Tier) contextValidateMinio(ctx context.Context, formats strfmt.Registry func (m *Tier) contextValidateS3(ctx context.Context, formats strfmt.Registry) error { if m.S3 != nil { + + if swag.IsZero(m.S3) { // not required + return nil + } + if err := m.S3.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("s3") diff --git a/models/tier_list_response.go b/models/tier_list_response.go index 6c911eba32..15fd15af64 100644 --- a/models/tier_list_response.go +++ b/models/tier_list_response.go @@ -99,6 +99,11 @@ func (m *TierListResponse) contextValidateItems(ctx context.Context, formats str for i := 0; i < len(m.Items); i++ { if m.Items[i] != nil { + + if swag.IsZero(m.Items[i]) { // not required + return nil + } + if err := m.Items[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("items" + "." + strconv.Itoa(i)) diff --git a/models/user_service_account_summary.go b/models/user_service_account_summary.go index ecd832198b..a97b9f8313 100644 --- a/models/user_service_account_summary.go +++ b/models/user_service_account_summary.go @@ -102,6 +102,11 @@ func (m *UserServiceAccountSummary) contextValidateUserServiceAccountList(ctx co for i := 0; i < len(m.UserServiceAccountList); i++ { if m.UserServiceAccountList[i] != nil { + + if swag.IsZero(m.UserServiceAccountList[i]) { // not required + return nil + } + if err := m.UserServiceAccountList[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("userServiceAccountList" + "." + strconv.Itoa(i)) diff --git a/models/widget.go b/models/widget.go index 1c075057ce..cf8f3c4dfe 100644 --- a/models/widget.go +++ b/models/widget.go @@ -136,6 +136,11 @@ func (m *Widget) ContextValidate(ctx context.Context, formats strfmt.Registry) e func (m *Widget) contextValidateOptions(ctx context.Context, formats strfmt.Registry) error { if m.Options != nil { + + if swag.IsZero(m.Options) { // not required + return nil + } + if err := m.Options.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("options") @@ -154,6 +159,11 @@ func (m *Widget) contextValidateTargets(ctx context.Context, formats strfmt.Regi for i := 0; i < len(m.Targets); i++ { if m.Targets[i] != nil { + + if swag.IsZero(m.Targets[i]) { // not required + return nil + } + if err := m.Targets[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("targets" + "." + strconv.Itoa(i)) @@ -246,6 +256,11 @@ func (m *WidgetOptions) ContextValidate(ctx context.Context, formats strfmt.Regi func (m *WidgetOptions) contextValidateReduceOptions(ctx context.Context, formats strfmt.Registry) error { if m.ReduceOptions != nil { + + if swag.IsZero(m.ReduceOptions) { // not required + return nil + } + if err := m.ReduceOptions.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("options" + "." + "reduceOptions") diff --git a/models/widget_details.go b/models/widget_details.go index 631ad13cf8..46f87bfc51 100644 --- a/models/widget_details.go +++ b/models/widget_details.go @@ -136,6 +136,11 @@ func (m *WidgetDetails) ContextValidate(ctx context.Context, formats strfmt.Regi func (m *WidgetDetails) contextValidateOptions(ctx context.Context, formats strfmt.Registry) error { if m.Options != nil { + + if swag.IsZero(m.Options) { // not required + return nil + } + if err := m.Options.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("options") @@ -154,6 +159,11 @@ func (m *WidgetDetails) contextValidateTargets(ctx context.Context, formats strf for i := 0; i < len(m.Targets); i++ { if m.Targets[i] != nil { + + if swag.IsZero(m.Targets[i]) { // not required + return nil + } + if err := m.Targets[i].ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("targets" + "." + strconv.Itoa(i)) @@ -246,6 +256,11 @@ func (m *WidgetDetailsOptions) ContextValidate(ctx context.Context, formats strf func (m *WidgetDetailsOptions) contextValidateReduceOptions(ctx context.Context, formats strfmt.Registry) error { if m.ReduceOptions != nil { + + if swag.IsZero(m.ReduceOptions) { // not required + return nil + } + if err := m.ReduceOptions.ContextValidate(ctx, formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("options" + "." + "reduceOptions") diff --git a/portal-ui/src/api/consoleApi.ts b/portal-ui/src/api/consoleApi.ts index 2e453fe255..3a56589b2e 100644 --- a/portal-ui/src/api/consoleApi.ts +++ b/portal-ui/src/api/consoleApi.ts @@ -1707,10 +1707,9 @@ export class HttpClient { ? { "Content-Type": type } : {}), }, - signal: - (cancelToken - ? this.createAbortSignal(cancelToken) - : requestParams.signal) || null, + signal: cancelToken + ? this.createAbortSignal(cancelToken) + : requestParams.signal, body: typeof body === "undefined" || body === null ? null diff --git a/portal-ui/src/common/SecureComponent/permissions.ts b/portal-ui/src/common/SecureComponent/permissions.ts index 8a68e37b67..57e3dd279f 100644 --- a/portal-ui/src/common/SecureComponent/permissions.ts +++ b/portal-ui/src/common/SecureComponent/permissions.ts @@ -139,6 +139,7 @@ export const IAM_PAGES = { /* Buckets */ BUCKETS: "/buckets", ADD_BUCKETS: "add-bucket", + BUCKETS_ADD_REPLICATION: "/buckets/add-replication", BUCKETS_ADMIN_VIEW: ":bucketName/admin/*", BUCKETS_EDIT_REPLICATION: "/buckets/edit-replication", /* Object Browser */ @@ -297,6 +298,9 @@ export const IAM_PAGES_PERMISSIONS = { [IAM_PAGES.BUCKETS_EDIT_REPLICATION]: [ ...IAM_PERMISSIONS[IAM_ROLES.BUCKET_ADMIN], // edit bucket replication bucket page ], + [IAM_PAGES.BUCKETS_ADD_REPLICATION]: [ + ...IAM_PERMISSIONS[IAM_ROLES.BUCKET_ADMIN], // add bucket replication rule + ], [IAM_PAGES.BUCKETS_ADMIN_VIEW]: [ ...IAM_PERMISSIONS[IAM_ROLES.BUCKET_ADMIN], // bucket admin page ], diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddBucketReplication.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddBucketReplication.tsx new file mode 100644 index 0000000000..c83751ea3d --- /dev/null +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddBucketReplication.tsx @@ -0,0 +1,477 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2023 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import React, { Fragment, useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { + BackLink, + Box, + BucketReplicationIcon, + Button, + FormLayout, + Grid, + HelpBox, + InputBox, + PageLayout, + Select, + Switch, +} from "mds"; +import { IAM_PAGES } from "../../../../common/SecureComponent/permissions"; +import { setErrorSnackMessage, setHelpName } from "../../../../systemSlice"; +import { useAppDispatch } from "../../../../store"; +import PageHeaderWrapper from "../../Common/PageHeaderWrapper/PageHeaderWrapper"; +import HelpMenu from "../../HelpMenu"; +import { api } from "api"; +import { errorToHandler } from "api/errors"; +import QueryMultiSelector from "screens/Console/Common/FormComponents/QueryMultiSelector/QueryMultiSelector"; +import { getBytes, k8sScalarUnitsExcluding } from "common/utils"; +import get from "lodash/get"; +import InputUnitMenu from "screens/Console/Common/FormComponents/InputUnitMenu/InputUnitMenu"; + +const AddBucketReplication = () => { + const dispatch = useAppDispatch(); + const navigate = useNavigate(); + let params = new URLSearchParams(document.location.search); + const bucketName = params.get("bucketName") || ""; + const nextPriority = params.get("nextPriority") || "1"; + const [addLoading, setAddLoading] = useState(false); + const [priority, setPriority] = useState(nextPriority); + const [accessKey, setAccessKey] = useState(""); + const [secretKey, setSecretKey] = useState(""); + const [targetURL, setTargetURL] = useState(""); + const [targetStorageClass, setTargetStorageClass] = useState(""); + const [prefix, setPrefix] = useState(""); + const [targetBucket, setTargetBucket] = useState(""); + const [region, setRegion] = useState(""); + const [useTLS, setUseTLS] = useState(true); + const [repDeleteMarker, setRepDeleteMarker] = useState(true); + const [repDelete, setRepDelete] = useState(true); + const [metadataSync, setMetadataSync] = useState(true); + const [repExisting, setRepExisting] = useState(false); + const [tags, setTags] = useState(""); + const [replicationMode, setReplicationMode] = useState<"async" | "sync">( + "async", + ); + const [bandwidthScalar, setBandwidthScalar] = useState("100"); + const [bandwidthUnit, setBandwidthUnit] = useState("Gi"); + const [healthCheck, setHealthCheck] = useState("60"); + const [validated, setValidated] = useState(false); + const backLink = IAM_PAGES.BUCKETS + `/${bucketName}/admin/replication`; + useEffect(() => { + dispatch(setHelpName("bucket-replication-add")); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const addRecord = () => { + const replicate = [ + { + originBucket: bucketName, + destinationBucket: targetBucket, + }, + ]; + + const hc = parseInt(healthCheck); + + const endURL = `${useTLS ? "https://" : "http://"}${targetURL}`; + + const remoteBucketsInfo = { + accessKey: accessKey, + secretKey: secretKey, + targetURL: endURL, + region: region, + bucketsRelation: replicate, + syncMode: replicationMode, + bandwidth: + replicationMode === "async" + ? parseInt(getBytes(bandwidthScalar, bandwidthUnit, true)) + : 0, + healthCheckPeriod: hc, + prefix: prefix, + tags: tags, + replicateDeleteMarkers: repDeleteMarker, + replicateDeletes: repDelete, + replicateExistingObjects: repExisting, + priority: parseInt(priority), + storageClass: targetStorageClass, + replicateMetadata: metadataSync, + }; + + api.bucketsReplication + .setMultiBucketReplication(remoteBucketsInfo) + .then((res) => { + setAddLoading(false); + + const states = get(res.data, "replicationState", []); + + if (states.length > 0) { + const itemVal = states[0]; + + setAddLoading(false); + + if (itemVal.errorString && itemVal.errorString !== "") { + dispatch( + setErrorSnackMessage({ + errorMessage: itemVal.errorString, + detailedError: "", + }), + ); + navigate(backLink); + return; + } + navigate(backLink); + return; + } + dispatch( + setErrorSnackMessage({ + errorMessage: "No changes applied", + detailedError: "", + }), + ); + }) + .catch((err) => { + setAddLoading(false); + dispatch(setErrorSnackMessage(errorToHandler(err.error))); + }); + }; + + let validURL = new RegExp(/(?<=^|\s)(\w*-?\w+\.[a-z]{2,}\S*)/); + const checkValidURL = (testURL: string) => { + return validURL.test(testURL); + }; + + useEffect(() => { + !validated && + accessKey.length >= 3 && + secretKey.length >= 8 && + targetBucket.length >= 3 && + checkValidURL(targetURL) && + setValidated(true); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [targetURL, accessKey, secretKey, targetBucket]); + useEffect(() => { + if ( + (validated && accessKey.length < 3) || + secretKey.length < 8 || + targetBucket.length < 3 || + !checkValidURL(targetURL) + ) { + setValidated(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [targetURL, accessKey, secretKey, targetBucket]); + + return ( + + navigate(backLink)} + /> + } + actions={} + /> + + } + title="Bucket Replication Configuration" + help={ + + + The bucket selected in this deployment acts as the “source” + while the configured remote deployment acts as the “target”. + + + For each write operation to this "source" bucket, MinIO + checks all configured replication rules and applies the + matching rule with highest configured priority. + + + MinIO supports automatically replicating existing objects in + a bucket, however it does not enable existing object + replication by default. Objects created before replication + was configured or while replication is disabled are not + synchronized to the target deployment unless replication of + existing objects is enabled. + + + MinIO supports replicating delete operations, where MinIO + synchronizes deleting specific object versions and new + delete markers. Delete operation replication uses the same + replication process as all other replication operations. + {" "} + + } + /> + } + > +
) => { + e.preventDefault(); + setAddLoading(true); + addRecord(); + }} + > + ) => { + if (e.target.validity.valid) { + setPriority(e.target.value); + } + }} + label="Priority" + value={priority} + pattern={"[0-9]*"} + /> + + ) => { + setTargetURL(e.target.value); + }} + placeholder="play.min.io" + label="Target URL" + value={targetURL} + /> + + { + setUseTLS(e.target.checked); + }} + value="yes" + /> + + ) => { + setAccessKey(e.target.value); + }} + label="Access Key" + value={accessKey} + /> + + ) => { + setSecretKey(e.target.value); + }} + label="Secret Key" + value={secretKey} + /> + + ) => { + setTargetBucket(e.target.value); + }} + label="Target Bucket" + value={targetBucket} + /> + + ) => { + setRegion(e.target.value); + }} + label="Region" + value={region} + /> + +