Beispiel #1
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)
Beispiel #2
0
    def querySummarySync(self, soap_data):
        def gotReservations(reservations, header):
            # do reply inline
            soap_header_element = helper.createProviderHeader(
                header.requester_nsa,
                header.provider_nsa,
                correlation_id=header.correlation_id)

            qs_reservations = queryhelper.buildQuerySummaryResultType(
                reservations)

            qsct = nsiconnection.QuerySummaryConfirmedType(qs_reservations)

            payload = minisoap.createSoapPayload(
                qsct.xml(nsiconnection.querySummarySyncConfirmed),
                soap_header_element)
            return payload

        header, query = helper.parseRequest(soap_data)
        d = self.provider.querySummarySync(header, query.connectionId,
                                           query.globalReservationId)
        d.addCallbacks(gotReservations,
                       self._createSOAPFault,
                       callbackArgs=(header, ),
                       errbackArgs=(header.provider_nsa, ))
        return d
Beispiel #3
0
    def reserveTimeout(self, soap_data):

        header, reserve_timeout = helper.parseRequest(soap_data)
        rt = reserve_timeout
        self.requester.reserveTimeout(header, rt.connectionId, rt.notificationId, rt.timeStamp, rt.timeoutValue, rt.originatingConnectionId, rt.originatingNSA)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #4
0
    def reserveConfirmed(self, soap_data):

        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)
        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)
Beispiel #5
0
 def release(self, soap_data):
     header, request = helper.parseRequest(soap_data)
     d = self.provider.release(header, request.connectionId)
     d.addCallbacks(
         lambda _: helper.createGenericProviderAcknowledgement(header),
         self._createSOAPFault,
         errbackArgs=(header.provider_nsa, request.connectionId))
     return d
Beispiel #6
0
 def gotReply(soap_data):
     header, query_confirmed = helper.parseRequest(soap_data)
     if query_confirmed is None:
         return []
     elif type(query_confirmed) is list:
         return [ helper.buildQuerySummaryResult(qc) for qc in query_confirmed ]
     else:
         return [ helper.buildQuerySummaryResult(query_confirmed) ]
Beispiel #7
0
 def reserveCommit(self, soap_data, request_info):
     header, confirm = helper.parseRequest(soap_data)
     d = self.provider.reserveCommit(header, confirm.connectionId,
                                     request_info)
     d.addCallbacks(
         lambda _: helper.createGenericProviderAcknowledgement(header),
         self._createSOAPFault,
         errbackArgs=(header.provider_nsa, confirm.connectionId))
     return d
Beispiel #8
0
    def reserveTimeout(self, soap_data, request_info):

        header, reserve_timeout = helper.parseRequest(soap_data)

        rt = reserve_timeout
        timestamp = xmlhelper.parseXMLTimestamp(rt.timeStamp)
        self.requester.reserveTimeout(header, rt.connectionId, rt.notificationId, timestamp, rt.timeoutValue, rt.originatingConnectionId, rt.originatingNSA)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #9
0
    def queryRecursiveConfirmed(self, soap_data, request_info):

        header, query_result = helper.parseRequest(soap_data)

        reservations = [ queryhelper.buildQueryResult(res, header.provider_nsa, include_children=True) for res in query_result.reservations ]

        self.requester.queryRecursiveConfirmed(header, reservations)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #10
0
    def queryRecursiveConfirmed(self, soap_data):

        header, query_result = helper.parseRequest(soap_data)

        reservations = [ queryhelper.buildQueryResult(res, header.provider_nsa, include_children=True) for res in query_result.reservations ]

        self.requester.queryRecursiveConfirmed(header, reservations)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #11
0
    def querySummaryConfirmed(self, soap_data, request_info):

        header, query_result = helper.parseRequest(soap_data)

        reservations = [ queryhelper.buildQueryResult(res, header.provider_nsa) for res in query_result.reservations ]

        self.requester.querySummaryConfirmed(header, reservations)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #12
