mirror of https://github.com/coder/coder.git
feat: promote single-tailnet out of experimental (#11366)
This commit is contained in:
parent
ffa7722c31
commit
48cd4c3a10
|
@ -9110,13 +9110,11 @@ const docTemplate = `{
|
|||
"enum": [
|
||||
"workspace_actions",
|
||||
"tailnet_pg_coordinator",
|
||||
"single_tailnet",
|
||||
"deployment_health_page"
|
||||
],
|
||||
"x-enum-varnames": [
|
||||
"ExperimentWorkspaceActions",
|
||||
"ExperimentTailnetPGCoordinator",
|
||||
"ExperimentSingleTailnet",
|
||||
"ExperimentDeploymentHealthPage"
|
||||
]
|
||||
},
|
||||
|
|
|
@ -8156,13 +8156,11 @@
|
|||
"enum": [
|
||||
"workspace_actions",
|
||||
"tailnet_pg_coordinator",
|
||||
"single_tailnet",
|
||||
"deployment_health_page"
|
||||
],
|
||||
"x-enum-varnames": [
|
||||
"ExperimentWorkspaceActions",
|
||||
"ExperimentTailnetPGCoordinator",
|
||||
"ExperimentSingleTailnet",
|
||||
"ExperimentDeploymentHealthPage"
|
||||
]
|
||||
},
|
||||
|
|
|
@ -458,25 +458,19 @@ func New(options *Options) *API {
|
|||
|
||||
api.Auditor.Store(&options.Auditor)
|
||||
api.TailnetCoordinator.Store(&options.TailnetCoordinator)
|
||||
if api.Experiments.Enabled(codersdk.ExperimentSingleTailnet) {
|
||||
api.agentProvider, err = NewServerTailnet(api.ctx,
|
||||
options.Logger,
|
||||
options.DERPServer,
|
||||
api.DERPMap,
|
||||
options.DeploymentValues.DERP.Config.ForceWebSockets.Value(),
|
||||
func(context.Context) (tailnet.MultiAgentConn, error) {
|
||||
return (*api.TailnetCoordinator.Load()).ServeMultiAgent(uuid.New()), nil
|
||||
},
|
||||
wsconncache.New(api._dialWorkspaceAgentTailnet, 0),
|
||||
api.TracerProvider,
|
||||
)
|
||||
if err != nil {
|
||||
panic("failed to setup server tailnet: " + err.Error())
|
||||
}
|
||||
} else {
|
||||
api.agentProvider = &wsconncache.AgentProvider{
|
||||
Cache: wsconncache.New(api._dialWorkspaceAgentTailnet, 0),
|
||||
}
|
||||
api.agentProvider, err = NewServerTailnet(api.ctx,
|
||||
options.Logger,
|
||||
options.DERPServer,
|
||||
api.DERPMap,
|
||||
options.DeploymentValues.DERP.Config.ForceWebSockets.Value(),
|
||||
func(context.Context) (tailnet.MultiAgentConn, error) {
|
||||
return (*api.TailnetCoordinator.Load()).ServeMultiAgent(uuid.New()), nil
|
||||
},
|
||||
wsconncache.New(api._dialWorkspaceAgentTailnet, 0),
|
||||
api.TracerProvider,
|
||||
)
|
||||
if err != nil {
|
||||
panic("failed to setup server tailnet: " + err.Error())
|
||||
}
|
||||
api.TailnetClientService, err = tailnet.NewClientService(
|
||||
api.Logger.Named("tailnetclient"),
|
||||
|
|
|
@ -2084,11 +2084,6 @@ const (
|
|||
// only Coordinator
|
||||
ExperimentTailnetPGCoordinator Experiment = "tailnet_pg_coordinator"
|
||||
|
||||
// ExperimentSingleTailnet replaces workspace connections inside coderd to
|
||||
// all use a single tailnet, instead of the previous behavior of creating a
|
||||
// single tailnet for each agent.
|
||||
ExperimentSingleTailnet Experiment = "single_tailnet"
|
||||
|
||||
// Deployment health page
|
||||
ExperimentDeploymentHealthPage Experiment = "deployment_health_page"
|
||||
|
||||
|
@ -2102,7 +2097,6 @@ const (
|
|||
// not be included here and will be essentially hidden.
|
||||
var ExperimentsAll = Experiments{
|
||||
ExperimentDeploymentHealthPage,
|
||||
ExperimentSingleTailnet,
|
||||
}
|
||||
|
||||
// Experiments is a list of experiments.
|
||||
|
|
|
@ -2880,7 +2880,6 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in
|
|||
| ------------------------ |
|
||||
| `workspace_actions` |
|
||||
| `tailnet_pg_coordinator` |
|
||||
| `single_tailnet` |
|
||||
| `deployment_health_page` |
|
||||
|
||||
## codersdk.ExternalAuth
|
||||
|
|
|
@ -239,27 +239,19 @@ func New(ctx context.Context, opts *Options) (*Server, error) {
|
|||
return nil, xerrors.Errorf("parse app security key: %w", err)
|
||||
}
|
||||
|
||||
var agentProvider workspaceapps.AgentProvider
|
||||
if opts.Experiments.Enabled(codersdk.ExperimentSingleTailnet) {
|
||||
stn, err := coderd.NewServerTailnet(ctx,
|
||||
s.Logger,
|
||||
nil,
|
||||
func() *tailcfg.DERPMap {
|
||||
return s.latestDERPMap.Load()
|
||||
},
|
||||
regResp.DERPForceWebSockets,
|
||||
s.DialCoordinator,
|
||||
wsconncache.New(s.DialWorkspaceAgent, 0),
|
||||
s.TracerProvider,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("create server tailnet: %w", err)
|
||||
}
|
||||
agentProvider = stn
|
||||
} else {
|
||||
agentProvider = &wsconncache.AgentProvider{
|
||||
Cache: wsconncache.New(s.DialWorkspaceAgent, 0),
|
||||
}
|
||||
agentProvider, err := coderd.NewServerTailnet(ctx,
|
||||
s.Logger,
|
||||
nil,
|
||||
func() *tailcfg.DERPMap {
|
||||
return s.latestDERPMap.Load()
|
||||
},
|
||||
regResp.DERPForceWebSockets,
|
||||
s.DialCoordinator,
|
||||
wsconncache.New(s.DialWorkspaceAgent, 0),
|
||||
s.TracerProvider,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("create server tailnet: %w", err)
|
||||
}
|
||||
|
||||
workspaceAppsLogger := opts.Logger.Named("workspaceapps")
|
||||
|
|
|
@ -17,7 +17,6 @@ import (
|
|||
"cdr.dev/slog/sloggers/slogtest"
|
||||
"github.com/coder/coder/v2/agent/agenttest"
|
||||
"github.com/coder/coder/v2/cli/clibase"
|
||||
"github.com/coder/coder/v2/coderd"
|
||||
"github.com/coder/coder/v2/coderd/coderdtest"
|
||||
"github.com/coder/coder/v2/coderd/healthcheck/derphealth"
|
||||
"github.com/coder/coder/v2/coderd/httpmw"
|
||||
|
@ -431,7 +430,7 @@ resourceLoop:
|
|||
require.False(t, p2p)
|
||||
}
|
||||
|
||||
func TestWorkspaceProxyWorkspaceApps_Wsconncache(t *testing.T) {
|
||||
func TestWorkspaceProxyWorkspaceApps(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
apptest.Run(t, false, func(t *testing.T, opts *apptest.DeploymentOptions) *apptest.Deployment {
|
||||
|
@ -487,59 +486,3 @@ func TestWorkspaceProxyWorkspaceApps_Wsconncache(t *testing.T) {
|
|||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestWorkspaceProxyWorkspaceApps_SingleTailnet(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
apptest.Run(t, false, func(t *testing.T, opts *apptest.DeploymentOptions) *apptest.Deployment {
|
||||
deploymentValues := coderdtest.DeploymentValues(t)
|
||||
deploymentValues.DisablePathApps = clibase.Bool(opts.DisablePathApps)
|
||||
deploymentValues.Dangerous.AllowPathAppSharing = clibase.Bool(opts.DangerousAllowPathAppSharing)
|
||||
deploymentValues.Dangerous.AllowPathAppSiteOwnerAccess = clibase.Bool(opts.DangerousAllowPathAppSiteOwnerAccess)
|
||||
deploymentValues.Experiments = []string{
|
||||
string(codersdk.ExperimentSingleTailnet),
|
||||
"*",
|
||||
}
|
||||
|
||||
client, _, api, user := coderdenttest.NewWithAPI(t, &coderdenttest.Options{
|
||||
Options: &coderdtest.Options{
|
||||
DeploymentValues: deploymentValues,
|
||||
AppHostname: "*.primary.test.coder.com",
|
||||
IncludeProvisionerDaemon: true,
|
||||
RealIPConfig: &httpmw.RealIPConfig{
|
||||
TrustedOrigins: []*net.IPNet{{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Mask: net.CIDRMask(8, 32),
|
||||
}},
|
||||
TrustedHeaders: []string{
|
||||
"CF-Connecting-IP",
|
||||
},
|
||||
},
|
||||
WorkspaceAppsStatsCollectorOptions: opts.StatsCollectorOptions,
|
||||
},
|
||||
LicenseOptions: &coderdenttest.LicenseOptions{
|
||||
Features: license.Features{
|
||||
codersdk.FeatureWorkspaceProxy: 1,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
// Create the external proxy
|
||||
if opts.DisableSubdomainApps {
|
||||
opts.AppHost = ""
|
||||
}
|
||||
proxyAPI := coderdenttest.NewWorkspaceProxy(t, api, client, &coderdenttest.ProxyOptions{
|
||||
Name: "best-proxy",
|
||||
Experiments: coderd.ReadExperiments(api.Logger, deploymentValues.Experiments.Value()),
|
||||
AppHostname: opts.AppHost,
|
||||
DisablePathApps: opts.DisablePathApps,
|
||||
})
|
||||
|
||||
return &apptest.Deployment{
|
||||
Options: opts,
|
||||
SDKClient: client,
|
||||
FirstUser: user,
|
||||
PathAppBaseURL: proxyAPI.Options.AccessURL,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1814,12 +1814,10 @@ export const Entitlements: Entitlement[] = [
|
|||
// From codersdk/deployment.go
|
||||
export type Experiment =
|
||||
| "deployment_health_page"
|
||||
| "single_tailnet"
|
||||
| "tailnet_pg_coordinator"
|
||||
| "workspace_actions";
|
||||
export const Experiments: Experiment[] = [
|
||||
"deployment_health_page",
|
||||
"single_tailnet",
|
||||
"tailnet_pg_coordinator",
|
||||
"workspace_actions",
|
||||
];
|
||||
|
|
|
@ -34,13 +34,13 @@ const meta: Meta<typeof GeneralSettingsPageView> = {
|
|||
description:
|
||||
"Enable one or more experiments. These are not ready for production. Separate multiple experiments with commas, or enter '*' to opt-in to all available experiments.",
|
||||
flag: "experiments",
|
||||
value: ["single_tailnet"],
|
||||
value: ["workspace_actions"],
|
||||
flag_shorthand: "",
|
||||
hidden: false,
|
||||
},
|
||||
],
|
||||
deploymentDAUs: MockDeploymentDAUResponse,
|
||||
safeExperiments: ["single_tailnet", "deployment_health_page"],
|
||||
safeExperiments: ["deployment_health_page"],
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -102,6 +102,6 @@ export const allExperimentsEnabled: Story = {
|
|||
hidden: false,
|
||||
},
|
||||
],
|
||||
safeExperiments: ["single_tailnet", "deployment_health_page"],
|
||||
safeExperiments: ["deployment_health_page"],
|
||||
},
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue