updatecluster: support multiple gateways

Just look at the existing proxied remotes that correspond to already
existing nodes of the cluster, and keep those nodes in the cluster.
While adding any remotes of the local repo that are configured as
cluster nodes. This allows removing cluster nodes from the local repo
and updating, without it also removing nodes provided by other gateways.
This commit is contained in:
Joey Hess 2024-06-26 10:51:14 -04:00
parent 0b72b85df5
commit 02bf3ddc3f
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
3 changed files with 19 additions and 7 deletions

View file

@ -50,23 +50,35 @@ start = startingCustomOutput (ActionItemOther Nothing) $ do
let mynodes = S.map (ClusterNodeUUID . R.uuid) mynodesremotes
let recordednodes = fromMaybe mempty $ M.lookup cu $
clusterUUIDs recordedclusters
if recordednodes == mynodes
proxiednodes <- findProxiedNodes recordednodes
let allnodes = S.union mynodes proxiednodes
if recordednodes == allnodes
then liftIO $ putStrLn $ safeOutput $
"No cluster node changes for cluster: " ++ clustername
else do
describechanges descs clustername recordednodes mynodes mynodesremotes
recordCluster cu mynodes
describechanges descs clustername recordednodes allnodes mynodesremotes
recordCluster cu allnodes
next $ return True
where
describechanges descs clustername oldnodes mynodes mynodesremotes = do
describechanges descs clustername oldnodes allnodes mynodesremotes = do
forM_ (S.toList mynodesremotes) $ \r ->
unless (S.member (ClusterNodeUUID (R.uuid r)) oldnodes) $
liftIO $ putStrLn $ safeOutput $
"Added node " ++ R.name r ++ " to cluster: " ++ clustername
forM_ (S.toList oldnodes) $ \n ->
unless (S.member n mynodes) $ do
unless (S.member n allnodes) $ do
let desc = maybe (fromUUID (fromClusterNodeUUID n)) fromUUIDDesc $
M.lookup (fromClusterNodeUUID n) descs
liftIO $ putStrLn $ safeOutput $
"Removed node " ++ desc ++ " from cluster: " ++ clustername
-- Finds nodes that are proxied by other cluster gateways.
findProxiedNodes :: S.Set ClusterNodeUUID -> Annex (S.Set ClusterNodeUUID)
findProxiedNodes recordednodes =
(S.fromList . map asclusternode . filter isproxynode) <$> R.remoteList
where
isproxynode r =
asclusternode r `S.member` recordednodes
&& remoteAnnexProxied (R.gitconfig r)
asclusternode = ClusterNodeUUID . R.uuid

View file

@ -16,7 +16,7 @@ gateway to the cluster. The `gateway` parameter is the name of that remote.
The `clustername` parameter is the name of the cluster.
The next step after running this command is to configure
any additional cluster nodes that this gateway provide to the cluster,
any additional cluster nodes that this gateway serves to the cluster,
then run [[git-annex-updatecluster]]. See the documentation of
that command for details about configuring nodes.

View file

@ -9,7 +9,7 @@ git-annex updatecluster
# DESCRIPTION
This command is used to record the nodes of a cluster in the git-annex
branch. It should be run in each repository that will serve as a gateway
branch. It should be run in the repository that will serve as a gateway
to the cluster.
It looks at the git config `remote.name.annex-cluster-node` of