Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a7f4037
microcluster/db: Consolidate all DB utility functions
roosterfish Dec 2, 2025
4dde629
internal/cluster: Make Microcluster specific DB funcs internal
roosterfish Dec 2, 2025
e9f5782
microcluster/types: Move dqlite specific funcs from cluster package
roosterfish Dec 2, 2025
c570f6f
cluster: Remove unused Schema struct and drop package
roosterfish Dec 2, 2025
0e3650c
microcluster/rest: Drop top level rest package
roosterfish Dec 2, 2025
c73ab75
microcluster/types: Move top level rest/types
roosterfish Dec 2, 2025
a44e40f
internal/rest/access: Move Microcluster specific auth bits to interna…
roosterfish Dec 2, 2025
9e03fb5
microcluster/types: Expose rest related types to allow direct exposure
roosterfish Dec 2, 2025
364ca03
internal/rest/resources: Import types from new packages
roosterfish Dec 2, 2025
ad8c1aa
internal/rest/client: Import types from new packages
roosterfish Dec 2, 2025
eb09050
internal/db: Import types from new packages
roosterfish Dec 2, 2025
ed09eb6
internal/daemon: Import types from new packages
roosterfish Dec 2, 2025
f458e72
internal/config: Import types from new packages
roosterfish Dec 2, 2025
7021755
internal/recover: Import types from new packages
roosterfish Dec 2, 2025
951acfb
internal/rest: Import types from new packages
roosterfish Dec 2, 2025
46f3fc3
internal/state: Import types from new packages
roosterfish Dec 2, 2025
2a6c198
internal/sys: Import types from new packages
roosterfish Dec 2, 2025
2551aac
internal/trust: Import types from new packages
roosterfish Dec 2, 2025
65f3b25
example: Import types from new packages
roosterfish Dec 2, 2025
56ddebb
client: Import types from new packages
roosterfish Dec 2, 2025
782f3a0
microcluster: Import types from new packages
roosterfish Dec 2, 2025
f676b41
make: Drop DB generation target
roosterfish Dec 2, 2025
55801ae
example/make: Drop DB generation target
roosterfish Dec 2, 2025
e95d157
example/database: Drop generator comments
roosterfish Dec 2, 2025
668bf40
internal/cluster: Drop generator comments
roosterfish Dec 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,3 @@ update-gomod:

# Use the bundled toolchain that meets the minimum go version
go get toolchain@none

# Update lxd-generate generated database helpers.
.PHONY: update-schema
update-schema:
go generate ./cluster/...
gofmt -s -w ./cluster/
goimports -w ./cluster/
@echo "Code generation completed"

2 changes: 1 addition & 1 deletion client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"github.com/gorilla/websocket"

"github.com/canonical/microcluster/v3/internal/rest/client"
"github.com/canonical/microcluster/v3/rest/types"
"github.com/canonical/microcluster/v3/microcluster/types"
)

// Client is a rest client for the microcluster daemon.
Expand Down
12 changes: 0 additions & 12 deletions cluster/schema.go

This file was deleted.

9 changes: 0 additions & 9 deletions example/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,3 @@ endif
update-gomod:
go get -u ./...
go mod tidy

# Update lxd-generate generated database helpers.
.PHONY: update-schema
update-schema:
go generate ./...
gofmt -s -w ./database/
goimports -w ./database/
@echo "Code generation completed"

6 changes: 3 additions & 3 deletions example/api/extended.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import (
"github.com/canonical/microcluster/v3/client"
extendedTypes "github.com/canonical/microcluster/v3/example/api/types"
extendedClient "github.com/canonical/microcluster/v3/example/client"
"github.com/canonical/microcluster/v3/rest"
"github.com/canonical/microcluster/v3/rest/response"
"github.com/canonical/microcluster/v3/rest/types"
"github.com/canonical/microcluster/v3/microcluster/rest"
"github.com/canonical/microcluster/v3/microcluster/rest/response"
"github.com/canonical/microcluster/v3/microcluster/types"
"github.com/canonical/microcluster/v3/state"
)

Expand Down
2 changes: 1 addition & 1 deletion example/api/servers.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package api

import (
"github.com/canonical/microcluster/v3/example/api/types"
"github.com/canonical/microcluster/v3/rest"
"github.com/canonical/microcluster/v3/microcluster/rest"
)

// Servers represents the list of listeners that the daemon will start
Expand Down
2 changes: 1 addition & 1 deletion example/api/types/extended.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Package types provides shared types and structs.
package types

