Skip to content

Commit b7d0d25

Browse files
feat: Add org-level default per-project concurrency cap
1 parent 059577e commit b7d0d25

6 files changed

Lines changed: 227 additions & 5 deletions

File tree

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 117
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-08c2d6a44f4cdcbfb6803a3043fdc1a3e33911dec4652cb3a870f01bc584421f.yml
3-
openapi_spec_hash: c816491451347eb93b793cddf6a78648
4-
config_hash: 9e45c27425021d49b5391f5cc980b046
1+
configured_endpoints: 119
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-76f6c461ca9fd01958f3315a4f5d558ef80896c8aa0496e38caef55d4bd51dbd.yml
3+
openapi_spec_hash: bb8124b6016b73022c52e6ef5b7220a4
4+
config_hash: 80eef1b592110714ea55cd26c470fabb

api.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,23 @@ Methods:
400400
- <code title="get /org/projects/{id}/limits">client.Projects.Limits.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#ProjectLimitService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, id <a href="https://pkg.go.dev/builtin#string">string</a>) (\*<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk">kernel</a>.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#ProjectLimits">ProjectLimits</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
401401
- <code title="patch /org/projects/{id}/limits">client.Projects.Limits.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#ProjectLimitService.Update">Update</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, id <a href="https://pkg.go.dev/builtin#string">string</a>, body <a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk">kernel</a>.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#ProjectLimitUpdateParams">ProjectLimitUpdateParams</a>) (\*<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk">kernel</a>.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#ProjectLimits">ProjectLimits</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
402402

403+
# Organization
404+
405+
## Limits
406+
407+
Params Types:
408+
409+
- <a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk">kernel</a>.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#UpdateOrgLimitsRequestParam">UpdateOrgLimitsRequestParam</a>
410+
411+
Response Types:
412+
413+
- <a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk">kernel</a>.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#OrgLimits">OrgLimits</a>
414+
415+
Methods:
416+
417+
- <code title="get /org/limits">client.Organization.Limits.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#OrganizationLimitService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>) (\*<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk">kernel</a>.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#OrgLimits">OrgLimits</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
418+
- <code title="patch /org/limits">client.Organization.Limits.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#OrganizationLimitService.Update">Update</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, body <a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk">kernel</a>.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#OrganizationLimitUpdateParams">OrganizationLimitUpdateParams</a>) (\*<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk">kernel</a>.<a href="https://pkg.go.dev/github.com/kernel/kernel-go-sdk#OrgLimits">OrgLimits</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
419+
403420
# APIKeys
404421

405422
Response Types:

