diff --git a/agent/proto/agent_drpc_old.go b/agent/proto/agent_drpc_old.go new file mode 100644 index 0000000000000..9da7f6dee49ac --- /dev/null +++ b/agent/proto/agent_drpc_old.go @@ -0,0 +1,38 @@ +package proto + +import ( + "context" + + "storj.io/drpc" +) + +// DRPCAgentClient20 is the Agent API at v2.0. Notably, it is missing GetAnnouncementBanners, but +// is useful when you want to be maximally compatible with Coderd Release Versions from 2.9+ +type DRPCAgentClient20 interface { + DRPCConn() drpc.Conn + + GetManifest(ctx context.Context, in *GetManifestRequest) (*Manifest, error) + GetServiceBanner(ctx context.Context, in *GetServiceBannerRequest) (*ServiceBanner, error) + UpdateStats(ctx context.Context, in *UpdateStatsRequest) (*UpdateStatsResponse, error) + UpdateLifecycle(ctx context.Context, in *UpdateLifecycleRequest) (*Lifecycle, error) + BatchUpdateAppHealths(ctx context.Context, in *BatchUpdateAppHealthRequest) (*BatchUpdateAppHealthResponse, error) + UpdateStartup(ctx context.Context, in *UpdateStartupRequest) (*Startup, error) + BatchUpdateMetadata(ctx context.Context, in *BatchUpdateMetadataRequest) (*BatchUpdateMetadataResponse, error) + BatchCreateLogs(ctx context.Context, in *BatchCreateLogsRequest) (*BatchCreateLogsResponse, error) +} + +// DRPCAgentClient21 is the Agent API at v2.1. It is useful if you want to be maximally compatible +// with Coderd Release Versions from 2.12+ +type DRPCAgentClient21 interface { + DRPCConn() drpc.Conn + + GetManifest(ctx context.Context, in *GetManifestRequest) (*Manifest, error) + GetServiceBanner(ctx context.Context, in *GetServiceBannerRequest) (*ServiceBanner, error) + UpdateStats(ctx context.Context, in *UpdateStatsRequest) (*UpdateStatsResponse, error) + UpdateLifecycle(ctx context.Context, in *UpdateLifecycleRequest) (*Lifecycle, error) + BatchUpdateAppHealths(ctx context.Context, in *BatchUpdateAppHealthRequest) (*BatchUpdateAppHealthResponse, error) + UpdateStartup(ctx context.Context, in *UpdateStartupRequest) (*Startup, error) + BatchUpdateMetadata(ctx context.Context, in *BatchUpdateMetadataRequest) (*BatchUpdateMetadataResponse, error) + BatchCreateLogs(ctx context.Context, in *BatchCreateLogsRequest) (*BatchCreateLogsResponse, error) + GetAnnouncementBanners(ctx context.Context, in *GetAnnouncementBannersRequest) (*GetAnnouncementBannersResponse, error) +} diff --git a/codersdk/agentsdk/agentsdk.go b/codersdk/agentsdk/agentsdk.go index 32222479b37ee..243b672a8007c 100644 --- a/codersdk/agentsdk/agentsdk.go +++ b/codersdk/agentsdk/agentsdk.go @@ -21,6 +21,7 @@ import ( "cdr.dev/slog" "github.com/coder/coder/v2/agent/proto" + "github.com/coder/coder/v2/apiversion" "github.com/coder/coder/v2/codersdk" drpcsdk "github.com/coder/coder/v2/codersdk/drpc" ) @@ -155,14 +156,39 @@ func (c *Client) RewriteDERPMap(derpMap *tailcfg.DERPMap) { } } +// ConnectRPC20 returns a dRPC client to the Agent API v2.0. Notably, it is missing +// GetAnnouncementBanners, but is useful when you want to be maximally compatible with Coderd +// Release Versions from 2.9+ +func (c *Client) ConnectRPC20(ctx context.Context) (proto.DRPCAgentClient20, error) { + conn, err := c.connectRPCVersion(ctx, apiversion.New(2, 0)) + if err != nil { + return nil, err + } + return proto.NewDRPCAgentClient(conn), nil +} + +// ConnectRPC21 returns a dRPC client to the Agent API v2.1. It is useful when you want to be +// maximally compatible with Coderd Release Versions from 2.12+ +func (c *Client) ConnectRPC21(ctx context.Context) (proto.DRPCAgentClient21, error) { + conn, err := c.connectRPCVersion(ctx, apiversion.New(2, 1)) + if err != nil { + return nil, err + } + return proto.NewDRPCAgentClient(conn), nil +} + // ConnectRPC connects to the workspace agent API and tailnet API func (c *Client) ConnectRPC(ctx context.Context) (drpc.Conn, error) { + return c.connectRPCVersion(ctx, proto.CurrentVersion) +} + +func (c *Client) connectRPCVersion(ctx context.Context, version *apiversion.APIVersion) (drpc.Conn, error) { rpcURL, err := c.SDK.URL.Parse("/api/v2/workspaceagents/me/rpc") if err != nil { return nil, xerrors.Errorf("parse url: %w", err) } q := rpcURL.Query() - q.Add("version", proto.CurrentVersion.String()) + q.Add("version", version.String()) rpcURL.RawQuery = q.Encode() jar, err := cookiejar.New(nil)