- -> (Node.AssocList,
- Instance.AssocList) -- ^ Data from either Text.loadData
- -- or Rapi.loadData
- -> Result (Node.List, Instance.List, String)
-mergeData um (nl, il) = do
- let il2 = Container.fromAssocList il
- il3 <- foldM (\im (name, n_util) -> do
- inst <- Container.findByName im name
- let new_i = inst { Instance.util = n_util }
- return $ Container.add (Instance.idx inst) new_i im
- ) il2 um
- let nl2 = foldl' fixNodes nl (Container.elems il3)
- let nl3 = Container.fromAssocList
- (map (\ (k, v) -> (k, Node.buildPeers v il3)) nl2)
- node_names = map Node.name $ Container.elems nl3
- inst_names = map Instance.name $ Container.elems il3
+ -> [String] -- ^ Exclusion tags
+ -> [String] -- ^ Untouchable instances
+ -> (Node.List, Instance.List, [String])
+ -- ^ Data from backends
+ -> Result (Node.List, Instance.List, [String])
+mergeData um extags exinsts (nl, il2, tags) =
+ let il = Container.elems il2
+ il3 = foldl' (\im (name, n_util) ->
+ case Container.findByName im name of
+ Nothing -> im -- skipping unknown instance
+ Just inst ->
+ let new_i = inst { Instance.util = n_util }
+ in Container.add (Instance.idx inst) new_i im
+ ) il2 um
+ allextags = extags ++ extractExTags tags
+ il4 = Container.map (filterExTags allextags .
+ updateMovable exinsts) il3
+ nl2 = foldl' fixNodes nl (Container.elems il4)
+ nl3 = Container.map (\node -> Node.buildPeers node il4) nl2
+ node_names = map Node.name (Container.elems nl)
+ inst_names = map Instance.name il