Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update context #567

Merged
merged 13 commits into from
Feb 29, 2024
2 changes: 1 addition & 1 deletion cmd/incusd/api_1.0.go
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ func doApi10Update(d *Daemon, r *http.Request, req api.ServerPut, patch bool) re
var newClusterConfig *clusterConfig.Config
oldClusterConfig := make(map[string]string)

err = s.DB.Cluster.Transaction(context.Background(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
var err error
newClusterConfig, err = clusterConfig.Load(ctx, tx)
if err != nil {
Expand Down
80 changes: 39 additions & 41 deletions cmd/incusd/api_cluster.go

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions cmd/incusd/api_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ func internalCreateWarning(d *Daemon, r *http.Request) response.Response {
return response.SmartError(fmt.Errorf("Invalid entity type"))
}

err = d.State().DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = d.State().DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
return tx.UpsertWarning(ctx, req.Location, req.Project, req.EntityTypeCode, req.EntityID, warningtype.Type(req.TypeCode), req.Message)
})
if err != nil {
Expand Down Expand Up @@ -571,7 +571,7 @@ func internalSQLExec(tx *sql.Tx, query string, result *internalSQL.SQLResult) er

// internalImportFromBackup creates instance, storage pool and volume DB records from an instance's backup file.
// It expects the instance volume to be mounted so that the backup.yaml file is readable.
func internalImportFromBackup(s *state.State, projectName string, instName string, allowNameOverride bool) error {
func internalImportFromBackup(ctx context.Context, s *state.State, projectName string, instName string, allowNameOverride bool) error {
if instName == "" {
return fmt.Errorf("The name of the instance is required")
}
Expand Down Expand Up @@ -661,7 +661,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin
pool, err := storagePools.LoadByName(s, instancePoolName)
if response.IsNotFoundError(err) {
// Create the storage pool db entry if it doesn't exist.
_, err = storagePoolDBCreate(s, instancePoolName, "", backupConf.Pool.Driver, backupConf.Pool.Config)
_, err = storagePoolDBCreate(ctx, s, instancePoolName, "", backupConf.Pool.Driver, backupConf.Pool.Config)
if err != nil {
return fmt.Errorf("Create storage pool database entry: %w", err)
}
Expand Down Expand Up @@ -690,7 +690,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin

// Check if a storage volume entry for the instance already exists.
var dbVolume *db.StorageVolume
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
dbVolume, err = tx.GetStoragePoolVolume(ctx, pool.ID(), projectName, instanceDBVolType, backupConf.Container.Name, true)
if err != nil && !response.IsNotFoundError(err) {
return err
Expand All @@ -706,7 +706,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin
return fmt.Errorf(`Storage volume for instance %q already exists in the database`, backupConf.Container.Name)
}

err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
// Check if an entry for the instance already exists in the db.
_, err := tx.GetInstanceID(ctx, projectName, backupConf.Container.Name)

Expand All @@ -726,7 +726,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin

var profiles []api.Profile

err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
profiles, err = tx.GetProfiles(ctx, projectName, backupConf.Container.Profiles)

return err
Expand Down Expand Up @@ -780,7 +780,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin
for _, snap := range existingSnapshots {
snapInstName := fmt.Sprintf("%s%s%s", backupConf.Container.Name, internalInstance.SnapshotDelimiter, snap.Name)

snapErr := s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
snapErr := s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
// Check if an entry for the snapshot already exists in the db.
_, err := tx.GetInstanceSnapshotID(ctx, projectName, backupConf.Container.Name, snap.Name)

Expand All @@ -796,7 +796,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin

// Check if a storage volume entry for the snapshot already exists.
var dbVolume *db.StorageVolume
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
dbVolume, err = tx.GetStoragePoolVolume(ctx, pool.ID(), projectName, instanceDBVolType, snapInstName, true)
if err != nil && !response.IsNotFoundError(err) {
return err
Expand All @@ -814,7 +814,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin
}

if snapErr == nil {
err := s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err := s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
return tx.DeleteInstance(ctx, projectName, snapInstName)
})
if err != nil {
Expand All @@ -823,7 +823,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin
}

if dbVolume != nil {
err := s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err := s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
return tx.RemoveStoragePoolVolume(ctx, projectName, snapInstName, instanceDBVolType, pool.ID())
})
if err != nil {
Expand All @@ -838,7 +838,7 @@ func internalImportFromBackup(s *state.State, projectName string, instName strin
return err
}

err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
profiles, err = tx.GetProfiles(ctx, projectName, snap.Profiles)

return err
Expand Down
16 changes: 8 additions & 8 deletions cmd/incusd/api_internal_recover.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,15 @@ func init() {
}

// internalRecoverScan provides the discovery and import functionality for both recovery validate and import steps.
func internalRecoverScan(s *state.State, userPools []api.StoragePoolsPost, validateOnly bool) response.Response {
func internalRecoverScan(ctx context.Context, s *state.State, userPools []api.StoragePoolsPost, validateOnly bool) response.Response {
var err error
var projects map[string]*api.Project
var projectProfiles map[string][]*api.Profile
var projectNetworks map[string]map[int64]api.Network

// Retrieve all project, profile and network info in a single transaction so we can use it for all
// imported instances and volumes, and avoid repeatedly querying the same information.
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
// Load list of projects for validation.
ps, err := dbCluster.GetProjects(ctx, tx.Tx())
if err != nil {
Expand Down Expand Up @@ -331,7 +331,7 @@ func internalRecoverScan(s *state.State, userPools []api.StoragePoolsPost, valid
if instPoolVol != nil {
// Create storage pool DB record from config in the instance.
logger.Info("Creating storage pool DB record from instance config", logger.Ctx{"name": instPoolVol.Pool.Name, "description": instPoolVol.Pool.Description, "driver": instPoolVol.Pool.Driver, "config": instPoolVol.Pool.Config})
poolID, err = dbStoragePoolCreateAndUpdateCache(s, instPoolVol.Pool.Name, instPoolVol.Pool.Description, instPoolVol.Pool.Driver, instPoolVol.Pool.Config)
poolID, err = dbStoragePoolCreateAndUpdateCache(ctx, s, instPoolVol.Pool.Name, instPoolVol.Pool.Description, instPoolVol.Pool.Driver, instPoolVol.Pool.Config)
if err != nil {
return response.SmartError(fmt.Errorf("Failed creating storage pool %q database entry: %w", pool.Name(), err))
}
Expand All @@ -341,19 +341,19 @@ func internalRecoverScan(s *state.State, userPools []api.StoragePoolsPost, valid
poolDriverName := pool.Driver().Info().Name
poolDriverConfig := pool.Driver().Config()
logger.Info("Creating storage pool DB record from user config", logger.Ctx{"name": pool.Name(), "driver": poolDriverName, "config": poolDriverConfig})
poolID, err = dbStoragePoolCreateAndUpdateCache(s, pool.Name(), "", poolDriverName, poolDriverConfig)
poolID, err = dbStoragePoolCreateAndUpdateCache(ctx, s, pool.Name(), "", poolDriverName, poolDriverConfig)
if err != nil {
return response.SmartError(fmt.Errorf("Failed creating storage pool %q database entry: %w", pool.Name(), err))
}
}

revert.Add(func() {
_ = dbStoragePoolDeleteAndUpdateCache(s, pool.Name())
_ = dbStoragePoolDeleteAndUpdateCache(context.Background(), s, pool.Name())
})

// Set storage pool node to storagePoolCreated.
// Must come before storage pool is loaded from the database.
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
return tx.StoragePoolNodeCreated(poolID)
})
if err != nil {
Expand Down Expand Up @@ -582,7 +582,7 @@ func internalRecoverValidate(d *Daemon, r *http.Request) response.Response {
return response.BadRequest(err)
}

return internalRecoverScan(d.State(), req.Pools, true)
return internalRecoverScan(r.Context(), d.State(), req.Pools, true)
}

// internalRecoverImport performs the pool volume recovery.
Expand All @@ -594,5 +594,5 @@ func internalRecoverImport(d *Daemon, r *http.Request) response.Response {
return response.BadRequest(err)
}

return internalRecoverScan(d.State(), req.Pools, false)
return internalRecoverScan(r.Context(), d.State(), req.Pools, false)
}
30 changes: 15 additions & 15 deletions cmd/incusd/api_project.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ func projectsGet(d *Daemon, r *http.Request) response.Response {
}

var result any
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
projects, err := cluster.GetProjects(ctx, tx.Tx())
if err != nil {
return err
Expand Down Expand Up @@ -312,7 +312,7 @@ func projectsPost(d *Daemon, r *http.Request) response.Response {
}

var id int64
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
id, err = cluster.CreateProject(ctx, tx.Tx(), cluster.Project{Description: project.Description, Name: project.Name})
if err != nil {
return fmt.Errorf("Failed adding database record: %w", err)
Expand All @@ -324,7 +324,7 @@ func projectsPost(d *Daemon, r *http.Request) response.Response {
}

if util.IsTrue(project.Config["features.profiles"]) {
err = projectCreateDefaultProfile(tx, project.Name)
err = projectCreateDefaultProfile(ctx, tx, project.Name)
if err != nil {
return err
}
Expand Down Expand Up @@ -356,14 +356,14 @@ func projectsPost(d *Daemon, r *http.Request) response.Response {
}

// Create the default profile of a project.
func projectCreateDefaultProfile(tx *db.ClusterTx, project string) error {
func projectCreateDefaultProfile(ctx context.Context, tx *db.ClusterTx, project string) error {
// Create a default profile
profile := cluster.Profile{}
profile.Project = project
profile.Name = api.ProjectDefaultName
profile.Description = fmt.Sprintf("Default Incus profile for project %s", project)

_, err := cluster.CreateProfile(context.TODO(), tx.Tx(), profile)
_, err := cluster.CreateProfile(ctx, tx.Tx(), profile)
if err != nil {
return fmt.Errorf("Add default profile to database: %w", err)
}
Expand Down Expand Up @@ -415,7 +415,7 @@ func projectGet(d *Daemon, r *http.Request) response.Response {

// Get the database entry
var project *api.Project
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
dbProject, err := cluster.GetProject(ctx, tx.Tx(), name)
if err != nil {
return err
Expand Down Expand Up @@ -480,7 +480,7 @@ func projectPut(d *Daemon, r *http.Request) response.Response {

// Get the current data
var project *api.Project
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
dbProject, err := cluster.GetProject(ctx, tx.Tx(), name)
if err != nil {
return err
Expand Down Expand Up @@ -524,7 +524,7 @@ func projectPut(d *Daemon, r *http.Request) response.Response {
requestor := request.CreateRequestor(r)
s.Events.SendLifecycle(project.Name, lifecycle.ProjectUpdated.Event(project.Name, requestor, nil))

return projectChange(s, project, req)
return projectChange(r.Context(), s, project, req)
}

// swagger:operation PATCH /1.0/projects/{name} projects project_patch
Expand Down Expand Up @@ -566,7 +566,7 @@ func projectPatch(d *Daemon, r *http.Request) response.Response {

// Get the current data
var project *api.Project
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
dbProject, err := cluster.GetProject(ctx, tx.Tx(), name)
if err != nil {
return err
Expand Down Expand Up @@ -640,11 +640,11 @@ func projectPatch(d *Daemon, r *http.Request) response.Response {
requestor := request.CreateRequestor(r)
s.Events.SendLifecycle(project.Name, lifecycle.ProjectUpdated.Event(project.Name, requestor, nil))

return projectChange(s, project, req)
return projectChange(r.Context(), s, project, req)
}

// Common logic between PUT and PATCH.
func projectChange(s *state.State, project *api.Project, req api.ProjectPut) response.Response {
func projectChange(ctx context.Context, s *state.State, project *api.Project, req api.ProjectPut) response.Response {
// Make a list of config keys that have changed.
configChanged := []string{}
for key := range project.Config {
Expand Down Expand Up @@ -703,7 +703,7 @@ func projectChange(s *state.State, project *api.Project, req api.ProjectPut) res
}

// Update the database entry.
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(ctx, func(ctx context.Context, tx *db.ClusterTx) error {
err := projecthelpers.AllowProjectUpdate(tx, project.Name, req.Config, configChanged)
if err != nil {
return err
Expand All @@ -716,7 +716,7 @@ func projectChange(s *state.State, project *api.Project, req api.ProjectPut) res

if slices.Contains(configChanged, "features.profiles") {
if util.IsTrue(req.Config["features.profiles"]) {
err = projectCreateDefaultProfile(tx, project.Name)
err = projectCreateDefaultProfile(ctx, tx, project.Name)
if err != nil {
return err
}
Expand Down Expand Up @@ -888,7 +888,7 @@ func projectDelete(d *Daemon, r *http.Request) response.Response {
}

var id int64
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
project, err := cluster.GetProject(ctx, tx.Tx(), name)
if err != nil {
return fmt.Errorf("Fetch project %q: %w", name, err)
Expand Down Expand Up @@ -972,7 +972,7 @@ func projectStateGet(d *Daemon, r *http.Request) response.Response {
state := api.ProjectState{}

// Get current limits and usage.
err = s.DB.Cluster.Transaction(context.TODO(), func(ctx context.Context, tx *db.ClusterTx) error {
err = s.DB.Cluster.Transaction(r.Context(), func(ctx context.Context, tx *db.ClusterTx) error {
result, err := projecthelpers.GetCurrentAllocations(ctx, tx, name)
if err != nil {
return err
Expand Down
Loading
Loading