Esempio n. 1
0
    def testNoStartEndTimeAndAdditionalReservation(self):

        schedule    = nsa.Schedule(None, None)
        criteria    = nsa.Criteria(0, schedule, nsa.Point2PointService(self.source_stp, self.dest_stp, 200, cnt.BIDIRECTIONAL, False, None) )

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None, criteria)
        header, cid, gid, desc, sc = yield self.requester.reserve_defer
        self.failUnlessEqual(cid, acid)

        yield self.provider.reserveCommit(self.header, acid)
        cid = yield self.requester.reserve_commit_defer

        # second reservation
        self.header.newCorrelationId()
        self.requester.reserve_defer = defer.Deferred()
        self.requester.reserve_commit_defer = defer.Deferred()

        schedule    = nsa.Schedule(None, None)
        criteria    = nsa.Criteria(0, schedule, nsa.Point2PointService(self.source_stp, self.dest_stp, 200, cnt.BIDIRECTIONAL, False, None) )

        acid2 = yield self.provider.reserve(header, None, None, None, criteria)
        _ = yield self.requester.reserve_defer

        yield self.provider.reserveCommit(self.header, acid2)
        cid = yield self.requester.reserve_commit_defer
Esempio n. 2
0
    def testReserveTimeout(self):

        # these need to be constructed such that there is only one label option
        source_stp  = nsa.STP(self.network, self.source_port, nsa.Label(cnt.ETHERNET_VLAN, '1782') )
        dest_stp    = nsa.STP(self.network, self.dest_port,   nsa.Label(cnt.ETHERNET_VLAN, '1782') )
        criteria    = nsa.Criteria(0, self.schedule, nsa.Point2PointService(source_stp, dest_stp, self.bandwidth, cnt.BIDIRECTIONAL, False, None) )

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None, criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer

        self.clock.advance(self.backend.TPC_TIMEOUT + 1)

        header, cid, notification_id, timestamp, timeout_value, org_cid, org_nsa = yield self.requester.reserve_timeout_defer

        self.failUnlessEquals(cid, acid)

        self.requester.reserve_defer = defer.Deferred()

        # new criteria
        start_time  = datetime.datetime.utcnow() + datetime.timedelta(seconds=2)
        end_time    = datetime.datetime.utcnow() + datetime.timedelta(seconds=6)
        schedule    = nsa.Schedule(start_time, end_time)
        criteria    = nsa.Criteria(0, schedule, nsa.Point2PointService(source_stp, dest_stp, self.bandwidth, cnt.BIDIRECTIONAL, False, None) )

        # try to reserve the same resources
        acid2 = yield self.provider.reserve(self.header, None, None, None, criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer
Esempio n. 3
0
    def testReserveFailAndLabelSwapEnabled(self):

        # When you try to reserve a circuit using a labelSwap enabled backend and the dest_stp appers to be in use,
        # the src stp reservation never gets removed from the calendar

        self.assertTrue(self.backend.connection_manager.canSwapLabel(cnt.ETHERNET_VLAN),"DUD is not able to swapLabels")

        # Construct a valid circuit
        source_stp  = nsa.STP(self.network, self.source_port, nsa.Label(cnt.ETHERNET_VLAN, '1782') )
        dest_stp    = nsa.STP(self.network, self.dest_port,   nsa.Label(cnt.ETHERNET_VLAN, '1782') )
        criteria    = nsa.Criteria(0, self.schedule, nsa.Point2PointService(source_stp, dest_stp, 200, cnt.BIDIRECTIONAL, False, None) )

        #We shouldn't have reservations in the calendar right now
        self.assertEquals(len(self.backend.calendar.reservations), 0,
                          "Reservations size is %s should be 0" % len(self.backend.calendar.reservations))

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None, criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer

        # reset deferred for reservation
        self.requester.reserve_defer = defer.Deferred()

        # 2 reservations, for source_stp and dest_stp
        self.assertEquals(len(self.backend.calendar.reservations), 2,
                          "Reservations size is %s should be 2" % len(self.backend.calendar.reservations))

        #Construct a second circuit, with the same dest_stp
        source_stp2 = nsa.STP(self.network,self.source_port, nsa.Label(cnt.ETHERNET_VLAN, '1781'))
        criteria2    = nsa.Criteria(0, self.schedule, nsa.Point2PointService(source_stp2, dest_stp, 200, cnt.BIDIRECTIONAL, False, None) )

        self.header.newCorrelationId()
        try:
            acid2 = yield self.provider.reserve(self.header, None, None, None, criteria2)
            header2, cid2, gid2, desc2, sp2 = yield self.requester.reserve_defer
        except error.STPUnavailableError as e:
            pass

        # reset deferred for reservation
        self.requester.reserve_defer = defer.Deferred()

        # The second reserve request failed, so we should have the original 2 reservations in the calendar
        self.assertEquals(len(self.backend.calendar.reservations), 2,
                         "Reservations size is %s should be 2" % len(self.backend.calendar.reservations))

        # terminate the connection
        yield self.provider.terminate(self.header, cid)
        yield self.requester.terminate_defer

        for stp in [source_stp2,dest_stp,source_stp]:
            try:
                res = self.backend.connection_manager.getResource(stp.port, stp.label)
                resource_is_available = self.backend.calendar.checkReservation(res, self.schedule.start_time,self.schedule.end_time)
            except error.STPUnavailableError as e:
                self.fail("STP %s should be available" % res)
Esempio n. 4
0
    def testProvisionReleaseNoStartEndTime(self):

        schedule    = nsa.Schedule(None, None)
        criteria    = nsa.Criteria(0, schedule, nsa.Point2PointService(self.source_stp, self.dest_stp, 200, 'Bidirectional', False, None) )

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None, criteria)
        yield self.requester.reserve_defer

        yield self.provider.reserveCommit(self.header, acid)
        yield self.requester.reserve_commit_defer

        yield self.provider.provision(self.header, acid)
        yield self.requester.provision_defer

        self.clock.advance(3)

        header, cid, nid, timestamp, dps = yield self.requester.data_plane_change_defer
        active, version, consistent = dps
        self.failUnlessEquals(active, True)

        self.requester.data_plane_change_defer = defer.Deferred()

        yield self.provider.release(self.header, acid)
        yield self.requester.release_defer

        header, cid, nid, timestamp, dps = yield self.requester.data_plane_change_defer
        active, version, consistent = dps
        self.failUnlessEquals(active, False)

        yield self.provider.terminate(self.header, cid)
        yield self.requester.terminate_defer
Esempio n. 5
0
    def testReserveAbort(self):

        # these need to be constructed such that there is only one label option
        source_stp = nsa.STP(self.network, self.source_port,
                             nsa.Label(cnt.ETHERNET_VLAN, '1782'))
        dest_stp = nsa.STP(self.network, self.dest_port,
                           nsa.Label(cnt.ETHERNET_VLAN, '1782'))
        criteria = nsa.Criteria(
            0, self.schedule,
            nsa.Point2PointService(source_stp, dest_stp, 200,
                                   cnt.BIDIRECTIONAL, False, None))

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None,
                                           criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer

        yield self.provider.reserveAbort(self.header, acid)
        header, cid = yield self.requester.reserve_abort_defer

        self.requester.reserve_defer = defer.Deferred()

        # try to reserve the same resources
        acid2 = yield self.provider.reserve(self.header, None, None, None,
                                            criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer
Esempio n. 6
0
    def testLabelRangeMultiReservation(self):

        source_stp = nsa.STP(self.network, self.source_port,
                             nsa.Label(cnt.ETHERNET_VLAN, '1781-1783'))
        dest_stp = nsa.STP(self.network, self.dest_port,
                           nsa.Label(cnt.ETHERNET_VLAN, '1781-1783'))
        criteria = nsa.Criteria(
            0, self.schedule,
            nsa.Point2PointService(source_stp, dest_stp, 100, 'Bidirectional',
                                   False, None))

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None,
                                           criteria)
        yield self.requester.reserve_defer

        self.header.newCorrelationId()
        yield self.provider.reserveCommit(self.header, acid)
        yield self.requester.reserve_commit_defer

        self.requester.reserve_defer = defer.Deferred()
        self.requester.reserve_commit_defer = defer.Deferred()

        self.header.newCorrelationId()
        acid2 = yield self.provider.reserve(self.header, None, None, None,
                                            criteria)
        yield self.requester.reserve_defer

        self.header.newCorrelationId()
        yield self.provider.reserveCommit(self.header, acid2)
        yield self.requester.reserve_commit_defer
