The LXD team is very excited to announce the release of microcluster v2.0.0!
This is the first release of Microcluster. It is an LTS release that will be supported until July 2029 and will receive a number of bugfix and security point releases over that time.
Microcluster is a Go library that simplifies development of dqlite clusters.
Importing Microcluster v2.0.0
go get github.com/canonical/microcluster/v2@latest
Go package imports will need to be updated:
github.com/canonical/microcluster --> github.com/canonical/microcluster/v2
Complete changelog
Here is a complete list of all changes in this release:
Full commit list
- Initial commit
- internal/state/state: Daemon & State implementation
- internal/trust/truststore: Store for local cluster record
- internal/sys/os: filesystem helpers
- internal/endpoints/socket: Network/Unix listeners
- internal/db/dqlite: Dqlite database implementation
- internal/db/cluster/certificates.mapper: Add Certificates DB entity
- internal/db/cluster/token_records.mapper: Add Token Records DB entity
- internal/rest/rest: Endpoint handler logic
- internal/rest/client/tls: Client connection implementation
- internal/rest/types/certificate: Add initial API types
- internal/rest/resources/database: Database endpoint
- internal/rest/types/cluster: Implement /cluster endpoint
- internal/rest/types/secrets: Implement /secrets endpoint
- internal/rest/types/sql: Implement /sql endpoint
- internal/rest/resources/ready: Implement /ready endpoint
- internal/rest/types/control: Add /control endpoint
- internal/rest/resources/resources: Separate public and internal endpoints
- go: Update-gomod
- Makefile: Remove unnecessary makefile
- internal/sys/fsnotify: Fix imports
- internal/rest/types/certificate: Add ParseX509Certificate helper
- internal/state/state: Add Leader client helper to State
- internal/rest/client/client: Disable keep-alives on client connections
- internal/rest/client/client: Add URL helper to the client
- internal/rest/client/client: Donāt overwrite per-request context timeouts
- internal/trust/remotes: Add helper to replace local truststore
- internal/db/dqlite: Add sys.OS to database
- internal/db/dqlite: Add dqlite leader client helper
- internal/db/dqlite: Use debug for dqlite connection log
- internal/db/dqlite: Send a heartbeat from the dqlite dialFunc
- internal/db/cluster/cluster/member: Update cluster_member table fields and db methods
- internal/db/cluster/cluster/member: Add pending role to cluster_member
- internal/rest/types/cluster: Update API type and client method for cluster members
- internal/rest/resources/secrets: Use new ClusterMember API types
- internal/rest/resources/cluster: Use database for cluster member POST and GET
- internal/daemon/daemon: Create db cluster_member entry on bootstrap
- internal/rest/types/heartbeat: Add HeartbeatInfo API type
- internal/rest/client/heartbeat: Add heartbeat client methods
- internal/rest/resources/heartbeat: Add /heartbeat API handler
- internal/trust/truststore: Add mutex lock to local trust store
- internal/db/update/update: Add schema update package
- internal/db/cluster/cluster/member: Add schema version db helpers
- internal/db/cluster/schema.mapper: Simplify schema entry in cluster package
- internal/daemon/daemon: Assign schema version to first cluster entries
- internal/db/dqlite: Add listen address to db
- internal/db/dqlite: Check and update schema when opening database
- internal/daemon/daemon: Send upgrade notification when opening non-bootstrapped dqlite
- internal/db/dqlite: Add NotifyUpgraded
- internal/rest/resources/database: Add /database PATCH
- internal/rest/rest: Only hijack POSTs to /database
- internal/db/dqlite: Add address to heartbeat log context
- internal/state/state: Make request optional for state.Cluster
- microcluster/app: Add microcluster package
- state/state: Move shared packages out of internal
- internal: Remove shareable packages out of internal
- internal: Fix imports
- internal/daemon/daemon: Apply api/schema extensions to daemon
- internal/rest/client/ready: Add dedicated waitready client command
- example: Add Example CLI
- internal/db/update/schema: Fix error strings
- internal/sys/environment: Add auto-update logic
- internal/db/dqlite: Begin heartbeat on database open
- internal/daemon/daemon: Donāt error out if upgrade notification canāt be sent
- internal/rest/client/client: Fully read and close all response bodies
- internal/state/state: Add 5s ctx timeout to dqlite client
- internal/rest/resources/heartbeat: Fix heartbeat sleep time
- internal/rest/resources/heartbeat: Better debug logs for heartbeats
- internal/rest/resources/heartbeat: Fix concurrent access to heartbeat data
- internal/endpoints/socket: Handle cancelled context on listeners
- internal/db/dqlite: Add Stop function to dqlite
- internal/state/state: Add Stop to state
- internal/rest/resources/shutdown: Add shutdown endpoint
- example/cmd/microctl/shutdown: Add shutdown command to example
- internal: Use a Name string for token creation/usage
- cluster/token/records.mapper: Get Tokens by their internal key
- cluster/token/records: Add ToAPI for InternalTokenRecords
- internal/rest/types/tokens: Store all cluster addresses in the token
- internal/rest/resources/tokens: Remove POST to /tokens/Name
- internal/rest/client/cluster: Return TokenResponse when adding a cluster member with a token
- internal/rest/resources/control: Handle token response from AddClusterMember
- microcluster/app: Add ListJoinTokens and RevokeJoinToken helpers
- example/cmd/microctl/secrets: Implement tokens add/list/revoke
- example/README: Update example README
- example/cmd/microctl/tokens: Move secrets.go to tokens.go
- internal/rest/types/tokens: Use cluster cert fingerprint in join token
- internal/rest/types/tokens: Rename generated token key to secret
- go: Update gomod
- cluster/stmt: Use updated Stmt required for lxd-generate
- cluster/mapper: Update generated code
- internal/db/update/update: Rename token column to secret
- internal/rest/resources/resources: Add DELETE /cluster/NAME
- internal/rest/resources/cluster: Add PUT cluster/NAME for resetting
- example/cmd/microctl/cluster/members: Add cluster remove to CLI
- example/README: Update example README
- example: Set package comments
- example: Fix client function description
- example: Add check-system Makefile target
- example: Fix bad imports
- example: Fix missing error check
- example/Makefile: Add update-schema to Makefile
- cluster/stmt: Add StmtString
- mapper: Update generated code
- internal/rest/resources: Remove empty filter structs
- client/client: Use extended endpoint for extended APIs
- example: Reference /1.0 as extended endpoint in comments
- example/Makefile: Remove internal schema-updates from example Makefile
- Makefile: Add microcluster Makefile
- internal/rest/resources/heartbeat: Ensure database is open before heartbeat response
- internal/daemon/daemon: Add initHook to daemon
- microcluster/app: Pass initHook to daemon from microcluster.Start
- example/cmd/microd/main: Add example hook
- internal/state/state: Add runHook flag to StartAPI
- internal/daemon/daemon: Run init hook on bootstrap
- example/database/cluster/members: Use unique ānameā column as primary key
- cluster/token/records: Remove version=2 flag from lxd-generate comments
- example/database/extended/table: Remove version=2 flag from lxd-generate comments
- example/database/extended/table: Use full import path for lxd-generate --database flag
- microcluster: Update generated code
- microcluster/app: Add customizable timeout to bootstrap/join
- internal/trust/remotes: Add Location type to remotes
- internal/state/state: Use functions for daemon/state Address/Name
- internal/daemon/daemon: Add setDaemonConfig helper
- internal/daemon/daemon: Remove address from daemon init
- internal/daemon/daemon: Remote validateConfig helper
- internal/daemon/daemon: Reload daemon config on restart
- internal/daemon/daemon: Apply new daemon configuration when starting API
- internal/db/dqlite: Supply db listen address on bootstrap/join/restart
- internal/rest/types/control: Add address and name to Control struct
- internal/rest/resources/control: Use specified cluster name instead of state dir name
- internal/rest/resources/heartbeat: Properly pass cluster name to cluster_members db helpers
- microcluster/app: Accept name/address on New/JoinCluster public helpers
- example/cmd/microd/main: Update example
- example/README: Update example README
- go: Update gomod
- example/database/extended.mapper: Update generated code
- internal/db/update/update: Pass context to query package helpers
- internal/state/state: Retrieve daemon address as *api.URL
- internal/db: Remove db.Tx alias for sql.Tx
- internal/daemon/hooks: Add Hooks interface
- internal/state/state: Add hooks to daemon and state
- internal/rest/resources/control: Update StartAPI usage
- internal/rest/resources/cluster: Transfer leadership and forward request if removing self as leader
- internal/rest/resources/cluster: Run OnRemoveHook after removing cluster member
- internal/rest/resources/heartbeat: Run OnHeartbeatHook after a heartbeat
- microcluster/app: Supply hooks on microcluster.Start
- example/cmd/microd/main: Add exampleHooks
- internal/daemon/daemon: Handle all endpoints on the unix socket
- internal/rest/resources/resources: Handle only init/shutdown exclusively with the unix socket
- internal/rest/client/tokens: Maintain one endpoint per path
- rest/rest: Add flag allowing endpoints before bootstrap
- internal/rest/rest: Reject endpoints if database is closed
- internal/rest/resources/shutdown: Allow some built-in endpoints before bootstrap
- internal/rest/resources/heartbeat: Remove SendHeartbeat
- microcluster/app: Rename Client to RemoteClient
- example/cmd/microctl/extended/cmd: Update examples
- internal/rest/rest: Remove rbac.UserIsAdmin
- internal/rest/rest: Set default AccessHandler
- internal/rest/client/control: Fix incorrect timeout condition
- config/hooks: Use struct to hold Hooks
- microcluster/app: Update usages
- internal/daemon/daemon: Apply hooks on daemon startup
- config/hooks: Add OnNewMember hook
- internal/rest/resources/cluster: Run OnNewMember hook if receiving forwarded cluster join request
- internal/daemon/daemon: Forward OnNewMember hook to all cluster members after completing a join
- internal/rest/resources/cluster: Forward OnRemoveHook to all cluster members
- internal/state/state: Update state helpers
- example/cmd/microd/main: Update example
- go: Update gomod
- internal/state/state: Add StopListeners to state
- internal/rest/resources/cluster: Stop listeners before replacing the daemon
- internal/rest/client/client: Add UseTarget and MakeRequest
- rest/rest: Add ProxyTarget flag
- internal/rest/rest: Send request to target if ProxyTarget is set
- internal/daemon/daemon: Add default OnNewMember hook
- internal/state/state: Replace OnRemove hook with Pre and Post hooks
- internal/rest/client/client: Append endpoint query params to client query params
- internal/rest/client/cluster: Add force option to cluster member removal
- internal/rest/resources/cluster: Run PreRemove hook if āforceā is not set
- example/cmd/microctl/cluster/members: Add force flag to CLI
- example/cmd/microd/main: Update default example hooks
- internal/rest/resources/cluster: Allow NewMember hook before initialization
- internal/trust/remotes: Check for empty remote certificate
- microcluster/app: Add microcluster.Args for specifying options
- example/cmd/microd/main: Update example
- go: Update go modules
- internal/rest/client/client: Update tcp.SetTimeouts arguments
- microcluster/app: Add /1.0 status endpoint
- microcluster/app: Add ListenPort argument
- internal/endpoints/endpoints: Start a listener on the given ListenPort
- internal/rest/rest: Allow unauthenticated traffic through ListenPort
- internal/daemon/daemon: Assign hostname as default name
- bumping lxc to 5.1 release, fixing a code-smell
- Add licensing files
- github: Add basic commit checks
- gomod: Run update-gomod
- cluster: Run update-schema
- internal: Set minimum timeout to 30s
- internal: Set remaining timeouts to 30s
- microcluster/app: Http client for uninitialized systems
- internal/trust/truststore: Prevent race between listing and reloading remotes
- internal: enable specifying socket group
- microcluster/app: add socket group argument
- e/c/m/main: add socket-group flag to example
- internal/rest/resources/heartbeat: Make fewer dqlite leader calls on heartbeat
- internal/db/dqlite: Send a heartbeat every 10 seconds
- go: Update go modules
- internal/daemon/daemon: Rename OnJoin to PostJoin
- internal/daemon/daemon: Add PreJoin hook
- Improve description of lifecycle hooks.
- internal/db/dqlite: Add first cluster member record before starting heartbeats
- internal/rest/resources/tokens: Issue join token with state address if truststore is busy
- internal/trust/remotes: Disallow emptying the list of remotes
- internal/rest/resources/heartbeat: Skip heartbeats when the database has no peers
- internal/trust/remotes: Donāt expose the internal remote data
- go: Update go modules
- internal/db/dqlite: Update call to lxdās logger
- microcluster/app: Update call to lxdās logger
- internal/trust/truststore: Donāt fail on Load if truststore is empty
- cluster/stmt: Split registered statements by caller package
- internal/db/update/update: Convert extended schema to sorted list
- Fixed ralative state directory not work
- gomod: Updates go mod to use canonical/lxd.
- client: Updates lxd imports.
- cluster: Updates lxd imports.
- example: Updates lxd imports.
- internal/daemon: Updates lxd imports.
- internal/db: Updates lxd imports.
- internal/endpoints: Updates lxd imports.
- internal/rest: Updates lxd imports.
- internal/state: Updates lxd imports.
- internal/sys: Updates lxd imports.
- internal/trust: Updates lxd imports.
- microcluster: Updates lxd imports.
- rest: Updates lxd imports.
- internal/trust/remotes: Fix deadlock when fetching remotes
- internal/trust: Use renameio to atomically write truststore yamls
- go: Update go modules
- internal/rest/types: Adds InitConfig to Control type.
- microcluster: Pass initConfig into NewCluster and JoinCluster methods.
- internal/daemon: Add initConfig argument to daemonās StartAPI method.
- internal/state: Add initConfig argument to StartAPI on State.
- internal/rest/resources: Update calls to StartAPI.
- internal/daemon: Update calls to StartAPI.
- config: Add initConfig to bootstrap and join hooks.
- internal/daemon: Update calls to hooks.
- microctl: Update example to pass in config on init.
- microd: Update example to log config passed in on init.
- internal/endpoints: Cancel the listener context before closing it
- internal/state: Add force flag to remove hooks
- internal/rest/client: Add force flag to ResetClusterMember
- internal/rest/resources: Pass force param to the remove hooks
- internal/rest/resources: Always run the PreRemove hook
- example/cmd/microd: Update example
- internal/rest/resources: Wait to join cluster before executing new-member hook
- github: Adds CODEOWNERS file
- internal/rest/resources: Refresh cluster info when assigning a role to another node
- internal/db/update: Drop implicit global state
- internal/rest/resources: Always refresh cluster info before leadership check
- go: Update go modules
- internal/db: Update new import path for reverter
- internal/daemon: Replace OnBootstrap hook with PreBootstrap and PostBootstrap
- internal/daemon: Use a lock to manage access to the cluster cert
- internal/db: Share cluster cert function with db
- internal/state: Add ReloadClusterCert helper to daemon and state
- internal/rest/resources: Add PUT /cluster/certificates endpoint
- internal/rest/client: Use TLSClientConfig with the client dial func
- github: merge CLA and DCO checks
- github: switch to 22.04
- internal/db/dqlite: remove redundant return statement
- example/cmd/microctl/extended_cmd: replace Printf() by Print()
- example/cmd/microctl/sql: replace Printf() by Print()
- github: add tests job
- github: add dependabot config
- github: drop DCO check now that we have the DCO app enabled
- build(deps): bump golang.org/x/sys from 0.16.0 to 0.17.0
- include name in encoded token
- build(deps): bump golang.org/x/sys from 0.17.0 to 0.18.0
- internal/daemon: Donāt export daemon ctx
- microcluster: Pass ctx to Init
- microcluster: Use signal.NotifyContext for signal handling
- internal/daemon: Wrap d.stop in a sync.Once
- microcluster: Block until cancelled in the daemon package
- internal/state: Use a returned function to stop the shutdownDoneCh
- Makefile: Set minimum required go version for update-gomod
- github: Check minimum required go version in CI
- microcluster: Remove io/ioutil
- internal/db: Remove io/ioutil
- example/cmd: Remove
rand.Seed
- go: Run
make update-gomod
- internal/db: Pass context to
query.Retry
- github: enable codeql scanning
- Enable renovate bot
- build(deps): bump golang.org/x/sys from 0.18.0 to 0.19.0
- internal/db/update: Split internal and external schema versions
- cluster: Update internal_cluster_members for schema version split
- cluster: Update database mapping
- internal/db: Separately validate both schema versions on db.Open
- internal/rest/types: Split schema version in API types
- internal/rest/resources: Handle split schema versions in the API
- microcluster: Use a slice for schema updates
- internal/db/update: Remove unused functions
- microcluster: Mention args in daemon comments
- internal/db/update: Add updateFromV1 tests
- internal/db: Move upgrade logic to its own function
- internal/db/update: Add helpers for replacing schema update list
- internal: Fix error formatting
- internal/db: Add tests for cluster upgrades
- go: Update go mod
- microcluster: add context in all methods
- example/cmd/microctl: pass context in all microcluster methods
- example/cmd/microd: pass context in all microcluster methods
- microcluster: drop unnecessary timeout argument from methods
- internal/rest/client: drop unused timeout flag from ControlDaemon
- example/cmd/microctl: update calls to specify timeout
- internal/rest/resources: Run PreRemove hook before deleting node from the database
- internal/rest/resources: Donāt pre-emptively remove local record on forwarding node
- internal/trust: Clean up StartAPI
- internal/rest/client: Add SetClusterNotification helper
- client: Rename IsForwardedRequest to IsNotification
- internal/rest/resources: Clearer error for unsuccessful join attempts
- internal/rest/resources: Allow unauthenticated connections to /cluster/1.0
- example: Add system tests for microd/microctl
- internal: Remove node name from join token
- cluster: Remove node name from join token
- internal/state: Set cluster notification with flag
- internal/rest/resources: Update cluster notification usages
- internal/rest/resources: /cluster/internal/trustore endpoint
- internal/daemon: Update trust stores on all nodes after new node comes online
- internal/rest/resources: Donāt implicitly trust joiners before confirmation on leader
- internal/rest/resources: Update truststore after node removal
- internal/trust: Suppress truststore error on init
- internal/rest/resources: Remove incorrect comment
- internal/rest: Update RawPath with endpoint type for client requests
- Run
make update-gomod
- example/test: Test valid member names
- internal/rest: Restrict new member names to valid hostnames
- microcluster/internal/extensions: Introducing the
Extensions
registry - microcluster/internal/extensions/test: Add unit tests for the extensions registry
- microcluster/internal/state: Make the
Extensions
registry part of a node state - microcluster/internal/rest: Add the API extensions in
ClusterMember
related requests - microcluster/cluster: register the extensions (differentiated by
internal
andexternal
) in DB per cluster member - microcluster/internal/daemon: initialize the daemon with an empty (only contains internal extensions) registry
- microcluster/internal/daemon: Allow a daemon to be started with external extensions
- microcluster/rest/resources: Compare the joining nodeās extensions against the leaderās
- microcluster/internal/db/update: Create a DB schema update for the API extensions
- microcluster/internal/db: Allow the
db.Open
to take an*Extensions
parameter - microcluster/cluster: Update the retrieval / update of API extensions
- internal/daemon: Only propagate truststore on joins
- internal/db: Donāt prematurely return when closing database
- microcluster/internal/db: Add the API extensions check in the
db.Open
function - microcluster/internal/db: Store initial API extensions in the bootstraped internal cluster member
- microcluster/internal/db/test: Update unit tests to support API extensions
- microcluster/example: Add API extension manipulation examples
- internal/extensions: Fix extension regex
- internal/extensions: Add more extension regex tests
- build(deps): bump golang.org/x/sys from 0.19.0 to 0.20.0
- internal/rest/access: Add internal access package
- rest/access: Add external access package
- internal/rest/access: Remove internal access handlers
- internal/rest/resources: Update package imports
- example/cmd/microd: Fix example extension order
- internal/db: Donāt warn every time we try to check for API extensions
- internal/rest/resources: Add /internal/hooks endpoint
- internal/rest/resources: Use hooks endpoint for OnNewMember/PreRemove/PostRemove
- internal/rest/resources: Disallow clustering endpoint before bootstrapping
- internal/rest/resources: Add hooks API test
- example/cmd/microd: Remove internal package import
- Makefile: No need to run shellcheck or revive.
- workflows: Do not ignore lint errors.
- example/cmd: Unexport methods that are not referenced elsewhere (revive: exported).
- internal/extensions: Use
require
instead oflog.Fatal
(revive: deep-exit). - internal/extensions: Fix comments (godot).
- internal/db/update: Split up schema update transactions
- internal/db/update: Disable foreign keys for internal updates
- internal/db/update: Also set legacy_alter_table when running internal updates
- internal/extensions: Handle or explicitly ignore errors (errcheck).
- internal/rest/resources: Trailing newlines (whitespace).
- internal/rest/client: Trailing newlines (whitespace).
- example/cmd/microd: Set
(cmdGlobal).run
asPreRunE
for(cmdDaemon).run
(unused). - cluster: Add comments (revive: exported).
- cluster: Log error when closing rows (errcheck).
- cluster: Import ordering (gci).
- example/cmd/microctl: Import ordering (gci).
- internal/db/update: Remove globalSchemaUpdateManager.
- internal/db/update: Add comments and use consistent receiver naming.
- internal/db: Do not check equivalence on booleans.
- internal/db: Remove duplicate import (revive).
- internal/db: Add comments for exported methods (revive: exported).
- internal/db: Remove unnecessary whitespace (whitespace).
- internal/db: Log error on connection close (errcheck).
- internal/endpoints: Log error on listener close (errcheck).
- internal/rest/client: Import ordering (gci).
- internal/rest/client: Add comments (revive: exported).
- internal/rest/resources: Import ordering (gci).
- internal/rest/resources: Early return where possible (gosimple).
- internal/rest/resources: Fix spelling (spellcheck).
- internal/rest/resources: Log error on
rows.Close
(errcheck). - internal/rest/resources: Use
any
instead ofinterface{}
(use-any). - internal/rest/types: Use
any
instead ofinterface{}
(use-any). - internal/rest/types: Add comments (revive: exported).
- internal/sys: Handle errors on filewatcher close.
- internal/trust: Add comments (revive: exported).
- microcluster: Remove useless break (gosimple).
- microcluster: Check type assertions (revive: unchecked-type-assertion).
- rest/types: Add comment (revive: exported).
- Add .golangci config file.
- internal/daemon: Change argument to
initServer
. - internal/rest/resources: Change endpoint definitions from references to values.
- internal/db/update: Supply API extensions to the schema update manager
- internal/db/update: Add schema update for applying the first API extensions
- internal/db/update: Update tests
- fix(deps): update module github.com/google/renameio to v2
- fix(deps): update module gopkg.in/yaml.v2 to v3
- example/test: Add VERBOSE and improve INSPECT
- rest: Add type alias for
client.EndpointType
. - rest: Move
Resources
type into public package. - internal/rest/resources: Update endpoints to use new/moved types.
- rest: Add
Server
type. - internal/daemon: Add extension servers to Daemon.
- microcluster: Add extension servers to microcluster args.
- rest/access: Add an error type to indicate an invalid host address.
- internal/rest: Pass host address into Authenticate in top-level handler.
- rest/access: Check trusted state in
AllowAuthenticated
handler. - internal/rest: Refactor API request handler.
- internal/rest/types: Save trusted system in token response
- internal/rest/resources: Remove nodes that never made it into dqlite
- internal/rest/resources: Just grab cluster members from the database
- internal/rest/resources: Allow removing nodes if at least 1 is non-pending
- internal/rest/resources: Remove redundant truststore deletions
- internal/rest/resources: If force=true, donāt fail deletion if the node is unreachable
- internal/rest/resources: Split resetClusterMember into its own helper
- internal/rest/resources: Revert join process on an error
- build(deps): bump golang.org/x/sys from 0.20.0 to 0.21.0
- use cluster certificate if additional network listener certificate not provided
- internal: Prevent Daemon startup if control socket is present
- internal/daemon: Donāt error out if upgrade notification fails
- example/test: Check two daemons cannot run in the same state dir
- rest/types: Move EndpointType to types package
- internal/rest/client: Update usages
- example/client: Update example package
- internal/db/update: Donāt force the bugfix schema version early
- internal/db/update: Manually fix the schemas table only after all cluster members agree
- cluster: Create a temporary table to hold the real schema update count
- internal/db/update: Only insert rows into the temporary table if it doesnāt exist
- internal/db/update: Add triggers for cluster adding/removing
- allow core endpoints without /1.0 prefix using extensionServer
- allow extensionServer endpoints to be registered before cluster initialisation
- ensure Server.Address, Server.Protocol and Server.Certificate are unset if Server.CoreAPI is set to true
- remove extendedEndpoints in favor of using core endpoints defined in extensionServers
- adjust example to use extensionServers
- allow downstream app to define handler for /
- restrict to one core API listener for extensionServers
- prevent duplicate path prefix in a single server
- rename Resources.Path to Resources.PathPrefix
- remove ExtendedEndpoint with adjusted examples
- internal/rest/resources: Allow FQDN cluster names
- github: added .jira_sync_config.yaml for the synchronization with Jira
- internal/db: Add database status
- cluster: Fetch cluster members awaiting an upgrade
- internal/db/update: Include API extensions in version function
- internal/db: Return database status-related error from IsOpen
- internal/rest/resources: Update schema.Version usages
- internal/rest/resources: Update db.IsOpen usages
- internal/rest: Update AllowedBeforeInit error
- internal/daemon: Update daemon not initialized error check
- Add GetStatus helper
- internal/rest/resources: Allow shutdown during upgrades
- internal/daemon: Attempt to re-use control.socket if present
- rest: Add PreInit flag and add Server field comments
- internal/rest/resources: Validate all extension servers
- internal/daemon: Initialize extension servers based on core configuration
- microcluster: Add extension servers after initializing state directory
- rest: Add ServeUnix flag
- example/cmd/microd: Update usages
- internal/daemon: Move unix socket to startUnixServer function
- internal/daemon: Always fully shutdown the daemon
- internal/daemon: Clean up daemon on start errors
- internal/db: Donāt re-bind to dqlite on version check timeout
- cluster: Add DqliteMember (for recovery)
- internal/recover: Implement internal recovery helpers
- microcluster: Implement recovery API
- internal/daemon: Load recovery tarball on daemon start
- example/cmd/microctl: Implement cluster recovery
- example/test: Allow creating arbitrary-sized clusters
- example/cmd/microctl: Add cluster list flags
- example/test: Add cluster recovery test
- microcluster: Check /1.0 on all members during recovery
- internal/recover: Return recovery tarball path
- microcluster: Return recovery tarball path during recovery
- example/cmd/microctl: Report recovery tarball path during recovery
- internal/recover: Implement database backups
- microcluster: Take DB backup on cluster recover
- internal/rest/types: Add cluster member upgrade status
- internal/rest/resources: Report cluster member upgrade status
- example/cmd/microctl: Only print fingerprint for cluster member certificates
- internal/db: Donāt close the database on an upgrade timeout
- internal/db: Allow transactions if the database is in a waiting or ready state
- internal/rest/client: remove ā/ā from path prefix if endpointType has empty value
- allow modification of response if access handler returns a callback
- internal/db: Pass dial context through to dialer.Dial
- go: Update dependencies
- go: Remove unused deps
- Makefile: Update min Go version
- github: Fix Go matrix test with min version
- rest/access: Use new CheckMutualTLS from LXD
- Makefile: the toolchain directive should be better supported now
- internal/rest/client: Always send client certificates
- internal/extensions: Add
MarshalJSON
,UnmarshalJSON
,MarshalYAML
,UnmarshalYAML
methods - microcluster: Expose the API extensions to the status API
- internal/recover: Improve tarball handling during recovery
- internal/rest/resources/certificates: Use right file permissions on update
- internal/rest/resources/certificates: Make endpoint aware of the certificates name
- internal/sys: Add CertificatesDir for extra certificates
- internal/rest/resources/certificates: Store extra certificates in their own directory
- internal/daemon: Add ExtensionServers func
- internal/rest/resources/certificates: Restrict certificates to existing additional listeners
- rest/types: Add KeyPair struct
- internal/rest/resources: Use KeyPair for clusterCertificatePut
- internal/rest/client/cluster: Pass name to UpdateClusterCertificate
- internal/rest/client/cluster: Use KeyPair in UpdateClusterCertificate
- microcluster/app: Add UpdateCertificate
- rest/types: Add daemon Config type
- internal/config/daemon: Add DaemonConfig type
- rest/types: Move configurable Server fields into ServerConfig
- internal/daemon: Add lock for extensionServers
- internal/rest/resources: Add daemon/servers endpoint
- microcluster: Add client func to modify the additional listeners
- microcluster: Replace additional listener slice with map
- internal/daemon: Use dedicated config struct
- internal/endpoints: Allow to separate between core and extension endpoints
- internal/endpoints: Use map type to track endpoints
- internal/endpoints: Add EndpointsUnix and EndpointsCore constants
- internal/daemon: Use the new endpoint map structure
- internal/daemon: Add UpdateServers
- internal/daemon: Allow additional listeners having a dedicated cert
- internal/daemon: Make ReloadClusterCert generic
- internal/config/daemon: Allow dumping the daemonās config
- config/hooks: Add OnDaemonConfigUpdate and trigger on update
- internal/rest/types: Add additional certs to join response
- internal/rest/resources: Publish additional certificates on join
- internal/rest: Consistently use internalTypes package name
- rest: Fix linting complaint in imports
- internal/daemon: Remove the daemonās address field
- internal/daemon: Enforce additional listeners to always use TLS
- rest/types: Add CertificateName type and constant for cluster cert
- internal/rest/types: Use CertificateName type
- internal/endpoint: Add TLS and endpoint getters.
- internal/daemon: Populate initial listen address if set
- rest/types: Return empty string if AddrPort is empty
- internal/rest/resources: Default to empty AddrPort if daemon address is not set
- state: Move Hooks into state package
- internal/state: Add State interface
- internal/daemon: Set up state interface on daemon start
- internal/daemon: Supply hooks directly to InternalState
- internal/rest/resources: Update stage usages
- internal/db/update: Rename core tables
- cluster: Rename db types and functions to mention ācoreā
- internal/rest/resources: Update core table usages
- cluster: Grab core table name dynamically prior to upgrade
- internal/rest/client: Rename core endpoints
- internal/rest/resources: Expose ClusterMember types
- internal/rest/resources: Include cluster member details in OnNewMember hook
- internal/db: Pre-emptively prepare API extensions before waiting for schema update
- internal/state: Add version
- internal/daemon: Pass version field to state
- internal/rest: Supply version from /1.0
- microcluster: Require version in microcluster.Args on daemon start
- example/version: Prep version to be set by build system
- example/Makefile: Set version during build
- example/cmd/microd: Set microcluster/app version
- example/cmd/microctl: Use version getter
- internal/rest/resources: fix conflicting endpoint error for same paths on different listeners
- Removes CODEOWNERS file
- internal/db: Load StateDir/patch.global.sql during schema Ensure
- internal/state: Add context argument to all hooks
- internal/state: Pass shutdown context to OnStart
- internal/state: Pass context to StartAPI and its hooks
- internal/rest/resources: Pass request context to other hooks, and cancel on return
- example/cmd/microd: Update example package
- internal/rest/resources: Update tests
- internal/rest/resources: Improve join logic to handle unreachable nodes
- internal/daemon: Add UpdateServers tests
- microcluster: Clarify apiExtensions parameter
- gomod: Consistently use gopkg.in/yaml.v3
- gomod: Remove gopkg.in/yaml.v2 as direct dependency
- internal/rest/resources: Reset the daemon if bootstrapping fails
- internal/rest/resources: Ensure bootstrap/join API requires clean state
- internal/rest/resources: Run the PreRemove hook in bootstrap cleanup
- internal/db: Wrap dqlite startup error messages
- microcluster: Move recovery into internal package
- internal/recover: Move recovery into internal package
- internal/recover: Implement address changes during recovery
- internal/recover: Donāt use go-dqlite to parse cluster.yaml
- internal/recover: Update database/cluster.yaml directly
- internal/recover: Update info.yaml during tarball generation
- internal/recover: Update daemon.yaml during tarball generation
- internal/recover: Validate new addresses and roles
- example/test: Perform address change during recovery tests
- example/cmd/microctl: Update yaml comment instructions
- microcluster: Update doc comment for RecoverFromQuorumLoss
- internal/rest/resources: Run the PreRemove hook before re-exec
- internal/rest/resources: Log an error in case the bootstrap reset fails
- internal/rest/client: Remove unused types
- .github: Run example system tests in CI
- Join: Run the PreRemove hook on join failures
- internal/rest/types: Rename cluster endoints to core
- internal/rest/resources: Move public facing API endpoints
- internal/rest/resources: Move internal facing API endpoints
- internal/rest/client: Remove AddClusterMember and ResetClusterMember from Client
- internal/rest/client: Remove Heartbeat from Client
- internal/rest/client: Remove GetSQL and PostSQL from Client
- microcluster: Remove server and certificate update functions
- internal/db: Remove heartbeat loop
- internal/rest/client: Remove heartbeat client
- microcluster: Add project configurable heartbeat interval
- internal/rest/types: Add heartbeat related fields to hearbeat info
- internal/db: Use dqlite roles adjustment hook for heartbeat
- internal/rest/resources: Reference dqlite info instead of reaching out to dqlite
- internal/db: Enforce sequential leader probes
- go: Update go-dqlite
- internal/rest/resources: Donāt allow token issuing over the network
- internal/db/update: Add expiry_date column to core_token_records
- cluster: Update database mappings
- internal/rest/types: Split token Get & Post types
- internal/rest/resources: Update token payload usages
- go: Update LXD dependency
- internal/sys: Update KeyPairAndCA usage
- internal/daemon: Supply daemon name to extension server certs
- rest/types: Allow replacing the server keypair prior to init
- internal/db: Pass ServerCert as function to DB
- internal/rest/resources: Move all reverts to main function body
- internal/rest/resources: Replace server keypair if daemon name is not hostname
- internal/rest/resources: Verify joiner SAN when accepting join token
- example/test: Modularize system tests
- cluster: Add Expired method to token record
- internal/rest: Do not allow join requests with expired tokens
- internal/rest: Do not return expired tokens from tokensGet
- internal/rest: Calculate token expiry time at creation
- cluster: Implement expired token cleanup
- internal/rest: Delete expired tokens on heartbeat
- internal/rest: Delete expired tokens on
POST tokens
- example/cmd/microctl: Show token expiry in
tokens list
- example/cmd/microctl: Add flag for custom token expiration
- example/cmd: Add format flag for
tokens list
- example/test: Token tests
- internal/daemon: Refactor daemon.Run args into Args
- microcluster: Use DaemonArgs for daemon start
- example/cmd/microd: Use DaemonArgs
- example/cmd/microctl: Eliminate verbosity flags from microcluster clients
- internal/sys: Remove SocketGroup from OS
- internal/daemon: Add SocketGroup as a DaemonArg
- microcluster: Remove SocketDir as an App arg
- example/cmd/microd: Move SocketGroup to DaemonArgs
- internal/rest/resources: Move validateFQDN into dedicated utils package
- internal/rest/resources: Update usage of validateFQDN
- internal/daemon: Check if extension server name is a valid FQDN
- internal/daemon: Use extension server name in case DedicatedCertificate is true
- cluster: Select by member name instead of addressā¦
- internal/db: Add memberName to DB
- internal/db: Pass member name to UpdateClusterMember*
- internal/daemon: Pass name to DB
- internal/db: Add SchemaVersion helper
- internal/rest/resources: Use SchemaVersion helper
- internal/db: Add DB interface
- internal/db: Replace DB struct with DqliteDB
- internal/state: Return DB interface from State interface
- internal/rest/resources: Update internal database usage
- internal/db/update: Move schema update helpers to update package
- rest/types: Move DatabaseStatus to API package
- internal/rest/resources: Update DB status usages
- internal/db: Update tests
- gomod: Update dependencies
- gomod: Retract v1.0.0
- gomod: Update Go module to v2