0
    def dataPlaneStateChange(self, soap_data, request_info):

        header, data_plane_state_change = helper.parseRequest(soap_data)

        dpsc = data_plane_state_change
        dps = dpsc.dataPlaneStatus

        self.requester.dataPlaneStateChange(header, dpsc.connectionId, dpsc.notificationId, dpsc.timeStamp, (dps.active, dps.version, dps.versionConsistent) )

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #13
0
    def queryRecursive(self, soap_data):

        header, query = helper.parseRequest(soap_data)
        d = self.provider.queryRecursive(header, query.connectionId,
                                         query.globalReservationId)
        d.addCallbacks(
            lambda _: helper.createGenericProviderAcknowledgement(header),
            self._createSOAPFault,
            errbackArgs=(header.provider_nsa, ))
        return d
Beispiel #14
0
    def dataPlaneStateChange(self, soap_data):

        header, data_plane_state_change = helper.parseRequest(soap_data)

        dpsc = data_plane_state_change
        dps = dpsc.dataPlaneStatus

        self.requester.dataPlaneStateChange(header, dpsc.connectionId, dpsc.notificationId, dpsc.timeStamp, (dps.active, dps.version, dps.versionConsistent) )

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #15
0
    def _parseGenericFailure(self, soap_data):

        header, generic_failure = helper.parseRequest(soap_data)

        rc = generic_failure.connectionStates
        rd = rc.dataPlaneStatus

        dps = (rd.active, rd.version, rd.versionConsistent)
        cs = (rc.reservationState, rc.provisionState, rc.lifecycleState, dps)

        ex = helper.createException(generic_failure.serviceException, header.provider_nsa)
        return header, generic_failure.connectionId, cs, ex
Beispiel #16
0
    def querySummaryConfirmed(self, soap_data):

        header, query_result = helper.parseRequest(soap_data)

        reservations = [
            queryhelper.buildQueryResult(res, header.provider_nsa)
            for res in query_result.reservations
        ]

        self.requester.querySummaryConfirmed(header, reservations)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #17
0
    def _parseGenericFailure(self, soap_data):

        header, generic_failure = helper.parseRequest(soap_data)

        rc = generic_failure.connectionStates
        rd = rc.dataPlaneStatus

        dps = (rd.active, rd.version, rd.versionConsistent)
        cs = (rc.reservationState, rc.provisionState, rc.lifecycleState, dps)

        ex = helper.createException(generic_failure.serviceException, header.provider_nsa)
        return header, generic_failure.connectionId, cs, ex
Beispiel #18
0
    def errorEvent(self, soap_data):

        header, error_event = helper.parseRequest(soap_data)

        #connection_id, notification_id, timestamp, event, info, service_ex = 
        ee = error_event
        if ee.serviceException:
            se = ee.serviceException
            service_ex = (se.nsaId, se.connectionId, se.errorId, se.text, se.variables, se.childException)
        else:
            service_ex = None

        self.requester.errorEvent(header, ee.connectionId, ee.notificationId, ee.timeStamp, ee.event, ee.additionalInfo, service_ex)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #19
0
    def errorEvent(self, soap_data, request_info):

        header, error_event = helper.parseRequest(soap_data)

        #connection_id, notification_id, timestamp, event, info, service_ex = 
        ee = error_event
        if ee.serviceException:
            se = ee.serviceException
            service_ex = (se.nsaId, se.connectionId, se.errorId, se.text, se.variables, se.childException)
        else:
            service_ex = None

        self.requester.errorEvent(header, ee.connectionId, ee.notificationId, ee.timeStamp, ee.event, ee.additionalInfo, service_ex)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #20