Esempio n. 7
0
    def reserveConfirmed(self, soap_data, request_info):

        header, reservation = helper.parseRequest(soap_data)

        criteria = reservation.criteria

        # Create DTOs - this overlaps heavily with the parsing done in providerservice - unify sometime

        start_time = xmlhelper.parseXMLTimestamp(criteria.schedule.startTime) if criteria.schedule.startTime is not None else None
        end_time   = xmlhelper.parseXMLTimestamp(criteria.schedule.endTime)   if criteria.schedule.endTime   is not None else None
        schedule   = nsa.Schedule(start_time, end_time)

        # check for service type sometime
        p2ps = criteria.serviceDefinition
        if type(p2ps) is not p2pservices.P2PServiceBaseType:
            raise ValueError('Only P2P service supported.')

        # (ERO missing)
        src_stp = helper.createSTP(p2ps.sourceSTP)
        dst_stp = helper.createSTP(p2ps.destSTP)

        if p2ps.ero:
            print('ERO parsing in reserveConfirmed not implemented yet, full path will not be available')

        sd = nsa.Point2PointService(src_stp, dst_stp, p2ps.capacity, p2ps.directionality, p2ps.symmetricPath, None)
        crt = nsa.Criteria(criteria.version, schedule, sd)

        self.requester.reserveConfirmed(header, reservation.connectionId,  reservation.globalReservationId, reservation.description, crt)

        return helper.createGenericRequesterAcknowledgement(header)
Esempio n. 8
0
    def testPortSTPs(self):

        source_stp  = nsa.STP(self.network, 'eth1', None)
        dest_stp    = nsa.STP(self.network, 'eth2', None)

        criteria    = nsa.Criteria(0, self.schedule, nsa.Point2PointService(source_stp, dest_stp, 200, cnt.BIDIRECTIONAL, False, None) )

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None, criteria)
        header, cid, gid, desc, sc = yield self.requester.reserve_defer
        self.failUnlessEqual(cid, acid)

        yield self.provider.reserveCommit(self.header, acid)
        cid = yield self.requester.reserve_commit_defer

        yield self.provider.provision(self.header, acid)
        cid = yield self.requester.provision_defer

        self.clock.advance(3)

        header, cid, nid, timestamp, dps = yield self.requester.data_plane_change_defer
        active, version, consistent = dps

        self.requester.data_plane_change_defer = defer.Deferred() # need a new one for deactivate

        self.failUnlessEqual(cid, acid)
        self.failUnlessEqual(active, True)
        self.failUnlessEqual(consistent, True)

        #yield self.provider.release(self.header, cid)
        #cid = yield self.requester.release_defer

        yield self.provider.terminate(self.header, acid)
        cid = yield self.requester.terminate_defer
Esempio n. 9
0
    def setUp(self):

        self.clock = task.Clock()

        self.requester = common.DUDRequester()

        nrm_ports = nrm.parsePortSpec(StringIO.StringIO(topology.ARUBA_TOPOLOGY))

        self.backend = dud.DUDNSIBackend(self.network, nrm_ports, self.requester, {})

        self.provider = self.backend
        self.provider.scheduler.clock = self.clock
        self.provider.startService()

        db.setupDatabase()

        # 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)

        return self.backend.restore_defer
Esempio n. 10
0
    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)
Esempio n. 11
0
    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
Esempio n. 12
0
    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)
Esempio n. 13
0
    def testSlowActivate(self):
        # key here is that end time is passed when activation is done

        start_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=2)
        end_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=4)
        schedule = nsa.Schedule(start_time, end_time)

        source_stp = nsa.STP(self.network, self.source_port,
                             nsa.Label(cnt.ETHERNET_VLAN, '1780'))
        dest_stp = nsa.STP(self.network, self.dest_port,
                           nsa.Label(cnt.ETHERNET_VLAN, '1780'))
        criteria = nsa.Criteria(
            0, schedule,
            nsa.Point2PointService(source_stp, dest_stp, 200,
                                   cnt.BIDIRECTIONAL, False, None))

        def setupLink(connection_id, src, dst, bandwidth):
            d = defer.Deferred()
            reactor.callLater(2, d.callback, None)
            return d

        # make activation fail via monkey patching
        self.backend.connection_manager.setupLink = setupLink

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None,
                                           criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer

        self.failUnlessEqual(cid, acid)

        yield self.provider.reserveCommit(self.header, cid)
        yield self.requester.reserve_commit_defer

        yield self.provider.provision(self.header, cid)
        yield self.requester.provision_defer

        self.clock.advance(3)

        header, cid, nid, timestamp, dps = yield self.requester.data_plane_change_defer
        active, version, consistent = dps

        self.failUnlessEqual(cid, acid)
        self.failUnlessEqual(active, True)
        self.failUnlessEqual(consistent, True)

        self.requester.data_plane_change_defer = defer.Deferred()

        self.clock.advance(2)
        header, cid, nid, timestamp, dps = yield self.requester.data_plane_change_defer
        active, version, consistent = dps

        self.failUnlessEqual(cid, acid)
        self.failUnlessEqual(active, False)

        yield self.provider.terminate(self.header, cid)
        yield self.requester.terminate_defer
