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