0
    def querySummarySync(self, soap_data, request_info):

        def gotReservations(reservations, header):
            # do reply inline
            soap_header_element = helper.createProviderHeader(header.requester_nsa, header.provider_nsa, correlation_id=header.correlation_id)

            qs_reservations = queryhelper.buildQuerySummaryResultType(reservations)

            qsct = nsiconnection.QuerySummaryConfirmedType(qs_reservations)

            payload = minisoap.createSoapPayload(qsct.xml(nsiconnection.querySummarySyncConfirmed), soap_header_element)
            return payload

        header, query = helper.parseRequest(soap_data)
        d = self.provider.querySummarySync(header, query.connectionId, query.globalReservationId, request_info)
        d.addCallbacks(gotReservations, self._createSOAPFault, callbackArgs=(header,), errbackArgs=(header.provider_nsa,))
        return d
Beispiel #21
0
    def querySummarySync(self, soap_data):

        def gotReservations(reservations):
            # do reply inline
            soap_header = nsiframework.CommonHeaderType(cnt.CS2_SERVICE_TYPE, header.correlation_id, header.requester_nsa, header.provider_nsa, None, header.session_security_attrs)
            soap_header_element = soap_header.xml(nsiframework.nsiHeader)

            query_summary_result = helper.buildQuerySummaryResultType(reservations)
            qsr_elements = [ qsr.xml(nsiconnection.reservation) for qsr in query_summary_result ]

            payload = minisoap.createSoapPayload(qsr_elements, soap_header_element)
            return payload

        header, query = helper.parseRequest(soap_data)
        d = self.provider.querySummarySync(header, query.connectionId, query.globalReservationId)
        d.addCallbacks(gotReservations, self._createSOAPFault, errbackArgs=(header.provider_nsa,))
        return d
Beispiel #22
0
    def error(self, soap_data):

        header, error = helper.parseRequest(soap_data)
        se = error.serviceException
        # service exception fields, we are not quite there yet...
        # nsaId  # NsaIdType -> anyURI
        # connectionId  # ConnectionIdType -> string
        # serviceType  # string
        # errorId  # string
        # text  # string
        # variables  # [ TypeValuePairType ]
        # childException  # [ ServiceException ]
        variables = [ (tvp.type, tvp.value) for tvp in se.variables ]
        child_ex = None

        self.requester.error(header, se.nsaId, se.connectionId, se.serviceType, se.errorId, se.text, variables, child_ex)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #23
0
    def error(self, soap_data, request_info):

        header, error = helper.parseRequest(soap_data)
        se = error.serviceException
        # service exception fields, we are not quite there yet...
        # nsaId  # NsaIdType -> anyURI
        # connectionId  # ConnectionIdType -> string
        # serviceType  # string
        # errorId  # string
        # text  # string
        # variables  # [ TypeValuePairType ]
        # childException  # [ ServiceException ]
        variables = [ (tvp.type, tvp.value) for tvp in se.variables ]
        child_ex = None

        self.requester.error(header, se.nsaId, se.connectionId, se.serviceType, se.errorId, se.text, variables, child_ex)

        return helper.createGenericRequesterAcknowledgement(header)
Beispiel #24
0
 def gotReply(soap_data):
     header, query_confirmed = helper.parseRequest(soap_data)
     return [queryhelper.buildQueryResult(resv, header.provider_nsa) for resv in query_confirmed.reservations]
Beispiel #25
0
 def _handleAck(soap_data):
     header, ack = helper.parseRequest(soap_data)
     return ack.connectionId
Beispiel #26
0
 def reserveCommit(self, soap_data):
     header, confirm = helper.parseRequest(soap_data)
     d = self.provider.reserveCommit(header, confirm.connectionId)
     d.addCallbacks(lambda _ : helper.createGenericProviderAcknowledgement(header), self._createSOAPFault, errbackArgs=(header.provider_nsa, confirm.connectionId))
     return d
Beispiel #27
0
 def terminateConfirmed(self, soap_data):
     header, generic_confirm = helper.parseRequest(soap_data)
     self.requester.terminateConfirmed(header, generic_confirm.connectionId)
     return helper.createGenericRequesterAcknowledgement(header)
