def parseRequest(soap_data): headers, bodies = minisoap.parseSoapPayload(soap_data) if headers is None: raise ValueError('No header specified in payload') elif len(headers) > 1: raise ValueError('Multiple headers specified in payload') header = nsiframework.parseElement(headers[0]) security_attributes = [] if header.sessionSecurityAttr: for ssa in header.sessionSecurityAttr: for attr in ssa.Attributes: for av in attr.AttributeValue: if av is None: continue security_attributes.append( nsa.SecurityAttribute(attr.Name, av)) #if header.protocolVersion not in [ cnt.CS2_REQUESTER, cnt.CS2_PROVIDER ]: # raise ValueError('Invalid protocol "%s". Only %s supported' % (header.protocolVersion, cnt.CS2_SERVICE_TYPE)) if len(bodies) == 0: body = None elif len(bodies) == 1: body = nsiconnection.parseElement(bodies[0]) else: body = [nsiconnection.parseElement(b) for b in bodies] nsi_header = nsa.NSIHeader(header.requesterNSA, header.providerNSA, header.correlationId, header.replyTo, security_attributes=security_attributes, connection_trace=header.connectionTrace) return nsi_header, body
class RemoteProviderTest(GenericProviderTest, unittest.TestCase): PROVIDER_PORT = 8180 REQUESTER_PORT = 8280 requester_agent = nsa.NetworkServiceAgent('test-requester:nsa', 'http://localhost:%i/NSI/services/RequesterService2' % REQUESTER_PORT) provider_agent = nsa.NetworkServiceAgent(GenericProviderTest.base + ':nsa', 'http://localhost:%i/NSI/services/CS2' % PROVIDER_PORT) header = nsa.NSIHeader(requester_agent.urn(), provider_agent.urn(), reply_to=requester_agent.endpoint, connection_trace=[ requester_agent.urn() + ':1' ], security_attributes = [ nsa.SecurityAttribute('user', 'testuser') ] ) def setUp(self): from twisted.web import resource, server from twisted.application import internet from opennsa.protocols import nsi2 from opennsa.protocols.shared import soapresource from opennsa.protocols.nsi2 import requesterservice, requesterclient db.setupDatabase() self.requester = common.DUDRequester() self.clock = task.Clock() nrm_map = StringIO.StringIO(topology.ARUBA_TOPOLOGY) nrm_ports, nml_network, link_vector = setup.setupTopology(nrm_map, self.network, 'aruba.net') self.backend = dud.DUDNSIBackend(self.network, nrm_ports, None, {}) # we set the parent later self.backend.scheduler.clock = self.clock pl = plugin.BasePlugin() pl.init( { config.NETWORK_NAME: self.network }, None ) pr = provreg.ProviderRegistry( { self.provider_agent.urn() : self.backend }, {} ) self.aggregator = aggregator.Aggregator(self.network, self.provider_agent, nml_network, link_vector, None, pr, [], pl) # we set the parent later self.backend.parent_requester = self.aggregator # provider protocol http_top_resource = resource.Resource() cs2_prov = nsi2.setupProvider(self.aggregator, http_top_resource) self.aggregator.parent_requester = cs2_prov provider_factory = server.Site(http_top_resource) self.provider_service = internet.TCPServer(self.PROVIDER_PORT, provider_factory) # requester protocol requester_top_resource = resource.Resource() soap_resource = soapresource.setupSOAPResource(requester_top_resource, 'RequesterService2') self.provider = requesterclient.RequesterClient(self.provider_agent.endpoint, self.requester_agent.endpoint) requester_service = requesterservice.RequesterService(soap_resource, self.requester) # this is the important part requester_factory = server.Site(requester_top_resource, logPath='/dev/null') # start engines! self.backend.startService() self.provider_service.startService() self.requester_iport = reactor.listenTCP(self.REQUESTER_PORT, requester_factory) # request stuff self.start_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=2) self.end_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=10) self.schedule = nsa.Schedule(self.start_time, self.end_time) self.sd = nsa.Point2PointService(self.source_stp, self.dest_stp, self.bandwidth) self.criteria = nsa.Criteria(0, self.schedule, self.sd) @defer.inlineCallbacks def tearDown(self): self.backend.stopService() self.provider_service.stopService() self.requester_iport.stopListening() from opennsa.backends.common import genericbackend # keep it simple... yield genericbackend.GenericBackendConnections.deleteAll() yield database.SubConnection.deleteAll() yield database.ServiceConnection.deleteAll() # close database connections, so we don't run out from twistar.registry import Registry Registry.DBPOOL.close() @defer.inlineCallbacks def testQuerySummarySync(self): # sync is only available remotely self.header.newCorrelationId() acid = yield self.provider.reserve(self.header, None, 'gid-123', 'desc2', self.criteria) yield self.requester.reserve_defer yield self.provider.reserveCommit(self.header, acid) yield self.requester.reserve_commit_defer reservations = yield self.provider.querySummarySync(self.header, connection_ids = [ acid ] ) self.failUnlessEquals(len(reservations), 1) ci = reservations[0] self.failUnlessEquals(ci.connection_id, acid) self.failUnlessEquals(ci.global_reservation_id, 'gid-123') self.failUnlessEquals(ci.description, 'desc2') self.failUnlessEquals(ci.requester_nsa, self.requester_agent.urn()) self.failUnlessEquals(len(ci.criterias), 1) crit = ci.criterias[0] sd = crit.service_def src_stp = sd.source_stp dst_stp = sd.dest_stp self.failUnlessEquals(src_stp.network, self.network) self.failUnlessEquals(src_stp.port, self.source_port) self.failUnlessEquals(src_stp.label.type_, cnt.ETHERNET_VLAN) self.failUnlessIn(src_stp.label.labelValue(), ('1781', '1782') ) self.failUnlessEquals(dst_stp.network, self.network) self.failUnlessEquals(dst_stp.port, self.dest_port) self.failUnlessEquals(dst_stp.label.type_, cnt.ETHERNET_VLAN) self.failUnlessIn(dst_stp.label.labelValue(), ('1782', '1783') ) self.failUnlessEqual(sd.capacity, self.bandwidth) self.failUnlessEqual(crit.revision, 0) from opennsa import state rsm, psm, lsm, dps = ci.states self.failUnlessEquals(rsm, state.RESERVE_START) self.failUnlessEquals(psm, state.RELEASED) self.failUnlessEquals(lsm, state.CREATED) self.failUnlessEquals(dps[:2], (False, 0) ) # we cannot really expect a consistent result for consistent here @defer.inlineCallbacks def testQueryRecursive(self): # only available on aggregator and remote, we just do remote for now self.header.newCorrelationId() acid = yield self.provider.reserve(self.header, None, 'gid-123', 'desc2', self.criteria) yield self.requester.reserve_defer yield self.provider.reserveCommit(self.header, acid) yield self.requester.reserve_commit_defer self.header.newCorrelationId() yield self.provider.queryRecursive(self.header, connection_ids = [ acid ] ) header, reservations = yield self.requester.query_recursive_defer self.failUnlessEquals(len(reservations), 1) ci = reservations[0] self.failUnlessEquals(ci.connection_id, acid) self.failUnlessEquals(ci.global_reservation_id, 'gid-123') self.failUnlessEquals(ci.description, 'desc2') self.failUnlessEquals(ci.requester_nsa, self.requester_agent.urn()) self.failUnlessEquals(len(ci.criterias), 1) crit = ci.criterias[0] src_stp = crit.service_def.source_stp dst_stp = crit.service_def.dest_stp self.failUnlessEquals(src_stp.network, self.network) self.failUnlessEquals(src_stp.port, self.source_port) self.failUnlessEquals(src_stp.label.type_, cnt.ETHERNET_VLAN) self.failUnlessIn(src_stp.label.labelValue(), ('1781', '1782') ) self.failUnlessEquals(dst_stp.network, self.network) self.failUnlessEquals(dst_stp.port, self.dest_port) self.failUnlessEquals(dst_stp.label.type_, cnt.ETHERNET_VLAN) self.failUnlessIn(dst_stp.label.labelValue(), ('1782', '1783') ) self.failUnlessEqual(crit.service_def.capacity, self.bandwidth) self.failUnlessEqual(crit.revision, 0) from opennsa import state rsm, psm, lsm, dps = ci.states self.failUnlessEquals(rsm, state.RESERVE_START) self.failUnlessEquals(psm, state.RELEASED) self.failUnlessEquals(lsm, state.CREATED) self.failUnlessEquals(dps[:2], (False, 0) ) # we cannot really expect a consistent result for consistent here self.failUnlessEqual(len(crit.children), 1) child = crit.children[0] rsm, psm, lsm, dps = ci.states # overwrite self.failUnlessEquals(rsm, state.RESERVE_START) self.failUnlessEquals(psm, state.RELEASED) self.failUnlessEquals(lsm, state.CREATED) self.failUnlessEquals(dps[:2], (False, 0) ) # we cannot really expect a consistent result for consistent here @defer.inlineCallbacks def testQueryRecursiveNoStartTime(self): # only available on aggregator and remote, we just do remote for now start_time = None criteria = nsa.Criteria(0, nsa.Schedule(start_time, self.end_time), self.sd) self.header.newCorrelationId() acid = yield self.provider.reserve(self.header, None, 'gid-123', 'desc2', criteria) yield self.requester.reserve_defer yield self.provider.reserveCommit(self.header, acid) yield self.requester.reserve_commit_defer self.header.newCorrelationId() yield self.provider.queryRecursive(self.header, connection_ids = [ acid ] ) header, reservations = yield self.requester.query_recursive_defer self.failUnlessEquals(len(reservations), 1) ci = reservations[0] self.failUnlessEquals(ci.connection_id, acid) self.failUnlessEquals(ci.global_reservation_id, 'gid-123') self.failUnlessEquals(ci.description, 'desc2') self.failUnlessEquals(ci.requester_nsa, self.requester_agent.urn()) self.failUnlessEquals(len(ci.criterias), 1) crit = ci.criterias[0] src_stp = crit.service_def.source_stp dst_stp = crit.service_def.dest_stp self.failUnlessEquals(src_stp.network, self.network) self.failUnlessEquals(src_stp.port, self.source_port) self.failUnlessEquals(src_stp.label.type_, cnt.ETHERNET_VLAN) self.failUnlessIn(src_stp.label.labelValue(), ('1781', '1782') ) self.failUnlessEquals(dst_stp.network, self.network) self.failUnlessEquals(dst_stp.port, self.dest_port) self.failUnlessEquals(dst_stp.label.type_, cnt.ETHERNET_VLAN) self.failUnlessIn(dst_stp.label.labelValue(), ('1782', '1783') ) self.failUnlessEqual(crit.service_def.capacity, self.bandwidth) self.failUnlessEqual(crit.revision, 0) from opennsa import state rsm, psm, lsm, dps = ci.states self.failUnlessEquals(rsm, state.RESERVE_START) self.failUnlessEquals(psm, state.RELEASED) self.failUnlessEquals(lsm, state.CREATED) self.failUnlessEquals(dps[:2], (False, 0) ) # we cannot really expect a consistent result for consistent here self.failUnlessEqual(len(crit.children), 1) child = crit.children[0] rsm, psm, lsm, dps = ci.states # overwrite self.failUnlessEquals(rsm, state.RESERVE_START) self.failUnlessEquals(psm, state.RELEASED) self.failUnlessEquals(lsm, state.CREATED) self.failUnlessEquals(dps[:2], (False, 0) ) # we cannot really expect a consistent result for consistent here
class AggregatorTest(GenericProviderTest, unittest.TestCase): requester_agent = nsa.NetworkServiceAgent('test-requester:nsa', 'dud_endpoint1') provider_agent = nsa.NetworkServiceAgent(GenericProviderTest.base + ':nsa', 'dud_endpoint2') header = nsa.NSIHeader(requester_agent.urn(), provider_agent.urn(), connection_trace= [ requester_agent.urn() + ':1' ], security_attributes = [ nsa.SecurityAttribute('user', 'testuser') ] ) def setUp(self): db.setupDatabase() self.requester = common.DUDRequester() self.clock = task.Clock() nrm_map = StringIO.StringIO(topology.ARUBA_TOPOLOGY) nrm_ports, nml_network, link_vector = setup.setupTopology(nrm_map, self.network, 'aruba.net') self.backend = dud.DUDNSIBackend(self.network, nrm_ports, self.requester, {}) self.backend.scheduler.clock = self.clock pl = plugin.BasePlugin() pl.init( { config.NETWORK_NAME: self.network }, None ) pr = provreg.ProviderRegistry( { self.provider_agent.urn() : self.backend }, {} ) self.provider = aggregator.Aggregator(self.network, self.provider_agent, nml_network, link_vector, self.requester, pr, [], pl) # set parent for backend, we need to create the aggregator before this can be done self.backend.parent_requester = self.provider self.backend.startService() # request stuff self.start_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=2) self.end_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=10) self.schedule = nsa.Schedule(self.start_time, self.end_time) self.sd = nsa.Point2PointService(self.source_stp, self.dest_stp, self.bandwidth, cnt.BIDIRECTIONAL, False, None) self.criteria = nsa.Criteria(0, self.schedule, self.sd) @defer.inlineCallbacks def tearDown(self): from opennsa.backends.common import genericbackend # keep it simple... yield genericbackend.GenericBackendConnections.deleteAll() yield database.SubConnection.deleteAll() yield database.ServiceConnection.deleteAll() # close database connections, so we don't run out from twistar.registry import Registry Registry.DBPOOL.close() @defer.inlineCallbacks def testHairpinConnectionAllowed(self): self.provider.policies.append(cnt.ALLOW_HAIRPIN) source_stp = nsa.STP(self.network, self.source_port, nsa.Label(cnt.ETHERNET_VLAN, '1782') ) dest_stp = nsa.STP(self.network, self.source_port, nsa.Label(cnt.ETHERNET_VLAN, '1783') ) sd = nsa.Point2PointService(source_stp, dest_stp, self.bandwidth, cnt.BIDIRECTIONAL, False, None) criteria = nsa.Criteria(0, self.schedule, sd) self.header.newCorrelationId() try: acid = yield self.provider.reserve(self.header, None, None, None, criteria) yield self.requester.reserve_defer except Exception as e: self.fail('Should not have raised exception: %s' % str(e))
def make(self, values): return nsa.SecurityAttribute(*values)
class AggregatorTest(GenericProviderTest, unittest.TestCase): requester_agent = nsa.NetworkServiceAgent('test-requester:nsa', 'dud_endpoint1') provider_agent = nsa.NetworkServiceAgent(GenericProviderTest.base + ':nsa', 'dud_endpoint2') header = nsa.NSIHeader( requester_agent.urn(), provider_agent.urn(), connection_trace=[requester_agent.urn() + ':1'], security_attributes=[nsa.SecurityAttribute('user', 'testuser')]) def setUp(self): tcf = os.path.expanduser('~/.opennsa-test.json') tc = json.load(open(tcf)) database.setupDatabase(tc['database'], tc['database-user'], tc['database-password']) self.requester = common.DUDRequester() self.clock = task.Clock() nrm_ports = nrm.parsePortSpec( StringIO.StringIO(topology.ARUBA_TOPOLOGY)) network_topology = nml.createNMLNetwork(nrm_ports, self.network, self.network) self.backend = dud.DUDNSIBackend(self.network, nrm_ports, self.requester, {}) self.backend.scheduler.clock = self.clock route_vectors = gns.RouteVectors([cnt.URN_OGF_PREFIX + self.network]) route_vectors.updateVector(self.provider_agent.identity, 0, [self.network], {}) pl = plugin.BasePlugin() pl.init({config.NETWORK_NAME: self.network}, None) pr = provreg.ProviderRegistry( {self.provider_agent.urn(): self.backend}, {}) self.provider = aggregator.Aggregator(self.network, self.provider_agent, network_topology, route_vectors, self.requester, pr, [], pl) # set parent for backend, we need to create the aggregator before this can be done self.backend.parent_requester = self.provider self.backend.startService() # request stuff self.start_time = datetime.datetime.utcnow() + datetime.timedelta( seconds=2) self.end_time = datetime.datetime.utcnow() + datetime.timedelta( seconds=10) self.schedule = nsa.Schedule(self.start_time, self.end_time) self.sd = nsa.Point2PointService(self.source_stp, self.dest_stp, self.bandwidth, cnt.BIDIRECTIONAL, False, None) self.criteria = nsa.Criteria(0, self.schedule, self.sd) @defer.inlineCallbacks def tearDown(self): from opennsa.backends.common import genericbackend # keep it simple... yield genericbackend.GenericBackendConnections.deleteAll() yield database.SubConnection.deleteAll() yield database.ServiceConnection.deleteAll() # close database connections, so we don't run out from twistar.registry import Registry Registry.DBPOOL.close()
def parsePortSpec(source): # Parse the entries like the following: ## type name remote label bandwidth interface authz # #ethernet ps - vlan:1780-1783 1000 em0 [email protected] #ethernet netherlight netherlight#nordunet-(in|out) vlan:1780-1783 1000 em1 - #ethernet uvalight uvalight#nordunet-(in|out) vlan:1780-1783 1000 em2 nsa=aruba.net:nsa # Line starting with # and blank lines should be ignored assert isinstance(source, file) or isinstance( source, StringIO.StringIO), 'Topology source must be file or StringIO instance' nrm_ports = [] for line in source: line = line.strip() if not line or line.startswith('#'): continue tokens = [t for t in line.split(' ') if t != ''] if len(tokens) != 7: raise NRMSpecificationError( 'Invalid number of entries for entry: %s' % line) port_type, port_name, remote_spec, label_spec, bandwidth, interface, authz = tokens if not port_type in PORT_TYPES: raise error.TopologyError('Port type %s is not a valid port type' % port_type) remote_network, remote_port, in_suffix, out_suffix = _parseRemoteSpec( remote_spec) label = _parseLabelSpec(label_spec) try: bandwidth = int(bandwidth) except ValueError as e: raise NRMSpecificationError('Invalid bandwidth: %s' % str(e)) if port_type == cnt.NRM_ETHERNET: if remote_network is None: remote_port = None remote_in = None remote_out = None else: if not in_suffix or not out_suffix: raise NRMSpecificationError( 'Suffix not defined for bidirectional port %s' % port_name) remote_port = remote_network + ':' + remote_port remote_in = remote_port + in_suffix remote_out = remote_port + out_suffix else: raise AssertionError('do not know what to with port of type %s' % port_type) # these are more than auth attributes, but thats what they where for initially authz_attributes = [] link_vectors = {} transit_restricted = False if authz != '-': for aa in authz.split(','): if '=' in aa: #authz_attributes.append( nsa.SecurityAttribute(*aa.split('=',2)) ) ak, av = aa.split('=', 2) if ak in AUTH_ATTRIBUTES: authz_attributes.append(nsa.SecurityAttribute(ak, av)) elif ak in PATH_ATTRIBUTES: if not '@' in av: raise config.ConfigurationError( 'Invalid path value: %s' % av) network, weight = av.split('@', 1) link_vectors[network] = int(weight) else: raise config.ConfigurationError( 'Invalid attribute: %s' % aa) elif aa in ATTRIBUTES and aa == cnt.NRM_RESTRICTTRANSIT: transit_restricted = True else: raise config.ConfigurationError('Invalid attribute: %s' % aa) nrm_ports.append( NRMPort(port_type, port_name, remote_network, remote_port, remote_in, remote_out, label, bandwidth, interface, authz_attributes, link_vectors, transit_restricted)) return nrm_ports