Esempio n. 14
0
    def testNoStartTime(self):

        start_time = None
        criteria = nsa.Criteria(0, nsa.Schedule(start_time, self.end_time),
                                self.sd)

        self.header.newCorrelationId()
        cid = yield self.provider.reserve(self.header, None, None, None,
                                          criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer
Esempio n. 15
0
    def testStartTimeInPast(self):

        start_time = datetime.datetime.utcnow() - datetime.timedelta(seconds=60)
        criteria   = nsa.Criteria(0, nsa.Schedule(start_time, self.end_time), self.sd)

        self.header.newCorrelationId()
        try:
            yield self.provider.reserve(self.header, None, None, None, criteria)
            self.fail('Should have raised PayloadError') # Error type is somewhat debatable, but this what we use
        except error.PayloadError:
            pass # expected
Esempio n. 16
0
    def testInvalidRewrite(self):

        source_stp  = nsa.STP(self.network, 'eth1', None)

        criteria    = nsa.Criteria(0, self.schedule, nsa.Point2PointService(source_stp, self.dest_stp, 200, cnt.BIDIRECTIONAL, False, None) )

        self.header.newCorrelationId()
        try:
            acid = yield self.provider.reserve(self.header, None, None, None, criteria)
            self.fail("Should have gotten topology error ")
        except error.NSIError:
            pass # expected
Esempio n. 17
0
    def testInvalidNetworkReservation(self):

        source_stp  = nsa.STP(self.network, self.source_port, nsa.Label(cnt.ETHERNET_VLAN, '1782') )
        dest_stp    = nsa.STP('NoSuchNetwork:topology', 'whatever', nsa.Label(cnt.ETHERNET_VLAN, '1782') )
        criteria    = nsa.Criteria(0, self.schedule, nsa.Point2PointService(source_stp, dest_stp, 200, 'Bidirectional', False, None) )

        self.header.newCorrelationId()
        try:
            yield self.provider.reserve(self.header, None, None, None, criteria)
            self.fail('Should have raised TopologyError')
        except (error.ConnectionCreateError, error.STPResolutionError):
            # we raise ConnectionCreateError in backends, and STPResolutionError in aggregator
            pass # expected
Esempio n. 18
0
    def testIdenticalPortSTPs(self):

        source_stp  = nsa.STP(self.network, 'eth1', None)
        dest_stp    = nsa.STP(self.network, 'eth1', None)

        criteria    = nsa.Criteria(0, self.schedule, nsa.Point2PointService(source_stp, dest_stp, 200, cnt.BIDIRECTIONAL, False, None) )

        self.header.newCorrelationId()
        try:
            acid = yield self.provider.reserve(self.header, None, None, None, criteria)
            self.fail("Should have gotten service error for identical ports")
        except error.ServiceError:
            pass # expected
Esempio n. 19
0
    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)
Esempio n. 20
0
    def testHairpinConnection(self):

        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:
            yield self.provider.reserve(self.header, None, None, None, criteria)
            self.fail('Should have raised ServceError / TopologyError')
        except error.ServiceError:
            pass # expected - hairpin
        except error.TopologyError:
            pass # expected - double vlan assignment
Esempio n. 21
0
    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))
Esempio n. 22
0
def reserveonly(client, nsi_header, src, dst, start_time, end_time, capacity, ero, connection_id, global_id):

    schedule = nsa.Schedule(start_time, end_time)
    service_def = _createP2PS(src, dst, capacity, ero)
    crt = nsa.Criteria(0, schedule, service_def)

    try:
        nsi_header.connection_trace = [ nsi_header.requester_nsa + ':' + '1' ]
        connection_id, _,_,criteria  = yield client.reserve(nsi_header, connection_id, global_id, 'Test Connection', crt)
        nsi_header.connection_trace = None
        sd = criteria.service_def
        log.msg("Connection created and held. Id %s at %s" % (connection_id, nsi_header.provider_nsa))
        log.msg("Source - Destination: %s - %s" % (sd.source_stp, sd.dest_stp))

    except error.NSIError as e:
        _logError(e)