Beispiel #28
0
 def provisionConfirmed(self, soap_data, request_info):
     header, generic_confirm = helper.parseRequest(soap_data)
     self.requester.provisionConfirmed(header, generic_confirm.connectionId)
     return helper.createGenericRequesterAcknowledgement(header)
Beispiel #29
0
    def terminate(self, soap_data, request_info):

        header, request = helper.parseRequest(soap_data)
        d = self.provider.terminate(header, request.connectionId, request_info)
        d.addCallbacks(lambda _ : helper.createGenericProviderAcknowledgement(header), self._createSOAPFault, errbackArgs=(header.provider_nsa, request.connectionId))
        return d
Beispiel #30
0
    def queryRecursive(self, soap_data, request_info):

        header, query = helper.parseRequest(soap_data)
        d = self.provider.queryRecursive(header, query.connectionId, query.globalReservationId, request_info)
        d.addCallbacks(lambda _ : helper.createGenericProviderAcknowledgement(header), self._createSOAPFault, errbackArgs=(header.provider_nsa,))
        return d
Beispiel #31
0
    def reserve(self, soap_data, request_info):

        t_start = time.time()

        header, reservation = helper.parseRequest(soap_data)

        # do some checking here

#        print header.protocolVersion
#        print header.correlationId
#        print header.requesterNSA
#        print header.providerNSA
#        print header.replyTo

        criteria = reservation.criteria

        #version      = criteria.version # not used at the moment
        service_type = criteria.serviceType # right now we just ignore this, either we know the service type or not
        p2ps         = criteria.serviceDefinition

#        if len(service_defs) == 0:
#            err = failure.Failure ( error.PayloadError('No service definition element in message') )
#            return self._createSOAPFault(err, header.provider_nsa, service_type=service_type)

#        if len(service_defs) != 1:
#            err = failure.Failure ( error.PayloadError('Only one service definition allowed') )
#            return self._createSOAPFault(err, header.provider_nsa, service_type=service_type)

        if type(p2ps) is not p2pservices.P2PServiceBaseType:
            err = failure.Failure ( error.PayloadError('Only supports Point2PointService service for now.') )
            return self._createSOAPFault(err, header.provider_nsa, service_type=service_type)

        if p2ps.directionality in (None, ''):
            err = failure.Failure ( error.MissingParameterError('Directionality parameter not defined'))
            return self._createSOAPFault(err, header.provider_nsa)

        # create DTOs (EROs not supported yet)

        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)

        src_stp = helper.createSTP(p2ps.sourceSTP)
        dst_stp = helper.createSTP(p2ps.destSTP)

        if p2ps.ero:
            err = failure.Failure ( error.PayloadError('ERO not supported, go away.') )
            return self._createSOAPFault(err, header.provider_nsa)

#        if p2ps.parameter:
#            p = p2ps.parameter[0]
#            err = failure.Failure ( error.UnsupportedParameter('Unsupported parameter: %s/%s' % (p.type_, p.value) ) )
#            return self._createSOAPFault(err, header.provider_nsa)
        params = [ (p.type_, p.value) for p in p2ps.parameter ] if p2ps.parameter else None
        symmetric = p2ps.symmetricPath or False # the p2p service specifies default behaviour as false, but doesn't specify default
        sd = nsa.Point2PointService(src_stp, dst_stp, p2ps.capacity, p2ps.directionality, symmetric, None, params)

        crt = nsa.Criteria(criteria.version, schedule, sd)

        t_delta = time.time() - t_start
        log.msg('Profile: Reserve request parse time: %s' % round(t_delta, 3), profile=True, system=LOG_SYSTEM)

        d = self.provider.reserve(header, reservation.connectionId, reservation.globalReservationId, reservation.description, crt, request_info)

        def createReserveAcknowledgement(connection_id):
            # no reply to / security attrs / trace
            soap_header_element = helper.createProviderHeader(header.requester_nsa, header.provider_nsa, None, header.correlation_id)

            reserve_response = nsiconnection.ReserveResponseType(connection_id)
            reserve_response_element = reserve_response.xml(nsiconnection.reserveResponse)

            payload = minisoap.createSoapPayload(reserve_response_element, soap_header_element)
            return payload


        d.addCallbacks(createReserveAcknowledgement, self._createSOAPFault, errbackArgs=(header.provider_nsa,))
        return d