client.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ type Client struct {
4141
// Create and manage credentials for authentication.
4242
Credentials CredentialService
4343
// Create and manage projects for resource isolation within an organization.
44-
Projects ProjectService
44+
Projects ProjectService
45+
Organization OrganizationService
4546
// Create and manage API keys for organization and project-scoped access.
4647
APIKeys APIKeyService
4748
// Configure external credential providers like 1Password.
@@ -94,6 +95,7 @@ func NewClient(opts ...option.RequestOption) (r Client) {
9495
r.BrowserPools = NewBrowserPoolService(opts...)
9596
r.Credentials = NewCredentialService(opts...)
9697
r.Projects = NewProjectService(opts...)
98+
r.Organization = NewOrganizationService(opts...)
9799
r.APIKeys = NewAPIKeyService(opts...)
98100
r.CredentialProviders = NewCredentialProviderService(opts...)
99101

organization.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package kernel
4+
5+
import (
6+
"github.com/kernel/kernel-go-sdk/option"
7+
)
8+
9+
// OrganizationService contains methods and other services that help with
10+
// interacting with the kernel API.
11+
//
12+
// Note, unlike clients, this service does not read variables from the environment
13+
// automatically. You should not instantiate this service directly, and instead use
14+
// the [NewOrganizationService] method instead.
15+
type OrganizationService struct {
16+
Options []option.RequestOption
17+
// Read and manage organization-level limits.
18+
Limits OrganizationLimitService
19+
}
20+
21+
// NewOrganizationService generates a new service that applies the given options to
22+
// each request. These options are applied after the parent client's options (if
23+
// there is one), and before any request-specific options.
24+
func NewOrganizationService(opts ...option.RequestOption) (r OrganizationService) {
25+
r = OrganizationService{}
26+
r.Options = opts
27+
r.Limits = NewOrganizationLimitService(opts...)
28+
return
29+
}

organizationlimit.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package kernel
4+
5+
import (
6+
"context"
7+
"net/http"
8+
"slices"
9+
10+
"github.com/kernel/kernel-go-sdk/internal/apijson"
11+
shimjson "github.com/kernel/kernel-go-sdk/internal/encoding/json"
12+
"github.com/kernel/kernel-go-sdk/internal/requestconfig"
13+
"github.com/kernel/kernel-go-sdk/option"
14+
"github.com/kernel/kernel-go-sdk/packages/param"
15+
"github.com/kernel/kernel-go-sdk/packages/respjson"
16+
)
17+
18+
// Read and manage organization-level limits.
19+
//
20+
// OrganizationLimitService contains methods and other services that help with
21+
// interacting with the kernel API.
22+
//
23+
// Note, unlike clients, this service does not read variables from the environment
24+
// automatically. You should not instantiate this service directly, and instead use
25+
// the [NewOrganizationLimitService] method instead.
26+
type OrganizationLimitService struct {
27+
Options []option.RequestOption
28+
}
29+
30+
// NewOrganizationLimitService generates a new service that applies the given
31+
// options to each request. These options are applied after the parent client's
32+
// options (if there is one), and before any request-specific options.
33+
func NewOrganizationLimitService(opts ...option.RequestOption) (r OrganizationLimitService) {
34+
r = OrganizationLimitService{}
35+
r.Options = opts
36+
return
37+
}
38+
39+
// Get the organization's concurrent session ceiling and the default per-project
40+
// concurrency cap applied to projects without an explicit override.
41+
func (r *OrganizationLimitService) Get(ctx context.Context, opts ...option.RequestOption) (res *OrgLimits, err error) {
42+
opts = slices.Concat(r.Options, opts)
43+
path := "org/limits"
44+
err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &res, opts...)
45+
return res, err
46+
}
47+
48+
// Set the default per-project concurrency cap applied to projects without an
49+
// explicit override. Set the value to 0 to remove the default; omit to leave it
50+
// unchanged. The default cannot exceed the organization's concurrent session
51+
// ceiling.
52+
func (r *OrganizationLimitService) Update(ctx context.Context, body OrganizationLimitUpdateParams, opts ...option.RequestOption) (res *OrgLimits, err error) {
53+
opts = slices.Concat(r.Options, opts)
54+
path := "org/limits"
55+
err = requestconfig.ExecuteNewRequest(ctx, http.MethodPatch, path, body, &res, opts...)
56+
return res, err
57+
}
58+
59+
type OrgLimits struct {
60+
// Default maximum concurrent browser sessions applied to every project that has no
61+
// explicit per-project override. Null means no org-level default, so such projects
62+
// are uncapped (only the org-wide limit applies). Applies to existing and newly
63+
// created projects.
64+
DefaultProjectMaxConcurrentSessions int64 `json:"default_project_max_concurrent_sessions" api:"nullable"`
65+
// The organization's effective concurrent browser session ceiling, from its plan
66+
// or an override. Read-only and shared across all projects in the org; a
67+
// per-project default cannot exceed it.
68+
MaxConcurrentSessions int64 `json:"max_concurrent_sessions"`
69+
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
70+
JSON struct {
71+
DefaultProjectMaxConcurrentSessions respjson.Field
72+
MaxConcurrentSessions respjson.Field
73+
ExtraFields map[string]respjson.Field
74+
raw string
75+
} `json:"-"`
76+
}
77+
78+
// Returns the unmodified JSON received from the API
79+
func (r OrgLimits) RawJSON() string { return r.JSON.raw }
80+
func (r *OrgLimits) UnmarshalJSON(data []byte) error {
81+
return apijson.UnmarshalRoot(data, r)
82+
}
83+
84+
type UpdateOrgLimitsRequestParam struct {
85+
// Default maximum concurrent browser sessions for projects without an explicit
86+
// override. Set to 0 to remove the default; omit to leave unchanged. Cannot exceed
87+
// the organization's concurrent session ceiling.
88+
DefaultProjectMaxConcurrentSessions param.Opt[int64] `json:"default_project_max_concurrent_sessions,omitzero"`
89+
paramObj
90+
}
91+
92+
func (r UpdateOrgLimitsRequestParam) MarshalJSON() (data []byte, err error) {
93+
type shadow UpdateOrgLimitsRequestParam
94+
return param.MarshalObject(r, (*shadow)(&r))
95+
}
96+
func (r *UpdateOrgLimitsRequestParam) UnmarshalJSON(data []byte) error {
97+
return apijson.UnmarshalRoot(data, r)
98+
}
99+
100+
type OrganizationLimitUpdateParams struct {
101+
UpdateOrgLimitsRequest UpdateOrgLimitsRequestParam
102+
paramObj
103+
}
104+
105+
func (r OrganizationLimitUpdateParams) MarshalJSON() (data []byte, err error) {
106+
return shimjson.Marshal(r.UpdateOrgLimitsRequest)
107+
}
108+
func (r *OrganizationLimitUpdateParams) UnmarshalJSON(data []byte) error {
109+
return apijson.UnmarshalRoot(data, r)
110+
}

organizationlimit_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package kernel_test
4+
5+
import (
6+
"context"
7+
"errors"
8+
"os"
9+
"testing"
10+
11+
"github.com/kernel/kernel-go-sdk"
12+
"github.com/kernel/kernel-go-sdk/internal/testutil"
13+
"github.com/kernel/kernel-go-sdk/option"
14+
)
15+
16+
func TestOrganizationLimitGet(t *testing.T) {
17+
t.Skip("Mock server tests are disabled")
18+
baseURL := "http://localhost:4010"
19+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
20+
baseURL = envURL
21+
}
22+
if !testutil.CheckTestServer(t, baseURL) {
23+
return
24+
}
25+
client := kernel.NewClient(
26+
option.WithBaseURL(baseURL),
27+
option.WithAPIKey("My API Key"),
28+
)
29+
_, err := client.Organization.Limits.Get(context.TODO())
30+
if err != nil {
31+
var apierr *kernel.Error
32+
if errors.As(err, &apierr) {
33+
t.Log(string(apierr.DumpRequest(true)))
34+
}
35+
t.Fatalf("err should be nil: %s", err.Error())
36+
}
37+
}
38+
39+
func TestOrganizationLimitUpdateWithOptionalParams(t *testing.T) {
40+
t.Skip("Mock server tests are disabled")
41+
baseURL := "http://localhost:4010"
42+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
43+
baseURL = envURL
44+
}
45+
if !testutil.CheckTestServer(t, baseURL) {
46+
return
47+
}
48+
client := kernel.NewClient(
49+
option.WithBaseURL(baseURL),
50+
option.WithAPIKey("My API Key"),
51+
)
52+
_, err := client.Organization.Limits.Update(context.TODO(), kernel.OrganizationLimitUpdateParams{
53+
UpdateOrgLimitsRequest: kernel.UpdateOrgLimitsRequestParam{
54+
DefaultProjectMaxConcurrentSessions: kernel.Int(0),
55+
},
56+
})
57+
if err != nil {
58+
var apierr *kernel.Error
59+
if errors.As(err, &apierr) {
60+
t.Log(string(apierr.DumpRequest(true)))
61+
}
62+
t.Fatalf("err should be nil: %s", err.Error())
63+
}
64+
}

0 commit comments

Comments
 (0)