From 75728a052de21ca8e28d85a3145f56f793100490 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 13:55:35 +0000 Subject: [PATCH 1/8] chore(internal): more robust bootstrap script --- scripts/bootstrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/bootstrap b/scripts/bootstrap index 5ab30665..46547f18 100755 --- a/scripts/bootstrap +++ b/scripts/bootstrap @@ -4,7 +4,7 @@ set -e cd "$(dirname "$0")/.." -if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then +if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then brew bundle check >/dev/null 2>&1 || { echo -n "==> Install Homebrew dependencies? (y/N): " read -r response From 57e9f6cca6fca71a4a6943c99b2fd7117225850f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:47:45 +0000 Subject: [PATCH 2/8] feat(api): aggregated API specs update --- .stats.yml | 4 +- cloud/api.md | 4 +- cloud/databasepostgrescluster.go | 22 +++-- cloud/databasepostgrescluster_test.go | 1 + .../databasepostgresclusterusercredential.go | 18 ++-- cloud/databasepostgresconfiguration.go | 4 +- cloud/databasepostgrescustomconfiguration.go | 12 +-- cloud/loadbalancerpool.go | 2 + cloud/loadbalancerpool_test.go | 1 + storage/api.md | 3 +- storage/objectstorage.go | 14 +++- storage/objectstoragebucket.go | 84 +------------------ storage/sftpstorage.go | 8 +- 13 files changed, 68 insertions(+), 109 deletions(-) diff --git a/.stats.yml b/.stats.yml index 157020e8..1cdf983f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 657 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-ba1eb162beed31f03386720005830bdaad3be08b9e08a07b2f10a2dd124648b8.yml -openapi_spec_hash: 416a4779f456d266b805fef5a54cfbc7 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-4ee8152b36b93280da61c72110967bf24fedecc8d6df738d5f06a1a741a1e483.yml +openapi_spec_hash: 95ad145b1c39dee152a45d7cdfd3fc65 config_hash: d2defa3f4caff86ec6f4b8890f74b295 diff --git a/cloud/api.md b/cloud/api.md index c51db86e..17ca863e 100644 --- a/cloud/api.md +++ b/cloud/api.md @@ -1097,11 +1097,11 @@ Methods: Response Types: -- cloud.PgConfValidation +- cloud.DatabasePostgresCustomConfigurationValidateResponse Methods: -- client.Cloud.Databases.Postgres.CustomConfigurations.Validate(ctx context.Context, params cloud.DatabasePostgresCustomConfigurationValidateParams) (\*cloud.PgConfValidation, error) +- client.Cloud.Databases.Postgres.CustomConfigurations.Validate(ctx context.Context, params cloud.DatabasePostgresCustomConfigurationValidateParams) (\*cloud.DatabasePostgresCustomConfigurationValidateResponse, error) ## VolumeSnapshots diff --git a/cloud/databasepostgrescluster.go b/cloud/databasepostgrescluster.go index 7158b0cf..ac10b94e 100644 --- a/cloud/databasepostgrescluster.go +++ b/cloud/databasepostgrescluster.go @@ -566,8 +566,10 @@ const ( ) type DatabasePostgresClusterNewParams struct { + // Project ID ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` // High Availability settings HighAvailability DatabasePostgresClusterNewParamsHighAvailability `json:"high_availability,omitzero" api:"required"` // PostgreSQL cluster name @@ -757,8 +759,10 @@ func (r *DatabasePostgresClusterNewParamsUser) UnmarshalJSON(data []byte) error } type DatabasePostgresClusterUpdateParams struct { + // Project ID ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` // New instance RAM and CPU Flavor DatabasePostgresClusterUpdateParamsFlavor `json:"flavor,omitzero"` // New High Availability settings @@ -942,10 +946,14 @@ func (r *DatabasePostgresClusterUpdateParamsUser) UnmarshalJSON(data []byte) err } type DatabasePostgresClusterListParams struct { + // Project ID ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` // Maximum number of clusters to return Limit param.Opt[int64] `query:"limit,omitzero" json:"-"` + // Filter clusters by name + Name param.Opt[string] `query:"name,omitzero" json:"-"` // Number of clusters to skip Offset param.Opt[int64] `query:"offset,omitzero" json:"-"` paramObj @@ -961,13 +969,17 @@ func (r DatabasePostgresClusterListParams) URLQuery() (v url.Values, err error) } type DatabasePostgresClusterDeleteParams struct { + // Project ID ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` paramObj } type DatabasePostgresClusterGetParams struct { + // Project ID ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` paramObj } diff --git a/cloud/databasepostgrescluster_test.go b/cloud/databasepostgrescluster_test.go index 8d7e9268..14b51e35 100644 --- a/cloud/databasepostgrescluster_test.go +++ b/cloud/databasepostgrescluster_test.go @@ -144,6 +144,7 @@ func TestDatabasePostgresClusterListWithOptionalParams(t *testing.T) { ProjectID: gcore.Int(0), RegionID: gcore.Int(0), Limit: gcore.Int(0), + Name: gcore.String("name"), Offset: gcore.Int(0), }) if err != nil { diff --git a/cloud/databasepostgresclusterusercredential.go b/cloud/databasepostgresclusterusercredential.go index cc8ef15c..249a216e 100644 --- a/cloud/databasepostgresclusterusercredential.go +++ b/cloud/databasepostgresclusterusercredential.go @@ -118,15 +118,21 @@ func (r *PostgresUserCredentials) UnmarshalJSON(data []byte) error { } type DatabasePostgresClusterUserCredentialGetParams struct { - ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` - ClusterName string `path:"cluster_name" api:"required" json:"-"` + // Project ID + ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Cluster name + ClusterName string `path:"cluster_name" api:"required" json:"-"` paramObj } type DatabasePostgresClusterUserCredentialRegenerateParams struct { - ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` - ClusterName string `path:"cluster_name" api:"required" json:"-"` + // Project ID + ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Cluster name + ClusterName string `path:"cluster_name" api:"required" json:"-"` paramObj } diff --git a/cloud/databasepostgresconfiguration.go b/cloud/databasepostgresconfiguration.go index 2345d36a..6cdd5709 100644 --- a/cloud/databasepostgresconfiguration.go +++ b/cloud/databasepostgresconfiguration.go @@ -118,7 +118,9 @@ func (r *PostgresConfigurationStorageClass) UnmarshalJSON(data []byte) error { } type DatabasePostgresConfigurationGetParams struct { + // Project ID ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` paramObj } diff --git a/cloud/databasepostgrescustomconfiguration.go b/cloud/databasepostgrescustomconfiguration.go index 6f56c871..ddf148fb 100644 --- a/cloud/databasepostgrescustomconfiguration.go +++ b/cloud/databasepostgrescustomconfiguration.go @@ -37,7 +37,7 @@ func NewDatabasePostgresCustomConfigurationService(opts ...option.RequestOption) } // Validate a custom PostgreSQL configuration file. -func (r *DatabasePostgresCustomConfigurationService) Validate(ctx context.Context, params DatabasePostgresCustomConfigurationValidateParams, opts ...option.RequestOption) (res *PgConfValidation, err error) { +func (r *DatabasePostgresCustomConfigurationService) Validate(ctx context.Context, params DatabasePostgresCustomConfigurationValidateParams, opts ...option.RequestOption) (res *DatabasePostgresCustomConfigurationValidateResponse, err error) { opts = slices.Concat(r.Options, opts) precfg, err := requestconfig.PreRequestOptions(opts...) if err != nil { @@ -58,7 +58,7 @@ func (r *DatabasePostgresCustomConfigurationService) Validate(ctx context.Contex return res, err } -type PgConfValidation struct { +type DatabasePostgresCustomConfigurationValidateResponse struct { // Errors list Errors []string `json:"errors" api:"required"` // Validity of pg.conf file @@ -73,14 +73,16 @@ type PgConfValidation struct { } // Returns the unmodified JSON received from the API -func (r PgConfValidation) RawJSON() string { return r.JSON.raw } -func (r *PgConfValidation) UnmarshalJSON(data []byte) error { +func (r DatabasePostgresCustomConfigurationValidateResponse) RawJSON() string { return r.JSON.raw } +func (r *DatabasePostgresCustomConfigurationValidateResponse) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } type DatabasePostgresCustomConfigurationValidateParams struct { + // Project ID ProjectID param.Opt[int64] `path:"project_id,omitzero" api:"required" json:"-"` - RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` + // Region ID + RegionID param.Opt[int64] `path:"region_id,omitzero" api:"required" json:"-"` // PostgreSQL configuration PgConf string `json:"pg_conf" api:"required"` // PostgreSQL version diff --git a/cloud/loadbalancerpool.go b/cloud/loadbalancerpool.go index de62e113..0ddeba78 100644 --- a/cloud/loadbalancerpool.go +++ b/cloud/loadbalancerpool.go @@ -678,6 +678,8 @@ type LoadBalancerPoolListParams struct { ListenerID param.Opt[string] `query:"listener_id,omitzero" format:"uuid4" json:"-"` // Load Balancer ID LoadBalancerID param.Opt[string] `query:"load_balancer_id,omitzero" format:"uuid4" json:"-"` + // Filter by name + Name param.Opt[string] `query:"name,omitzero" json:"-"` // Optional. Offset value is used to exclude the first set of records from the // result Offset param.Opt[int64] `query:"offset,omitzero" json:"-"` diff --git a/cloud/loadbalancerpool_test.go b/cloud/loadbalancerpool_test.go index 436888e9..76b7769a 100644 --- a/cloud/loadbalancerpool_test.go +++ b/cloud/loadbalancerpool_test.go @@ -178,6 +178,7 @@ func TestLoadBalancerPoolListWithOptionalParams(t *testing.T) { Limit: gcore.Int(1000), ListenerID: gcore.String("00000000-0000-4000-8000-000000000000"), LoadBalancerID: gcore.String("00000000-0000-4000-8000-000000000000"), + Name: gcore.String("lb-pool-name"), Offset: gcore.Int(0), }) if err != nil { diff --git a/storage/api.md b/storage/api.md index a1ab20ec..c59bb68a 100644 --- a/storage/api.md +++ b/storage/api.md @@ -43,11 +43,10 @@ Methods: Response Types: - storage.Bucket -- storage.BucketCreated Methods: -- client.Storage.ObjectStorages.Buckets.New(ctx context.Context, storageID int64, body storage.ObjectStorageBucketNewParams) (\*storage.BucketCreated, error) +- client.Storage.ObjectStorages.Buckets.New(ctx context.Context, storageID int64, body storage.ObjectStorageBucketNewParams) (\*storage.Bucket, error) - client.Storage.ObjectStorages.Buckets.Update(ctx context.Context, bucketName string, params storage.ObjectStorageBucketUpdateParams) (\*storage.Bucket, error) - client.Storage.ObjectStorages.Buckets.List(ctx context.Context, storageID int64, query storage.ObjectStorageBucketListParams) (\*pagination.OffsetPage[storage.Bucket], error) - client.Storage.ObjectStorages.Buckets.Delete(ctx context.Context, bucketName string, body storage.ObjectStorageBucketDeleteParams) error diff --git a/storage/objectstorage.go b/storage/objectstorage.go index a7aef0e1..d56406bf 100644 --- a/storage/objectstorage.go +++ b/storage/objectstorage.go @@ -110,9 +110,13 @@ type S3Storage struct { Address string `json:"address" api:"required"` // ISO 8601 timestamp when the storage was created CreatedAt time.Time `json:"created_at" api:"required" format:"date-time"` + // Read-only internal full name of the storage, composed as "{`client_id`}-{name}". + // Used internally by the backend. Clients should continue to identify the storage + // by `name`. + FullName string `json:"full_name" api:"required"` // Geographic location code where the storage is provisioned LocationName string `json:"location_name" api:"required"` - // User-defined name for the storage instance + // User-defined name for the storage instance, as supplied at creation time. Name string `json:"name" api:"required"` // Lifecycle status of the storage. Use this to check readiness before operations. // @@ -123,6 +127,7 @@ type S3Storage struct { ID respjson.Field Address respjson.Field CreatedAt respjson.Field + FullName respjson.Field LocationName respjson.Field Name respjson.Field ProvisioningStatus respjson.Field @@ -157,9 +162,13 @@ type S3StorageCreated struct { Address string `json:"address" api:"required"` // ISO 8601 timestamp when the storage was created CreatedAt time.Time `json:"created_at" api:"required" format:"date-time"` + // Read-only internal full name of the storage, composed as "{`client_id`}-{name}". + // Used internally by the backend. Clients should continue to identify the storage + // by `name`. + FullName string `json:"full_name" api:"required"` // Geographic location code where the storage is provisioned LocationName string `json:"location_name" api:"required"` - // User-defined name for the storage instance + // User-defined name for the storage instance, as supplied at creation time. Name string `json:"name" api:"required"` // Lifecycle status of the storage. Use this to check readiness before operations. // @@ -171,6 +180,7 @@ type S3StorageCreated struct { AccessKeys respjson.Field Address respjson.Field CreatedAt respjson.Field + FullName respjson.Field LocationName respjson.Field Name respjson.Field ProvisioningStatus respjson.Field diff --git a/storage/objectstoragebucket.go b/storage/objectstoragebucket.go index 6f34c157..79ec526a 100644 --- a/storage/objectstoragebucket.go +++ b/storage/objectstoragebucket.go @@ -39,7 +39,7 @@ func NewObjectStorageBucketService(opts ...option.RequestOption) (r ObjectStorag } // Creates a new bucket within an S3-compatible storage. -func (r *ObjectStorageBucketService) New(ctx context.Context, storageID int64, body ObjectStorageBucketNewParams, opts ...option.RequestOption) (res *BucketCreated, err error) { +func (r *ObjectStorageBucketService) New(ctx context.Context, storageID int64, body ObjectStorageBucketNewParams, opts ...option.RequestOption) (res *Bucket, err error) { opts = slices.Concat(r.Options, opts) path := fmt.Sprintf("storage/v4/object_storages/%v/buckets", storageID) err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...) @@ -200,88 +200,6 @@ func (r *BucketPolicy) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } -type BucketCreated struct { - Cors BucketCreatedCors `json:"cors" api:"required"` - Lifecycle BucketCreatedLifecycle `json:"lifecycle" api:"required"` - // Globally unique bucket name within the storage. Used as the path prefix when - // accessing objects via S3 API. - Name string `json:"name" api:"required"` - Policy BucketCreatedPolicy `json:"policy" api:"required"` - // Parent storage this bucket belongs to. Use this ID in the URL path for bucket - // operations. - StorageID int64 `json:"storage_id" api:"required"` - // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. - JSON struct { - Cors respjson.Field - Lifecycle respjson.Field - Name respjson.Field - Policy respjson.Field - StorageID respjson.Field - ExtraFields map[string]respjson.Field - raw string - } `json:"-"` -} - -// Returns the unmodified JSON received from the API -func (r BucketCreated) RawJSON() string { return r.JSON.raw } -func (r *BucketCreated) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -type BucketCreatedCors struct { - // Web domains allowed to make direct browser requests to this bucket (e.g., - // "https://myapp.com"). Use "\*" to allow any origin. - AllowedOrigins []string `json:"allowed_origins" api:"required"` - // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. - JSON struct { - AllowedOrigins respjson.Field - ExtraFields map[string]respjson.Field - raw string - } `json:"-"` -} - -// Returns the unmodified JSON received from the API -func (r BucketCreatedCors) RawJSON() string { return r.JSON.raw } -func (r *BucketCreatedCors) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -type BucketCreatedLifecycle struct { - // Days after upload before objects are automatically deleted. For example, 30 - // means files are removed 30 days after creation. - ExpirationDays int64 `json:"expiration_days" api:"required"` - // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. - JSON struct { - ExpirationDays respjson.Field - ExtraFields map[string]respjson.Field - raw string - } `json:"-"` -} - -// Returns the unmodified JSON received from the API -func (r BucketCreatedLifecycle) RawJSON() string { return r.JSON.raw } -func (r *BucketCreatedLifecycle) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - -type BucketCreatedPolicy struct { - // When true, anyone can download objects without credentials. When false, all - // requests require valid S3 authentication. - IsPublic bool `json:"is_public" api:"required"` - // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. - JSON struct { - IsPublic respjson.Field - ExtraFields map[string]respjson.Field - raw string - } `json:"-"` -} - -// Returns the unmodified JSON received from the API -func (r BucketCreatedPolicy) RawJSON() string { return r.JSON.raw } -func (r *BucketCreatedPolicy) UnmarshalJSON(data []byte) error { - return apijson.UnmarshalRoot(data, r) -} - type ObjectStorageBucketNewParams struct { // Name of the bucket to create Name string `json:"name" api:"required"` diff --git a/storage/sftpstorage.go b/storage/sftpstorage.go index c79e0ac1..2154f097 100644 --- a/storage/sftpstorage.go +++ b/storage/sftpstorage.go @@ -106,6 +106,11 @@ type SftpStorage struct { CreatedAt time.Time `json:"created_at" api:"required" format:"date-time"` // Duration when the storage will expire. Null if no expiration is set. Expires string `json:"expires" api:"required"` + // Read-only internal full name of the storage, composed as "{`client_id`}-{name}". + // Used by the SFTP backend as the login username. Clients should use this value + // when connecting but should continue to identify the storage by `name` in their + // own configuration. + FullName string `json:"full_name" api:"required"` // Whether this storage uses a custom configuration file HasCustomConfigFile bool `json:"has_custom_config_file" api:"required"` // Whether password authentication is configured for this storage @@ -114,7 +119,7 @@ type SftpStorage struct { IsHTTPDisabled bool `json:"is_http_disabled" api:"required"` // Geographic location code where the storage is provisioned LocationName string `json:"location_name" api:"required"` - // User-defined name for the storage instance + // User-defined name for the storage instance, as supplied at creation time. Name string `json:"name" api:"required"` // Lifecycle status of the storage. Use this to check readiness before operations. // @@ -133,6 +138,7 @@ type SftpStorage struct { Address respjson.Field CreatedAt respjson.Field Expires respjson.Field + FullName respjson.Field HasCustomConfigFile respjson.Field HasPassword respjson.Field IsHTTPDisabled respjson.Field From 10bd55ae6569d32d0645350b0265d040b4f8bb71 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:34:29 +0000 Subject: [PATCH 3/8] feat(storage): support TF for ssh keys --- .stats.yml | 2 +- storage/sshkey.go | 3 +++ storage/storage.go | 6 ++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1cdf983f..e639653d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 657 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-4ee8152b36b93280da61c72110967bf24fedecc8d6df738d5f06a1a741a1e483.yml openapi_spec_hash: 95ad145b1c39dee152a45d7cdfd3fc65 -config_hash: d2defa3f4caff86ec6f4b8890f74b295 +config_hash: aa5a9dd05b6324fcb454d0694e5901a3 diff --git a/storage/sshkey.go b/storage/sshkey.go index b56f2284..ea34128d 100644 --- a/storage/sshkey.go +++ b/storage/sshkey.go @@ -19,6 +19,9 @@ import ( "github.com/G-Core/gcore-go/packages/respjson" ) +// SSH keys enable secure access to SFTP storage by associating public keys with +// user accounts for authentication. +// // SSHKeyService contains methods and other services that help with interacting // with the gcore API. // diff --git a/storage/storage.go b/storage/storage.go index c8d4db5f..d1f41d2c 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -18,8 +18,10 @@ type StorageService struct { Locations LocationService ObjectStorages ObjectStorageService SftpStorages SftpStorageService - SSHKeys SSHKeyService - Statistics StatisticService + // SSH keys enable secure access to SFTP storage by associating public keys with + // user accounts for authentication. + SSHKeys SSHKeyService + Statistics StatisticService } // NewStorageService generates a new service that applies the given options to each From 09773f8d6a80853d0c090d687687d59c26b870a0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 14:55:36 +0000 Subject: [PATCH 4/8] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e639653d..eb881ba3 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 657 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-4ee8152b36b93280da61c72110967bf24fedecc8d6df738d5f06a1a741a1e483.yml -openapi_spec_hash: 95ad145b1c39dee152a45d7cdfd3fc65 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-d7bc6f6b1d020fb7c24b6f53d9437256eee2203d0aa46c7337f620c9630285f8.yml +openapi_spec_hash: 7922ec4e12c6c73c57cb98dbfee69234 config_hash: aa5a9dd05b6324fcb454d0694e5901a3 From f1faaf7fdc53e194d8d9e9891fc7c7f03ded5b3a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 19:58:38 +0000 Subject: [PATCH 5/8] feat(go): add default http client with timeout --- client.go | 2 +- default_http_client.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 default_http_client.go diff --git a/client.go b/client.go index 01958a7c..eea4ed75 100644 --- a/client.go +++ b/client.go @@ -45,7 +45,7 @@ type Client struct { // GCORE_CLOUD_PROJECT_ID, GCORE_CLOUD_REGION_ID, GCORE_BASE_URL). This should be // used to initialize new clients. func DefaultClientOptions() []option.RequestOption { - defaults := []option.RequestOption{option.WithEnvironmentProduction()} + defaults := []option.RequestOption{option.WithHTTPClient(defaultHTTPClient()), option.WithEnvironmentProduction()} if o, ok := os.LookupEnv("GCORE_BASE_URL"); ok { defaults = append(defaults, option.WithBaseURL(o)) } diff --git a/default_http_client.go b/default_http_client.go new file mode 100644 index 00000000..3d2b86b6 --- /dev/null +++ b/default_http_client.go @@ -0,0 +1,24 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +package gcore + +import ( + "net/http" + "time" +) + +// defaultResponseHeaderTimeout bounds the time between a fully written request +// and the server's response headers. It does not apply to the response body, +// so long-running streams are unaffected. Without this, a server that accepts +// the connection but never responds would hang the request indefinitely. +const defaultResponseHeaderTimeout = 10 * time.Minute + +// defaultHTTPClient returns an [*http.Client] used when the caller does not +// supply one via [option.WithHTTPClient]. It clones [http.DefaultTransport] +// and adds a [http.Transport.ResponseHeaderTimeout] so stuck connections +// fail fast instead of compounding across retries. +func defaultHTTPClient() *http.Client { + transport := http.DefaultTransport.(*http.Transport).Clone() + transport.ResponseHeaderTimeout = defaultResponseHeaderTimeout + return &http.Client{Transport: transport} +} From 6ccf2d9b6b09929f4263ef9cb852da3263fd63f7 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 05:14:56 +0000 Subject: [PATCH 6/8] feat(api): aggregated API specs update --- .stats.yml | 4 ++-- iam/user.go | 12 ++++++------ iam/user_test.go | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.stats.yml b/.stats.yml index eb881ba3..533a18c3 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 657 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-d7bc6f6b1d020fb7c24b6f53d9437256eee2203d0aa46c7337f620c9630285f8.yml -openapi_spec_hash: 7922ec4e12c6c73c57cb98dbfee69234 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-236958943262c124215347d9b33e2de06e1e38e4b89797eddb0a73fb29ff6d62.yml +openapi_spec_hash: fbe0b6ef8b425ff72e84ef8f3514771d config_hash: aa5a9dd05b6324fcb454d0694e5901a3 diff --git a/iam/user.go b/iam/user.go index d34fba9d..6be754cb 100644 --- a/iam/user.go +++ b/iam/user.go @@ -332,19 +332,19 @@ func (r *UserGetResponse) UnmarshalJSON(data []byte) error { type UserUpdateParams struct { // User's name. - Name param.Opt[string] `json:"name,omitzero" api:"required"` + Name param.Opt[string] `json:"name,omitzero"` // User's phone. - Phone param.Opt[string] `json:"phone,omitzero" api:"required"` - // System field. List of auth types available for the account. - AuthTypes []AuthType `json:"auth_types,omitzero" api:"required"` + Phone param.Opt[string] `json:"phone,omitzero"` // User's email address. - Email string `json:"email" api:"required" format:"email"` + Email param.Opt[string] `json:"email,omitzero" format:"email"` + // System field. List of auth types available for the account. + AuthTypes []AuthType `json:"auth_types,omitzero"` // User's language. // // Defines language of the control panel and email messages. // // Any of "de", "en", "ru", "zh", "az". - Lang UserLanguage `json:"lang,omitzero" api:"required"` + Lang UserLanguage `json:"lang,omitzero"` paramObj } diff --git a/iam/user_test.go b/iam/user_test.go index 6b67342a..ec01ce81 100644 --- a/iam/user_test.go +++ b/iam/user_test.go @@ -14,7 +14,7 @@ import ( "github.com/G-Core/gcore-go/option" ) -func TestUserUpdate(t *testing.T) { +func TestUserUpdateWithOptionalParams(t *testing.T) { t.Skip("skipped: PutUser schema requires read-only fields on PATCH, see IMP-1903") baseURL := "http://localhost:4010" if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { @@ -32,7 +32,7 @@ func TestUserUpdate(t *testing.T) { 0, iam.UserUpdateParams{ AuthTypes: []iam.AuthType{iam.AuthTypePassword}, - Email: "dev@stainless.com", + Email: gcore.String("dev@stainless.com"), Lang: iam.UserLanguageDe, Name: gcore.String("name"), Phone: gcore.String("phone"), From bb537c784b60af97a874a956bbea71b0bdd7f2d0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 12:45:52 +0000 Subject: [PATCH 7/8] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 533a18c3..a8ec4169 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 657 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-236958943262c124215347d9b33e2de06e1e38e4b89797eddb0a73fb29ff6d62.yml -openapi_spec_hash: fbe0b6ef8b425ff72e84ef8f3514771d +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-8c3bd3792724737d30da0f0200f0c589f9942ea3a028fcc9bcd56f3490ffc29a.yml +openapi_spec_hash: 7b184f4e52554b89cadf11b43f395583 config_hash: aa5a9dd05b6324fcb454d0694e5901a3 From 310806c54d79eee647df037e31bf8a43c795ea49 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 12:46:31 +0000 Subject: [PATCH 8/8] release: 0.44.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 16 ++++++++++++++++ README.md | 2 +- internal/version.go | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index fe87cd91..cc51f6f8 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.43.0" + ".": "0.44.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index fb414167..25ba743b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 0.44.0 (2026-04-27) + +Full Changelog: [v0.43.0...v0.44.0](https://github.com/G-Core/gcore-go/compare/v0.43.0...v0.44.0) + +### Features + +* **api:** aggregated API specs update ([6ccf2d9](https://github.com/G-Core/gcore-go/commit/6ccf2d9b6b09929f4263ef9cb852da3263fd63f7)) +* **api:** aggregated API specs update ([57e9f6c](https://github.com/G-Core/gcore-go/commit/57e9f6cca6fca71a4a6943c99b2fd7117225850f)) +* **go:** add default http client with timeout ([f1faaf7](https://github.com/G-Core/gcore-go/commit/f1faaf7fdc53e194d8d9e9891fc7c7f03ded5b3a)) +* **storage:** support TF for ssh keys ([10bd55a](https://github.com/G-Core/gcore-go/commit/10bd55ae6569d32d0645350b0265d040b4f8bb71)) + + +### Chores + +* **internal:** more robust bootstrap script ([75728a0](https://github.com/G-Core/gcore-go/commit/75728a052de21ca8e28d85a3145f56f793100490)) + ## 0.43.0 (2026-04-22) Full Changelog: [v0.42.0...v0.43.0](https://github.com/G-Core/gcore-go/compare/v0.42.0...v0.43.0) diff --git a/README.md b/README.md index 3f9fbe38..a3c06b17 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Or to pin the version: ```sh -go get -u 'github.com/G-Core/gcore-go@v0.43.0' +go get -u 'github.com/G-Core/gcore-go@v0.44.0' ``` diff --git a/internal/version.go b/internal/version.go index 32a29940..27842b2f 100644 --- a/internal/version.go +++ b/internal/version.go @@ -2,4 +2,4 @@ package internal -const PackageVersion = "0.43.0" // x-release-please-version +const PackageVersion = "0.44.0" // x-release-please-version