Beispiel #32
0
    def reserve(self, soap_data):

        t_start = time.time()

        header, reservation = helper.parseRequest(soap_data)

        # do some checking here

        #        print header.protocolVersion
        #        print header.correlationId
        #        print header.requesterNSA
        #        print header.providerNSA
        #        print header.replyTo

        criteria = reservation.criteria

        #version      = criteria.version # not used at the moment
        service_type = criteria.serviceType  # right now we just ignore this, either we know the service type or not
        p2ps = criteria.serviceDefinition

        #        if len(service_defs) == 0:
        #            err = failure.Failure ( error.PayloadError('No service definition element in message') )
        #            return self._createSOAPFault(err, header.provider_nsa, service_type=service_type)

        #        if len(service_defs) != 1:
        #            err = failure.Failure ( error.PayloadError('Only one service definition allowed') )
        #            return self._createSOAPFault(err, header.provider_nsa, service_type=service_type)

        if type(p2ps) is not p2pservices.P2PServiceBaseType:
            err = failure.Failure(
                error.PayloadError(
                    'Only supports Point2PointService service for now.'))
            return self._createSOAPFault(err,
                                         header.provider_nsa,
                                         service_type=service_type)

        if p2ps.directionality in (None, ''):
            err = failure.Failure(
                error.MissingParameterError(
                    'Directionality parameter not defined'))
            return self._createSOAPFault(err, header.provider_nsa)

        # create DTOs (EROs not supported yet)

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

        src_stp = helper.createSTP(p2ps.sourceSTP)
        dst_stp = helper.createSTP(p2ps.destSTP)

        if p2ps.ero:
            err = failure.Failure(
                error.PayloadError('ERO not supported, go away.'))
            return self._createSOAPFault(err, header.provider_nsa)

#        if p2ps.parameter:
#            p = p2ps.parameter[0]
#            err = failure.Failure ( error.UnsupportedParameter('Unsupported parameter: %s/%s' % (p.type_, p.value) ) )
#            return self._createSOAPFault(err, header.provider_nsa)
        params = [(p.type_, p.value)
                  for p in p2ps.parameter] if p2ps.parameter else None
        symmetric = p2ps.symmetricPath or False  # the p2p service specifies default behaviour as false, but doesn't specify default
        sd = nsa.Point2PointService(src_stp, dst_stp, p2ps.capacity,
                                    p2ps.directionality, symmetric, None,
                                    params)

        crt = nsa.Criteria(criteria.version, schedule, sd)

        t_delta = time.time() - t_start
        log.msg('Profile: Reserve request parse time: %s' % round(t_delta, 3),
                profile=True,
                system=LOG_SYSTEM)

        d = self.provider.reserve(header, reservation.connectionId,
                                  reservation.globalReservationId,
                                  reservation.description, crt)

        def createReserveAcknowledgement(connection_id):
            # no reply to / security attrs / trace
            soap_header_element = helper.createProviderHeader(
                header.requester_nsa, header.provider_nsa, None,
                header.correlation_id)

            reserve_response = nsiconnection.ReserveResponseType(connection_id)
            reserve_response_element = reserve_response.xml(
                nsiconnection.reserveResponse)

            payload = minisoap.createSoapPayload(reserve_response_element,
                                                 soap_header_element)
            return payload

        d.addCallbacks(createReserveAcknowledgement,
                       self._createSOAPFault,
                       errbackArgs=(header.provider_nsa, ))
        return d