import "github.com/canonical/microcluster/v3/rest/types"
import "github.com/canonical/microcluster/v3/microcluster/types"

// ExtendedType is an example of an API type usable by MicroCluster but defined by this example project.
type ExtendedType struct {
Expand Down
2 changes: 1 addition & 1 deletion example/api/types/server.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package types

import "github.com/canonical/microcluster/v3/rest/types"
import "github.com/canonical/microcluster/v3/microcluster/types"

const (
// ExtendedPathPrefix is the path prefix that will be used for the extended endpoints.
Expand Down
4 changes: 2 additions & 2 deletions example/cmd/microctl/cluster_members.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import (
"gopkg.in/yaml.v3"

"github.com/canonical/microcluster/v3/client"
"github.com/canonical/microcluster/v3/cluster"
"github.com/canonical/microcluster/v3/microcluster"
"github.com/canonical/microcluster/v3/microcluster/types"
)

const recoveryConfirmation = `You should only run this command if:
Expand Down Expand Up @@ -254,7 +254,7 @@ func (c *cmdClusterEdit) run(cmd *cobra.Command, args []string) error {
}
}

newMembers := []cluster.DqliteMember{}
newMembers := []types.DqliteMember{}
err = yaml.Unmarshal(content, &newMembers)
if err != nil {
return err
Expand Down
2 changes: 1 addition & 1 deletion example/cmd/microd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
"github.com/canonical/microcluster/v3/example/database"
"github.com/canonical/microcluster/v3/example/version"
"github.com/canonical/microcluster/v3/microcluster"
"github.com/canonical/microcluster/v3/rest/types"
"github.com/canonical/microcluster/v3/microcluster/types"
"github.com/canonical/microcluster/v3/state"
)

Expand Down
36 changes: 14 additions & 22 deletions example/database/extended.mapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,47 +10,45 @@ import (

"github.com/canonical/lxd/shared/api"

"github.com/canonical/microcluster/v3/cluster"
"github.com/canonical/microcluster/v3/cluster/db"
"github.com/canonical/microcluster/v3/microcluster/db"
)

var _ = api.ServerEnvironment{}

var extendedTableObjects = cluster.RegisterStmt(`
var extendedTableObjects = db.RegisterStmt(`
SELECT extended_table.id, extended_table.key, extended_table.value
FROM extended_table
ORDER BY extended_table.key
`)

var extendedTableObjectsByKey = cluster.RegisterStmt(`
var extendedTableObjectsByKey = db.RegisterStmt(`
SELECT extended_table.id, extended_table.key, extended_table.value
FROM extended_table
WHERE ( extended_table.key = ? )
ORDER BY extended_table.key
`)

var extendedTableID = cluster.RegisterStmt(`
var extendedTableID = db.RegisterStmt(`
SELECT extended_table.id FROM extended_table
WHERE extended_table.key = ?
`)

var extendedTableCreate = cluster.RegisterStmt(`
var extendedTableCreate = db.RegisterStmt(`
INSERT INTO extended_table (key, value)
VALUES (?, ?)
`)

var extendedTableDeleteByKey = cluster.RegisterStmt(`
var extendedTableDeleteByKey = db.RegisterStmt(`
DELETE FROM extended_table WHERE key = ?
`)

var extendedTableUpdate = cluster.RegisterStmt(`
var extendedTableUpdate = db.RegisterStmt(`
UPDATE extended_table
SET key = ?, value = ?
WHERE id = ?
`)

// GetExtendedTables returns all available extended_tables.
// generator: extended_table GetMany
func GetExtendedTables(ctx context.Context, tx *sql.Tx, filters ...ExtendedTableFilter) ([]ExtendedTable, error) {
var err error

Expand All @@ -63,7 +61,7 @@ func GetExtendedTables(ctx context.Context, tx *sql.Tx, filters ...ExtendedTable
queryParts := [2]string{}

if len(filters) == 0 {
sqlStmt, err = cluster.Stmt(tx, extendedTableObjects)
sqlStmt, err = db.Stmt(tx, extendedTableObjects)
if err != nil {
return nil, fmt.Errorf("Failed to get \"extendedTableObjects\" prepared statement: %w", err)
}
Expand All @@ -73,15 +71,15 @@ func GetExtendedTables(ctx context.Context, tx *sql.Tx, filters ...ExtendedTable
if filter.Key != nil {
args = append(args, []any{filter.Key}...)
if len(filters) == 1 {
sqlStmt, err = cluster.Stmt(tx, extendedTableObjectsByKey)
sqlStmt, err = db.Stmt(tx, extendedTableObjectsByKey)
if err != nil {
return nil, fmt.Errorf("Failed to get \"extendedTableObjectsByKey\" prepared statement: %w", err)
}

break
}

query, err := cluster.StmtString(extendedTableObjectsByKey)
query, err := db.StmtString(extendedTableObjectsByKey)
if err != nil {
return nil, fmt.Errorf("Failed to get \"extendedTableObjects\" prepared statement: %w", err)
}
Expand Down Expand Up @@ -130,7 +128,6 @@ func GetExtendedTables(ctx context.Context, tx *sql.Tx, filters ...ExtendedTable
}

// GetExtendedTable returns the extended_table with the given key.
// generator: extended_table GetOne
func GetExtendedTable(ctx context.Context, tx *sql.Tx, key string) (*ExtendedTable, error) {
filter := ExtendedTableFilter{}
filter.Key = &key
Expand All @@ -151,9 +148,8 @@ func GetExtendedTable(ctx context.Context, tx *sql.Tx, key string) (*ExtendedTab
}

// GetExtendedTableID return the ID of the extended_table with the given key.
// generator: extended_table ID
func GetExtendedTableID(ctx context.Context, tx *sql.Tx, key string) (int64, error) {
stmt, err := cluster.Stmt(tx, extendedTableID)
stmt, err := db.Stmt(tx, extendedTableID)
if err != nil {
return -1, fmt.Errorf("Failed to get \"extendedTableID\" prepared statement: %w", err)
}
Expand All @@ -173,7 +169,6 @@ func GetExtendedTableID(ctx context.Context, tx *sql.Tx, key string) (int64, err
}

// ExtendedTableExists checks if a extended_table with the given key exists.
// generator: extended_table Exists
func ExtendedTableExists(ctx context.Context, tx *sql.Tx, key string) (bool, error) {
_, err := GetExtendedTableID(ctx, tx, key)
if err != nil {
Expand All @@ -188,7 +183,6 @@ func ExtendedTableExists(ctx context.Context, tx *sql.Tx, key string) (bool, err
}

// CreateExtendedTable adds a new extended_table to the database.
// generator: extended_table Create
func CreateExtendedTable(ctx context.Context, tx *sql.Tx, object ExtendedTable) (int64, error) {
// Check if a extended_table with the same key exists.
exists, err := ExtendedTableExists(ctx, tx, object.Key)
Expand All @@ -207,7 +201,7 @@ func CreateExtendedTable(ctx context.Context, tx *sql.Tx, object ExtendedTable)
args[1] = object.Value

// Prepared statement to use.
stmt, err := cluster.Stmt(tx, extendedTableCreate)
stmt, err := db.Stmt(tx, extendedTableCreate)
if err != nil {
return -1, fmt.Errorf("Failed to get \"extendedTableCreate\" prepared statement: %w", err)
}
Expand All @@ -227,9 +221,8 @@ func CreateExtendedTable(ctx context.Context, tx *sql.Tx, object ExtendedTable)
}

// DeleteExtendedTable deletes the extended_table matching the given key parameters.
// generator: extended_table DeleteOne-by-Key
func DeleteExtendedTable(ctx context.Context, tx *sql.Tx, key string) error {
stmt, err := cluster.Stmt(tx, extendedTableDeleteByKey)
stmt, err := db.Stmt(tx, extendedTableDeleteByKey)
if err != nil {
return fmt.Errorf("Failed to get \"extendedTableDeleteByKey\" prepared statement: %w", err)
}
Expand All @@ -254,14 +247,13 @@ func DeleteExtendedTable(ctx context.Context, tx *sql.Tx, key string) error {
}

// UpdateExtendedTable updates the extended_table matching the given key parameters.
// generator: extended_table Update
func UpdateExtendedTable(ctx context.Context, tx *sql.Tx, key string, object ExtendedTable) error {
id, err := GetExtendedTableID(ctx, tx, key)
if err != nil {
return err
}

stmt, err := cluster.Stmt(tx, extendedTableUpdate)
stmt, err := db.Stmt(tx, extendedTableUpdate)
if err != nil {
return fmt.Errorf("Failed to get \"extendedTableUpdate\" prepared statement: %w", err)
}
Expand Down
2 changes: 1 addition & 1 deletion example/database/extended_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"context"
"database/sql"

"github.com/canonical/microcluster/v3/cluster/db"
"github.com/canonical/microcluster/v3/microcluster/db"
)

// SchemaExtensions is a list of schema extensions that can be passed to the MicroCluster daemon.
Expand Down
23 changes: 2 additions & 21 deletions example/database/extended_table.go
Original file line number Diff line number Diff line change
@@ -1,32 +1,13 @@
package database

//go:generate -command mapper lxd-generate db mapper -t extended.mapper.go
//go:generate mapper reset
//
//go:generate mapper stmt -d github.com/canonical/microcluster/v3/cluster -e extended_table objects table=extended_table
//go:generate mapper stmt -d github.com/canonical/microcluster/v3/cluster -e extended_table objects-by-Key table=extended_table
//go:generate mapper stmt -d github.com/canonical/microcluster/v3/cluster -e extended_table id table=extended_table
//go:generate mapper stmt -d github.com/canonical/microcluster/v3/cluster -e extended_table create table=extended_table
//go:generate mapper stmt -d github.com/canonical/microcluster/v3/cluster -e extended_table delete-by-Key table=extended_table
//go:generate mapper stmt -d github.com/canonical/microcluster/v3/cluster -e extended_table update table=extended_table
//
//go:generate mapper method -i -d github.com/canonical/microcluster/v3/cluster -e extended_table GetMany table=extended_table
//go:generate mapper method -i -d github.com/canonical/microcluster/v3/cluster -e extended_table GetOne table=extended_table
//go:generate mapper method -i -d github.com/canonical/microcluster/v3/cluster -e extended_table ID table=extended_table
//go:generate mapper method -i -d github.com/canonical/microcluster/v3/cluster -e extended_table Exists table=extended_table
//go:generate mapper method -i -d github.com/canonical/microcluster/v3/cluster -e extended_table Create table=extended_table
//go:generate mapper method -i -d github.com/canonical/microcluster/v3/cluster -e extended_table DeleteOne-by-Key table=extended_table
//go:generate mapper method -i -d github.com/canonical/microcluster/v3/cluster -e extended_table Update table=extended_table

// ExtendedTable is an example of a database table. In this case named `extended_table`. The above comments will
// generate database queries and helpers using lxd-generate.
// ExtendedTable is an example of a database table. In this case named `extended_table`.
type ExtendedTable struct {
ID int
Key string `db:"primary=yes"`
Value string
}

// ExtendedTableFilter is a required struct for use with lxd-generate. It is used for filtering fields on database
// ExtendedTableFilter is used for filtering fields on database
// fetches. In this case we will only support filtering by Key.
type ExtendedTableFilter struct {
Key *string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,9 @@ import (

"github.com/canonical/microcluster/v3/internal/db/update"
"github.com/canonical/microcluster/v3/internal/extensions"
"github.com/canonical/microcluster/v3/rest/types"
"github.com/canonical/microcluster/v3/microcluster/types"
)

//go:generate -command mapper lxd-generate db mapper -t cluster_members.mapper.go
//go:generate mapper reset
//
//go:generate mapper stmt -e core_cluster_member objects table=core_cluster_members
//go:generate mapper stmt -e core_cluster_member objects-by-Address table=core_cluster_members
//go:generate mapper stmt -e core_cluster_member objects-by-Name table=core_cluster_members
//go:generate mapper stmt -e core_cluster_member id table=core_cluster_members
//go:generate mapper stmt -e core_cluster_member create table=core_cluster_members
//go:generate mapper stmt -e core_cluster_member delete-by-Address table=core_cluster_members
//go:generate mapper stmt -e core_cluster_member update table=core_cluster_members
//
//go:generate mapper method -i -e core_cluster_member GetMany table=core_cluster_members
//go:generate mapper method -i -e core_cluster_member GetOne table=core_cluster_members
//go:generate mapper method -i -e core_cluster_member ID table=core_cluster_members
//go:generate mapper method -i -e core_cluster_member Exists table=core_cluster_members
//go:generate mapper method -i -e core_cluster_member Create table=core_cluster_members
//go:generate mapper method -i -e core_cluster_member DeleteOne-by-Address table=core_cluster_members
//go:generate mapper method -i -e core_cluster_member Update table=core_cluster_members

// Role is the role of the dqlite cluster member.
type Role string

Expand Down
Loading