+++ /dev/null
-##
-# SpecDict
-#
-# SpecDict defines a means for converting a dictionary with plc specific keys
-# to a dict with rspec specific keys.
-#
-# SpecDict.fields dict defines all the rspec specific attribute and their
-# expected type.
-#
-# SpecDict.plc_fields defines a one to one mapping of plc attribute to rspec
-# attribute
-
-from types import StringTypes, ListType
-
-class SpecDict(dict):
- """
- Base class of SpecDict objects.
- """
- fields = {}
- plc_fields = {}
- type = None
-
- def __init__(self, spec_dict):
- # convert plc dict and initialize self
- sdict = self.plcToSpec(spec_dict)
- dict.__init__(self, sdict)
-
-
- def plcToSpec(self, spec_dict):
- """
- Defines how to convert a plc dict to rspec dict
- """
- spec = {}
- for field in self.fields:
- value = ""
- expected = self.fields[field]
- if isinstance(expected, StringTypes):
- if self.plc_fields.has_key(field):
- plc_field = self.plc_fields[field]
- if spec_dict.has_key(plc_field):
- value = spec_dict[plc_field]
- elif isinstance(expected, ListType):
- expected = expected[0]
- if self.plc_fields.has_key(field):
- plc_field = self.plc_fields[field]
- if spec_dict.has_key(plc_field):
- value = [expected(value) for value in spec_dict[plc_field]]
- spec[field] = value
- return {self.type: spec}
-
-#
-# fields = { geni_field: type. Could be class for nested classes, otherwise prob str}
-# plc_fields = {geni_field : plc_field}
-#
-
-class IfSpecDict(SpecDict):
- type = 'IfSpec'
- fields = {'name': '',
- 'addr': '',
- 'type': '',
- 'init_params': '',
- 'min_rate': '',
- 'max_rate': '',
- 'max_kbyte': '',
- 'ip_spoof': ''}
- plc_fields = {'name': 'is_primary', # XXX needs munging to return name instead of True or False
- 'addr': 'ip',
- 'type': 'type'}
-
-class LinkSpecDict(SpecDict):
- type = 'LinkSpec'
- fields = {'min_alloc': '',
- 'max_alloc': '',
- 'type': '',
- 'start_time': '',
- 'bw': '',
- 'duration': '',
- 'init_params': '',
- 'endpoints': [IfSpecDict]}
- plc_fields = {'min_alloc': 'min_alloc',
- 'max_alloc': 'max_alloc',
- 'type': 'type',
- 'start_time': 'start_time',
- 'bw': 'bw',
- 'duration': 'duration',
- 'init_params': 'init_params',
- 'endpoints': 'endpoints'}
-
-
-class NodeSpecDict(SpecDict):
- type = 'NodeSpec'
- fields = {'name': '',
- 'type': '',
- 'init_params': '',
- 'cpu_min': '',
- 'cpu_share': '',
- 'cpu_pct': '',
- 'disk_max': '',
- 'start_time': '',
- 'duration': '',
- 'net_if': [IfSpecDict]}
-
- plc_fields = {'name': 'hostname',
- 'net_if': 'interfaces'}
-
-class NetSpecDict(SpecDict):
- type = 'NetSpec'
- fields = {'name': '',
- 'start_time': '',
- 'duration': '',
- 'nodes': [NodeSpecDict],
- 'links': [LinkSpecDict],
- }
- plc_fields = {'name': 'name',
- 'start_time': 'start_time',
- 'duration': 'duration',
- 'nodes': 'nodes',
- 'links': 'links'}
-
-class RSpecDict(SpecDict):
- type = 'RSpec'
- fields = {'start_time': '',
- 'duration': '',
- 'networks': [NetSpecDict]
- }
- plc_fields = {'networks': 'networks',
- 'start_time': 'start_tim',
- 'duration': 'duration'
- }
-
-# vim:ts=4:expandtab