Beispiel #33
0
 def terminateConfirmed(self, soap_data):
     header, generic_confirm = helper.parseRequest(soap_data)
     self.requester.terminateConfirmed(header, generic_confirm.connectionId)
     return helper.createGenericRequesterAcknowledgement(header)
Beispiel #34
0
 def provisionConfirmed(self, soap_data, request_info):
     header, generic_confirm = helper.parseRequest(soap_data)
     self.requester.provisionConfirmed(header, generic_confirm.connectionId)
     return helper.createGenericRequesterAcknowledgement(header)
Beispiel #35
0
 def gotReply(soap_data):
     header, query_confirmed = helper.parseRequest(soap_data)
     return [ queryhelper.buildQueryResult(resv, header.provider_nsa) for resv in query_confirmed.reservations ]
Beispiel #36
0
 def _handleAck(soap_data):
     header, ack = helper.parseRequest(soap_data)
     return ack.connectionId
Beispiel #37
0
    def reserve(self, soap_data):

        t_start = time.time()

        header, reservation = helper.parseRequest(soap_data)

        # do some checking here

#        print header.protocolVersion
#        print header.correlationId
#        print header.requesterNSA
#        print header.providerNSA
#        print header.replyTo

        criteria = reservation.criteria

        #version      = criteria.version # not used at the moment
        service_type = criteria.serviceType # right now we just ignore this, either we know the service type or not
        p2ps         = criteria.serviceDefinition

#        if len(service_defs) == 0:
#            err = failure.Failure ( error.PayloadError('No service definition element in message') )
#            return self._createSOAPFault(err, header.provider_nsa, service_type=service_type)

#        if len(service_defs) != 1:
#            err = failure.Failure ( error.PayloadError('Only one service definition allowed') )
#            return self._createSOAPFault(err, header.provider_nsa, service_type=service_type)

        if type(p2ps) is not p2pservices.P2PServiceBaseType:
            err = failure.Failure ( error.PayloadError('Only support EthernetVlanType service for now.') )
            return self._createSOAPFault(err, header.provider_nsa, service_type=service_type)

        # create DTOs (EROs not supported yet)

        start_time = helper.parseXMLTimestamp(criteria.schedule.startTime)
        end_time = helper.parseXMLTimestamp(criteria.schedule.endTime)
        schedule = nsa.Schedule(start_time, end_time)

        src_stp = helper.createSTP(p2ps.sourceSTP)
        dst_stp = helper.createSTP(p2ps.destSTP)

        if p2ps.ero:
            err = failure.Failure ( error.PayloadError('ERO not supported, go away.') )
            return self._createSOAPFault(err, header.provider_nsa)

        sd = nsa.Point2PointService(src_stp, dst_stp, p2ps.capacity, p2ps.directionality, p2ps.symmetricPath, None)

        crt = nsa.Criteria(criteria.version, schedule, sd)

        t_delta = time.time() - t_start
        log.msg('Profile: Reserve request parse time: %s' % round(t_delta, 3), profile=True, system=LOG_SYSTEM)

        d = self.provider.reserve(header, reservation.connectionId, reservation.globalReservationId, reservation.description, crt)

        def createReserveAcknowledgement(connection_id):
            soap_header = nsiframework.CommonHeaderType(cnt.CS2_SERVICE_TYPE, header.correlation_id, header.requester_nsa, header.provider_nsa, None, header.session_security_attrs)
            soap_header_element = soap_header.xml(nsiframework.nsiHeader)

            reserve_response = nsiconnection.ReserveResponseType(connection_id)
            reserve_response_element = reserve_response.xml(nsiconnection.reserveResponse)

            payload = minisoap.createSoapPayload(reserve_response_element, soap_header_element)
            return payload


        d.addCallbacks(createReserveAcknowledgement, self._createSOAPFault, errbackArgs=(header.provider_nsa,))
        return d