Esempio n. 23
0
    def testDoubleReserve(self):

        source_stp  = nsa.STP(self.network, self.source_port, nsa.Label(cnt.ETHERNET_VLAN, '1781') )
        p2p = nsa.Point2PointService(source_stp, self.dest_stp, self.bandwidth, cnt.BIDIRECTIONAL, False, None)
        criteria = nsa.Criteria(0, self.schedule, p2p)

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None, criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer

        self.requester.reserve_defer = defer.Deferred() # new defer for new reserve request
        try:
            acid2 = yield self.provider.reserve(self.header, None, None, None, criteria)
            self.fail('Should have raised STPUnavailableError')
        except error.STPUnavailableError:
            pass # we expect this
Esempio n. 24
0
    def _doReserve(self, conn, correlation_id):

        # we have already checked resource availability, so can progress directly through checking
        state.reserveMultiSwitch(conn, state.RESERVE_CHECKING,
                                 state.RESERVE_HELD)
        yield conn.save()
        self.logStateUpdate(conn, 'RESERVE CHECKING/HELD')

        # schedule 2PC timeout
        if self.scheduler.hasScheduledCall(conn.connection_id):
            # this means that the build scheduler made a call while we yielded
            self.scheduler.cancelCall(conn.connection_id)

        now = datetime.datetime.utcnow()
        timeout_time = min(now + datetime.timedelta(seconds=self.TPC_TIMEOUT),
                           conn.end_time)

        self.scheduler.scheduleCall(conn.connection_id, timeout_time,
                                    self._doReserveTimeout, conn)
        td = timeout_time - datetime.datetime.utcnow()
        log.msg(
            'Connection %s: reserve abort scheduled for %s UTC (%i seconds)' %
            (conn.connection_id, timeout_time.replace(microsecond=0),
             td.total_seconds()),
            system=self.log_system)

        schedule = nsa.Schedule(conn.start_time, conn.end_time)
        sc_source_stp = nsa.STP(conn.source_network, conn.source_port,
                                conn.source_label)
        sc_dest_stp = nsa.STP(conn.dest_network, conn.dest_port,
                              conn.dest_label)
        sd = nsa.Point2PointService(
            sc_source_stp, sc_dest_stp, conn.bandwidth, cnt.BIDIRECTIONAL,
            False, None)  # we fake some things due to db limitations
        crit = nsa.Criteria(conn.revision, schedule, sd)

        header = nsa.NSIHeader(
            conn.requester_nsa,
            conn.requester_nsa,
            correlation_id=correlation_id
        )  # The NSA is both requester and provider in the backend, but this might be problematic without aggregator
        yield self.parent_requester.reserveConfirmed(
            header, conn.connection_id, conn.global_reservation_id,
            conn.description, crit)
