]> dgit.raspbian.org Git - git-annex.git/commitdiff
set up proxies for cluster nodes that are themselves proxied via a remote
authorJoey Hess <joeyh@joeyh.name>
Wed, 26 Jun 2024 15:24:55 +0000 (11:24 -0400)
committerJoey Hess <joeyh@joeyh.name>
Wed, 26 Jun 2024 15:24:55 +0000 (11:24 -0400)
When there are multiple gateways to a cluster, this sets up proxying
for nodes that are accessed via a remote gateway.

Eg, when running in nyc and amsterdam is the remote gateway,
and it has node1 and node2, this sets up proxying for
amsterdam-node1 and amsterdam-node2. A client that has nyc as a remote
will see proxied remotes nyc-amsterdam-node1 and nyc-amsterdam-node2.

Command/UpdateCluster.hs
Command/UpdateProxy.hs
doc/git-annex-extendcluster.mdwn
doc/git-annex-updatecluster.mdwn

index 3a98ef43f4e18345a76f0ac2749e30a076fb9241..72b59233a6d1aaa65df2ed4bd073b51d4c5abb32 100644 (file)
@@ -50,7 +50,7 @@ start = startingCustomOutput (ActionItemOther Nothing) $ do
                let mynodes = S.map (ClusterNodeUUID . R.uuid) mynodesremotes
                let recordednodes = fromMaybe mempty $ M.lookup cu $
                        clusterUUIDs recordedclusters
-               proxiednodes <- findProxiedNodes recordednodes 
+               proxiednodes <- findProxiedClusterNodes recordednodes 
                let allnodes = S.union mynodes proxiednodes
                if recordednodes == allnodes
                        then liftIO $ putStrLn $ safeOutput $
@@ -74,8 +74,8 @@ start = startingCustomOutput (ActionItemOther Nothing) $ do
                                        "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 =
+findProxiedClusterNodes :: S.Set ClusterNodeUUID -> Annex (S.Set ClusterNodeUUID)
+findProxiedClusterNodes recordednodes =
        (S.fromList . map asclusternode . filter isproxynode) <$> R.remoteList
   where
        isproxynode r = 
index b30b20f8befacfa9733c154c4ed9503f088c971a..cbe7ae9a81e6210f939787eb07a5394118f96aff 100644 (file)
@@ -10,11 +10,11 @@ module Command.UpdateProxy where
 import Command
 import qualified Annex
 import Logs.Proxy
+import Logs.Cluster
 import Annex.UUID
 import qualified Remote as R
 import qualified Types.Remote as R
 import Utility.SafeOutput
-import Types.Cluster
 
 import qualified Data.Map as M
 import qualified Data.Set as S
@@ -32,10 +32,8 @@ start = startingCustomOutput (ActionItemOther Nothing) $ do
        rs <- R.remoteList
        let remoteproxies = S.fromList $ map mkproxy $
                filter (isproxy . R.gitconfig) rs
-       clusterproxies <-
-               (S.fromList . map mkclusterproxy . M.toList . annexClusters)
-               <$> Annex.getGitConfig
-       let proxies = remoteproxies <> clusterproxies
+       clusterproxies <- getClusterProxies
+       let proxies = S.union remoteproxies clusterproxies
        u <- getUUID
        oldproxies <- fromMaybe mempty . M.lookup u <$> getProxies
        if oldproxies == proxies
@@ -60,5 +58,38 @@ start = startingCustomOutput (ActionItemOther Nothing) $ do
        
        mkproxy r = Proxy (R.uuid r) (R.name r)
 
+-- Automatically proxy nodes of any cluster this repository is configured
+-- to serve as a gateway for. Also proxy other cluster nodes that are
+-- themselves proxied via other remotes.
+getClusterProxies :: Annex (S.Set Proxy)
+getClusterProxies = do
+       mynodes <- (map mkclusterproxy . M.toList . annexClusters)
+               <$> Annex.getGitConfig
+       remoteproxiednodes <- findRemoteProxiedClusterNodes
+       let mynodesuuids = S.fromList $ map proxyRemoteUUID mynodes
+       -- filter out nodes we proxy for from the remote proxied nodes
+       -- to avoid cycles
+       let remoteproxiednodes' = filter
+               (\n -> proxyRemoteUUID n `S.notMember` mynodesuuids)
+               remoteproxiednodes
+       return (S.fromList (mynodes ++ remoteproxiednodes'))
+  where
        mkclusterproxy (remotename, cu) = 
                Proxy (fromClusterUUID cu) remotename
+
+findRemoteProxiedClusterNodes :: Annex [Proxy]
+findRemoteProxiedClusterNodes = do
+       myclusters <- (S.fromList . M.elems . annexClusters)
+               <$> Annex.getGitConfig
+       clusternodes <- clusterNodeUUIDs <$> getClusters
+       let isproxiedclusternode r
+               | remoteAnnexProxied (R.gitconfig r) =
+                       case M.lookup (ClusterNodeUUID (R.uuid r)) clusternodes of
+                               Nothing -> False
+                               Just s -> not $ S.null $ 
+                                       S.intersection s myclusters
+               | otherwise = False
+       (map asproxy . filter isproxiedclusternode)
+               <$> R.remoteList
+  where
+       asproxy r = Proxy (R.uuid r) (R.name r)
index 53b6839652c7564a0eb897155d2ee91f7937bce2..79796fe6e839bc3a80a0d0a0c648e3b4bb0acc81 100644 (file)
@@ -17,8 +17,8 @@ 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 serves to the cluster,
-then run [[git-annex-updatecluster]]. See the documentation of
-that command for details about configuring nodes.
+then run [[git-annex-updatecluster]] on each gateway. 
+See the documentation of that command for details about configuring nodes.
 
 # OPTIONS
 
index f7adebb8cb0c113feac4ca567f00e1c9e9d09bb0..b40b417f731b935c4ae6fb0c63eff83d836850f1 100644 (file)
@@ -9,8 +9,8 @@ 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 the repository that will serve as a gateway
-to the cluster.
+branch, and set up proxying to the nodes. 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
 each remote. When that is set to the name of a cluster that has been