Commit 85ab92d5 authored by Leigh Stoller's avatar Leigh Stoller

Convert rspec to submodule

parent 4cb50ced
[submodule "protogeni/rspec-geni"]
path = protogeni/rspec-geni
url = git-public.flux.utah.edu:/flux/git/geni-rspec.git
...@@ -12,7 +12,7 @@ SUBDIR = protogeni/rspec-emulab/0.1 ...@@ -12,7 +12,7 @@ SUBDIR = protogeni/rspec-emulab/0.1
# #
# Switch our VPATH over to where the actual files live. # Switch our VPATH over to where the actual files live.
# #
MOSTLY_SRCDIRS = $(subst rspec-emulab,rspec,$(SRCDIR)) MOSTLY_SRCDIRS = $(subst rspec-emulab,rspec-geni,$(SRCDIR))
include $(OBJDIR)/Makeconf include $(OBJDIR)/Makeconf
......
...@@ -12,7 +12,7 @@ SUBDIR = protogeni/rspec-emulab/0.2 ...@@ -12,7 +12,7 @@ SUBDIR = protogeni/rspec-emulab/0.2
# #
# Switch our VPATH over to where the actual files live. # Switch our VPATH over to where the actual files live.
# #
MOSTLY_SRCDIRS = $(subst rspec-emulab,rspec,$(SRCDIR)) MOSTLY_SRCDIRS = $(subst rspec-emulab,rspec-geni,$(SRCDIR))
include $(OBJDIR)/Makeconf include $(OBJDIR)/Makeconf
......
...@@ -12,7 +12,7 @@ SUBDIR = protogeni/rspec-emulab/2 ...@@ -12,7 +12,7 @@ SUBDIR = protogeni/rspec-emulab/2
# #
# Switch our VPATH over to where the actual files live. # Switch our VPATH over to where the actual files live.
# #
MOSTLY_SRCDIRS = $(subst rspec-emulab,rspec,$(SRCDIR)) MOSTLY_SRCDIRS = $(subst rspec-emulab,rspec-geni,$(SRCDIR))
include $(OBJDIR)/Makeconf include $(OBJDIR)/Makeconf
......
rspec-geni @ 2fddf099
Subproject commit 2fddf0990a12a0b33b02752fb77b3a79427cabad
#
# GENIPUBLIC-COPYRIGHT
# Copyright (c) 2011 University of Utah and the Flux Group.
# All rights reserved.
#
ifdef TRANG
TRANGCMD = java -jar ${TRANG}
else
TRANGCMD = java -jar /usr/local/share/java/classes/trang.jar
endif
SCHEMAS = ad.xsd request.xsd manifest.xsd
all: $(SCHEMAS)
clean:
rm $(SCHEMAS)
%.xsd: %.rnc
mkdir -p tmp
$(TRANGCMD) $< tmp/$@
mv tmp/top.xsd $(@:.xsd=)-top.xsd
sed "s/top.xsd/$(@:.xsd=)-top.xsd/" tmp/common.xsd > $(@:.xsd=)-common.xsd
rm tmp/common.xsd
sed "s/common.xsd/$(@:.xsd=)-common.xsd/" tmp/$@ > $@
rm tmp/$@
if [ $< = manifest.rnc ]; then \
sed "s/common.xsd/manifest-common.xsd/" tmp/request.xsd > manifest-request.xsd; \
rm tmp/request.xsd; \
sed "s/request.xsd/manifest-request.xsd/" manifest.xsd > manifest.tmp; \
mv manifest.tmp manifest.xsd; \
fi
rmdir tmp
.PHONY: clean
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.protogeni.net/resources/rspec/0.1" xmlns:rspec="http://www.protogeni.net/resources/rspec/0.1">
<xs:include schemaLocation="ad-top.xsd"/>
<!--
EMULAB-COPYRIGHT
Copyright (c) 2008 University of Utah and the Flux Group.
All rights reserved.
-->
<!--
Common definitions for advertisements, requests, and tickets
Version 0.1
-->
<xs:element name="node" type="rspec:NodeContents"/>
<xs:element name="link" type="rspec:LinkContents"/>
<xs:complexType name="NodeContents">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="rspec:subnode_of"/>
<xs:group ref="rspec:NodeTypeList"/>
<xs:element ref="rspec:interface"/>
</xs:choice>
<xs:choice>
<xs:element ref="rspec:location"/>
<xs:element ref="rspec:available"/>
<xs:element ref="rspec:exclusive"/>
<xs:element ref="rspec:cloud"/>
<xs:element ref="rspec:services"/>
</xs:choice>
</xs:choice>
<xs:attribute name="virtualization_type">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="raw"/>
<xs:enumeration value="trellis-vserver"/>
<xs:enumeration value="planetlab-vserver"/>
<xs:enumeration value="emulab-vnode"/>
<xs:enumeration value="bgpmux"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attributeGroup ref="rspec:ComponentName"/>
</xs:complexType>
<xs:element name="subnode_of" type="xs:string"/>
<xs:element name="interface" type="rspec:InterfaceDecl"/>
<xs:element name="available" type="xs:boolean"/>
<xs:element name="exclusive" type="xs:boolean"/>
<xs:element name="cloud">
<xs:complexType/>
</xs:element>
<xs:element name="services" type="rspec:ServiceContents"/>
<xs:complexType name="LinkContents">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:group ref="rspec:LinkType"/>
<xs:element ref="rspec:interface_ref"/>
</xs:choice>
<xs:choice>
<xs:element ref="rspec:bandwidth"/>
<xs:element ref="rspec:latency"/>
<xs:element ref="rspec:packet_loss"/>
</xs:choice>
</xs:choice>
<xs:attribute name="virtualization_type">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="raw"/>
<xs:enumeration value="trellis-vserver"/>
<xs:enumeration value="planetlab-vserver"/>
<xs:enumeration value="emulab-vnode"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attributeGroup ref="rspec:ComponentName"/>
</xs:complexType>
<xs:element name="interface_ref">
<xs:complexType>
<xs:attributeGroup ref="rspec:InterfaceRef"/>
</xs:complexType>
</xs:element>
<xs:element name="bandwidth">
<xs:annotation>
<xs:documentation>Bandwidth of the link in kbps</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:float">
<xs:minExclusive value="0.0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="latency">
<xs:annotation>
<xs:documentation>Latency of the link in ms</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:float">
<xs:minInclusive value="0.0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="packet_loss">
<xs:annotation>
<xs:documentation>Static packet loss probability of the link as a fraction
(ie. 0.01 == 1%)</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:float">
<xs:minInclusive value="0.0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:group name="NodeTypeList">
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="rspec:node_type"/>
</xs:sequence>
</xs:group>
<xs:group name="LinkType">
<xs:sequence>
<xs:element name="link_type">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="rspec:field"/>
</xs:sequence>
<xs:attribute name="name"/>
<xs:attribute name="type_name"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<xs:element name="field">
<xs:complexType>
<xs:attribute name="key" use="required"/>
<xs:attribute name="value" use="required"/>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="VirtualName">
<xs:attribute name="virtual_id" use="required"/>
</xs:attributeGroup>
<xs:attributeGroup name="ComponentName">
<xs:attribute name="component_manager_uuid"/>
<xs:attribute name="component_manager_urn"/>
<xs:attribute name="component_name"/>
<xs:attribute name="component_uuid"/>
<xs:attribute name="component_urn"/>
</xs:attributeGroup>
<xs:attributeGroup name="ComponentInterfaceDeclName">
<xs:attribute name="component_id" use="required"/>
</xs:attributeGroup>
<xs:attributeGroup name="ComponentInterfaceRefName">
<xs:attribute name="component_node_uuid"/>
<xs:attribute name="component_node_urn"/>
<xs:attribute name="component_interface_id" use="required"/>
</xs:attributeGroup>
<xs:complexType name="InterfaceDecl">
<xs:sequence>
<xs:element minOccurs="0" ref="rspec:monitoring"/>
</xs:sequence>
<xs:attributeGroup ref="rspec:ComponentInterfaceDeclName"/>
<xs:attribute name="role">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="control"/>
<xs:enumeration value="experimental"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="public_ipv4"/>
</xs:complexType>
<xs:element name="monitoring">
<xs:complexType>
<xs:attribute name="user_traffic"/>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="InterfaceRef">
<xs:attributeGroup ref="rspec:ComponentInterfaceRefName"/>
</xs:attributeGroup>
<xs:element name="location">
<xs:complexType>
<xs:attribute name="country" use="required"/>
<xs:attribute name="longitude"/>
<xs:attribute name="latitude"/>
</xs:complexType>
</xs:element>
<xs:element name="rspec" type="rspec:RSpecContents"/>
<xs:complexType name="RSpecContents">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element ref="rspec:node"/>
<xs:element ref="rspec:link"/>
</xs:choice>
<xs:choice>
<xs:element ref="rspec:external_ref"/>
<xs:element ref="rspec:bgp_prefix"/>
</xs:choice>
</xs:choice>
<xs:attribute name="generated" type="xs:dateTime"/>
<xs:attribute name="generated_by"/>
<xs:attribute name="valid_until" type="xs:dateTime"/>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="advertisement"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:schema>
This diff is collapsed.
#
# EMULAB-COPYRIGHT
# Copyright (c) 2008 University of Utah and the Flux Group.
# All rights reserved.
#
#
# Prototype of an advertisement RSpec, to be used by ProtoGENI
# Version 0.1
#
default namespace = "http://www.protogeni.net/resources/rspec/0.1"
include "common.rnc"
NodeContents &=
# Component identifiers
ComponentName &
# Information about the physical location of the node.
Location? &
# Indicate whether or not this node is available - the idea is that a
# full dump of the static physical topology will not include this, but
# that we can later get updates that include only this attribute (and a
# UUID) Just binary for now - probably will include more things, such
# as a number of "free slots", later
element available { xsd:boolean } &
# Indicates whether the node is in sharing mode: exclusive is true if
# the component manager will agree to promise not to share it.
element exclusive { xsd:boolean } &
# Marks this node as a stand-in for a large network rather than a
# single machine. This means that other CMs can make external
# references to this node without a corresponding external reference
# in this advertisement. It also means that it makes sense for
# multiple physical links to connect to the same interface.
element cloud { empty } &
# Lists services provided by the CM for this node.
element services { ServiceContents }
LinkContents &=
# Component identifiers
ComponentName &
# Characteristics (bandwidth, latency, loss) which affect traffic.
LinkCharacteristics?
InterfaceDecl &=
ComponentInterfaceDeclName &
element monitoring { attribute user_traffic { text }? }? &
attribute role { "control" | "experimental" }? &
attribute public_ipv4 { text }?
InterfaceRef &=
ComponentInterfaceRefName
# Reference to components managed by other component managers.
# TODO: Merge ComponentInterfaceRefName into just component_id when
# length restrictions on URNs end.
ExternalReference = element external_ref {
ComponentInterfaceRefName &
attribute component_manager_uuid { text }? &
attribute component_manager_urn { text }?
}
ServiceContents &=
# Login services include ssh-services, serial consoles, etc.
element login { LoginServiceContents }* &
# Install services include download and extraction of a file at
# experiment startup.
element install { InstallServiceContents }* &
# Execute services include initialization scripts
element execute { ExecuteServiceContents }*
LoginServiceContents &=
# Authentication mechanism
attribute authentication { "ssh-keys" } &
# Access mechanism
attribute hostname { text } &
attribute port { text }
InstallServiceContents &=
# Type(s) of archives supported
attribute file_type { "tar.gz" | "tar.bz2" }
ExecuteServiceContents &=
# Shell environment allowed
attribute shell { "sh" }
RSpecContents &=
attribute type { "advertisement" } &
ExternalReference* &
BgpPrefix*
BgpPrefix = element bgp_prefix {
attribute address { text } &
attribute netmask { text }
}
start = RSpec
<?xml version="1.0" encoding="UTF-8"?>
<!--
EMULAB-COPYRIGHT
Copyright (c) 2008 University of Utah and the Flux Group.
All rights reserved.
-->
<!--
Prototype of an advertisement RSpec, to be used by ProtoGENI
Version 0.1
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.protogeni.net/resources/rspec/0.1" xmlns:rspec="http://www.protogeni.net/resources/rspec/0.1">
<xs:include schemaLocation="ad-common.xsd"/>
<!--
Reference to components managed by other component managers.
TODO: Merge ComponentInterfaceRefName into just component_id when
length restrictions on URNs end.
-->
<xs:element name="external_ref">
<xs:complexType>
<xs:attributeGroup ref="rspec:ComponentInterfaceRefName"/>
<xs:attribute name="component_manager_uuid"/>
<xs:attribute name="component_manager_urn"/>
</xs:complexType>
</xs:element>
<xs:complexType name="ServiceContents">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="rspec:login"/>
<xs:element ref="rspec:install"/>
<xs:element ref="rspec:execute"/>
</xs:choice>
</xs:complexType>
<xs:element name="login">
<xs:complexType>
<xs:attributeGroup ref="rspec:LoginServiceContents"/>
</xs:complexType>
</xs:element>
<xs:element name="install">
<xs:complexType>
<xs:attributeGroup ref="rspec:InstallServiceContents"/>
</xs:complexType>
</xs:element>
<xs:element name="execute">
<xs:complexType>
<xs:attributeGroup ref="rspec:ExecuteServiceContents"/>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="LoginServiceContents">
<xs:attribute name="authentication" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="ssh-keys"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="hostname" use="required"/>
<xs:attribute name="port" use="required"/>
</xs:attributeGroup>
<xs:attributeGroup name="InstallServiceContents">
<xs:attribute name="file_type" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="tar.gz"/>
<xs:enumeration value="tar.bz2"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:attributeGroup>
<xs:attributeGroup name="ExecuteServiceContents">
<xs:attribute name="shell" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="sh"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:attributeGroup>
<xs:element name="bgp_prefix">
<xs:complexType>
<xs:attribute name="address" use="required"/>
<xs:attribute name="netmask" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
#
# EMULAB-COPYRIGHT
# Copyright (c) 2008 University of Utah and the Flux Group.
# All rights reserved.
#
#
# Common definitions for advertisements, requests, and tickets
# Version 0.1
#
include "top.rnc"
NodeSpec = element node { NodeContents }
LinkSpec = element link { LinkContents }
NodeContents =
# Each node has exactly one virtualization technology, which we simply
# enumerate here
attribute virtualization_type { "raw" | "trellis-vserver" |
"planetlab-vserver" | "emulab-vnode" | "bgpmux" }? &
# Each node may be the subnode of (physically located within) another.
# In advertisements, this is the URN of the other component.
# In requests, this is the virtual_id of the other sliver.
# TODO: To be consistent with the rest of the RSpec, we should have
# an attribute called parent_node instead of a child text node
element subnode_of { text }? &
# Node type list
NodeTypeList &
# List of interfaces on this node. Interfaces are declared here. So
# all information about a particular interface including types
# belongs in the declaration. Other references to interfaces
# should just uniquely identify them and refer back here.
element interface {
InterfaceDecl
}*
LinkContents =
# Each link has exactly one virtualization technology, which we simply
# enumerate here
attribute virtualization_type { "raw" | "trellis-vserver" |
"planetlab-vserver" | "emulab-vnode" }? &
# Link types
LinkType+ &
# The interfaces which this link spans.
element interface_ref {
InterfaceRef
}*
NodeTypeList = NodeTypeSpec+
NodeTypeContents &= TypeField*
LinkType = element link_type {
attribute name { text }? &
attribute type_name { text }? &
TypeField*
}
TypeField = element field {
attribute key { text } &
attribute value { text }
}
VirtualName = attribute virtual_id { text }
ComponentName =
# This is the uuid of the aggregate that this node or link belongs
# to. It is required in an advertisement.
attribute component_manager_uuid { text }? &
attribute component_manager_urn { text }? &
# User-readable name for the component
attribute component_name { text }? &
# The uuid of the physical component.
attribute component_uuid { text }? &
attribute component_urn { text }?
ComponentInterfaceDeclName = attribute component_id { text }
ComponentInterfaceRefName =
attribute component_node_uuid { text }? &
attribute component_node_urn { text }? &
attribute component_interface_id { text }
InterfaceDecl = empty
InterfaceRef = empty
Location = element location {
# The two-letter ISO 3166 code for the country the node is in.
attribute country { text } &
# Longitude and Latitude coordinates of the node using the
# WGS 84 standard.
attribute longitude { text }? &
attribute latitude { text }?
}
RSpec = element rspec {
RSpecContents
}
RSpecContents =
# When this RSpec was generated - optional, can be used for determining
# staleness
attribute generated { xsd:dateTime }? &
# Who/what generated the rspec. This is purely informative and
# should not be used for any policy consideration. The format is
# not fixed.
attribute generated_by { text }? &
# How long this rspec is valid - in the case of a ticket, this indicates
# how long the holder may use the resources. For a resource request, it's
# how long we want the resources. For an advertisement, it might be a hint
# as to how long it's okay to cache this rspec.
attribute valid_until { xsd:dateTime }? &
# One or more nodes/links
NodeSpec* &
LinkSpec*
<?xml version="1.0" encoding="UTF-8"?>
<rspec xmlns="http://www.protogeni.net/resources/rspec/0.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.protogeni.net/resources/rspec/0.1 http://www.protogeni.net/resources/rspec/0.1/ad.xsd"
type="advertisement"
generated="2009-07-21T19:19:06Z" valid_until="2009-07-21T19:19:06Z" >
<node component_manager_uuid="urn:publicid:IDN+emulab.geni.emulab.net+authority+cm"
component_name="cisco3"
component_uuid="urn:publicid:IDN+emulab.geni.emulab.net+node+cisco3" >
<node_type
type_name="switch"
type_slots="1"
/>
<available>true</available>
<exclusive>true</exclusive>
<interface component_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+cisco3:(null)"/>
</node>
<node component_manager_uuid="urn:publicid:IDN+emulab.geni.emulab.net+authority+cm"
component_name="pc119"
component_uuid="urn:publicid:IDN+emulab.geni.emulab.net+node+pc119" >
<node_type
type_name="pc850"
type_slots="1"
/>
<node_type
type_name="pc"
type_slots="1"
/>
<node_type
type_name="delay"
type_slots="1"
/>
<node_type
type_name="pcvm"
type_slots="20"
/>
<available>true</available>
<exclusive>true</exclusive>
<interface component_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+pc119:eth0"/>
<interface component_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+pc119:eth2"/>
</node>
<node component_manager_uuid="urn:publicid:IDN+emulab.geni.emulab.net+authority+cm"
component_name="pc111"
component_uuid="urn:publicid:IDN+emulab.geni.emulab.net+node+pc111" >
<node_type
type_name="pc850"
type_slots="1"
/>
<node_type
type_name="pc"
type_slots="1"
/>
<node_type
type_name="delay"
type_slots="1"
/>
<node_type
type_name="pcvm"
type_slots="20"
/>
<available>true</available>
<exclusive>true</exclusive>
<interface component_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+pc111:eth0"/>
<interface component_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+pc111:eth2"/>
</node>
<link component_manager_uuid="urn:publicid:IDN+emulab.geni.emulab.net+authority+sa"
component_name="link-pc111:eth0-cisco3:(null)"
component_uuid="urn:publicid:IDN+emulab.geni.emulab.net+link+link-pc111%3Aeth0-cisco3%3A(null)" >
<interface_ref component_node_uuid="urn:publicid:IDN+emulab.geni.emulab.net+node+pc111"
component_interface_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+pc111:eth0"/>
<interface_ref component_node_uuid="urn:publicid:IDN+emulab.geni.emulab.net+node+cisco3"
component_interface_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+cisco3:(null)"/>
<bandwidth>100000</bandwidth>
<latency>0</latency>
<packet_loss>0</packet_loss>
<link_type type_name="ethernet" />
</link>
<link component_manager_uuid="urn:publicid:IDN+emulab.geni.emulab.net+authority+sa"
component_name="link-pc119:eth0-cisco3:(null)"
component_uuid="urn:publicid:IDN+emulab.geni.emulab.net+link+link-pc119%3Aeth0-cisco3%3A(null)" >
<interface_ref component_node_uuid="urn:publicid:IDN+emulab.geni.emulab.net+node+pc119"
component_interface_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+pc119:eth0"/>
<interface_ref component_node_uuid="urn:publicid:IDN+emulab.geni.emulab.net+node+cisco3"
component_interface_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+cisco3:(null)"/>
<bandwidth>100000</bandwidth>
<latency>0</latency>
<packet_loss>0</packet_loss>
<link_type type_name="ethernet" />
</link>
</rspec>
<?xml version="1.0" encoding="UTF-8"?>
<rspec xmlns="http://www.protogeni.net/resources/rspec/0.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.protogeni.net/resources/rspec/0.1 http://www.protogeni.net/resources/rspec/0.1/ad.xsd"
type="advertisement"
generated="2009-07-21T19:19:06Z"
valid_until="2009-07-21T19:19:06Z" >
<node component_manager_uuid="urn:publicid:IDN+emulab.geni.emulab.net+authority+cm"
component_name="pc160"
component_uuid="urn:publicid:IDN+emulab.geni.emulab.net+node+pc160" >
<node_type
type_name="pc850"
type_slots="1"
/>
<node_type
type_name="pc"
type_slots="1"
/>
<available>true</available>
<exclusive>true</exclusive>
<interface component_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+pc160:eth0"/>
<interface component_id="urn:publicid:IDN+emulab.geni.emulab.net+interface+pc160:eth1"/>