|
From: Robert E. <pa...@tu...> - 2004-02-20 15:47:59
|
From Joel:
> So here is a way to nicen the syntax.
>
> -Every Node type gets a list of constraint attributes. This is implicit in
> the "#" dynamic marker syntax as well, I believe.
>
> -The constructor definitions get changed to be of the form:
>
> CRNetworkNode( object, tagString="match_string" )
>
> and the treatment of object depends on tagString. The default behavior adds a
> match-this-string-type constraint to the node's constraint list, so that old
> scripts don't break and old tools and conf writers don't get confused. The
> availability of tagString and a new Node.addConstraint() method allows for a
> lot of future expansion. One could even do something like:
>
> CRNetworkNode( "foo", "dynamic_host" )
>
> to get exactly the internal logic your proposal would give with
>
> CRNetworkNode( "#foo" )
I've refined this a bit during implementation.
- Every node constructor is of the form:
CR.*Node(host, constraint = "name", constraintArg = None)
- The "host" argument represents the machine. By default, it must be the name
of the connecting machine; but with dynamic hosts, this isn't necessarily the
case. With dynamic hosts, it's just a string identifier that can be used to
differentiate hosts.
- The "constraint" and "constraintArg" allow control over which hostnames will
match to which nodes. By default, the "name" constraint only matches incoming
connecting hostnames to nodes with identical hostnames provided. Other variants
include:
node = CRNetworkNode("server1", "dynamic")
(the "dynamic" test allows the test to match any incoming connecting hostname to
this node)
node = CRNetworkNode("server1", "regex", "name[0-9]*")
(the "regex" test only allows incoming connecting hostnames that match the given
regular expression to match the node)
pattern = re.compile("name[0-9]*")
node = CRNetworkNode("server1", "pattern", pattern)
(the "pattern" test works like the "regex" test, but with a precompiled pattern)
node = CRNetworkNode("server1", "regex_full", ".*\.psc\.edu")
(the "regex_full" test checks the regular expression against the fully qualified
domain name of an incoming connecting machine)
pattern_full = re.compile(".*\.psc\.edu")
node = CRNetworkNode("server1", "pattern_full", pattern_full)
(the "pattern_full" test works like the "regex_full" test, but with a
precompiled pattern)
- A single node may have multiple constraints added to it, via the new
node.AddConstraint(constraint, constraintArg) method. A node will only be
accepted for an incoming connection name if all constraints are satisfied.
- If all the constraints for a node are static (i.e., allow the name of the
connecting host to be known before incoming connections are made), the node is
static. If any of the constraints is dynamic (i.e., have to be resolved to true
hostnames before use), the node is dynamic. For any dynamic node, the "host"
parameter is a placeholder; it is a variable name, not a machine name. I use
special syntax to make it clear that the supplied host name is a dynamic
variable rather than an explicit host name, such as:
node = CRNetworkNode("#server1", "dynamic")
or
node = CRNetworkNode("SERVER1", "dynamic")
but such syntax is not required.
- When an incoming connection is made, all possible static matches are tried,
then all already-resolved dynamic matches are tried, before any new dynamic
matches are resolved. When dynamic matches are resolved, the first node of the
appropriate type (i.e. a CRNetworkNode for a server, a CRApplicationNode for an
app faker, etc.) that satisfies all the constraints will be used. Multiple
processes running on the same host can resolve multiple dynamic nodes (all to
the same hostname, of course).
- To define a bank of network nodes that will be resolved to incoming server
connections, use something like:
for serverNumber in range(NUM_SERVERS):
node = CRNetworkNode("server%d" % serverNumber)
... # configure the node and add it
I believe this satisfies all the requirements we've had to date. For futures,
it's easy to add more constraint tests, if more are needed; I think a special
"or" test would be great, so that you can design configuration files that work
without change in very different environments... but I'm not planning on making
these changes at this time.
Bob Ellison
Tungsten Graphics, Inc.
|