mirror of
https://github.com/coder/coder.git
synced 2026-11-03 05:55:24 +08:00
refactor: upgrade golangci-lint to v2.0.2 (#28416)
This commit is contained in:
@@ -297,7 +297,7 @@ func (a *API) Serve(ctx context.Context, l net.Listener) error {
|
||||
return xerrors.Errorf("create agent API server: %w", err)
|
||||
}
|
||||
|
||||
if err := a.ResourcesMonitoringAPI.InitMonitors(ctx); err != nil {
|
||||
if err := a.InitMonitors(ctx); err != nil {
|
||||
return xerrors.Errorf("initialize resource monitoring: %w", err)
|
||||
}
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ func (b *Batcher) Close() {
|
||||
// to the same metadata key for the same agent are deduplicated in the batch,
|
||||
// keeping only the value with the most recent collectedAt timestamp.
|
||||
func (b *Batcher) Add(agentID uuid.UUID, keys []string, values []string, errors []string, collectedAt []time.Time) error {
|
||||
if !(len(keys) == len(values) && len(values) == len(errors) && len(errors) == len(collectedAt)) {
|
||||
if len(keys) != len(values) || len(values) != len(errors) || len(errors) != len(collectedAt) {
|
||||
return xerrors.Errorf("invalid Add call, all inputs must have the same number of items; keys: %d, values: %d, errors: %d, collectedAt: %d", len(keys), len(values), len(errors), len(collectedAt))
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ func (api *API) RegisterInMemoryAIBridgedHTTPHandler(srv http.Handler) {
|
||||
api.aiGatewayHandler = srv
|
||||
|
||||
factory := aibridged.NewTransportFactory(http.StripPrefix(agplaibridge.AIGatewayRootPath, srv))
|
||||
var asInterface agplaibridge.TransportFactory = factory
|
||||
asInterface := factory
|
||||
api.AIBridgeTransportFactory.Store(&asInterface)
|
||||
}
|
||||
|
||||
|
||||
+5
-5
@@ -383,12 +383,12 @@ func deriveTaskCurrentState(
|
||||
ws.LatestBuild.Status == codersdk.WorkspaceStatusStarting:
|
||||
message = fmt.Sprintf("Workspace is %s", ws.LatestBuild.Status)
|
||||
case taskAgentLifecycle != nil:
|
||||
switch {
|
||||
case *taskAgentLifecycle == codersdk.WorkspaceAgentLifecycleCreated:
|
||||
switch *taskAgentLifecycle {
|
||||
case codersdk.WorkspaceAgentLifecycleCreated:
|
||||
message = "Agent is connecting"
|
||||
case *taskAgentLifecycle == codersdk.WorkspaceAgentLifecycleStarting:
|
||||
case codersdk.WorkspaceAgentLifecycleStarting:
|
||||
message = "Agent is starting"
|
||||
case *taskAgentLifecycle == codersdk.WorkspaceAgentLifecycleReady:
|
||||
case codersdk.WorkspaceAgentLifecycleReady:
|
||||
if taskAppHealth != nil && *taskAppHealth == codersdk.WorkspaceAppHealthInitializing {
|
||||
message = "App is initializing"
|
||||
} else {
|
||||
@@ -572,7 +572,7 @@ func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) {
|
||||
workspace,
|
||||
data.builds[0],
|
||||
data.templates[0],
|
||||
api.Options.AllowWorkspaceRenames,
|
||||
api.AllowWorkspaceRenames,
|
||||
appStatus,
|
||||
)
|
||||
if err != nil {
|
||||
|
||||
@@ -2377,10 +2377,11 @@ func TestTasksNotification(t *testing.T) {
|
||||
startedAt sql.NullTime
|
||||
readyAt sql.NullTime
|
||||
)
|
||||
if tc.agentLifecycle == database.WorkspaceAgentLifecycleStateReady {
|
||||
switch tc.agentLifecycle {
|
||||
case database.WorkspaceAgentLifecycleStateReady:
|
||||
startedAt = sql.NullTime{Time: clock.Now(), Valid: true}
|
||||
readyAt = sql.NullTime{Time: clock.Now(), Valid: true}
|
||||
} else if tc.agentLifecycle == database.WorkspaceAgentLifecycleStateStarting {
|
||||
case database.WorkspaceAgentLifecycleStateStarting:
|
||||
startedAt = sql.NullTime{Time: clock.Now(), Valid: true}
|
||||
}
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ func ResourceTarget[T Auditable](tgt T) string {
|
||||
case database.GitSSHKey:
|
||||
return typed.PublicKey
|
||||
case database.AuditableGroup:
|
||||
return typed.Group.Name
|
||||
return typed.Name
|
||||
case database.APIKey:
|
||||
if typed.TokenName != "nil" {
|
||||
return typed.TokenName
|
||||
@@ -206,7 +206,7 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
|
||||
case database.GitSSHKey:
|
||||
return typed.UserID
|
||||
case database.AuditableGroup:
|
||||
return typed.Group.ID
|
||||
return typed.ID
|
||||
case database.APIKey:
|
||||
return typed.UserID
|
||||
case database.License:
|
||||
|
||||
@@ -46,10 +46,10 @@ func AnalyzeOIDCLinks(ctx context.Context, db database.Store, expectedIssuer str
|
||||
for _, row := range rows {
|
||||
count := int(row.Count)
|
||||
analysis.Total += count
|
||||
switch {
|
||||
case row.IssuerPrefix == "":
|
||||
switch row.IssuerPrefix {
|
||||
case "":
|
||||
analysis.Unlinked += count
|
||||
case row.IssuerPrefix == expectedIssuer:
|
||||
case expectedIssuer:
|
||||
analysis.CorrectIssuer += count
|
||||
default:
|
||||
analysis.MismatchedCounts[row.IssuerPrefix] += count
|
||||
|
||||
+6
-6
@@ -988,8 +988,8 @@ func New(options *Options) *API {
|
||||
}
|
||||
api.NetworkTelemetryBatcher = tailnet.NewNetworkTelemetryBatcher(
|
||||
quartz.NewReal(),
|
||||
api.Options.NetworkTelemetryBatchFrequency,
|
||||
api.Options.NetworkTelemetryBatchMaxSize,
|
||||
api.NetworkTelemetryBatchFrequency,
|
||||
api.NetworkTelemetryBatchMaxSize,
|
||||
api.handleNetworkTelemetry,
|
||||
)
|
||||
if options.CoordinatorResumeTokenProvider == nil {
|
||||
@@ -998,10 +998,10 @@ func New(options *Options) *API {
|
||||
api.TailnetClientService, err = tailnet.NewClientService(tailnet.ClientServiceOptions{
|
||||
Logger: api.Logger.Named("tailnetclient"),
|
||||
CoordPtr: &api.TailnetCoordinator,
|
||||
DERPMapUpdateFrequency: api.Options.DERPMapUpdateFrequency,
|
||||
DERPMapUpdateFrequency: api.DERPMapUpdateFrequency,
|
||||
DERPMapFn: api.DERPMap,
|
||||
NetworkTelemetryHandler: api.NetworkTelemetryBatcher.Handler,
|
||||
ResumeTokenProvider: api.Options.CoordinatorResumeTokenProvider,
|
||||
ResumeTokenProvider: api.CoordinatorResumeTokenProvider,
|
||||
WorkspaceUpdatesProvider: api.UpdatesProvider,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -2743,10 +2743,10 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
|
||||
func (api *API) DERPMap() *tailcfg.DERPMap {
|
||||
fn := api.DERPMapper.Load()
|
||||
if fn != nil {
|
||||
return (*fn)(api.Options.BaseDERPMap)
|
||||
return (*fn)(api.BaseDERPMap)
|
||||
}
|
||||
|
||||
return api.Options.BaseDERPMap
|
||||
return api.BaseDERPMap
|
||||
}
|
||||
|
||||
// nolint:revive
|
||||
|
||||
@@ -441,12 +441,12 @@ func TestDERPMetrics(t *testing.T) {
|
||||
|
||||
_, _, api := coderdtest.NewWithAPI(t, nil)
|
||||
|
||||
require.NotNil(t, api.Options.DERPServer, "DERP server should be configured")
|
||||
require.NotNil(t, api.Options.PrometheusRegistry, "Prometheus registry should be configured")
|
||||
require.NotNil(t, api.DERPServer, "DERP server should be configured")
|
||||
require.NotNil(t, api.PrometheusRegistry, "Prometheus registry should be configured")
|
||||
|
||||
// The registry is created internally by coderd. Gather from it
|
||||
// to verify DERP metrics were registered during startup.
|
||||
metrics, err := api.Options.PrometheusRegistry.Gather()
|
||||
metrics, err := api.PrometheusRegistry.Gather()
|
||||
require.NoError(t, err)
|
||||
|
||||
names := make(map[string]struct{})
|
||||
@@ -518,7 +518,7 @@ func TestWebSocketProbeMetrics(t *testing.T) {
|
||||
|
||||
// Assert the probe metric was recorded.
|
||||
testutil.Eventually(ctx, t, func(context.Context) bool {
|
||||
metrics, err := api.Options.PrometheusRegistry.Gather()
|
||||
metrics, err := api.PrometheusRegistry.Gather()
|
||||
assert.NoError(t, err)
|
||||
return testutil.PromCounterHasValue(t, metrics, 1,
|
||||
"coderd_api_websocket_probes_total", "/api/v2/notifications/inbox/watch", "ok")
|
||||
|
||||
@@ -1258,7 +1258,7 @@ func (f *FakeIDP) httpHandler(t testing.TB) http.Handler {
|
||||
mux.Handle(revokeTokenPath, http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
||||
if f.revokeTokenGitHubFormat {
|
||||
u, p, ok := r.BasicAuth()
|
||||
if !ok || !(u == f.clientID && p == f.clientSecret) {
|
||||
if !ok || (u != f.clientID || p != f.clientSecret) {
|
||||
httpError(rw, http.StatusForbidden, xerrors.Errorf("basic auth failed"))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -121,9 +121,10 @@ func parseSwaggerComment(commentGroup *ast.CommentGroup) SwaggerComment {
|
||||
r.model = args[2]
|
||||
}
|
||||
|
||||
if annotationName == "@Success" {
|
||||
switch annotationName {
|
||||
case "@Success":
|
||||
c.successes = append(c.successes, r)
|
||||
} else if annotationName == "@Failure" {
|
||||
case "@Failure":
|
||||
c.failures = append(c.failures, r)
|
||||
}
|
||||
case "@Param":
|
||||
|
||||
@@ -2283,8 +2283,7 @@ func (q *querier) DeleteExpiredAPIKeys(ctx context.Context, arg database.DeleteE
|
||||
|
||||
func (q *querier) DeleteExternalAuthLink(ctx context.Context, arg database.DeleteExternalAuthLinkParams) error {
|
||||
return fetchAndExec(q.log, q.auth, policy.ActionUpdatePersonal, func(ctx context.Context, arg database.DeleteExternalAuthLinkParams) (database.ExternalAuthLink, error) {
|
||||
//nolint:gosimple
|
||||
return q.db.GetExternalAuthLink(ctx, database.GetExternalAuthLinkParams{UserID: arg.UserID, ProviderID: arg.ProviderID})
|
||||
return q.db.GetExternalAuthLink(ctx, database.GetExternalAuthLinkParams(arg))
|
||||
}, q.db.DeleteExternalAuthLink)(ctx, arg)
|
||||
}
|
||||
|
||||
@@ -9028,7 +9027,7 @@ func (q *querier) UpsertChatTitleGenerationModelOverride(ctx context.Context, va
|
||||
return q.db.UpsertChatTitleGenerationModelOverride(ctx, value)
|
||||
}
|
||||
|
||||
//nolint:revive // Parameter name matches the generated querier interface.
|
||||
//nolint:revive,staticcheck // Parameter name matches the generated querier interface.
|
||||
func (q *querier) UpsertChatWorkspaceTTL(ctx context.Context, workspaceTtl string) error {
|
||||
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceDeploymentConfig); err != nil {
|
||||
return err
|
||||
|
||||
@@ -803,7 +803,7 @@ func WorkspaceAgentScriptTiming(t testing.TB, db database.Store, orig database.W
|
||||
}
|
||||
// Some tests run WorkspaceAgentScriptTiming in a loop and run into
|
||||
// a unique violation - 2 rows get the same started_at value.
|
||||
if (database.IsUniqueViolation(err, database.UniqueWorkspaceAgentScriptTimingsScriptIDStartedAtKey) && orig.StartedAt == time.Time{}) {
|
||||
if (database.IsUniqueViolation(err, database.UniqueWorkspaceAgentScriptTimingsScriptIDStartedAtKey) && orig.StartedAt.Equal(time.Time{})) {
|
||||
// Wait 1 millisecond so dbtime.Now() changes
|
||||
time.Sleep(time.Millisecond * 1)
|
||||
continue
|
||||
@@ -1174,7 +1174,7 @@ func GroupMember(t testing.TB, db database.Store, member database.GroupMemberTab
|
||||
require.NotEqual(t, member.UserID, uuid.Nil, "A user id is required to use 'dbgen.GroupMember', use 'dbgen.User'.")
|
||||
require.NotEqual(t, member.GroupID, uuid.Nil, "A group id is required to use 'dbgen.GroupMember', use 'dbgen.Group'.")
|
||||
|
||||
//nolint:gosimple
|
||||
//nolint:staticcheck
|
||||
err := db.InsertGroupMember(genCtx, database.InsertGroupMemberParams{
|
||||
UserID: member.UserID,
|
||||
GroupID: member.GroupID,
|
||||
|
||||
@@ -197,8 +197,8 @@ func createDatabaseFromTemplate(t TBSubset, connParams ConnectionParams, db *sql
|
||||
// Template database already exists and we successfully created the new database.
|
||||
return nil
|
||||
}
|
||||
tplDbDoesNotExistOccurred := strings.Contains(err.Error(), "template database") && strings.Contains(err.Error(), "does not exist")
|
||||
if (tplDbDoesNotExistOccurred && !emptyTemplateDBName) || !tplDbDoesNotExistOccurred {
|
||||
tplDBDoesNotExistOccurred := strings.Contains(err.Error(), "template database") && strings.Contains(err.Error(), "does not exist")
|
||||
if (tplDBDoesNotExistOccurred && !emptyTemplateDBName) || !tplDBDoesNotExistOccurred {
|
||||
// First and case: user passed a templateDBName that doesn't exist.
|
||||
// Second and case: some other error.
|
||||
return xerrors.Errorf("create db with template: %w", err)
|
||||
@@ -273,26 +273,26 @@ func createAndInitDatabase(t TBSubset, connParams ConnectionParams, db *sql.DB,
|
||||
if _, err := db.Exec("CREATE DATABASE " + tmpDBName); err != nil {
|
||||
return xerrors.Errorf("create tmp db: %w", err)
|
||||
}
|
||||
tmpDbURL := ConnectionParams{
|
||||
tmpDBURL := ConnectionParams{
|
||||
Username: connParams.Username,
|
||||
Password: connParams.Password,
|
||||
Host: connParams.Host,
|
||||
Port: connParams.Port,
|
||||
DBName: tmpDBName,
|
||||
}.DSN()
|
||||
tmpDb, err := sql.Open("postgres", tmpDbURL)
|
||||
tmpDB, err := sql.Open("postgres", tmpDBURL)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("connect to template db: %w", err)
|
||||
}
|
||||
defer func() {
|
||||
if err := tmpDb.Close(); err != nil {
|
||||
if err := tmpDB.Close(); err != nil {
|
||||
t.Logf("failed to close temp db: %s\n", err.Error())
|
||||
}
|
||||
}()
|
||||
if err := initialize(tmpDb); err != nil {
|
||||
if err := initialize(tmpDB); err != nil {
|
||||
return xerrors.Errorf("initialize: %w", err)
|
||||
}
|
||||
if err := tmpDb.Close(); err != nil {
|
||||
if err := tmpDB.Close(); err != nil {
|
||||
return xerrors.Errorf("close template db: %w", err)
|
||||
}
|
||||
if _, err := db.Exec("ALTER DATABASE " + tmpDBName + " RENAME TO " + name); err != nil {
|
||||
|
||||
@@ -58,12 +58,12 @@ func TestOpen_ValidDBFrom(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
templateDBName := "tpl_" + migrations.GetMigrationsHash()[:32]
|
||||
tplDbExistsRes, err := db.Query("SELECT 1 FROM pg_database WHERE datname = $1", templateDBName)
|
||||
tplDBExistsRes, err := db.Query("SELECT 1 FROM pg_database WHERE datname = $1", templateDBName)
|
||||
if err != nil {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
require.True(t, tplDbExistsRes.Next())
|
||||
require.NoError(t, tplDbExistsRes.Close())
|
||||
require.True(t, tplDBExistsRes.Next())
|
||||
require.NoError(t, tplDBExistsRes.Close())
|
||||
|
||||
// now populate the db with some data and use it as a new template db
|
||||
// to verify that dbtestutil.Open respects WithDBFrom
|
||||
@@ -91,13 +91,13 @@ func TestOpen_ValidDBFrom(t *testing.T) {
|
||||
newDsn, err := dbtestutil.Open(t, dbtestutil.WithDBFrom(freshTemplateDBName))
|
||||
require.NoError(t, err)
|
||||
|
||||
newDb, err := sql.Open("postgres", newDsn)
|
||||
newDB, err := sql.Open("postgres", newDsn)
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
require.NoError(t, newDb.Close())
|
||||
require.NoError(t, newDB.Close())
|
||||
})
|
||||
|
||||
rows, err = newDb.Query("SELECT 1 FROM my_wonderful_table WHERE name = 'test'")
|
||||
rows, err = newDB.Query("SELECT 1 FROM my_wonderful_table WHERE name = 'test'")
|
||||
require.NoError(t, err)
|
||||
require.True(t, rows.Next())
|
||||
require.NoError(t, rows.Close())
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
|
||||
// ChatProvider is the fixture shape accepted by dbgen.ChatProvider.
|
||||
//
|
||||
//nolint:revive
|
||||
//nolint:revive,staticcheck // Field names match the legacy generated database models.
|
||||
type ChatProvider struct {
|
||||
ID uuid.UUID
|
||||
Provider string
|
||||
@@ -29,7 +29,7 @@ type ChatProvider struct {
|
||||
// InsertChatProviderParams is the callback parameter shape accepted by
|
||||
// dbgen.ChatProvider.
|
||||
//
|
||||
//nolint:revive
|
||||
//nolint:revive,staticcheck // Field names match the legacy generated database parameters.
|
||||
type InsertChatProviderParams struct {
|
||||
Provider string
|
||||
DisplayName string
|
||||
|
||||
@@ -3858,7 +3858,7 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
|
||||
var allLogs []database.ConnectionLog
|
||||
db, _ := dbtestutil.NewDB(t)
|
||||
authz := rbac.NewAuthorizer(prometheus.NewRegistry())
|
||||
authDb := dbauthz.New(db, authz, slogtest.Make(t, &slogtest.Options{}), coderdtest.AccessControlStorePointer())
|
||||
authDB := dbauthz.New(db, authz, slogtest.Make(t, &slogtest.Options{}), coderdtest.AccessControlStorePointer())
|
||||
|
||||
orgA := dbfake.Organization(t, db).Do()
|
||||
orgB := dbfake.Organization(t, db).Do()
|
||||
@@ -3891,7 +3891,7 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
|
||||
}
|
||||
for orgID, ids := range orgConnectionLogs {
|
||||
for _, id := range ids {
|
||||
allLogs = append(allLogs, dbgen.ConnectionLog(t, authDb, database.UpsertConnectionLogParams{
|
||||
allLogs = append(allLogs, dbgen.ConnectionLog(t, authDB, database.UpsertConnectionLogParams{
|
||||
WorkspaceID: wsID,
|
||||
WorkspaceOwnerID: user.ID,
|
||||
ID: id,
|
||||
@@ -3928,12 +3928,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
|
||||
})
|
||||
|
||||
// When: The user queries for connection logs
|
||||
logs, err := authDb.GetConnectionLogsOffset(memberCtx, database.GetConnectionLogsOffsetParams{})
|
||||
logs, err := authDB.GetConnectionLogsOffset(memberCtx, database.GetConnectionLogsOffsetParams{})
|
||||
require.NoError(t, err)
|
||||
// Then: No logs returned
|
||||
require.Len(t, logs, 0, "no logs should be returned")
|
||||
// And: The count matches the number of logs returned
|
||||
count, err := authDb.CountConnectionLogs(memberCtx, database.CountConnectionLogsParams{})
|
||||
count, err := authDB.CountConnectionLogs(memberCtx, database.CountConnectionLogsParams{})
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, len(logs), count)
|
||||
})
|
||||
@@ -3951,12 +3951,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
|
||||
})
|
||||
|
||||
// When: the auditor queries for connection logs
|
||||
logs, err := authDb.GetConnectionLogsOffset(siteAuditorCtx, database.GetConnectionLogsOffsetParams{})
|
||||
logs, err := authDB.GetConnectionLogsOffset(siteAuditorCtx, database.GetConnectionLogsOffsetParams{})
|
||||
require.NoError(t, err)
|
||||
// Then: All logs are returned
|
||||
require.ElementsMatch(t, connectionOnlyIDs(allLogs), connectionOnlyIDs(logs))
|
||||
// And: The count matches the number of logs returned
|
||||
count, err := authDb.CountConnectionLogs(siteAuditorCtx, database.CountConnectionLogsParams{})
|
||||
count, err := authDB.CountConnectionLogs(siteAuditorCtx, database.CountConnectionLogsParams{})
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, len(logs), count)
|
||||
})
|
||||
@@ -3975,12 +3975,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
|
||||
})
|
||||
|
||||
// When: The auditor queries for connection logs
|
||||
logs, err := authDb.GetConnectionLogsOffset(orgAuditCtx, database.GetConnectionLogsOffsetParams{})
|
||||
logs, err := authDB.GetConnectionLogsOffset(orgAuditCtx, database.GetConnectionLogsOffsetParams{})
|
||||
require.NoError(t, err)
|
||||
// Then: Only the logs for the organization are returned
|
||||
require.ElementsMatch(t, orgConnectionLogs[orgID], connectionOnlyIDs(logs))
|
||||
// And: The count matches the number of logs returned
|
||||
count, err := authDb.CountConnectionLogs(orgAuditCtx, database.CountConnectionLogsParams{})
|
||||
count, err := authDB.CountConnectionLogs(orgAuditCtx, database.CountConnectionLogsParams{})
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, len(logs), count)
|
||||
})
|
||||
@@ -4000,12 +4000,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
|
||||
})
|
||||
|
||||
// When: The user queries for connection logs
|
||||
logs, err := authDb.GetConnectionLogsOffset(multiOrgAuditCtx, database.GetConnectionLogsOffsetParams{})
|
||||
logs, err := authDB.GetConnectionLogsOffset(multiOrgAuditCtx, database.GetConnectionLogsOffsetParams{})
|
||||
require.NoError(t, err)
|
||||
// Then: All logs for both organizations are returned
|
||||
require.ElementsMatch(t, append(orgConnectionLogs[first], orgConnectionLogs[second]...), connectionOnlyIDs(logs))
|
||||
// And: The count matches the number of logs returned
|
||||
count, err := authDb.CountConnectionLogs(multiOrgAuditCtx, database.CountConnectionLogsParams{})
|
||||
count, err := authDB.CountConnectionLogs(multiOrgAuditCtx, database.CountConnectionLogsParams{})
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, len(logs), count)
|
||||
})
|
||||
@@ -4023,12 +4023,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
|
||||
})
|
||||
|
||||
// When: The user queries for audit logs
|
||||
logs, err := authDb.GetConnectionLogsOffset(userCtx, database.GetConnectionLogsOffsetParams{})
|
||||
logs, err := authDB.GetConnectionLogsOffset(userCtx, database.GetConnectionLogsOffsetParams{})
|
||||
require.NoError(t, err)
|
||||
// Then: No logs are returned
|
||||
require.Len(t, logs, 0, "no logs should be returned")
|
||||
// And: The count matches the number of logs returned
|
||||
count, err := authDb.CountConnectionLogs(userCtx, database.CountConnectionLogsParams{})
|
||||
count, err := authDB.CountConnectionLogs(userCtx, database.CountConnectionLogsParams{})
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, len(logs), count)
|
||||
})
|
||||
@@ -6207,15 +6207,17 @@ func TestGetUserStatusCounts(t *testing.T) {
|
||||
case row.Date.Before(userCreatedAt):
|
||||
require.Equal(t, int64(0), row.Count)
|
||||
case row.Date.Before(firstStatusChange):
|
||||
if row.Status == stc.initialStatus {
|
||||
switch row.Status {
|
||||
case stc.initialStatus:
|
||||
require.Equal(t, int64(1), row.Count)
|
||||
} else if row.Status == stc.targetStatus {
|
||||
case stc.targetStatus:
|
||||
require.Equal(t, int64(0), row.Count)
|
||||
}
|
||||
case !row.Date.After(tc.reportUntil):
|
||||
if row.Status == stc.initialStatus {
|
||||
switch row.Status {
|
||||
case stc.initialStatus:
|
||||
require.Equal(t, int64(0), row.Count)
|
||||
} else if row.Status == stc.targetStatus {
|
||||
case stc.targetStatus:
|
||||
require.Equal(t, int64(1), row.Count)
|
||||
}
|
||||
default:
|
||||
|
||||
@@ -184,7 +184,7 @@ func (t *WorkspaceACL) Scan(src interface{}) error {
|
||||
return xerrors.Errorf("unexpected type %T", src)
|
||||
}
|
||||
|
||||
//nolint:revive
|
||||
//nolint:revive,staticcheck // Receiver name matches the other WorkspaceACL methods in this file.
|
||||
func (w WorkspaceACL) RBACACL() map[string][]policy.Action {
|
||||
// Convert WorkspaceACL to a map of string to []policy.Action.
|
||||
// This is used for RBAC checks.
|
||||
|
||||
+3
-3
@@ -64,7 +64,7 @@ func (api *API) debugTailnet(rw http.ResponseWriter, r *http.Request) {
|
||||
// @Param force query boolean false "Force a healthcheck to run"
|
||||
func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
|
||||
apiKey := httpmw.APITokenFromRequest(r)
|
||||
ctx, cancel := context.WithTimeout(r.Context(), api.Options.HealthcheckTimeout)
|
||||
ctx, cancel := context.WithTimeout(r.Context(), api.HealthcheckTimeout)
|
||||
defer cancel()
|
||||
|
||||
// Load sections previously marked as dismissed.
|
||||
@@ -78,7 +78,7 @@ func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
|
||||
// Get cached report if it exists and the requester did not force a refresh.
|
||||
if !forced {
|
||||
if report := api.healthCheckCache.Load(); report != nil {
|
||||
if time.Since(report.Time) < api.Options.HealthcheckRefresh {
|
||||
if time.Since(report.Time) < api.HealthcheckRefresh {
|
||||
formatHealthcheck(ctx, rw, r, *report, dismissed...)
|
||||
return
|
||||
}
|
||||
@@ -87,7 +87,7 @@ func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
|
||||
|
||||
resChan := api.healthCheckGroup.DoChan("", func() (*healthsdk.HealthcheckReport, error) {
|
||||
// Create a new context not tied to the request.
|
||||
ctx, cancel := context.WithTimeout(context.Background(), api.Options.HealthcheckTimeout)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), api.HealthcheckTimeout)
|
||||
defer cancel()
|
||||
|
||||
// Create and store progress tracker for timeout diagnostics.
|
||||
|
||||
@@ -117,10 +117,10 @@ func DiagnosticErrorString(d *hcl.Diagnostic) string {
|
||||
|
||||
func DiagnosticsErrorString(d hcl.Diagnostics) string {
|
||||
count := len(d)
|
||||
switch {
|
||||
case count == 0:
|
||||
switch count {
|
||||
case 0:
|
||||
return "no diagnostics"
|
||||
case count == 1:
|
||||
case 1:
|
||||
return DiagnosticErrorString(d[0])
|
||||
default:
|
||||
for _, d := range d {
|
||||
|
||||
@@ -659,7 +659,7 @@ func TestPostChats(t *testing.T) {
|
||||
OrganizationID: firstUser.OrganizationID,
|
||||
Enabled: true,
|
||||
})
|
||||
disabledCfg, err := client.Client.UpdateMCPServerConfig(ctx, enabledCfg.OrganizationID, enabledCfg.ID, codersdk.UpdateMCPServerConfigRequest{
|
||||
disabledCfg, err := client.UpdateMCPServerConfig(ctx, enabledCfg.OrganizationID, enabledCfg.ID, codersdk.UpdateMCPServerConfigRequest{
|
||||
Enabled: ptr.Ref(false),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -734,7 +734,7 @@ func TestPostChats(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = client.Client.UpdateMCPServerConfig(ctx, cfg.OrganizationID, cfg.ID, codersdk.UpdateMCPServerConfigRequest{
|
||||
_, err = client.UpdateMCPServerConfig(ctx, cfg.OrganizationID, cfg.ID, codersdk.UpdateMCPServerConfigRequest{
|
||||
Enabled: ptr.Ref(false),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -761,7 +761,7 @@ func TestPostChats(t *testing.T) {
|
||||
OrganizationID: firstUser.OrganizationID,
|
||||
Enabled: true,
|
||||
})
|
||||
_, err = client.Client.UpdateMCPServerConfig(ctx, secondCfg.OrganizationID, secondCfg.ID, codersdk.UpdateMCPServerConfigRequest{
|
||||
_, err = client.UpdateMCPServerConfig(ctx, secondCfg.OrganizationID, secondCfg.ID, codersdk.UpdateMCPServerConfigRequest{
|
||||
Enabled: ptr.Ref(false),
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -1385,7 +1385,7 @@ func TestChats_ForceOnMCPServerEnforced(t *testing.T) {
|
||||
_ = createChatModelConfig(t, client)
|
||||
|
||||
// An admin marks an MCP server as Force On.
|
||||
forced, err := client.Client.CreateMCPServerConfig(ctx, firstUser.OrganizationID, codersdk.CreateMCPServerConfigRequest{
|
||||
forced, err := client.CreateMCPServerConfig(ctx, firstUser.OrganizationID, codersdk.CreateMCPServerConfigRequest{
|
||||
DisplayName: "Forced Server",
|
||||
Slug: "forced-server",
|
||||
Transport: "streamable_http",
|
||||
@@ -1931,7 +1931,7 @@ func TestListChats(t *testing.T) {
|
||||
Pagination: codersdk.Pagination{Limit: pageSize},
|
||||
}
|
||||
if afterID != uuid.Nil {
|
||||
opts.Pagination.AfterID = afterID
|
||||
opts.AfterID = afterID
|
||||
}
|
||||
page, listErr := client.ListChats(ctx, opts)
|
||||
require.NoError(t, listErr)
|
||||
@@ -11359,7 +11359,7 @@ This arrived as octet-stream.
|
||||
client := newChatClient(t)
|
||||
firstUser := coderdtest.CreateFirstUser(t, client.Client)
|
||||
|
||||
_, err := client.UploadChatFile(ctx, firstUser.OrganizationID, "application/octet-stream", "payload.zip", bytes.NewReader([]byte("PK")))
|
||||
_, err := client.UploadChatFile(ctx, firstUser.OrganizationID, "application/octet-stream", "payload.zip", bytes.NewReader([]byte("PK\x03\x04")))
|
||||
sdkErr := requireSDKError(t, err, http.StatusBadRequest)
|
||||
require.Contains(t, sdkErr.Message, "Unsupported file type")
|
||||
})
|
||||
@@ -11370,7 +11370,7 @@ This arrived as octet-stream.
|
||||
client := newChatClient(t)
|
||||
firstUser := coderdtest.CreateFirstUser(t, client.Client)
|
||||
|
||||
_, err := client.UploadChatFile(ctx, firstUser.OrganizationID, "application/zip", "test.zip", bytes.NewReader([]byte("PK")))
|
||||
_, err := client.UploadChatFile(ctx, firstUser.OrganizationID, "application/zip", "test.zip", bytes.NewReader([]byte("PK\x03\x04")))
|
||||
requireSDKError(t, err, http.StatusBadRequest)
|
||||
})
|
||||
|
||||
@@ -11912,7 +11912,7 @@ func TestChatFileDownloadURL(t *testing.T) {
|
||||
|
||||
// Suspending the minting user invalidates the URL because
|
||||
// redemption requires the token's user to still be active.
|
||||
_, err = client.Client.UpdateUserStatus(ctx, member.ID.String(), codersdk.UserStatusSuspended)
|
||||
_, err = client.UpdateUserStatus(ctx, member.ID.String(), codersdk.UserStatusSuspended)
|
||||
require.NoError(t, err)
|
||||
|
||||
res := get(t, ctx, download.URL)
|
||||
|
||||
@@ -636,7 +636,7 @@ func (c *Config) ValidateToken(ctx context.Context, token *oauth2.Token) (bool,
|
||||
}
|
||||
|
||||
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token.AccessToken))
|
||||
res, err := c.InstrumentedOAuth2Config.Do(ctx, promoauth.SourceValidateToken, req)
|
||||
res, err := c.Do(ctx, promoauth.SourceValidateToken, req)
|
||||
if err != nil {
|
||||
return false, nil, err
|
||||
}
|
||||
@@ -765,7 +765,7 @@ func (c *Config) AppInstallations(ctx context.Context, token string) ([]codersdk
|
||||
return nil, false, err
|
||||
}
|
||||
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
|
||||
res, err := c.InstrumentedOAuth2Config.Do(ctx, promoauth.SourceAppInstallations, req)
|
||||
res, err := c.Do(ctx, promoauth.SourceAppInstallations, req)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
@@ -817,7 +817,7 @@ func (c *Config) RevokeToken(ctx context.Context, link database.ExternalAuthLink
|
||||
return false, err
|
||||
}
|
||||
|
||||
res, err := c.InstrumentedOAuth2Config.Do(ctx, promoauth.SourceRevoke, req)
|
||||
res, err := c.Do(ctx, promoauth.SourceRevoke, req)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@@ -1634,8 +1634,8 @@ func (s *entraV1TokenSource) Token() (*oauth2.Token, error) {
|
||||
oauth2.SetAuthURLParam("grant_type", "refresh_token"),
|
||||
oauth2.SetAuthURLParam("refresh_token", refreshToken),
|
||||
}
|
||||
if len(s.cfg.Config.Scopes) > 0 {
|
||||
refreshOpts = append(refreshOpts, oauth2.SetAuthURLParam("scope", strings.Join(s.cfg.Config.Scopes, " ")))
|
||||
if len(s.cfg.Scopes) > 0 {
|
||||
refreshOpts = append(refreshOpts, oauth2.SetAuthURLParam("scope", strings.Join(s.cfg.Scopes, " ")))
|
||||
}
|
||||
|
||||
token, err := s.cfg.Exchange(s.ctx, "", refreshOpts...)
|
||||
|
||||
@@ -256,7 +256,7 @@ func (r *NodeReport) derpURL() *url.URL {
|
||||
if r.Node.HostName == "" {
|
||||
derpURL.Host = r.Node.IPv4
|
||||
}
|
||||
if r.Node.DERPPort != 0 && !(r.Node.DERPPort == 443 && derpURL.Scheme == "https") && !(r.Node.DERPPort == 80 && derpURL.Scheme == "http") {
|
||||
if r.Node.DERPPort != 0 && (r.Node.DERPPort != 443 || derpURL.Scheme != "https") && (r.Node.DERPPort != 80 || derpURL.Scheme != "http") {
|
||||
derpURL.Host = fmt.Sprintf("%s:%d", derpURL.Host, r.Node.DERPPort)
|
||||
}
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ func (s *WebsocketEchoServer) ServeHTTP(rw http.ResponseWriter, r *http.Request)
|
||||
c, err := websocket.Accept(rw, r, &websocket.AcceptOptions{})
|
||||
if err != nil {
|
||||
rw.WriteHeader(http.StatusBadRequest)
|
||||
_, _ = rw.Write([]byte(fmt.Sprint("unable to accept:", err)))
|
||||
_, _ = fmt.Fprint(rw, "unable to accept:", err)
|
||||
return
|
||||
}
|
||||
defer c.Close(websocket.StatusGoingAway, "goodbye")
|
||||
|
||||
@@ -392,7 +392,7 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
|
||||
|
||||
sendEvent := func(newEvent codersdk.ServerSentEvent) error {
|
||||
buf := &bytes.Buffer{}
|
||||
_, err := buf.WriteString(fmt.Sprintf("event: %s\n", newEvent.Type))
|
||||
_, err := fmt.Fprintf(buf, "event: %s\n", newEvent.Type)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -193,10 +193,10 @@ func TestOrganizationParam(t *testing.T) {
|
||||
assert.Equal(t, user.AvatarURL, orgMem.AvatarURL)
|
||||
assert.NotEmpty(t, orgMem.Roles)
|
||||
assert.NotZero(t, orgMem.OrganizationMember)
|
||||
assert.NotEmpty(t, orgMem.OrganizationMember.CreatedAt)
|
||||
assert.NotEmpty(t, orgMem.OrganizationMember.UpdatedAt)
|
||||
assert.NotEmpty(t, orgMem.OrganizationMember.UserID)
|
||||
assert.NotEmpty(t, orgMem.OrganizationMember.Roles)
|
||||
assert.NotEmpty(t, orgMem.CreatedAt)
|
||||
assert.NotEmpty(t, orgMem.UpdatedAt)
|
||||
assert.NotEmpty(t, orgMem.UserID)
|
||||
assert.NotEmpty(t, orgMem.Roles)
|
||||
|
||||
orgMems := httpmw.OrganizationMembersParam(r)
|
||||
assert.NotZero(t, orgMems)
|
||||
|
||||
@@ -32,7 +32,7 @@ func (AGPLIDPSync) GroupSyncEntitled() bool {
|
||||
|
||||
func (s AGPLIDPSync) UpdateGroupSyncSettings(ctx context.Context, orgID uuid.UUID, db database.Store, settings GroupSyncSettings) error {
|
||||
orgResolver := s.Manager.OrganizationResolver(db, orgID)
|
||||
err := s.SyncSettings.Group.SetRuntimeValue(ctx, orgResolver, &settings)
|
||||
err := s.Group.SetRuntimeValue(ctx, orgResolver, &settings)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("update group sync settings: %w", err)
|
||||
}
|
||||
@@ -42,7 +42,7 @@ func (s AGPLIDPSync) UpdateGroupSyncSettings(ctx context.Context, orgID uuid.UUI
|
||||
|
||||
func (s AGPLIDPSync) GroupSyncSettings(ctx context.Context, orgID uuid.UUID, db database.Store) (*GroupSyncSettings, error) {
|
||||
orgResolver := s.Manager.OrganizationResolver(db, orgID)
|
||||
settings, err := s.SyncSettings.Group.Resolve(ctx, orgResolver)
|
||||
settings, err := s.Group.Resolve(ctx, orgResolver)
|
||||
if err != nil {
|
||||
if !xerrors.Is(err, runtimeconfig.ErrEntryNotFound) {
|
||||
return nil, xerrors.Errorf("resolve group sync settings: %w", err)
|
||||
@@ -52,7 +52,7 @@ func (s AGPLIDPSync) GroupSyncSettings(ctx context.Context, orgID uuid.UUID, db
|
||||
settings = &GroupSyncSettings{}
|
||||
|
||||
// Check for legacy settings if the default org.
|
||||
if s.DeploymentSyncSettings.Legacy.GroupField != "" {
|
||||
if s.Legacy.GroupField != "" {
|
||||
defaultOrganization, err := db.GetDefaultOrganization(ctx)
|
||||
if err != nil {
|
||||
return nil, xerrors.Errorf("get default organization: %w", err)
|
||||
|
||||
@@ -35,7 +35,7 @@ func (AGPLIDPSync) OrganizationSyncEnabled(_ context.Context, _ database.Store)
|
||||
|
||||
func (s AGPLIDPSync) UpdateOrganizationSyncSettings(ctx context.Context, db database.Store, settings OrganizationSyncSettings) error {
|
||||
rlv := s.Manager.Resolver(db)
|
||||
err := s.SyncSettings.Organization.SetRuntimeValue(ctx, rlv, &settings)
|
||||
err := s.Organization.SetRuntimeValue(ctx, rlv, &settings)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("update organization sync settings: %w", err)
|
||||
}
|
||||
@@ -47,7 +47,7 @@ func (s AGPLIDPSync) OrganizationSyncSettings(ctx context.Context, db database.S
|
||||
// If this logic is ever updated, make sure to update the corresponding
|
||||
// checkIDPOrgSync in coderd/telemetry/telemetry.go.
|
||||
rlv := s.Manager.Resolver(db)
|
||||
orgSettings, err := s.SyncSettings.Organization.Resolve(ctx, rlv)
|
||||
orgSettings, err := s.Organization.Resolve(ctx, rlv)
|
||||
if err != nil {
|
||||
if !xerrors.Is(err, runtimeconfig.ErrEntryNotFound) {
|
||||
return nil, xerrors.Errorf("resolve org sync settings: %w", err)
|
||||
@@ -55,9 +55,9 @@ func (s AGPLIDPSync) OrganizationSyncSettings(ctx context.Context, db database.S
|
||||
|
||||
// Default to the statically assigned settings if they exist.
|
||||
orgSettings = &OrganizationSyncSettings{
|
||||
Field: s.DeploymentSyncSettings.OrganizationField,
|
||||
Mapping: s.DeploymentSyncSettings.OrganizationMapping,
|
||||
AssignDefault: s.DeploymentSyncSettings.OrganizationAssignDefault,
|
||||
Field: s.OrganizationField,
|
||||
Mapping: s.OrganizationMapping,
|
||||
AssignDefault: s.OrganizationAssignDefault,
|
||||
}
|
||||
}
|
||||
return orgSettings, nil
|
||||
|
||||
@@ -44,7 +44,7 @@ func (AGPLIDPSync) SiteRoleSyncEnabled() bool {
|
||||
|
||||
func (s AGPLIDPSync) UpdateRoleSyncSettings(ctx context.Context, orgID uuid.UUID, db database.Store, settings RoleSyncSettings) error {
|
||||
orgResolver := s.Manager.OrganizationResolver(db, orgID)
|
||||
err := s.SyncSettings.Role.SetRuntimeValue(ctx, orgResolver, &settings)
|
||||
err := s.Role.SetRuntimeValue(ctx, orgResolver, &settings)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("update role sync settings: %w", err)
|
||||
}
|
||||
|
||||
@@ -222,7 +222,7 @@ func (d *Detector) run(t time.Time) Stats {
|
||||
|
||||
err := reapJob(ctx, log, d.db, d.pubsub, job)
|
||||
if err != nil {
|
||||
if !(xerrors.As(err, &acquireLockError{}) || xerrors.As(err, &jobIneligibleError{})) {
|
||||
if (!xerrors.As(err, &acquireLockError{}) && !xerrors.As(err, &jobIneligibleError{})) {
|
||||
log.Error(ctx, "error forcefully terminating provisioner job", slog.F("type", job.Type), slog.Error(err))
|
||||
}
|
||||
continue
|
||||
|
||||
+1
-1
@@ -1010,7 +1010,7 @@ type mcpServerConfigDeleteRaceStore struct {
|
||||
func (s *mcpServerConfigDeleteRaceStore) GetMCPServerConfigByID(ctx context.Context, id uuid.UUID) (database.MCPServerConfig, error) {
|
||||
config, err := s.Store.GetMCPServerConfigByID(ctx, id)
|
||||
if err == nil && s.armed.CompareAndSwap(true, false) {
|
||||
if err := s.Store.DeleteMCPServerConfigByID(ctx, id); err != nil {
|
||||
if err := s.DeleteMCPServerConfigByID(ctx, id); err != nil {
|
||||
return database.MCPServerConfig{}, err
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -113,7 +113,7 @@ func (api *API) deleteOrganizationMember(rw http.ResponseWriter, r *http.Request
|
||||
Action: database.AuditActionDelete,
|
||||
})
|
||||
)
|
||||
aReq.Old = member.OrganizationMember.Auditable(member.Username)
|
||||
aReq.Old = member.Auditable(member.Username)
|
||||
defer commitAudit()
|
||||
|
||||
// Note: we disallow adding OIDC users if organization sync is enabled.
|
||||
@@ -421,7 +421,7 @@ func (api *API) putMemberRoles(rw http.ResponseWriter, r *http.Request) {
|
||||
Action: database.AuditActionWrite,
|
||||
})
|
||||
)
|
||||
aReq.Old = member.OrganizationMember.Auditable(member.Username)
|
||||
aReq.Old = member.Auditable(member.Username)
|
||||
defer commitAudit()
|
||||
|
||||
// Check if changing roles is allowed
|
||||
@@ -429,7 +429,7 @@ func (api *API) putMemberRoles(rw http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
if apiKey.UserID == member.OrganizationMember.UserID {
|
||||
if apiKey.UserID == member.UserID {
|
||||
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
||||
Message: "You cannot change your own organization roles.",
|
||||
Detail: "Another user with the appropriate permissions must change your roles.",
|
||||
|
||||
@@ -64,7 +64,7 @@ func TestWebhook(t *testing.T) {
|
||||
assert.Equal(t, bodyMarkdown, payload.BodyMarkdown)
|
||||
|
||||
w.WriteHeader(http.StatusOK)
|
||||
_, err = w.Write([]byte(fmt.Sprintf("received %s", payload.MsgID)))
|
||||
_, err = fmt.Fprintf(w, "received %s", payload.MsgID)
|
||||
assert.NoError(t, err)
|
||||
},
|
||||
expectSuccess: true,
|
||||
|
||||
@@ -250,7 +250,7 @@ func (a *labelAggregator) aggregate(am annotatedMetric, labels []string) error {
|
||||
}
|
||||
|
||||
// Memoize based on the metric name & the unique combination of labels.
|
||||
key := fmt.Sprintf("%s:%v", am.Stats_Metric.Name, labelSet.FastFingerprint())
|
||||
key := fmt.Sprintf("%s:%v", am.Name, labelSet.FastFingerprint())
|
||||
|
||||
// Aggregate the value based on the key.
|
||||
a.aggregations[key] += am.Value
|
||||
@@ -297,7 +297,7 @@ func (ma *MetricsAggregator) Run(ctx context.Context) func() {
|
||||
key := hashKey(&req, m)
|
||||
|
||||
if val, ok := ma.store[key]; ok {
|
||||
val.Stats_Metric.Value = m.Value
|
||||
val.Value = m.Value
|
||||
val.expiryDate = req.timestamp.Add(ma.metricsCleanupInterval)
|
||||
ma.store[key] = val
|
||||
} else {
|
||||
|
||||
@@ -5485,7 +5485,7 @@ func (s *fakeStream) Send(j *proto.AcquiredJob) error {
|
||||
func (s *fakeStream) Recv() (*proto.CancelAcquire, error) {
|
||||
s.c.L.Lock()
|
||||
defer s.c.L.Unlock()
|
||||
for !(s.canceled || s.closed) {
|
||||
for !s.canceled && !s.closed {
|
||||
s.c.Wait()
|
||||
}
|
||||
if s.canceled {
|
||||
@@ -5528,7 +5528,7 @@ func (s *fakeStream) Close() error {
|
||||
func (s *fakeStream) waitForJob() (*proto.AcquiredJob, error) {
|
||||
s.c.L.Lock()
|
||||
defer s.c.L.Unlock()
|
||||
for !(s.sendCalled || s.closed) {
|
||||
for !s.sendCalled && !s.closed {
|
||||
s.c.Wait()
|
||||
}
|
||||
if s.sendCalled {
|
||||
|
||||
@@ -478,7 +478,7 @@ func (a RegoAuthorizer) authorize(ctx context.Context, subject Subject, action p
|
||||
// The caller should use either 1 or the other (or none).
|
||||
// Using "AnyOrgOwner" and an OrgID is a contradiction.
|
||||
// An empty uuid or a nil uuid means "no org owner".
|
||||
if object.AnyOrgOwner && !(object.OrgID == "" || object.OrgID == "00000000-0000-0000-0000-000000000000") {
|
||||
if object.AnyOrgOwner && object.OrgID != "" && object.OrgID != "00000000-0000-0000-0000-000000000000" {
|
||||
return xerrors.Errorf("object cannot have 'any_org' and an 'org_id' specified, values are mutually exclusive")
|
||||
}
|
||||
|
||||
|
||||
@@ -146,10 +146,7 @@ func InnerTextFromMarkdown(markdown string) (out string, err error) {
|
||||
// after the start tag. Skip just that token (not a running depth) so a stray
|
||||
// </script> or unterminated tag can't swallow the rest of the document.
|
||||
skipNextText := false
|
||||
for {
|
||||
if z.Next() == xhtml.ErrorToken {
|
||||
break // includes io.EOF
|
||||
}
|
||||
for z.Next() != xhtml.ErrorToken {
|
||||
switch tok := z.Token(); tok.Type {
|
||||
case xhtml.StartTagToken:
|
||||
skipNextText = tok.Data == "script" || tok.Data == "style"
|
||||
|
||||
+1
-1
@@ -396,7 +396,7 @@ type MultiAgentController struct {
|
||||
}
|
||||
|
||||
func (m *MultiAgentController) New(client tailnet.CoordinatorClient) tailnet.CloserWaiter {
|
||||
b := m.BasicCoordinationController.NewCoordination(client)
|
||||
b := m.NewCoordination(client)
|
||||
// resync all destinations
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
|
||||
@@ -1104,11 +1104,11 @@ func buildTaskEvent(
|
||||
// Below only relevant for "resumed" tasks, not when initially created.
|
||||
if isResumed {
|
||||
event.LastResumedAt = &row.StartBuildCreatedAt.Time
|
||||
switch {
|
||||
switch row.StartBuildReason.BuildReason {
|
||||
// TODO(Cian): will this exist? Future readers may know better than I.
|
||||
// case row.StartBuildReason == database.BuildReasonTaskAutoResume:
|
||||
// event.ResumeReason = ptr.Ref("auto")
|
||||
case row.StartBuildReason.BuildReason == database.BuildReasonTaskResume:
|
||||
case database.BuildReasonTaskResume:
|
||||
event.ResumeReason = ptr.Ref("manual")
|
||||
default: // Task resumed by starting workspace?
|
||||
event.ResumeReason = ptr.Ref("other")
|
||||
|
||||
@@ -1144,7 +1144,7 @@ func TestPatchTemplateMeta(t *testing.T) {
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||
require.Equal(t, codersdk.WorkspaceAgentPortShareLevelPublic, template.MaxPortShareLevel)
|
||||
|
||||
var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelAuthenticated
|
||||
level := codersdk.WorkspaceAgentPortShareLevelAuthenticated
|
||||
req := codersdk.UpdateTemplateMeta{
|
||||
MaxPortShareLevel: &level,
|
||||
}
|
||||
|
||||
@@ -1887,7 +1887,7 @@ func (api *API) dynamicTemplateVersionTags(ctx context.Context, rw http.Response
|
||||
|
||||
func (api *API) classicTemplateVersionTags(ctx context.Context, rw http.ResponseWriter, file database.File) (map[string]string, bool) {
|
||||
// Try to parse template tags from the given file.
|
||||
tempDir, err := os.MkdirTemp(api.Options.CacheDir, "tfparse-*")
|
||||
tempDir, err := os.MkdirTemp(api.CacheDir, "tfparse-*")
|
||||
if err != nil {
|
||||
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
|
||||
Message: "Internal error checking workspace tags",
|
||||
|
||||
@@ -156,7 +156,7 @@ func mapToSlogFields(m map[string]interface{}) slog.Map {
|
||||
func mapToBasicMap(m map[string]interface{}) map[string]interface{} {
|
||||
basic := make(map[string]interface{}, len(m))
|
||||
for k, v := range m {
|
||||
var val interface{} = v
|
||||
val := v
|
||||
switch v := v.(type) {
|
||||
case float32:
|
||||
val = float64(v)
|
||||
|
||||
@@ -3246,11 +3246,7 @@ func assertPagination(ctx context.Context, t *testing.T, client *codersdk.Client
|
||||
require.Equalf(t, onlyUsernames(page.Users), onlyUsernames(allUsers[:limit]), "first page, limit=%d", limit)
|
||||
count += len(page.Users)
|
||||
|
||||
for {
|
||||
if len(page.Users) == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
for len(page.Users) != 0 {
|
||||
afterCursor := page.Users[len(page.Users)-1].ID
|
||||
// Assert each page is the next expected page
|
||||
// This is using a cursor, and only works if all users created_at
|
||||
|
||||
@@ -872,10 +872,10 @@ func requireSecretAPIError(t *testing.T, err error, status int, detailContains s
|
||||
var sdkErr *codersdk.Error
|
||||
require.ErrorAs(t, err, &sdkErr)
|
||||
assert.Equal(t, status, sdkErr.StatusCode())
|
||||
combined := sdkErr.Message + " " + sdkErr.Response.Detail
|
||||
combined := sdkErr.Message + " " + sdkErr.Detail
|
||||
assert.Containsf(t, combined, detailContains,
|
||||
"expected response to contain %q; got Message=%q Detail=%q",
|
||||
detailContains, sdkErr.Message, sdkErr.Response.Detail)
|
||||
detailContains, sdkErr.Message, sdkErr.Detail)
|
||||
}
|
||||
|
||||
func TestDeleteUserSecret(t *testing.T) {
|
||||
|
||||
@@ -1267,7 +1267,7 @@ func (api *API) derpMapUpdates(rw http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}(ctx)
|
||||
|
||||
ticker := time.NewTicker(api.Options.DERPMapUpdateFrequency)
|
||||
ticker := time.NewTicker(api.DERPMapUpdateFrequency)
|
||||
defer ticker.Stop()
|
||||
|
||||
var lastDERPMap *tailcfg.DERPMap
|
||||
@@ -1281,7 +1281,7 @@ func (api *API) derpMapUpdates(rw http.ResponseWriter, r *http.Request) {
|
||||
lastDERPMap = derpMap
|
||||
}
|
||||
|
||||
ticker.Reset(api.Options.DERPMapUpdateFrequency)
|
||||
ticker.Reset(api.DERPMapUpdateFrequency)
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
@@ -1456,7 +1456,7 @@ func (api *API) logTunnelConnection(agentID uuid.UUID, statusCode int32, userID
|
||||
return
|
||||
}
|
||||
|
||||
staleInterval := api.Options.WorkspaceAppAuditSessionTimeout
|
||||
staleInterval := api.WorkspaceAppAuditSessionTimeout
|
||||
if staleInterval == 0 {
|
||||
staleInterval = time.Hour
|
||||
}
|
||||
@@ -1527,7 +1527,7 @@ func (api *API) handleResumeToken(ctx context.Context, rw http.ResponseWriter, r
|
||||
peerID = uuid.New()
|
||||
resumeToken := r.URL.Query().Get("resume_token")
|
||||
if resumeToken != "" {
|
||||
peerID, err = api.Options.CoordinatorResumeTokenProvider.VerifyResumeToken(ctx, resumeToken)
|
||||
peerID, err = api.CoordinatorResumeTokenProvider.VerifyResumeToken(ctx, resumeToken)
|
||||
// If the token is missing the key ID, it's probably an old token in which
|
||||
// case we just want to generate a new peer ID.
|
||||
switch {
|
||||
|
||||
@@ -184,7 +184,7 @@ func (api *API) workspaceAgentRPC(rw http.ResponseWriter, r *http.Request) {
|
||||
AgentStatsRefreshInterval: api.AgentStatsRefreshInterval,
|
||||
DisableDirectConnections: api.DeploymentValues.DERP.Config.BlockDirect.Value(),
|
||||
DerpForceWebSockets: api.DeploymentValues.DERP.Config.ForceWebSockets.Value(),
|
||||
DerpMapUpdateFrequency: api.Options.DERPMapUpdateFrequency,
|
||||
DerpMapUpdateFrequency: api.DERPMapUpdateFrequency,
|
||||
ExternalAuthConfigs: api.ExternalAuthConfigs,
|
||||
Experiments: api.Experiments,
|
||||
LifecycleMetrics: api.lifecycleMetrics,
|
||||
|
||||
@@ -1094,7 +1094,7 @@ func Run(t *testing.T, appHostIsPrimary bool, factory DeploymentFactory) {
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify the prefix is in the token.
|
||||
require.Equal(t, prefixedOwnerApp.Prefix, tok.Request.Prefix)
|
||||
require.Equal(t, prefixedOwnerApp.Prefix, tok.Prefix)
|
||||
|
||||
// Ensure the signed app token cookie is valid by making a request with
|
||||
// it with no session token.
|
||||
|
||||
@@ -322,8 +322,8 @@ func (p *DBTokenProvider) authorizeRequest(ctx context.Context, roles *rbac.Subj
|
||||
// Figure out which RBAC resource to check. For terminals we use execution
|
||||
// instead of application connect.
|
||||
var (
|
||||
rbacAction policy.Action = policy.ActionApplicationConnect
|
||||
rbacResource rbac.Object = dbReq.Workspace.RBACObject()
|
||||
rbacAction = policy.ActionApplicationConnect
|
||||
rbacResource = dbReq.Workspace.RBACObject()
|
||||
// rbacResourceOwned is for the level "authenticated". We still need to
|
||||
// make sure the API key has permissions to connect to the actor's own
|
||||
// workspace. Scopes would prevent this.
|
||||
@@ -336,7 +336,7 @@ func (p *DBTokenProvider) authorizeRequest(ctx context.Context, roles *rbac.Subj
|
||||
// the object to check the proper permissions. AnyOrg is almost the same,
|
||||
// but technically excludes users who are not in any organization. This is
|
||||
// the closest we can get though without more significant refactoring.
|
||||
rbacResourceOwned rbac.Object = rbac.ResourceWorkspace.WithOwner(roles.ID).AnyOrganization()
|
||||
rbacResourceOwned = rbac.ResourceWorkspace.WithOwner(roles.ID).AnyOrganization()
|
||||
)
|
||||
if dbReq.AccessMethod == AccessMethodTerminal {
|
||||
rbacAction = policy.ActionSSH
|
||||
@@ -446,7 +446,7 @@ func (p *DBTokenProvider) connLogInitRequest(w http.ResponseWriter, r *http.Requ
|
||||
|
||||
// Approximation of the status code.
|
||||
// #nosec G115 - Safe conversion as HTTP status code is expected to be within int32 range (typically 100-599)
|
||||
var statusCode int32 = int32(sw.Status)
|
||||
statusCode := int32(sw.Status)
|
||||
if statusCode == 0 {
|
||||
statusCode = http.StatusOK
|
||||
}
|
||||
|
||||
@@ -835,7 +835,7 @@ func Test_ResolveRequest(t *testing.T) {
|
||||
require.Equal(t, req.BasePath, token.BasePath)
|
||||
require.Empty(t, token.UsernameOrID)
|
||||
require.Empty(t, token.WorkspaceNameOrID)
|
||||
require.Equal(t, req.AgentNameOrID, token.Request.AgentNameOrID)
|
||||
require.Equal(t, req.AgentNameOrID, token.AgentNameOrID)
|
||||
require.Empty(t, token.AppSlugOrPort)
|
||||
require.Empty(t, token.AppURL)
|
||||
assertConnLogContains(t, rw, r, connLogger, workspace, agentName, "terminal", database.ConnectionTypeWorkspaceApp, me.ID)
|
||||
|
||||
@@ -32,7 +32,7 @@ type SignedToken struct {
|
||||
// MatchesRequest returns true if the token matches the request. Any token that
|
||||
// does not match the request should be considered invalid.
|
||||
func (t SignedToken) MatchesRequest(req Request) bool {
|
||||
tokenBasePath := t.Request.BasePath
|
||||
tokenBasePath := t.BasePath
|
||||
if !strings.HasSuffix(tokenBasePath, "/") {
|
||||
tokenBasePath += "/"
|
||||
}
|
||||
@@ -111,7 +111,7 @@ func FromRequest(r *http.Request, mgr cryptokeys.SigningKeycache) (*SignedToken,
|
||||
Time: time.Now(),
|
||||
}))
|
||||
if err == nil {
|
||||
req := token.Request.Normalize()
|
||||
req := token.Normalize()
|
||||
if hasQueryParam && req.AccessMethod != AccessMethodTerminal {
|
||||
// The request must be a terminal request if we're using a
|
||||
// query parameter.
|
||||
|
||||
@@ -316,7 +316,7 @@ func Test_FromRequest(t *testing.T) {
|
||||
|
||||
// Add an expired cookie
|
||||
expired := token
|
||||
expired.RegisteredClaims.Expiry = jwt.NewNumericDate(time.Now().Add(time.Hour * -1))
|
||||
expired.Expiry = jwt.NewNumericDate(time.Now().Add(time.Hour * -1))
|
||||
expiredStr, err := jwtutils.Sign(ctx, signer, expired)
|
||||
require.NoError(t, err)
|
||||
r.AddCookie(&http.Cookie{
|
||||
|
||||
@@ -347,7 +347,7 @@ func TestPostWorkspaceBuildsOnSuccessPinnedChildVersionRequiresTemplateUpdate(t
|
||||
var apiErr *codersdk.Error
|
||||
require.ErrorAs(t, err, &apiErr)
|
||||
require.Equal(t, http.StatusForbidden, apiErr.StatusCode())
|
||||
require.Contains(t, apiErr.Response.Detail, "template update permission")
|
||||
require.Contains(t, apiErr.Detail, "template update permission")
|
||||
|
||||
// THEN: no new workspace build is created.
|
||||
builds, err := userClient.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{WorkspaceID: workspace.ID})
|
||||
|
||||
@@ -122,7 +122,7 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) {
|
||||
workspace,
|
||||
data.builds[0],
|
||||
data.templates[0],
|
||||
api.Options.AllowWorkspaceRenames,
|
||||
api.AllowWorkspaceRenames,
|
||||
appStatus,
|
||||
)
|
||||
if err != nil {
|
||||
@@ -339,7 +339,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
|
||||
workspace,
|
||||
data.builds[0],
|
||||
data.templates[0],
|
||||
api.Options.AllowWorkspaceRenames,
|
||||
api.AllowWorkspaceRenames,
|
||||
appStatus,
|
||||
)
|
||||
if err != nil {
|
||||
@@ -851,7 +851,7 @@ func createWorkspace(
|
||||
workspace,
|
||||
apiBuild,
|
||||
template,
|
||||
api.Options.AllowWorkspaceRenames,
|
||||
api.AllowWorkspaceRenames,
|
||||
codersdk.WorkspaceAppStatus{},
|
||||
)
|
||||
if err != nil {
|
||||
@@ -1154,7 +1154,7 @@ func (api *API) patchWorkspace(rw http.ResponseWriter, r *http.Request) {
|
||||
// patched in the future, it's enough if one changes.
|
||||
name := workspace.Name
|
||||
if req.Name != "" || req.Name != workspace.Name {
|
||||
if !api.Options.AllowWorkspaceRenames {
|
||||
if !api.AllowWorkspaceRenames {
|
||||
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
||||
Message: "Workspace renames are not allowed.",
|
||||
})
|
||||
@@ -1593,7 +1593,7 @@ func (api *API) putWorkspaceDormant(rw http.ResponseWriter, r *http.Request) {
|
||||
workspace,
|
||||
data.builds[0],
|
||||
data.templates[0],
|
||||
api.Options.AllowWorkspaceRenames,
|
||||
api.AllowWorkspaceRenames,
|
||||
appStatus,
|
||||
)
|
||||
if err != nil {
|
||||
@@ -2172,7 +2172,7 @@ func (api *API) watchWorkspace(
|
||||
workspace,
|
||||
data.builds[0],
|
||||
data.templates[0],
|
||||
api.Options.AllowWorkspaceRenames,
|
||||
api.AllowWorkspaceRenames,
|
||||
appStatus,
|
||||
)
|
||||
if err != nil {
|
||||
@@ -2760,7 +2760,7 @@ func (api *API) workspaceData(ctx context.Context, workspaces []database.Workspa
|
||||
templates: templates,
|
||||
appStatuses: db2sdk.WorkspaceAppStatuses(appStatuses),
|
||||
builds: apiBuilds,
|
||||
allowRenames: api.Options.AllowWorkspaceRenames,
|
||||
allowRenames: api.AllowWorkspaceRenames,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -5796,9 +5796,10 @@ func TestWorkspaceListTasks(t *testing.T) {
|
||||
|
||||
// Then: verify TaskID is only set for task workspaces
|
||||
for _, workspace := range workspaces.Workspaces {
|
||||
if workspace.ID == workspaceWithoutTask.ID {
|
||||
switch workspace.ID {
|
||||
case workspaceWithoutTask.ID:
|
||||
assert.False(t, workspace.TaskID.Valid)
|
||||
} else if workspace.ID == workspaceWithTask.ID {
|
||||
case workspaceWithTask.ID:
|
||||
assert.True(t, workspace.TaskID.Valid)
|
||||
assert.Equal(t, task.ID, workspace.TaskID.UUID)
|
||||
}
|
||||
|
||||
@@ -1924,6 +1924,8 @@ var ErrArchiveRequiresRootChat = xerrors.New(
|
||||
// Child chats must not be archived independently. ArchiveChat
|
||||
// rejects them with [ErrArchiveRequiresRootChat] so callers cannot
|
||||
// silently break the parent-implies-child archive invariant.
|
||||
//
|
||||
//nolint:staticcheck // Receiver name matches the other Server methods in this file.
|
||||
func (p *Server) ArchiveChat(ctx context.Context, chat database.Chat) error {
|
||||
if chat.ID == uuid.Nil {
|
||||
return xerrors.New("chat_id is required")
|
||||
|
||||
@@ -161,7 +161,7 @@ func recordOpenAIRequest(req *chattest.OpenAIRequest) recordedOpenAIRequest {
|
||||
|
||||
var contentLength int64
|
||||
if req.Request != nil {
|
||||
contentLength = req.Request.ContentLength
|
||||
contentLength = req.ContentLength
|
||||
}
|
||||
|
||||
return recordedOpenAIRequest{
|
||||
|
||||
@@ -927,7 +927,7 @@ func ModelFromConfig(
|
||||
|
||||
apiKey := providerKeys.APIKey(provider)
|
||||
if apiKey == "" &&
|
||||
!(ProviderAllowsAmbientCredentials(provider) && providerKeys.HasProvider(provider)) {
|
||||
(!ProviderAllowsAmbientCredentials(provider) || !providerKeys.HasProvider(provider)) {
|
||||
return Model{}, missingProviderAPIKeyError(provider)
|
||||
}
|
||||
baseURL := providerKeys.BaseURL(provider)
|
||||
|
||||
@@ -47,7 +47,7 @@ func TestModelFromConfig_OpenAIResponsesAPIOverride(t *testing.T) {
|
||||
var gotPath string
|
||||
serverURL := chattest.NewOpenAI(t, func(req *chattest.OpenAIRequest) chattest.OpenAIResponse {
|
||||
mu.Lock()
|
||||
gotPath = req.Request.URL.Path
|
||||
gotPath = req.URL.Path
|
||||
mu.Unlock()
|
||||
return chattest.OpenAINonStreamingResponse("ok")
|
||||
})
|
||||
@@ -135,7 +135,7 @@ func TestModelTransportConsumersAgree(t *testing.T) {
|
||||
var gotPath string
|
||||
serverURL := chattest.NewOpenAI(t, func(req *chattest.OpenAIRequest) chattest.OpenAIResponse {
|
||||
mu.Lock()
|
||||
gotPath = req.Request.URL.Path
|
||||
gotPath = req.URL.Path
|
||||
mu.Unlock()
|
||||
return chattest.OpenAINonStreamingResponse("ok")
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user