@@ -2,6 +2,7 @@ use graph::{
2
2
anyhow:: Error ,
3
3
blockchain:: BlockchainKind ,
4
4
firehose:: { SubgraphLimit , SUBGRAPHS_PER_CONN } ,
5
+ itertools:: Itertools ,
5
6
prelude:: {
6
7
anyhow:: { anyhow, bail, Context , Result } ,
7
8
info,
@@ -518,8 +519,14 @@ fn default_blockchain_kind() -> BlockchainKind {
518
519
519
520
impl Chain {
520
521
fn validate ( & mut self ) -> Result < ( ) > {
521
- // `Config` validates that `self.shard` references a configured shard
522
+ let mut labels = self . providers . iter ( ) . map ( |p| & p. label ) . collect_vec ( ) ;
523
+ labels. sort ( ) ;
524
+ labels. dedup ( ) ;
525
+ if labels. len ( ) != self . providers . len ( ) {
526
+ return Err ( anyhow ! ( "Provider labels must be unique" ) ) ;
527
+ }
522
528
529
+ // `Config` validates that `self.shard` references a configured shard
523
530
for provider in self . providers . iter_mut ( ) {
524
531
provider. validate ( ) ?
525
532
}
@@ -1147,7 +1154,7 @@ where
1147
1154
#[ cfg( test) ]
1148
1155
mod tests {
1149
1156
1150
- use crate :: config:: Web3Rule ;
1157
+ use crate :: config:: { ChainSection , Web3Rule } ;
1151
1158
1152
1159
use super :: {
1153
1160
Chain , Config , FirehoseProvider , Provider , ProviderDetails , Transport , Web3Provider ,
@@ -1702,4 +1709,55 @@ mod tests {
1702
1709
assert ! ( SubgraphLimit :: Unlimited > SubgraphLimit :: Limit ( 10 ) ) ;
1703
1710
assert ! ( SubgraphLimit :: Limit ( 10 ) > SubgraphLimit :: Disabled ) ;
1704
1711
}
1712
+
1713
+ #[ test]
1714
+ fn duplicated_labels_are_not_allowed_within_chain ( ) {
1715
+ let mut actual = toml:: from_str :: < ChainSection > (
1716
+ r#"
1717
+ ingestor = "block_ingestor_node"
1718
+ [mainnet]
1719
+ shard = "vip"
1720
+ provider = [
1721
+ { label = "mainnet1", url = "http://127.0.0.1", features = [], headers = { Authorization = "Bearer foo" } },
1722
+ { label = "mainnet1", url = "http://127.0.0.1", features = [ "archive", "traces" ] }
1723
+ ]
1724
+ "# ,
1725
+ )
1726
+ . unwrap ( ) ;
1727
+
1728
+ let err = actual. validate ( ) ;
1729
+ assert_eq ! ( true , err. is_err( ) ) ;
1730
+ let err = err. unwrap_err ( ) ;
1731
+ assert_eq ! (
1732
+ true ,
1733
+ err. to_string( ) . contains( "unique" ) ,
1734
+ "result: {:?}" ,
1735
+ err
1736
+ ) ;
1737
+ }
1738
+
1739
+ #[ test]
1740
+ fn duplicated_labels_are_allowed_on_different_chain ( ) {
1741
+ let mut actual = toml:: from_str :: < ChainSection > (
1742
+ r#"
1743
+ ingestor = "block_ingestor_node"
1744
+ [mainnet]
1745
+ shard = "vip"
1746
+ provider = [
1747
+ { label = "mainnet1", url = "http://127.0.0.1", features = [], headers = { Authorization = "Bearer foo" } },
1748
+ { label = "mainnet2", url = "http://127.0.0.1", features = [ "archive", "traces" ] }
1749
+ ]
1750
+ [mainnet2]
1751
+ shard = "vip"
1752
+ provider = [
1753
+ { label = "mainnet1", url = "http://127.0.0.1", features = [], headers = { Authorization = "Bearer foo" } },
1754
+ { label = "mainnet2", url = "http://127.0.0.1", features = [ "archive", "traces" ] }
1755
+ ]
1756
+ "# ,
1757
+ )
1758
+ . unwrap ( ) ;
1759
+
1760
+ let result = actual. validate ( ) ;
1761
+ assert_eq ! ( true , result. is_ok( ) , "error: {:?}" , result. unwrap_err( ) ) ;
1762
+ }
1705
1763
}
0 commit comments