Esempio n. 25
0
    def testNoStartOrEndTime(self):

        criteria   = nsa.Criteria(0, nsa.Schedule(None, None), self.sd)

        self.header.newCorrelationId()
        cid = yield self.provider.reserve(self.header, None, None, None, criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer

        yield self.provider.reserveCommit(self.header, cid)
        yield self.requester.reserve_commit_defer

        yield self.provider.provision(self.header, cid)
        yield self.requester.provision_defer

        self.clock.advance(3)

        header, cid, nid, timestamp, dps = yield self.requester.data_plane_change_defer
        active, version, consistent = dps
        self.failUnlessEquals(active, True)
Esempio n. 26
0
def reserveprovision(client, nsi_header, src, dst, start_time, end_time,
                     capacity, connection_id, global_id, notification_wait):

    schedule = nsa.Schedule(start_time, end_time)
    service_def = _createP2PS(src, dst, capacity)
    crt = nsa.Criteria(0, schedule, service_def)

    try:
        nsi_header.connection_trace = [nsi_header.requester_nsa + ':' + '1']
        connection_id, _, _, criteria = yield client.reserve(
            nsi_header, connection_id, global_id, 'Test Connection', crt)
        nsi_header.connection_trace = []
        sd = criteria.service_def
        log.msg("Connection created and held. Id %s at %s" %
                (connection_id, nsi_header.provider_nsa))
        log.msg("Source - Destination: %s - %s" % (sd.source_stp, sd.dest_stp))

        nsi_header.newCorrelationId()
        yield client.reserveCommit(nsi_header, connection_id)
        log.msg("Connection committed at %s" % nsi_header.provider_nsa)

        # query
        nsi_header.newCorrelationId()
        qr = yield client.querySummary(nsi_header,
                                       connection_ids=[connection_id])
        print "Query result:", qr

        # provision
        nsi_header.newCorrelationId()
        yield client.provision(nsi_header, connection_id)
        log.msg('Connection %s provisioned' % connection_id)

        while notification_wait:
            event = yield client.notifications.get()
            exit = _handleEvent(event)
            if exit:
                break

    except error.NSIError, e:
        _logError(e)
Esempio n. 27
0
def rprt(client, nsi_header, src, dst, start_time, end_time, capacity,
         connection_id, global_id):
    # reserve, provision, release,  terminate
    schedule = nsa.Schedule(start_time, end_time)
    service_def = _createP2PS(src, dst, capacity)
    crt = nsa.Criteria(0, schedule, service_def)

    try:
        nsi_header.connection_trace = [nsi_header.requester_nsa + ':' + '1']
        connection_id, _, _, criteria = yield client.reserve(
            nsi_header, connection_id, global_id, 'Test Connection', crt)
        nsi_header.connection_trace = []
        sd = criteria.service_def
        log.msg("Connection created and held. Id %s at %s" %
                (connection_id, nsi_header.provider_nsa))
        log.msg("Source - Destination: %s - %s" % (sd.source_stp, sd.dest_stp))

        # commit
        nsi_header.newCorrelationId()
        yield client.reserveCommit(nsi_header, connection_id)
        log.msg("Connection committed at %s" % nsi_header.provider_nsa)

        # provision
        nsi_header.newCorrelationId()
        yield client.provision(nsi_header, connection_id)
        log.msg('Connection %s provisioned' % connection_id)

        # release
        nsi_header.newCorrelationId()
        yield client.release(nsi_header, connection_id)
        log.msg('Connection %s released' % connection_id)

        # terminate
        nsi_header.newCorrelationId()
        yield client.terminate(nsi_header, connection_id)
        log.msg('Connection %s terminated' % connection_id)

    except error.NSIError, e:
        _logError(e)
Esempio n. 28
0
    def testReserveTerminateReReserve(self):

        # Tamas Varga found a bug where calendar isn't probably cleanup up on reserve+terminate
        # This reproduces the the issue

        # these need to be constructed such that there is only one label option
        source_stp  = nsa.STP(self.network, self.source_port, nsa.Label(cnt.ETHERNET_VLAN, '1782') )
        dest_stp    = nsa.STP(self.network, self.dest_port,   nsa.Label(cnt.ETHERNET_VLAN, '1782') )
        criteria    = nsa.Criteria(0, self.schedule, nsa.Point2PointService(source_stp, dest_stp, 200, cnt.BIDIRECTIONAL, False, None) )

        self.header.newCorrelationId()
        acid = yield self.provider.reserve(self.header, None, None, None, criteria)
        header, cid, gid, desc, sp = yield self.requester.reserve_defer

        # reset deferred for reservation
        self.requester.reserve_defer = defer.Deferred()

        # terminate the connection
        yield self.provider.terminate(self.header, cid)
        yield self.requester.terminate_defer

        # try to reserve the same resources
        acid2 = yield self.provider.reserve(self.header, None, None, None, criteria)
        yield self.requester.reserve_defer
Esempio n. 29
0
    def render_POST(self, request):

        allowed, msg, request_info = requestauthz.checkAuthz(
            request, self.allowed_hosts)
        if not allowed:
            payload = msg + RN
            return _requestResponse(request, 401, payload)  # Not Authorized

        payload = request.content.read()

        if len(payload) == 0:
            log.msg('No data received in request', system=LOG_SYSTEM)
            payload = 'No data received in request' + RN
            return _requestResponse(request, 400, payload)  # Bad Request

        if len(payload) > 32 * 1024:
            log.msg('Rejecting request, payload too large. Length %i' %
                    len(payload),
                    system=LOG_SYSTEM)
            payload = 'Requests too large' + RN
            return _requestResponse(request, 413, payload)  # Payload Too Large

        try:
            data = json.loads(payload)
        except ValueError:
            log.msg('Invalid JSON data received, returning 400',
                    system=LOG_SYSTEM)
            payload = 'Invalid JSON data' + RN
            return _requestResponse(request, 400, payload)  # Bad Request

        def createResponse(connection_id):

            payload = 'Connection created' + RN
            header = {'location': self.base_path + '/' + connection_id}
            _finishRequest(request, 201, payload, header)  # Created
            return connection_id

        # extract stuffs
        try:
            source = data['source']
            if not source.startswith(cnt.URN_OGF_PREFIX):
                source = cnt.URN_OGF_PREFIX + source

            destination = data['destination']
            if not destination.startswith(cnt.URN_OGF_PREFIX):
                destination = cnt.URN_OGF_PREFIX + destination

            source_stp = helper.createSTP(str(source))
            destination_stp = helper.createSTP(str(destination))

            start_time = xmlhelper.parseXMLTimestamp(
                data[START_TIME]) if START_TIME in data else None
            end_time = xmlhelper.parseXMLTimestamp(
                data[END_TIME]) if END_TIME in data else None
            capacity = data[
                'capacity'] if 'capacity' in data else 0  # Maybe None should just be best effort

            # auto commit (default true) and auto provision (defult false)
            auto_commit = False if 'auto_commit' in data and not data[
                'auto_commit'] else True
            auto_provision = True if 'auto_provision' in data and data[
                'auto_provision'] else False

            if auto_provision and not auto_commit:
                msg = 'Cannot have auto-provision without auto-commit'
                log.msg('Rejecting request: ' + msg, system=LOG_SYSTEM)
                return _requestResponse(request, 400, msg + RN)  # Bad Request

            # fillers, we don't really do this in this api
            symmetric = False
            ero = None
            params = None
            version = 0

            service_def = nsa.Point2PointService(source_stp, destination_stp,
                                                 capacity, cnt.BIDIRECTIONAL,
                                                 symmetric, ero, params)
            schedule = nsa.Schedule(start_time, end_time)
            criteria = nsa.Criteria(version, schedule, service_def)

            header = nsa.NSIHeader(
                'rest-dud-requester',
                'rest-dud-provider')  # completely bogus header

            d = self.provider.reserve(
                header, None, None, None, criteria, request_info
            )  # nones are connection_id, global resv id, description
            d.addCallbacks(createResponse,
                           _createErrorResponse,
                           errbackArgs=(request, ))

            if auto_commit:

                @defer.inlineCallbacks
                def connectionCreated(conn_id):
                    if conn_id is None:
                        # error creating connection
                        # not exactly optimal code flow here, but chainining the callback correctly for this is tricky
                        return

                    conn = yield self.provider.getConnection(conn_id)

                    def stateUpdate():
                        log.msg(
                            'stateUpdate reservation_state: %s, provision_state: %s'
                            % (str(conn.reservation_state),
                               str(conn.provision_state)),
                            debug=True,
                            system=LOG_SYSTEM)
                        if conn.reservation_state == state.RESERVE_HELD:
                            self.provider.reserveCommit(
                                header, conn_id, request_info)
                        if conn.reservation_state == state.RESERVE_START and conn.provision_state == state.RELEASED and auto_provision:
                            self.provider.provision(header, conn_id,
                                                    request_info)
                        if conn.provision_state == state.PROVISIONED:
                            state.desubscribe(conn_id, stateUpdate)

                    state.subscribe(conn_id, stateUpdate)

                d.addCallback(connectionCreated)

            return server.NOT_DONE_YET

        except Exception as e:
            #log.err(e, system=LOG_SYSTEM)
            log.msg('Error creating connection: %s' % str(e),
                    system=LOG_SYSTEM)

            error_code = _errorCode(e)
            return _requestResponse(request, error_code, str(e))
Esempio n. 30
0
    def setUp(self):
        from twisted.web import resource, server
        from twisted.application import internet
        from opennsa.protocols import nsi2
        from opennsa.protocols.shared import resource as soapresource
        from opennsa.protocols.nsi2 import requesterservice, requesterclient

        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, None,
                                         {})  # we set the parent later
        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.aggregator = aggregator.Aggregator(self.network,
                                                self.provider_agent,
                                                network_topology,
                                                route_vectors, 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)