Skip to content

Instantly share code, notes, and snippets.

@misterikkit
Last active June 1, 2018 23:46
Show Gist options
  • Save misterikkit/16c7c36311f1f4029305348cc3f40654 to your computer and use it in GitHub Desktop.
Save misterikkit/16c7c36311f1f4029305348cc3f40654 to your computer and use it in GitHub Desktop.
Architecture diagram of the k8s scheduler
digraph scheduler {
graph [fontname = "helvetica", pad="0.5", nodesep="1", ranksep="2"];
node [fontname = "mono", shape = "box"];
edge [fontname = "helvetica"];
label="\nA partial picture of the k8s scheduler architecture\n"
subgraph cluster_legend {
style=dashed;
label="legend"
structVal [shape="octagon",label="struct value"]
type [shape="box",label="struct type"]
interface [shape="box", style="dashed"]
funcObj [shape="ellipse",style="dashed",label="func value"]
funcType [shape="ellipse",style="dotted",label="func type"]
func [shape="ellipse"]
}
// Create subgraphs to group nodes.
subgraph cluster_predicate {
label=""
color="none"
}
subgraph cluster_priority {
label=""
color="none"
}
subgraph cluster_config {
label=""
color="none"
}
subgraph cluster_core {
label=""
color="none"
}
//----------------------------------------
// scheduler.go
subgraph cluster_core {
Scheduler
}
Scheduler -> Config [label="has"]
NewFromConfigurator -> Scheduler [label="produces"]
subgraph cluster_config {
Config
}
Config -> Cache [label="has"]
Config -> eCache [label="has"]
Config -> ScheduleAlgorithm [label="has"]
Config -> GetBinder [label="has"]
Config -> PodConditionUpdater [label="has"]
Config -> PodPreemptor [label="has"]
// TODO: add other func fields
subgraph cluster_config {
Configurator [style="dashed"]
}
Configurator -> Config [label="produces"]
Binder [style="dashed"]
PodConditionUpdater [style="dashed"]
PodPreemptor [style="dashed"]
NewFromConfigurator [shape="ellipse"]
GetBinder [shape="ellipse",style="dashed"]
GetBinder -> Binder [label="produces"]
//----------------------------------------
// factory/factory.go
subgraph cluster_config {
configFactory
}
configFactory -> listers [label="has"]
configFactory -> genericScheduler [label="creates"] // Keep this?
configFactory -> Configurator [label="implements"]
//configFactory -> Clientset [label="has"]
NewConfigFactory -> configFactory [label="produces"]
NewConfigFactory [shape="ellipse"]
listers [label="Various Listers",style="dashed"]
listers -> Cache [label="updates"]
listers -> eCache [label="updates"]
listers -> SchedulingQueue [label="updates"]
binder
binder -> Binder [label="implements"]
GetBinder->binder [label="has"]
GetBinder->SchedulerExtender [label="has"]
//----------------------------------------
// factory/plugins.go
subgraph cluster_config {
AlgorithmProviderConfig
}
AlgorithmProviderConfig -> ScheduleAlgorithm [label="produces*"]
subgraph cluster_predicate{
PredicateMetadataProducerFactory [shape="ellipse",style="dotted"]
}
PredicateMetadataProducerFactory -> PredicateMetadataProducer [label="produces"]
subgraph cluster_priority {
PriorityMetadataProducerFactory [shape="ellipse",style="dotted"]
}
PriorityMetadataProducerFactory -> PriorityMetadataProducer [label="produces"]
//----------------------------------------
// algorithmprovider/defaults/defaults.go
subgraph cluster_config {
DefaultProvider [shape="octagon"]
ClusterAutoscaleProvider [shape="octagon"]
}
defaults [shape="ellipse",label="defaults.init()"]
//----------------------------------------
// core/generic_scheduler.go
subgraph cluster_core {
genericScheduler
}
genericScheduler -> Cache [label="has"]
genericScheduler -> eCache [label="has"]
genericScheduler -> SchedulingQueue [label="has"]
genericScheduler -> PredicateMetadataProducer [label="has"]
genericScheduler -> PriorityMetadataProducer [label="has"]
genericScheduler -> SchedulerExtender [label="has many"]
genericScheduler -> ScheduleAlgorithm [label="implements"]
//----------------------------------------
// core/extender.go
HTTPExtender -> SchedulerExtender [label="implements"]
//----------------------------------------
// core/scheduling_queue.go
subgraph cluster_core {
SchedulingQueue [style="dashed"]
// hide queue detail
//FIFO -> SchedulingQueue [label="implements"]
//PriorityQueue -> SchedulingQueue [label="implements"]
}
//----------------------------------------
// core/equivalence/equivalence.go
subgraph cluster_core {
eCache [label="equivalence.Cache"]
}
//----------------------------------------
// algorithm/types.go
subgraph cluster_predicate {
PredicateMetadataProducer [shape="ellipse",style="dashed"]
}
PredicateMetadataProducer -> PredicateMetadata [label="produces"]
subgraph cluster_priority {
PriorityMetadataProducer [shape="ellipse",style="dashed"]
}
PriorityMetadataProducer -> PriorityMetadata [label="produces"]
subgraph cluster_predicate {
PredicateMetadata [style="dashed"]
}
subgraph cluster_priority {
PriorityMetadata [style="dashed",label="PriorityMetadata\n(actually interface{})"]
}
//----------------------------------------
// algorithm/scheduler_interface.go (algorithm)
subgraph cluster_core {
ScheduleAlgorithm [style="dashed"]
}
SchedulerExtender [style="dashed"]
SchedulerExtender -> Binder [label="implements"]
//----------------------------------------
// algorithm/predicates/metadata.go
subgraph cluster_predicate {
PredicateMetadataFactory
predicateMetadata
}
PredicateMetadataFactory -> PredicateMetadataProducer [label="implements*"]
PredicateMetadataFactory -> predicateMetadata [label="produces"]
predicateMetadata -> PredicateMetadata [label="implements"]
// algorithm/priorities/metadata.go
subgraph cluster_priority {
PriorityMetadataFactory
priorityMetadata
listers2 [label="Various Listers",style="dashed"]
}
PriorityMetadataFactory -> PriorityMetadataProducer [label="implements*"]
PriorityMetadataFactory -> priorityMetadata [label="produces"]
PriorityMetadataFactory -> listers2 [label="has"]
priorityMetadata -> PriorityMetadata [label="implements"]
//----------------------------------------
// cache/interface.go
subgraph cluster_core {
Cache [label="cache.Cache",style="dashed"]
}
// REGISTERS
DefaultProvider -> AlgorithmProviderConfig [label="RegisterAlgorithmProvider"]
ClusterAutoscaleProvider -> AlgorithmProviderConfig [label="RegisterAlgorithmProvider"]
configFactory->AlgorithmProviderConfig [label="GetAlgorithmProvider"] // TODO: maybe delete this edge
defaults->PredicateMetadataProducerFactory[label="RegisterPredicateMetadataProducerFactory"]
defaults->PriorityMetadataProducerFactory[label="RegisterPriorityMetadataProducerFactory"]
configFactory->PredicateMetadataProducer [label="GetPredicateMetadataProducer"]
configFactory->PriorityMetadataProducer [label="GetPriorityMetadataProducer"]
}
// TODO: informers & clientset
// TODO: volumebinder?
Display the source blob
Display the rendered blob
Raw
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.38.0 (20140413.2041)
-->
<!-- Title: scheduler Pages: 1 -->
<svg width="4051pt" height="1381pt"
viewBox="0.00 0.00 4051.00 1381.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 1345)">
<title>scheduler</title>
<polygon fill="white" stroke="none" points="-36,36 -36,-1345 4015,-1345 4015,36 -36,36"/>
<text text-anchor="middle" x="1989.5" y="-7.8" font-family="Helvetica,sans-Serif" font-size="14.00">A partial picture of the k8s scheduler architecture</text>
<g id="clust1" class="cluster"><title>cluster_legend</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="8,-1203 8,-1301 1057,-1301 1057,-1203 8,-1203"/>
<text text-anchor="middle" x="532.5" y="-1285.8" font-family="Helvetica,sans-Serif" font-size="14.00">legend</text>
</g>
<g id="clust2" class="cluster"><title>cluster_predicate</title>
<polygon fill="none" stroke="none" points="2444,-227 2444,-670 3113,-670 3113,-227 2444,-227"/>
</g>
<g id="clust3" class="cluster"><title>cluster_priority</title>
<polygon fill="none" stroke="none" points="3121,-226 3121,-670 3850,-670 3850,-226 3121,-226"/>
</g>
<g id="clust4" class="cluster"><title>cluster_config</title>
<polygon fill="none" stroke="none" points="438,-618 438,-1060 1287,-1060 1287,-618 438,-618"/>
</g>
<g id="clust5" class="cluster"><title>cluster_core</title>
<polygon fill="none" stroke="none" points="1443,-423 1443,-670 2237,-670 2237,-423 1443,-423"/>
</g>
<!-- structVal -->
<g id="node1" class="node"><title>structVal</title>
<polygon fill="none" stroke="black" points="1048.71,-1221.54 1048.71,-1236.46 1000.85,-1247 933.154,-1247 885.29,-1236.46 885.29,-1221.54 933.154,-1211 1000.85,-1211 1048.71,-1221.54"/>
<text text-anchor="middle" x="967" y="-1225.3" font-family="mono" font-size="14.00">struct value</text>
</g>
<!-- type -->
<g id="node2" class="node"><title>type</title>
<polygon fill="none" stroke="black" points="813.5,-1247 706.5,-1247 706.5,-1211 813.5,-1211 813.5,-1247"/>
<text text-anchor="middle" x="760" y="-1225.3" font-family="mono" font-size="14.00">struct type</text>
</g>
<!-- interface -->
<g id="node3" class="node"><title>interface</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="634.5,-1247 543.5,-1247 543.5,-1211 634.5,-1211 634.5,-1247"/>
<text text-anchor="middle" x="589" y="-1225.3" font-family="mono" font-size="14.00">interface</text>
</g>
<!-- funcObj -->
<g id="node4" class="node"><title>funcObj</title>
<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="407" cy="-1229" rx="64.189" ry="18"/>
<text text-anchor="middle" x="407" y="-1225.3" font-family="mono" font-size="14.00">func value</text>
</g>
<!-- funcType -->
<g id="node5" class="node"><title>funcType</title>
<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="212" cy="-1229" rx="59.2899" ry="18"/>
<text text-anchor="middle" x="212" y="-1225.3" font-family="mono" font-size="14.00">func type</text>
</g>
<!-- func -->
<g id="node6" class="node"><title>func</title>
<ellipse fill="none" stroke="black" cx="48" cy="-1229" rx="32.4942" ry="18"/>
<text text-anchor="middle" x="48" y="-1225.3" font-family="mono" font-size="14.00">func</text>
</g>
<!-- Scheduler -->
<g id="node7" class="node"><title>Scheduler</title>
<polygon fill="none" stroke="black" points="2150.5,-662 2059.5,-662 2059.5,-626 2150.5,-626 2150.5,-662"/>
<text text-anchor="middle" x="2105" y="-640.3" font-family="mono" font-size="14.00">Scheduler</text>
</g>
<!-- Config -->
<g id="node8" class="node"><title>Config</title>
<polygon fill="none" stroke="black" points="1015,-662 949,-662 949,-626 1015,-626 1015,-662"/>
<text text-anchor="middle" x="982" y="-640.3" font-family="mono" font-size="14.00">Config</text>
</g>
<!-- Scheduler&#45;&gt;Config -->
<g id="edge1" class="edge"><title>Scheduler&#45;&gt;Config</title>
<path fill="none" stroke="black" d="M2059.07,-660.555C2047.44,-664.195 2034.87,-667.658 2023,-670 1851.74,-703.794 1412.16,-761.86 1240,-733 1161.42,-719.827 1074.75,-685.557 1024.52,-663.591"/>
<polygon fill="black" stroke="black" points="1025.84,-660.346 1015.28,-659.506 1023.01,-666.749 1025.84,-660.346"/>
<text text-anchor="middle" x="1251" y="-737.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- Cache -->
<g id="node10" class="node"><title>Cache</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="2016.5,-467 1909.5,-467 1909.5,-431 2016.5,-431 2016.5,-467"/>
<text text-anchor="middle" x="1963" y="-445.3" font-family="mono" font-size="14.00">cache.Cache</text>
</g>
<!-- Config&#45;&gt;Cache -->
<g id="edge3" class="edge"><title>Config&#45;&gt;Cache</title>
<path fill="none" stroke="black" d="M1015.38,-629.973C1073.37,-607.859 1196.89,-563.039 1305,-539 1553.4,-483.768 1621.64,-506.633 1873,-467 1881.56,-465.65 1890.55,-464.105 1899.41,-462.509"/>
<polygon fill="black" stroke="black" points="1900.11,-465.938 1909.31,-460.692 1898.85,-459.053 1900.11,-465.938"/>
<text text-anchor="middle" x="1316" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- eCache -->
<g id="node11" class="node"><title>eCache</title>
<polygon fill="none" stroke="black" points="1837.5,-467 1680.5,-467 1680.5,-431 1837.5,-431 1837.5,-467"/>
<text text-anchor="middle" x="1759" y="-445.3" font-family="mono" font-size="14.00">equivalence.Cache</text>
</g>
<!-- Config&#45;&gt;eCache -->
<g id="edge4" class="edge"><title>Config&#45;&gt;eCache</title>
<path fill="none" stroke="black" d="M991.914,-625.904C1006.81,-601.971 1037.38,-559.155 1076,-539 1301.59,-421.274 1391.9,-501.608 1644,-467 1652.57,-465.823 1661.5,-464.564 1670.42,-463.283"/>
<polygon fill="black" stroke="black" points="1671.07,-466.725 1680.47,-461.83 1670.07,-459.797 1671.07,-466.725"/>
<text text-anchor="middle" x="1087" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- ScheduleAlgorithm -->
<g id="node12" class="node"><title>ScheduleAlgorithm</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="1608.5,-467 1451.5,-467 1451.5,-431 1608.5,-431 1608.5,-467"/>
<text text-anchor="middle" x="1530" y="-445.3" font-family="mono" font-size="14.00">ScheduleAlgorithm</text>
</g>
<!-- Config&#45;&gt;ScheduleAlgorithm -->
<g id="edge5" class="edge"><title>Config&#45;&gt;ScheduleAlgorithm</title>
<path fill="none" stroke="black" d="M974.796,-625.974C966.468,-603.292 956.368,-563.218 977,-539 1006.72,-504.109 1292.63,-472.336 1441.24,-458.014"/>
<polygon fill="black" stroke="black" points="1441.64,-461.492 1451.26,-457.055 1440.97,-454.524 1441.64,-461.492"/>
<text text-anchor="middle" x="988" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- GetBinder -->
<g id="node13" class="node"><title>GetBinder</title>
<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="1012" cy="-449" rx="59.2899" ry="18"/>
<text text-anchor="middle" x="1012" y="-445.3" font-family="mono" font-size="14.00">GetBinder</text>
</g>
<!-- Config&#45;&gt;GetBinder -->
<g id="edge6" class="edge"><title>Config&#45;&gt;GetBinder</title>
<path fill="none" stroke="black" d="M948.723,-629.101C911.012,-611.151 857.303,-577.592 878,-539 896.421,-504.651 934.583,-481.303 965.486,-467.169"/>
<polygon fill="black" stroke="black" points="967.063,-470.3 974.814,-463.077 964.25,-463.889 967.063,-470.3"/>
<text text-anchor="middle" x="889" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- PodConditionUpdater -->
<g id="node14" class="node"><title>PodConditionUpdater</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="660.5,-467 487.5,-467 487.5,-431 660.5,-431 660.5,-467"/>
<text text-anchor="middle" x="574" y="-445.3" font-family="mono" font-size="14.00">PodConditionUpdater</text>
</g>
<!-- Config&#45;&gt;PodConditionUpdater -->
<g id="edge7" class="edge"><title>Config&#45;&gt;PodConditionUpdater</title>
<path fill="none" stroke="black" d="M948.895,-628.572C909.436,-611.271 841.595,-581.194 784,-554 725.684,-526.465 659.073,-493.156 616.797,-471.78"/>
<polygon fill="black" stroke="black" points="618.139,-468.537 607.636,-467.142 614.977,-474.782 618.139,-468.537"/>
<text text-anchor="middle" x="795" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- PodPreemptor -->
<g id="node15" class="node"><title>PodPreemptor</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="849,-467 733,-467 733,-431 849,-431 849,-467"/>
<text text-anchor="middle" x="791" y="-445.3" font-family="mono" font-size="14.00">PodPreemptor</text>
</g>
<!-- Config&#45;&gt;PodPreemptor -->
<g id="edge8" class="edge"><title>Config&#45;&gt;PodPreemptor</title>
<path fill="none" stroke="black" d="M948.993,-630.442C915.91,-616.354 865.492,-590.585 834,-554 814.854,-531.757 803.372,-499.811 797.151,-477.206"/>
<polygon fill="black" stroke="black" points="800.469,-476.054 794.583,-467.245 793.691,-477.802 800.469,-476.054"/>
<text text-anchor="middle" x="845" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- NewFromConfigurator -->
<g id="node9" class="node"><title>NewFromConfigurator</title>
<ellipse fill="none" stroke="black" cx="2105" cy="-839" rx="112.38" ry="18"/>
<text text-anchor="middle" x="2105" y="-835.3" font-family="mono" font-size="14.00">NewFromConfigurator</text>
</g>
<!-- NewFromConfigurator&#45;&gt;Scheduler -->
<g id="edge2" class="edge"><title>NewFromConfigurator&#45;&gt;Scheduler</title>
<path fill="none" stroke="black" d="M2105,-820.873C2105,-787.323 2105,-712.707 2105,-672.287"/>
<polygon fill="black" stroke="black" points="2108.5,-672.089 2105,-662.089 2101.5,-672.089 2108.5,-672.089"/>
<text text-anchor="middle" x="2134.5" y="-737.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- Binder -->
<g id="node17" class="node"><title>Binder</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="1077,-75 1011,-75 1011,-39 1077,-39 1077,-75"/>
<text text-anchor="middle" x="1044" y="-53.3" font-family="mono" font-size="14.00">Binder</text>
</g>
<!-- GetBinder&#45;&gt;Binder -->
<g id="edge10" class="edge"><title>GetBinder&#45;&gt;Binder</title>
<path fill="none" stroke="black" d="M1013.4,-430.991C1018.42,-369.787 1035.6,-160.416 1041.77,-85.1901"/>
<polygon fill="black" stroke="black" points="1045.27,-85.3509 1042.6,-75.0981 1038.29,-84.7784 1045.27,-85.3509"/>
<text text-anchor="middle" x="1060.5" y="-249.3" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- binder -->
<g id="node23" class="node"><title>binder</title>
<polygon fill="none" stroke="black" points="900,-271 834,-271 834,-235 900,-235 900,-271"/>
<text text-anchor="middle" x="867" y="-249.3" font-family="mono" font-size="14.00">binder</text>
</g>
<!-- GetBinder&#45;&gt;binder -->
<g id="edge19" class="edge"><title>GetBinder&#45;&gt;binder</title>
<path fill="none" stroke="black" d="M999.386,-431.123C973.902,-397.027 916.152,-319.762 886.052,-279.49"/>
<polygon fill="black" stroke="black" points="888.686,-277.169 879.896,-271.254 883.079,-281.359 888.686,-277.169"/>
<text text-anchor="middle" x="955" y="-347.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- SchedulerExtender -->
<g id="node24" class="node"><title>SchedulerExtender</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="1333.5,-271 1176.5,-271 1176.5,-235 1333.5,-235 1333.5,-271"/>
<text text-anchor="middle" x="1255" y="-249.3" font-family="mono" font-size="14.00">SchedulerExtender</text>
</g>
<!-- GetBinder&#45;&gt;SchedulerExtender -->
<g id="edge20" class="edge"><title>GetBinder&#45;&gt;SchedulerExtender</title>
<path fill="none" stroke="black" d="M1032.3,-431.793C1075.3,-397.46 1175.73,-317.288 1225.69,-277.399"/>
<polygon fill="black" stroke="black" points="1227.92,-280.102 1233.55,-271.127 1223.55,-274.631 1227.92,-280.102"/>
<text text-anchor="middle" x="1152" y="-347.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- Configurator -->
<g id="node16" class="node"><title>Configurator</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="1158,-857 1042,-857 1042,-821 1158,-821 1158,-857"/>
<text text-anchor="middle" x="1100" y="-835.3" font-family="mono" font-size="14.00">Configurator</text>
</g>
<!-- Configurator&#45;&gt;Config -->
<g id="edge9" class="edge"><title>Configurator&#45;&gt;Config</title>
<path fill="none" stroke="black" d="M1089.53,-820.873C1068.75,-786.894 1022.22,-710.792 997.745,-670.752"/>
<polygon fill="black" stroke="black" points="1000.65,-668.795 992.448,-662.089 994.678,-672.447 1000.65,-668.795"/>
<text text-anchor="middle" x="1074.5" y="-737.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- configFactory -->
<g id="node18" class="node"><title>configFactory</title>
<polygon fill="none" stroke="black" points="1279,-1052 1155,-1052 1155,-1016 1279,-1016 1279,-1052"/>
<text text-anchor="middle" x="1217" y="-1030.3" font-family="mono" font-size="14.00">configFactory</text>
</g>
<!-- configFactory&#45;&gt;Configurator -->
<g id="edge13" class="edge"><title>configFactory&#45;&gt;Configurator</title>
<path fill="none" stroke="black" d="M1206.62,-1015.87C1186.02,-981.894 1139.88,-905.792 1115.61,-865.752"/>
<polygon fill="black" stroke="black" points="1118.54,-863.826 1110.36,-857.089 1112.55,-867.455 1118.54,-863.826"/>
<text text-anchor="middle" x="1198" y="-932.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements</text>
</g>
<!-- listers -->
<g id="node19" class="node"><title>listers</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="1435,-662 1295,-662 1295,-626 1435,-626 1435,-662"/>
<text text-anchor="middle" x="1365" y="-640.3" font-family="mono" font-size="14.00">Various Listers</text>
</g>
<!-- configFactory&#45;&gt;listers -->
<g id="edge11" class="edge"><title>configFactory&#45;&gt;listers</title>
<path fill="none" stroke="black" d="M1223.52,-1015.94C1230.37,-998.025 1241.45,-969.034 1251,-944 1289.35,-843.519 1334.89,-724.019 1354.82,-671.729"/>
<polygon fill="black" stroke="black" points="1358.16,-672.783 1358.45,-662.192 1351.62,-670.29 1358.16,-672.783"/>
<text text-anchor="middle" x="1308" y="-835.3" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- genericScheduler -->
<g id="node20" class="node"><title>genericScheduler</title>
<polygon fill="none" stroke="black" points="1987.5,-662 1838.5,-662 1838.5,-626 1987.5,-626 1987.5,-662"/>
<text text-anchor="middle" x="1913" y="-640.3" font-family="mono" font-size="14.00">genericScheduler</text>
</g>
<!-- configFactory&#45;&gt;genericScheduler -->
<g id="edge12" class="edge"><title>configFactory&#45;&gt;genericScheduler</title>
<path fill="none" stroke="black" d="M1247.8,-1015.83C1360.09,-953.23 1747.44,-737.296 1873.21,-667.179"/>
<polygon fill="black" stroke="black" points="1875.13,-670.12 1882.16,-662.194 1871.72,-664.006 1875.13,-670.12"/>
<text text-anchor="middle" x="1612" y="-835.3" font-family="Helvetica,sans-Serif" font-size="14.00">creates</text>
</g>
<!-- AlgorithmProviderConfig -->
<g id="node25" class="node"><title>AlgorithmProviderConfig</title>
<polygon fill="none" stroke="black" points="915,-857 709,-857 709,-821 915,-821 915,-857"/>
<text text-anchor="middle" x="812" y="-835.3" font-family="mono" font-size="14.00">AlgorithmProviderConfig</text>
</g>
<!-- configFactory&#45;&gt;AlgorithmProviderConfig -->
<g id="edge44" class="edge"><title>configFactory&#45;&gt;AlgorithmProviderConfig</title>
<path fill="none" stroke="black" d="M1172.14,-1015.92C1128.42,-998.915 1060.35,-971.445 1003,-944 948.611,-917.97 887.753,-883.945 849.661,-862.029"/>
<polygon fill="black" stroke="black" points="851.364,-858.971 840.954,-857.002 847.864,-865.033 851.364,-858.971"/>
<text text-anchor="middle" x="1070" y="-932.8" font-family="Helvetica,sans-Serif" font-size="14.00">GetAlgorithmProvider</text>
</g>
<!-- PredicateMetadataProducer -->
<g id="node27" class="node"><title>PredicateMetadataProducer</title>
<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="2648" cy="-449" rx="144.874" ry="18"/>
<text text-anchor="middle" x="2648" y="-445.3" font-family="mono" font-size="14.00">PredicateMetadataProducer</text>
</g>
<!-- configFactory&#45;&gt;PredicateMetadataProducer -->
<g id="edge47" class="edge"><title>configFactory&#45;&gt;PredicateMetadataProducer</title>
<path fill="none" stroke="black" d="M1279.28,-1028.78C1477.28,-1014.38 2088.97,-962.199 2253,-857 2361.23,-787.589 2326.37,-710.188 2416,-618 2476.05,-556.237 2561.05,-501.14 2609.75,-471.965"/>
<polygon fill="black" stroke="black" points="2611.59,-474.939 2618.4,-466.823 2608.02,-468.921 2611.59,-474.939"/>
<text text-anchor="middle" x="2444" y="-737.8" font-family="Helvetica,sans-Serif" font-size="14.00">GetPredicateMetadataProducer</text>
</g>
<!-- PriorityMetadataProducer -->
<g id="node29" class="node"><title>PriorityMetadataProducer</title>
<ellipse fill="none" stroke="black" stroke-dasharray="5,2" cx="3702" cy="-449" rx="139.976" ry="18"/>
<text text-anchor="middle" x="3702" y="-445.3" font-family="mono" font-size="14.00">PriorityMetadataProducer</text>
</g>
<!-- configFactory&#45;&gt;PriorityMetadataProducer -->
<g id="edge48" class="edge"><title>configFactory&#45;&gt;PriorityMetadataProducer</title>
<path fill="none" stroke="black" d="M1279.28,-1032.56C1537.04,-1029.78 2544.69,-1009.19 3355,-857 3584.09,-813.972 3731.78,-873.757 3845,-670 3886.48,-595.349 3790.52,-512.053 3736.17,-472.807"/>
<polygon fill="black" stroke="black" points="3738.02,-469.824 3727.83,-466.894 3733.97,-475.534 3738.02,-469.824"/>
<text text-anchor="middle" x="3888.5" y="-737.8" font-family="Helvetica,sans-Serif" font-size="14.00">GetPriorityMetadataProducer</text>
</g>
<!-- listers&#45;&gt;Cache -->
<g id="edge15" class="edge"><title>listers&#45;&gt;Cache</title>
<path fill="none" stroke="black" d="M1378.4,-625.817C1397.85,-602.184 1436.27,-560.177 1479,-539 1638.5,-459.948 1697.98,-499.52 1873,-467 1881.52,-465.417 1890.49,-463.738 1899.33,-462.075"/>
<polygon fill="black" stroke="black" points="1900.05,-465.501 1909.23,-460.21 1898.76,-458.622 1900.05,-465.501"/>
<text text-anchor="middle" x="1504" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">updates</text>
</g>
<!-- listers&#45;&gt;eCache -->
<g id="edge16" class="edge"><title>listers&#45;&gt;eCache</title>
<path fill="none" stroke="black" d="M1355.92,-625.803C1345.44,-603.296 1332.03,-563.805 1352,-539 1371.95,-514.217 1556.72,-481.462 1670.33,-463.398"/>
<polygon fill="black" stroke="black" points="1671.09,-466.822 1680.42,-461.803 1670,-459.908 1671.09,-466.822"/>
<text text-anchor="middle" x="1377" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">updates</text>
</g>
<!-- SchedulingQueue -->
<g id="node22" class="node"><title>SchedulingQueue</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="2229,-467 2089,-467 2089,-431 2229,-431 2229,-467"/>
<text text-anchor="middle" x="2159" y="-445.3" font-family="mono" font-size="14.00">SchedulingQueue</text>
</g>
<!-- listers&#45;&gt;SchedulingQueue -->
<g id="edge17" class="edge"><title>listers&#45;&gt;SchedulingQueue</title>
<path fill="none" stroke="black" d="M1403.83,-625.822C1456.89,-602.969 1555.46,-562.7 1643,-539 1684.32,-527.814 1944.14,-484.914 2078.59,-463.019"/>
<polygon fill="black" stroke="black" points="2079.52,-466.413 2088.83,-461.352 2078.4,-459.504 2079.52,-466.413"/>
<text text-anchor="middle" x="1668" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">updates</text>
</g>
<!-- genericScheduler&#45;&gt;Cache -->
<g id="edge24" class="edge"><title>genericScheduler&#45;&gt;Cache</title>
<path fill="none" stroke="black" d="M1917.44,-625.873C1926.17,-592.18 1945.62,-517.07 1956.06,-476.771"/>
<polygon fill="black" stroke="black" points="1959.45,-477.647 1958.57,-467.089 1952.68,-475.892 1959.45,-477.647"/>
<text text-anchor="middle" x="1951" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- genericScheduler&#45;&gt;eCache -->
<g id="edge25" class="edge"><title>genericScheduler&#45;&gt;eCache</title>
<path fill="none" stroke="black" d="M1899.33,-625.873C1872.05,-591.68 1810.73,-514.829 1778.95,-474.998"/>
<polygon fill="black" stroke="black" points="1781.61,-472.723 1772.64,-467.089 1776.14,-477.089 1781.61,-472.723"/>
<text text-anchor="middle" x="1852" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- genericScheduler&#45;&gt;ScheduleAlgorithm -->
<g id="edge30" class="edge"><title>genericScheduler&#45;&gt;ScheduleAlgorithm</title>
<path fill="none" stroke="black" d="M1879.01,-625.873C1809.17,-590.678 1649.64,-510.29 1572.86,-471.595"/>
<polygon fill="black" stroke="black" points="1574.42,-468.464 1563.91,-467.089 1571.27,-474.715 1574.42,-468.464"/>
<text text-anchor="middle" x="1768" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements</text>
</g>
<!-- genericScheduler&#45;&gt;SchedulingQueue -->
<g id="edge26" class="edge"><title>genericScheduler&#45;&gt;SchedulingQueue</title>
<path fill="none" stroke="black" d="M1934.83,-625.873C1979.05,-591.179 2079.25,-512.569 2129.34,-473.272"/>
<polygon fill="black" stroke="black" points="2131.51,-476.015 2137.22,-467.089 2127.19,-470.508 2131.51,-476.015"/>
<text text-anchor="middle" x="2055" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- genericScheduler&#45;&gt;SchedulerExtender -->
<g id="edge29" class="edge"><title>genericScheduler&#45;&gt;SchedulerExtender</title>
<path fill="none" stroke="black" d="M1961.53,-625.962C2049.76,-593.898 2230.52,-522.795 2265,-467 2275.28,-450.365 2277.64,-437.925 2265,-423 2146.99,-283.6 1567.79,-259.101 1343.73,-254.86"/>
<polygon fill="black" stroke="black" points="1343.72,-251.36 1333.65,-254.679 1343.59,-258.359 1343.72,-251.36"/>
<text text-anchor="middle" x="2303" y="-445.3" font-family="Helvetica,sans-Serif" font-size="14.00">has many</text>
</g>
<!-- genericScheduler&#45;&gt;PredicateMetadataProducer -->
<g id="edge27" class="edge"><title>genericScheduler&#45;&gt;PredicateMetadataProducer</title>
<path fill="none" stroke="black" d="M1973.94,-625.959C2049.08,-605.041 2180.75,-568.689 2294,-539 2391.33,-513.483 2504.11,-485.381 2575.73,-467.717"/>
<polygon fill="black" stroke="black" points="2576.68,-471.087 2585.55,-465.296 2575.01,-464.29 2576.68,-471.087"/>
<text text-anchor="middle" x="2305" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- genericScheduler&#45;&gt;PriorityMetadataProducer -->
<g id="edge28" class="edge"><title>genericScheduler&#45;&gt;PriorityMetadataProducer</title>
<path fill="none" stroke="black" d="M1986.92,-625.997C1998.97,-623.284 2011.33,-620.537 2023,-618 2033.56,-615.705 2393.29,-540.447 2404,-539 2899.19,-472.109 3027.91,-507.026 3526,-467 3545.37,-465.443 3565.92,-463.617 3585.89,-461.75"/>
<polygon fill="black" stroke="black" points="3586.32,-465.224 3595.95,-460.801 3585.67,-458.255 3586.32,-465.224"/>
<text text-anchor="middle" x="2415" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- NewConfigFactory -->
<g id="node21" class="node"><title>NewConfigFactory</title>
<ellipse fill="none" stroke="black" cx="1217" cy="-1229" rx="96.6831" ry="18"/>
<text text-anchor="middle" x="1217" y="-1225.3" font-family="mono" font-size="14.00">NewConfigFactory</text>
</g>
<!-- NewConfigFactory&#45;&gt;configFactory -->
<g id="edge14" class="edge"><title>NewConfigFactory&#45;&gt;configFactory</title>
<path fill="none" stroke="black" d="M1217,-1210.87C1217,-1177.32 1217,-1102.71 1217,-1062.29"/>
<polygon fill="black" stroke="black" points="1220.5,-1062.09 1217,-1052.09 1213.5,-1062.09 1220.5,-1062.09"/>
<text text-anchor="middle" x="1246.5" y="-1127.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- binder&#45;&gt;Binder -->
<g id="edge18" class="edge"><title>binder&#45;&gt;Binder</title>
<path fill="none" stroke="black" d="M872.52,-234.873C880.267,-212.763 896.037,-173.936 919,-147 942.524,-119.406 976.37,-95.9947 1002.91,-80.1194"/>
<polygon fill="black" stroke="black" points="1004.75,-83.1017 1011.61,-75.0294 1001.21,-77.0606 1004.75,-83.1017"/>
<text text-anchor="middle" x="954" y="-150.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements</text>
</g>
<!-- SchedulerExtender&#45;&gt;Binder -->
<g id="edge34" class="edge"><title>SchedulerExtender&#45;&gt;Binder</title>
<path fill="none" stroke="black" d="M1236.28,-234.784C1198.58,-200.126 1113.47,-121.869 1070.24,-82.1302"/>
<polygon fill="black" stroke="black" points="1072.41,-79.3695 1062.68,-75.1776 1067.68,-84.5224 1072.41,-79.3695"/>
<text text-anchor="middle" x="1191" y="-150.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements</text>
</g>
<!-- AlgorithmProviderConfig&#45;&gt;ScheduleAlgorithm -->
<g id="edge21" class="edge"><title>AlgorithmProviderConfig&#45;&gt;ScheduleAlgorithm</title>
<path fill="none" stroke="black" d="M915.101,-827.523C978.995,-816.611 1059.71,-794.357 1118,-749 1171.3,-707.528 1147.43,-665.943 1195,-618 1243.15,-569.464 1266.24,-570.344 1327,-539 1376.97,-513.222 1436.03,-487.876 1477.53,-470.867"/>
<polygon fill="black" stroke="black" points="1478.95,-474.066 1486.89,-467.048 1476.31,-467.584 1478.95,-474.066"/>
<text text-anchor="middle" x="1227" y="-640.3" font-family="Helvetica,sans-Serif" font-size="14.00">produces*</text>
</g>
<!-- PredicateMetadataProducerFactory -->
<g id="node26" class="node"><title>PredicateMetadataProducerFactory</title>
<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="2635" cy="-644" rx="182.768" ry="18"/>
<text text-anchor="middle" x="2635" y="-640.3" font-family="mono" font-size="14.00">PredicateMetadataProducerFactory</text>
</g>
<!-- PredicateMetadataProducerFactory&#45;&gt;PredicateMetadataProducer -->
<g id="edge22" class="edge"><title>PredicateMetadataProducerFactory&#45;&gt;PredicateMetadataProducer</title>
<path fill="none" stroke="black" d="M2636.15,-625.873C2638.41,-592.323 2643.44,-517.707 2646.16,-477.287"/>
<polygon fill="black" stroke="black" points="2649.67,-477.302 2646.85,-467.089 2642.68,-476.831 2649.67,-477.302"/>
<text text-anchor="middle" x="2671.5" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- PredicateMetadata -->
<g id="node34" class="node"><title>PredicateMetadata</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="2834.5,-271 2677.5,-271 2677.5,-235 2834.5,-235 2834.5,-271"/>
<text text-anchor="middle" x="2756" y="-249.3" font-family="mono" font-size="14.00">PredicateMetadata</text>
</g>
<!-- PredicateMetadataProducer&#45;&gt;PredicateMetadata -->
<g id="edge32" class="edge"><title>PredicateMetadataProducer&#45;&gt;PredicateMetadata</title>
<path fill="none" stroke="black" d="M2657.58,-430.784C2676.56,-396.701 2719,-320.454 2741.45,-280.14"/>
<polygon fill="black" stroke="black" points="2744.63,-281.617 2746.44,-271.178 2738.52,-278.213 2744.63,-281.617"/>
<text text-anchor="middle" x="2735.5" y="-347.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- PriorityMetadataProducerFactory -->
<g id="node28" class="node"><title>PriorityMetadataProducerFactory</title>
<ellipse fill="none" stroke="black" stroke-dasharray="1,5" cx="3632" cy="-644" rx="176.569" ry="18"/>
<text text-anchor="middle" x="3632" y="-640.3" font-family="mono" font-size="14.00">PriorityMetadataProducerFactory</text>
</g>
<!-- PriorityMetadataProducerFactory&#45;&gt;PriorityMetadataProducer -->
<g id="edge23" class="edge"><title>PriorityMetadataProducerFactory&#45;&gt;PriorityMetadataProducer</title>
<path fill="none" stroke="black" d="M3638.21,-625.873C3650.46,-592.109 3677.79,-516.751 3692.38,-476.515"/>
<polygon fill="black" stroke="black" points="3695.68,-477.683 3695.8,-467.089 3689.1,-475.296 3695.68,-477.683"/>
<text text-anchor="middle" x="3699.5" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- PriorityMetadata -->
<g id="node35" class="node"><title>PriorityMetadata</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="3482,-272 3284,-272 3284,-234 3482,-234 3482,-272"/>
<text text-anchor="middle" x="3383" y="-256.8" font-family="mono" font-size="14.00">PriorityMetadata</text>
<text text-anchor="middle" x="3383" y="-241.8" font-family="mono" font-size="14.00">(actually interface{})</text>
</g>
<!-- PriorityMetadataProducer&#45;&gt;PriorityMetadata -->
<g id="edge33" class="edge"><title>PriorityMetadataProducer&#45;&gt;PriorityMetadata</title>
<path fill="none" stroke="black" d="M3674.53,-431.292C3617.66,-396.706 3486.91,-317.191 3421.6,-277.472"/>
<polygon fill="black" stroke="black" points="3423.19,-274.346 3412.83,-272.14 3419.55,-280.327 3423.19,-274.346"/>
<text text-anchor="middle" x="3582.5" y="-347.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- DefaultProvider -->
<g id="node30" class="node"><title>DefaultProvider</title>
<polygon fill="none" stroke="black" points="1017.48,-1026.54 1017.48,-1041.46 959.791,-1052 878.209,-1052 820.522,-1041.46 820.522,-1026.54 878.209,-1016 959.791,-1016 1017.48,-1026.54"/>
<text text-anchor="middle" x="919" y="-1030.3" font-family="mono" font-size="14.00">DefaultProvider</text>
</g>
<!-- DefaultProvider&#45;&gt;AlgorithmProviderConfig -->
<g id="edge42" class="edge"><title>DefaultProvider&#45;&gt;AlgorithmProviderConfig</title>
<path fill="none" stroke="black" d="M858.61,-1019.43C818.794,-1007.01 769.612,-984.233 745,-944 727.908,-916.06 754.954,-884.503 779.617,-863.553"/>
<polygon fill="black" stroke="black" points="781.943,-866.173 787.482,-857.142 777.52,-860.747 781.943,-866.173"/>
<text text-anchor="middle" x="826.5" y="-932.8" font-family="Helvetica,sans-Serif" font-size="14.00">RegisterAlgorithmProvider</text>
</g>
<!-- ClusterAutoscaleProvider -->
<g id="node31" class="node"><title>ClusterAutoscaleProvider</title>
<polygon fill="none" stroke="black" points="748.002,-1026.54 748.002,-1041.46 659.547,-1052 534.453,-1052 445.998,-1041.46 445.998,-1026.54 534.453,-1016 659.547,-1016 748.002,-1026.54"/>
<text text-anchor="middle" x="597" y="-1030.3" font-family="mono" font-size="14.00">ClusterAutoscaleProvider</text>
</g>
<!-- ClusterAutoscaleProvider&#45;&gt;AlgorithmProviderConfig -->
<g id="edge43" class="edge"><title>ClusterAutoscaleProvider&#45;&gt;AlgorithmProviderConfig</title>
<path fill="none" stroke="black" d="M581.545,-1015.85C563.89,-994.092 539.778,-956.138 559,-929 590.857,-884.023 647.345,-861.611 698.875,-850.513"/>
<polygon fill="black" stroke="black" points="699.665,-853.924 708.769,-848.505 698.272,-847.064 699.665,-853.924"/>
<text text-anchor="middle" x="640.5" y="-932.8" font-family="Helvetica,sans-Serif" font-size="14.00">RegisterAlgorithmProvider</text>
</g>
<!-- defaults -->
<g id="node32" class="node"><title>defaults</title>
<ellipse fill="none" stroke="black" cx="3228" cy="-839" rx="90.9839" ry="18"/>
<text text-anchor="middle" x="3228" y="-835.3" font-family="mono" font-size="14.00">defaults.init()</text>
</g>
<!-- defaults&#45;&gt;PredicateMetadataProducerFactory -->
<g id="edge45" class="edge"><title>defaults&#45;&gt;PredicateMetadataProducerFactory</title>
<path fill="none" stroke="black" d="M3182.94,-823.335C3077.39,-788.982 2814.08,-703.284 2695.07,-664.552"/>
<polygon fill="black" stroke="black" points="2695.98,-661.166 2685.39,-661.399 2693.81,-667.822 2695.98,-661.166"/>
<text text-anchor="middle" x="3085.5" y="-737.8" font-family="Helvetica,sans-Serif" font-size="14.00">RegisterPredicateMetadataProducerFactory</text>
</g>
<!-- defaults&#45;&gt;PriorityMetadataProducerFactory -->
<g id="edge46" class="edge"><title>defaults&#45;&gt;PriorityMetadataProducerFactory</title>
<path fill="none" stroke="black" d="M3261.06,-822.206C3333.41,-787.645 3505.8,-705.288 3587.54,-666.239"/>
<polygon fill="black" stroke="black" points="3589.53,-669.166 3597.05,-661.697 3586.52,-662.85 3589.53,-669.166"/>
<text text-anchor="middle" x="3571.5" y="-737.8" font-family="Helvetica,sans-Serif" font-size="14.00">RegisterPriorityMetadataProducerFactory</text>
</g>
<!-- HTTPExtender -->
<g id="node33" class="node"><title>HTTPExtender</title>
<polygon fill="none" stroke="black" points="1315,-467 1199,-467 1199,-431 1315,-431 1315,-467"/>
<text text-anchor="middle" x="1257" y="-445.3" font-family="mono" font-size="14.00">HTTPExtender</text>
</g>
<!-- HTTPExtender&#45;&gt;SchedulerExtender -->
<g id="edge31" class="edge"><title>HTTPExtender&#45;&gt;SchedulerExtender</title>
<path fill="none" stroke="black" d="M1256.82,-430.784C1256.47,-397.061 1255.7,-322.058 1255.28,-281.428"/>
<polygon fill="black" stroke="black" points="1258.78,-281.141 1255.18,-271.178 1251.78,-281.213 1258.78,-281.141"/>
<text text-anchor="middle" x="1292" y="-347.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements</text>
</g>
<!-- PredicateMetadataFactory -->
<g id="node36" class="node"><title>PredicateMetadataFactory</title>
<polygon fill="none" stroke="black" points="3104.5,-662 2889.5,-662 2889.5,-626 3104.5,-626 3104.5,-662"/>
<text text-anchor="middle" x="2997" y="-640.3" font-family="mono" font-size="14.00">PredicateMetadataFactory</text>
</g>
<!-- PredicateMetadataFactory&#45;&gt;PredicateMetadataProducer -->
<g id="edge35" class="edge"><title>PredicateMetadataFactory&#45;&gt;PredicateMetadataProducer</title>
<path fill="none" stroke="black" d="M2966.03,-625.873C2902.49,-590.733 2757.47,-510.54 2687.38,-471.776"/>
<polygon fill="black" stroke="black" points="2688.85,-468.59 2678.4,-466.814 2685.46,-474.716 2688.85,-468.59"/>
<text text-anchor="middle" x="2870.5" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements*</text>
</g>
<!-- predicateMetadata -->
<g id="node37" class="node"><title>predicateMetadata</title>
<polygon fill="none" stroke="black" points="3033.5,-467 2876.5,-467 2876.5,-431 3033.5,-431 3033.5,-467"/>
<text text-anchor="middle" x="2955" y="-445.3" font-family="mono" font-size="14.00">predicateMetadata</text>
</g>
<!-- PredicateMetadataFactory&#45;&gt;predicateMetadata -->
<g id="edge36" class="edge"><title>PredicateMetadataFactory&#45;&gt;predicateMetadata</title>
<path fill="none" stroke="black" d="M2993.27,-625.873C2985.96,-592.252 2969.66,-517.389 2960.88,-477.029"/>
<polygon fill="black" stroke="black" points="2964.27,-476.116 2958.72,-467.089 2957.43,-477.605 2964.27,-476.116"/>
<text text-anchor="middle" x="3007.5" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- predicateMetadata&#45;&gt;PredicateMetadata -->
<g id="edge37" class="edge"><title>predicateMetadata&#45;&gt;PredicateMetadata</title>
<path fill="none" stroke="black" d="M2937.34,-430.784C2901.86,-396.198 2821.85,-318.193 2781.01,-278.378"/>
<polygon fill="black" stroke="black" points="2783.22,-275.652 2773.62,-271.178 2778.34,-280.664 2783.22,-275.652"/>
<text text-anchor="middle" x="2897" y="-347.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements</text>
</g>
<!-- PriorityMetadataFactory -->
<g id="node38" class="node"><title>PriorityMetadataFactory</title>
<polygon fill="none" stroke="black" points="3383,-662 3177,-662 3177,-626 3383,-626 3383,-662"/>
<text text-anchor="middle" x="3280" y="-640.3" font-family="mono" font-size="14.00">PriorityMetadataFactory</text>
</g>
<!-- PriorityMetadataFactory&#45;&gt;PriorityMetadataProducer -->
<g id="edge38" class="edge"><title>PriorityMetadataFactory&#45;&gt;PriorityMetadataProducer</title>
<path fill="none" stroke="black" d="M3317.45,-625.873C3395.05,-590.385 3573.11,-508.946 3656.88,-470.636"/>
<polygon fill="black" stroke="black" points="3658.49,-473.746 3666.13,-466.404 3655.58,-467.38 3658.49,-473.746"/>
<text text-anchor="middle" x="3541.5" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements*</text>
</g>
<!-- priorityMetadata -->
<g id="node39" class="node"><title>priorityMetadata</title>
<polygon fill="none" stroke="black" points="3277.5,-467 3128.5,-467 3128.5,-431 3277.5,-431 3277.5,-467"/>
<text text-anchor="middle" x="3203" y="-445.3" font-family="mono" font-size="14.00">priorityMetadata</text>
</g>
<!-- PriorityMetadataFactory&#45;&gt;priorityMetadata -->
<g id="edge39" class="edge"><title>PriorityMetadataFactory&#45;&gt;priorityMetadata</title>
<path fill="none" stroke="black" d="M3270.61,-625.961C3261.1,-608.304 3246.38,-579.738 3236,-554 3225.65,-528.333 3216.37,-498.091 3210.3,-476.855"/>
<polygon fill="black" stroke="black" points="3213.67,-475.893 3207.59,-467.213 3206.93,-477.787 3213.67,-475.893"/>
<text text-anchor="middle" x="3265.5" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">produces</text>
</g>
<!-- listers2 -->
<g id="node40" class="node"><title>listers2</title>
<polygon fill="none" stroke="black" stroke-dasharray="5,2" points="3490,-467 3350,-467 3350,-431 3490,-431 3490,-467"/>
<text text-anchor="middle" x="3420" y="-445.3" font-family="mono" font-size="14.00">Various Listers</text>
</g>
<!-- PriorityMetadataFactory&#45;&gt;listers2 -->
<g id="edge40" class="edge"><title>PriorityMetadataFactory&#45;&gt;listers2</title>
<path fill="none" stroke="black" d="M3292.42,-625.873C3317.18,-591.751 3372.74,-515.15 3401.69,-475.248"/>
<polygon fill="black" stroke="black" points="3404.57,-477.239 3407.6,-467.089 3398.9,-473.129 3404.57,-477.239"/>
<text text-anchor="middle" x="3366" y="-542.8" font-family="Helvetica,sans-Serif" font-size="14.00">has</text>
</g>
<!-- priorityMetadata&#45;&gt;PriorityMetadata -->
<g id="edge41" class="edge"><title>priorityMetadata&#45;&gt;PriorityMetadata</title>
<path fill="none" stroke="black" d="M3218.97,-430.784C3250.76,-396.531 3322.05,-319.69 3359.31,-279.538"/>
<polygon fill="black" stroke="black" points="3362.04,-281.731 3366.28,-272.02 3356.91,-276.97 3362.04,-281.731"/>
<text text-anchor="middle" x="3334" y="-347.8" font-family="Helvetica,sans-Serif" font-size="14.00">implements</text>
</g>
</g>
</svg>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment