Best Python code snippet using tempest_python
lb_command.py
Source:lb_command.py  
...161            @return the LBCommandResult object created from the connectblox response.162        '''163        # the default command just pings the server164        request = self._create_request()165        self._decorate_request(request)166        response = self._send_request(request)167        bloxcommand_response = None168        if hasattr(response, 'transaction') and response.transaction.command:169            bloxcommand_response = response.transaction.command[0]170        return self.result_class.from_response(response, self, bloxcommand_response)171    @property172    def result_class(self):173        '''174            @return the class that should encapsulate the connectblox response for this command.175        '''176        # by default, strip off Command from this class and add Result to177        # find the result classname178        this_class_prefix = self.__class__.__name__[:-7]179        result_class_name = '%sResult' % this_class_prefix180        this_module = sys.modules[self.__class__.__module__]181        result_class_ = getattr(this_module, result_class_name)182        return result_class_183    @property184    def request_class(self):185        '''186            @return the class to construct connectblox requests for this command.187        '''188        return blox.connect.ConnectBlox_pb2.Request189    def initialize_transaction(self, request, workspace):190        '''191            Initializes the transaction object of this request with the values stored in192            self. See __init__ for a description of transaction properties.193        '''194        #commented out until timeout are supported by lb-server195#        if self.timeout is not None:196#            request.transaction.timeout = self.timeout197        if self.exclusive is not None:198            request.transaction.exclusive = self.exclusive199        if self.readonly is not None:200            request.transaction.readonly = self.readonly201        if self.commit_mode is not None:202            request.transaction.commit_mode = self.commit_mode203        if self.branch is not None:204            request.transaction.workspace = '%s@%s' % (workspace, self.branch)205        else:206            request.transaction.workspace = workspace207    def _create_request(self):208        '''209            @return a new request object (of type request_class()) configured according to210                    this command.211        '''212        # create using the specific request class for this command213        request = self.request_class()214        # set some default values for it215        if self.loglevel is not None:216            request.log_level = self.loglevel217        if self.log is True:218            request.return_log = True219        if self.cwd is not None:220            request.current_working_directory = os.path.abspath(self.cwd)221        # potentially add monitoring commands222        self._add_monitor_commands(request)223        # add GUID to the request so we pass it to lb-server224        request.guid = self.guid225        return request226    def _add_monitor_commands(self, request):227        '''228            If this command was configured with monitoring, this function will add229            commands to the request to execute the monitoring.230        '''231        if isinstance(self.monitor, list):232            for predicate_name in self.monitor:233                # monitor assertions into a predicate234                cmd = request.transaction.command_after_fixpoint.add()235                cmd.query_predicate.delta = ASSERTIONS236                cmd.query_predicate.predicate.global_name.qualified_name = predicate_name237                # monitor retractions from a predicate238                cmd = request.transaction.command_after_fixpoint.add()239                cmd.query_predicate.delta = RETRACTIONS240                cmd.query_predicate.predicate.global_name.qualified_name = predicate_name241    def _decorate_request(self, request):242        '''243            A template method for sub-types to enrich the request after it's been created244            but before sending it to the connectblox server. The default implementation245            does nothing.246            @param request the connectblox protobuf request object being created for this command.247        '''248        pass249    def _decorate_transaction_request(self, blox_command, request):250        '''251            A template method for sub-types to enrich the blox_command when this command252            is going to be executed inside a transaction. The default implementation253            does nothing.254            @param blox_command the bloxcommand protobuf object corresponding to this lb command.255            @param request the connectblox protobuf request object being created for the whole256                           transaction.257        '''258        pass259    def _send_request(self, request, ignore_exception=False):260        '''261            Send the request to the connectblox server.262            @param request the request to be sent (of type request_class())263            @param ignore_exception whether exceptions included in the connectblox response264                                    should be ignored. If False, this function will raise an265                                    exception with the contents of the connectblox exception.266                                    Otherwise, the response will be returned even if it contains267                                    an exception.268            @return the response object returned from the connectblox server.269        '''270        # at debug mode, print the request271        if LB_DEBUG:272            print('LB_DEBUG: connectblox request =\n' + text_format.MessageToString(request))273        # setting an alarm if there is a timeout274        if self.timeout is not None and self.timeout>0:275            util.set_alarm_handler(self.timeout)276            # rounds up to the second277            signal.alarm((self.timeout+999)/1000)278        #setting the guid to enable cleanup in case of interruption279        util.current_guid = self.guid280        # if we should serialize requests, acquire a lock first281        if self.serialize_requests:282            with self._backend_lock:283                response = self.conn.call(request)284        else:285            response = self.conn.call(request)286            # ad debug mode, print the response287            if LB_DEBUG:288                print('LB_DEBUG: connectblox response =\n' + text_format.MessageToString(response))289        #nothing to interrupt when the call has returned290        util.current_guid = None291        signal.alarm(0)292        # deal with exceptions in the response293        if not ignore_exception:294            if response.HasField("exception"):295                msg = response.exception.message296                if msg.startswith('ERROR '):297                    msg = msg[6:]298                raise lb_exception.LBCommandError(msg)299        return response300    def _workspace_exists(self, name):301        '''302            TODO - remove this method, it makes no sense here.303            @return whether a workspace with this name exists.304        '''305        cmd = WorkspaceExistsCommand(name, conn = self.conn, log = self.log,306                loglevel = self.loglevel, monitor = self.monitor,307                priority = self.priority, isAdmin = False, serialize_requests = self.serialize_requests)308        result = cmd.run()309        return result.exists310    def _decorate_with_authenticator(self, workspaceName, req):311        """A helper function that adds an authentication token to the request.312        Use this when sending workspace delete requests."""313        # we only need to add an authenticator if the request goes through a regular tcp314        # connection (indicated by having a port). If a unix socket is used, then that is315        # not necessary.316        if hasattr(self.conn, "port"):317            port = self.conn.port318            secret_file = "%s/.lb-server.%s.secret" % (util.get_lb_deployment_home(), port)319            if os.path.isfile(secret_file):320                try:321                    with open(secret_file, 'r') as f:322                        secret = f.read()323                    t = time.strftime('%s')324                    token = "::%s::%s::%s::" % (t, str(workspaceName), secret)325                    req.authenticator = t + "::" + hashlib.sha512(token).hexdigest()326                except IOError:327                    print "Could not read authentication secret from file %s" % secret_file328class LBAdminCommand(LBCommand):329    '''330        An LBCommand specific for admin commands.331    '''332    def __init__(self, conn=None, log=False, loglevel=None, monitor=None,333            priority=None, isAdmin=True, serialize_requests=False, **kw):334        super(LBAdminCommand, self).__init__(335            conn=conn,log=log,loglevel=loglevel,monitor=monitor,336            priority=priority,isAdmin=isAdmin,serialize_requests=serialize_requests,337            **kw)338    @property339    def request_class(self):340        # an admin command must be encapsulated in a different class than a regular341        # command, so we override this method to return the proper class342        return blox.connect.ConnectBlox_pb2.AdminRequest343    def _create_request(self):344        # overwrite method in LBAdminCommand to avoid setting the loglevel and cwd345        # create using the specific request class for this command346        request = self.request_class()347        # Note: Admin requests do not support return_log348        # if self.log is True:349        #     request.return_log = True350        #if self.cwd is not None:351        #    request.current_working_directory = os.path.abspath(self.cwd)352        # potentially add monitoring commands353        self._add_monitor_commands(request)354        return request355class TransactionResult(LBCommandResult):356    '''357        An object to encapsulate the response of a transaction request.358    '''359    def __init__(self, response, lbcommand, bloxcommand_response):360        super(TransactionResult,self).__init__(response, lbcommand, bloxcommand_response)361        # mapping of response objects from protocol buffer to command result classes362        response_to_result_dict = {363            "AddBlockResponse":"AddBlockResult",364            "InstallLibraryResponse":"AddLibraryResult",365            "ExecInactiveBlockResponse":"ExecuteBlockResult",366            "ExecBlockResponse":"ExecuteLogicResult",367            "QueryPredicateResponse":"PrintPredicateResult",368            "UpdatePredicateResponse":None,369            "GetPredicateInfoResponse":"PredicateInfoResult",370            "GetPredicateInfoBulkResponse":None,371            "ImportProtoBufResponse":"ImportProtobufResult",372            "CompileBlockResponse":"CompileBlockResult",373            "InstallProjectResponse":"AddProjectResult",374            "RemoveBlockResponse":"RemoveBlockResult",375            "LogMessageResponse":"InsertLogMessageResult",376            "ReplaceBlockResponse":"ReplaceBlockResult",377            "ExportProtoBufResponse":"ExportProtobufResult",378            "ProtoAddSpecResponse":"ProtoAddSpecResult",379            "FaultInjection":None,380            "XMLAddSpecResponse":"XMLAddSpecResult",381            "ImportXMLDocResponse":"ImportXMLResult",382            "GetPredicatePopcountResponse":"PredicatePopcountResult",383            "GetProtocolDescriptorsResponse": "GetProtocolDescriptorsResult"384        }385        # decorate command response of each transaction command386        def parse_transaction_command_response(request_lbcommands, response_transaction_command, lbcommand_result_list):387            '''388            '''389            for i, bloxcommand_response in enumerate(response_transaction_command):390                descriptor, r = bloxcommand_response.ListFields()[0]391                result_class_name = response_to_result_dict[r.__class__.__name__]392                result_class = getattr(sys.modules[__name__], result_class_name)393                lbcommand_result_object = result_class(response, request_lbcommands[i], bloxcommand_response)394                lbcommand_result_object.name = descriptor.name395                lbcommand_result_list.append(lbcommand_result_object)396        # transaction commands before fix point397        self.transaction_cmds = []398        parse_transaction_command_response(lbcommand.commands, response.transaction.command, self.transaction_cmds)399        # transaction commands after fix point400        self.transaction_cmds_after_fixpoint = []401        parse_transaction_command_response(lbcommand.commands_after_fixpoint, response.transaction.command_after_fixpoint, self.transaction_cmds_after_fixpoint)402class TransactionCommand(LBCommand):403    '''404        An LBCommand that represents a transaction with multiple commands.405    '''406    def __init__(self, workspace, commands, commands_after_fixpoint, **kw):407        '''408            Initialize this transaction command.409            @param workspace410            @param commands a list of Namespaces that represent commands parsed from the command line. These are the411                            objects returned by argparser after it parsed a command line. See lb_argparser. These are412                            *not* LBCommand objects.413            @param commands_after_fixpoint a list with the same type of objects as the "commands" parameter, but with414                                           commands that should be executed after fixpoint.415            @param kw yey!416        '''417        super(TransactionCommand, self).__init__(**kw)418        # set attributes that are specific to transactions419        self.workspace = workspace420        self.cmdline_commands = commands421        self.cmdline_commands_after_fixpoint = commands_after_fixpoint422    def _decorate_request(self, request):423        '''424            Override to fill the request with commands.425        '''426        # set basic properties of the request427        self.initialize_transaction(request, self.workspace)428        def build_lb_command(cmdline_command, blox_command):429            '''430                Build an LBCommand object from information in the cmdline_command. Also decorate431                the blox_command object with information extracted from the built LBCommand.432                @return the LBCommand that was instantiated.433            '''434            cmdline_command.workspace = self.workspace435            # initialize the command from the cmdline. The class object is taked from the name in the cmd attribute of436            # the cmdline_command.437            lbcommand = getattr(sys.modules[__name__], "%sCommand" % vars(cmdline_command)['cmd']).from_args(None, cmdline_command)438            # make sure we keep the correspondence between lbcommand object and the blox_command protobuf object representing it439            lbcommand.blox_command = blox_command440            # decorate the protobuf command with information from the command441            lbcommand._decorate_transaction_request(blox_command, request)442            return lbcommand443        # build commands from cmdline_commands444        self.commands = []445        for cmdline_command in self.cmdline_commands:446            self.commands.append(build_lb_command(cmdline_command, request.transaction.command.add()))447        # build commands_after_fixpoint from cmdline_commands_after_fixpoint448        self.commands_after_fixpoint = []449        for cmdline_command in self.cmdline_commands_after_fixpoint:450            self.commands_after_fixpoint.append(build_lb_command(cmdline_command, request.transaction.command_after_fixpoint.add()))451    def run(self):452        '''453            TODO - is this useless?454        '''455        return super(TransactionCommand, self).run()456class CreateWorkspaceResult(LBCommandResult):457    def __init__(self, response, lbcommand, bloxcommand_response):458        super(CreateWorkspaceResult,self).__init__(response, lbcommand, bloxcommand_response)459        self.workspace_name = response.create.name460class CreateWorkspaceCommand(LBCommand):461    def __init__(self, name, unique, overwrite, libs=None, **kw):462        """ Command to create a new workspace463        """464        super(CreateWorkspaceCommand, self).__init__(**kw)465        self.name = name466        self.unique = unique467        self.overwrite = overwrite468        self.libs = libs469    def run(self):470        return super(CreateWorkspaceCommand, self).run()471    def _decorate_request(self, req):472        super(CreateWorkspaceCommand,self)._decorate_request(req)473        if self.name:474           req.create.name = self.name475        if self.libs != None:476           req.create.libraries = self.libs477        req.create.overwrite = self.overwrite478        if self.overwrite:479            self._decorate_with_authenticator(self.name, req)480        req.create.unique = self.unique481class ExecuteBlockResult(LBCommandResult):482    def __init__(self, response, lbcommand, bloxcommand_response):483        super(ExecuteBlockResult,self).__init__(response, lbcommand, bloxcommand_response)484        self.return_local = lbcommand.return_local485        for name, rel in zip(self.return_local, bloxcommand_response.exec_inactive.return_local):486            self.output_relations.append((name, rel))487        # This is a bit of a hack in that the ExecuteBlockCommand sometimes needs 2 bloxcommand488        # commands. So here it tries to get the corresponding response by getting the position489        # of the bloxcommand_reponse for the first command in the transaction and getting the next490        # response object. The problem is that it uses the command list, and exec block could491        # perhaps be in command_after_fixpoint. The way to fix this is to have a better link492        # between requests and responses.493        has_msgCls = hasattr(lbcommand, "msgCls") and lbcommand.msgCls is not None494        if has_msgCls and issubclass(lbcommand.msgCls, Message):495            pos = response.transaction.command.index(bloxcommand_response)496            proto_lbcommand = response.transaction.command[pos+1]497            msgInstance = lbcommand.msgCls()498            msgInstance.ParseFromString(proto_lbcommand.export_protobuf.message)499            self.message = msgInstance500        self.should_escape = lbcommand.escape501        self.output_csv = lbcommand.output_csv502        self.delimiter = lbcommand.delimiter503        self.exclude_ids = lbcommand.exclude_ids504class ExecuteBlockCommand(LBCommand):505    def __init__(self, name, workspace, escape, should_print=False, return_local=None, **kw):506        self.name = name507        self.workspace = workspace508        self.escape = escape509        self.return_local = []510        if (should_print != None) and (isinstance(should_print, list)):511            # This is kind of ridiculous mess, but different versions512            # require different formats for should_print, so we check513            # for a bunch of different variants. Clearly, there should514            # just be a clear parameter with a list of predicate515            # names/516            for rel in should_print:517                if rel == None:518                    self.return_local.append("_")519                elif rel == []:520                    self.return_local.append("_")521                elif isinstance(rel, basestring):522                    self.return_local.append(rel)523                elif isinstance(rel, list):524                    for predname in rel:525                        self.return_local.append(predname)526        self.msgCls = kw.pop('msgCls', None)527        self.msgType = kw.pop('msgType', None)528        self.protocol = kw.pop('protocol', None)529        self.inputs = kw.pop('inputs',[])530        self.branch_bindings = kw.pop('branch_bindings',[])531        self.output_csv = kw.get('output_csv', False)532        self.delimiter = kw.get('delimiter', None)533        self.exclude_ids = kw.get('exclude_ids', False)534        super(ExecuteBlockCommand, self).__init__(**kw)535    def _decorate_request(self, request):536        self.initialize_transaction(request, self.workspace)537        self.bloxcommand = request.transaction.command.add()538        self._decorate_transaction_request(self.bloxcommand, request)539        for binding in self.branch_bindings:540            binding_command = request.transaction.command.add()541            binding_command.bind_branch_alias.alias = binding.alias542            binding_command.bind_branch_alias.branch_name = binding.branch_name543    def _decorate_transaction_request(self, bloxcommand, request):544        bloxcommand.exec_inactive.block_name = self.name545        if len(self.inputs) > 0:546            bloxcommand.exec_inactive.input.extend(self.inputs)547        has_msgCls = self.msgCls is not None548        has_msgType = self.msgType is not None549        has_protocol = self.protocol is not None550        if has_msgCls and has_msgType and has_protocol:551            bloxcommand = request.transaction.command.add()552            bloxcommand.export_protobuf.protocol = self.protocol553            bloxcommand.export_protobuf.type_name = self.msgType554        self._add_return_local_commands(request, bloxcommand)555    def _add_return_local_commands(self, request, bloxcommand):556        if isinstance(self.return_local,list):557            for pred in self.return_local:558                bloxcommand.exec_inactive.return_local.append(pred)559class ExecuteLogicResult(LBCommandResult):560    def __init__(self, response, lbcommand, bloxcommand_response):561        super(ExecuteLogicResult,self).__init__(response, lbcommand, bloxcommand_response)562        if hasattr(lbcommand, 'return_local'):563            self.return_local = lbcommand.return_local564        else:565            self.return_local = []566        for name, rel in zip(self.return_local, getattr(bloxcommand_response,'exec').return_local):567            self.output_relations.append((name, rel))568        self.should_escape = lbcommand.escape569        if isinstance(lbcommand.monitor,list):570            self.monitor_results = []571            i = 0572            for pred in lbcommand.monitor:573                rel1 = getattr(getattr(response.transaction.command_after_fixpoint[i], "query_predicate"),"relation")574                rel2 = getattr(getattr(response.transaction.command_after_fixpoint[i+1], "query_predicate"),"relation")575                self.monitor_results.append( (pred, (rel1, rel2)) );576                i = i + 2577        self.output_csv = lbcommand.output_csv578        self.delimiter = lbcommand.delimiter579        self.exclude_ids = lbcommand.exclude_ids580        if getattr(bloxcommand_response,'exec').problems is not None:581           self.errors = getattr(bloxcommand_response,'exec').problems582class ExecuteLogicCommand(LBCommand):583    def __init__(self, workspace, escape, blockname=None, language='lb', logic=None, should_print=False, file=None, block_name=None, **kw):584        if logic is None and file is None:585            raise lb_exception.LBCommandArgsError(LBCommand.FILE_OR_LOGIC_MSG)586        self.workspace = workspace587        if file is not None:588            logic = file.read()589        self.block_name = blockname590        self.language = blox.connect.BloxCommand_pb2.LB591        if language == 'lb':592            self.language = blox.connect.BloxCommand_pb2.LB593        elif language == 'lb0':594            self.language = blox.connect.BloxCommand_pb2.LB0595        else:596            raise lb_exception.LBCommandArgsError(LBCommand.LANG_MUST_BE_LOGIC_OR_LB0)597        self.logic = logic598        # only use block_name if blockname is None. I have no idea why there are 2 blockname parameters.599        if blockname is None:600            self.block_name = block_name601        self.branch_bindings = kw.pop('branch_bindings',[])602        self.return_local = []603        if (should_print != None) and (isinstance(should_print, list)):604            # This is kind of ridiculous mess, but different versions605            # require different formats for should_print, so we check606            # for a bunch of different variants. Clearly, there should607            # just be a clear parameter with a list of predicate608            # names/609            for rel in should_print:610                if rel == None:611                    self.return_local.append("_")612                elif rel == []:613                    self.return_local.append("_")614                elif isinstance(rel, basestring):615                    self.return_local.append(rel)616                elif isinstance(rel, list):617                    for predname in rel:618                        self.return_local.append(predname)619        self.escape = escape620        self.output_csv = kw.get('output_csv', False)621        self.delimiter = kw.get('delimiter', None)622        self.exclude_ids = kw.get('exclude_ids', False)623        super(ExecuteLogicCommand, self).__init__(**kw)624    def _decorate_request(self, request):625        self.initialize_transaction(request, self.workspace)626        self.blox_command = request.transaction.command.add()627        self._decorate_transaction_request(self.blox_command, request)628        for binding in self.branch_bindings:629            binding_command = request.transaction.command.add()630            binding_command.bind_branch_alias.alias = binding.alias631            binding_command.bind_branch_alias.branch_name = binding.branch_name632    def _decorate_transaction_request(self, blox_command, request):633        cmdexec = getattr(blox_command, 'exec')634        cmdexec.language = self.language635        cmdexec.logic = self.logic636        if self.block_name is not None:637            cmdexec.block_name = self.block_name638        self._add_return_local_commands(cmdexec)639    def _add_return_local_commands(self, cmdexec):640        if isinstance(self.return_local,list):641            for pred in self.return_local:642               cmdexec.return_local.append(pred)643# query is same as exec with --print option644class QueryLogicResult(ExecuteLogicResult):645    pass646class QueryLogicCommand(ExecuteLogicCommand):647    def __init__(self, workspace, escape, logic=None, file=None, should_print=['_'], **kw):648        if should_print is None:649            should_print = ['_']650        kw['readonly'] = True651        super(QueryLogicCommand, self).__init__(workspace, escape, logic=logic, should_print = should_print, file=file, **kw)652class DeleteWorkspaceResult(LBCommandResult): pass653class DeleteWorkspaceCommand(LBCommand):654    def __init__(self, name, force=False, **kw):655        super(DeleteWorkspaceCommand, self).__init__(**kw)656        self.name = name657        self.force = force658    def _decorate_request(self, req):659        req.delete.name = self.name660        if self.force:661            req.delete.ignore_nonexistent = True662        self._decorate_with_authenticator(self.name, req)663class WorkspaceFilepathResult(LBCommandResult):664    def __init__(self, response, lbcommand, bloxcommand_response):665        super(WorkspaceFilepathResult,self).__init__(response, lbcommand, bloxcommand_response)666        self.filepath = response.get_ws_path.filepath667class WorkspaceFilepathCommand(LBCommand):668    def __init__(self, workspace, inverse=False, **kw):669        super(WorkspaceFilepathCommand, self).__init__(**kw)670        self.name = workspace671        self.inverse = inverse672    def _decorate_request(self, req):673        req.get_ws_path.name = self.name674        req.get_ws_path.inverse = self.inverse675class ListWorkspacesResult(LBAdminCommandResult):676    def __init__(self, response, lbcommand, bloxcommand_response):677        super(ListWorkspacesResult,self).__init__(response, lbcommand, bloxcommand_response)678        self.names = [name for name in response.list_workspaces.name]679class ListWorkspacesCommand(LBAdminCommand):680    def __init__(self, **kw):681        super(ListWorkspacesCommand, self).__init__(**kw)682    def _decorate_request(self, req):683        req.list_workspaces = True684class CreateBranchResult(LBCommandResult): pass685class CreateBranchCommand(LBCommand):686    def __init__(self, workspace, name, parent, overwrite=False, **kw):687        super(CreateBranchCommand, self).__init__(**kw)688        self.workspace = workspace689        self.name = name690        self.parent = parent691        self.overwrite = overwrite692    def _decorate_request(self, req):693        req.create_named_branch.workspace = self.workspace694        req.create_named_branch.branch = self.name695        if self.parent is not None:696            req.create_named_branch.from_branch = self.parent697        req.create_named_branch.overwrite = self.overwrite698class DeleteBranchResult(LBCommandResult): pass699class DeleteBranchCommand(LBCommand):700    def __init__(self, workspace, name, **kw):701        super(DeleteBranchCommand, self).__init__(**kw)702        self.workspace = workspace703        self.name = name704    def _decorate_request(self, req):705        req.close_named_branch.workspace = self.workspace706        req.close_named_branch.branch = self.name707class DefaultBranchResult(LBCommandResult): pass708class DefaultBranchCommand(LBCommand):709    def __init__(self, workspace, name, **kw):710        super(DefaultBranchCommand, self).__init__(**kw)711        self.workspace = workspace712        self.name = name713    def _decorate_request(self, req):714        req.revert_database.workspace = self.workspace715        req.revert_database.older_branch = self.name716        self._decorate_with_authenticator(self.workspace, req)717class ListBranchesResult(LBCommandResult):718    def __init__(self, response, lbcommand, bloxcommand_response):719        super(ListBranchesResult,self).__init__(response, lbcommand, bloxcommand_response)720        self.names = [name for name in response.get_branch_names.names]721class ListBranchesCommand(LBCommand):722    def __init__(self, workspace, all, **kw):723        super(ListBranchesCommand, self).__init__(**kw)724        self.workspace = workspace725        self.all = all726    def _decorate_request(self, req):727        req.get_branch_names.workspace = self.workspace728        req.get_branch_names.include_auto_versions = self.all729class VersionResult(LBCommandResult):730    def __init__(self, response, lbcommand, bloxcommand_response):731        super(VersionResult,self).__init__(response, lbcommand, bloxcommand_response)732        self.version = response.get_ws_version.version733        self.minor_version = response.get_ws_version.minor_version734        self.build_number = response.get_ws_version.build_number735class VersionCommand(LBCommand):736    def __init__(self, workspace, **kw):737        super(VersionCommand, self).__init__(**kw)738        if workspace == None:739            self.name = '/'740        else:741            self.name = workspace742    def _decorate_request(self, req):743        req.get_ws_version.name = self.name744class WorkspaceExistsResult(LBCommandResult):745    def __init__(self, response, lbcommand, bloxcommand_response):746        not_exists = (747            response.HasField('exception')748            and response.exception.HasField('message')749            and response.exception.message.startswith("Workspace '" + lbcommand.name + "' does not exist")750        )751        self.exists = not not_exists752        super(WorkspaceExistsResult,self).__init__(response, lbcommand)753class WorkspaceExistsCommand(LBCommand):754    def __init__(self, name, **kw):755        super(WorkspaceExistsCommand,self).__init__(**kw)756        self.name = name757    def run(self):758        req = self._create_request()759        self._decorate_request(req)760        # Ignore exception because that's what we use to know weather the ws exists or not761        res = self._send_request(req, True)762        return self.result_class.from_response(res, self)763    def _decorate_request(self, req):764        self.initialize_transaction(req, self.name)765class ExportWorkspaceResult(LBCommandResult): pass766class ExportWorkspaceCommand(LBCommand):767    def __init__(self, name, dest, overwrite=False, **kw):768        super(ExportWorkspaceCommand,self).__init__(**kw)769        self.name = name770        self.dest = dest771        self.overwrite = overwrite772    def _decorate_request(self, req):773        req.exportws.name = self.name774        req.exportws.dest_filepath = os.path.abspath(self.dest)775        req.exportws.overwrite = self.overwrite776class ImportWorkspaceResult(LBCommandResult):777    def __init__(self, response, lbcommand, bloxcommand_response):778        super(ImportWorkspaceResult, self).__init__(response, lbcommand, bloxcommand_response)779        self.name = response.importws.name780class ImportWorkspaceCommand(LBCommand):781    def __init__(self, name, src, overwrite=False, unique=False, **kw):782        super(ImportWorkspaceCommand,self).__init__(**kw)783        self.name = name784        self.src = src785        self.overwrite = overwrite786        self.unique = unique787    def _decorate_request(self, req):788        if self.name is not None:789            req.importws.name = self.name790        req.importws.src_filepath = os.path.abspath(self.src)791        req.importws.overwrite = self.overwrite792        req.importws.unique = self.unique793        self._decorate_with_authenticator(self.name, req)794class PredicateInfoResult(LBCommandResult):795    def __init__(self, response, lbcommand, bloxcommand_response):796        super(PredicateInfoResult,self).__init__(response, lbcommand, bloxcommand_response)797        pred_info = bloxcommand_response.pred_info798        self.pred_info = text_format.MessageToString(pred_info)799class PredicateInfoCommand(LBCommand):800    def __init__(self, name, workspace, all, **kw):801        super(PredicateInfoCommand, self).__init__(**kw)802        self.name = name803        self.workspace = workspace804    def _decorate_request(self, req):805        self.initialize_transaction(req, self.workspace)806        self.bloxcommand = req.transaction.command.add()807        req.transaction.readonly = True808        self._decorate_transaction_request(self.bloxcommand, req)809    def _decorate_transaction_request(self, cmd, req):810        cmd.pred_info.predicate.global_name.qualified_name = self.name[0]811class PredicateInfoBulkResult(LBCommandResult):812    def __init__(self, response, lbcommand, bloxcommand_response):813        super(PredicateInfoBulkResult,self).__init__(response, lbcommand, bloxcommand_response)814        pred_info = bloxcommand_response.pred_info_bulk815        self.pred_info = text_format.MessageToString(pred_info)816        self.pred_info_message = pred_info817class PredicateInfoBulkCommand(LBCommand):818    def __init__(self, name, workspace, all, **kw):819        super(PredicateInfoBulkCommand, self).__init__(**kw)820        if all:821           self.all = True822        else:823           self.all = False824           self.requested_names = name825        self.workspace = workspace826    def _decorate_request(self, req):827        self.initialize_transaction(req, self.workspace)828        self.bloxcommand = req.transaction.command.add()829        # we here add and delete omit to create the pred_info_bulk container830        # to have a request even if self.requested_names is empty (indicating831        # that all user-predicates should be returned.832        self.bloxcommand.pred_info_bulk.omit.add()833        del self.bloxcommand.pred_info_bulk.omit[:]834        if not self.all:835           for pred_name in self.requested_names:836               reqname = self.bloxcommand.pred_info_bulk.predicate.add()837               reqname.global_name.qualified_name = pred_name838# NEEDS_WORK: unused - remove? ("lb list" uses PredicatePopcount.)839class ListPredicatesResult(LBCommandResult):840    def __init__(self, response, lbcommand, bloxcommand_response):841        super(ListPredicatesResult,self).__init__(response, lbcommand, bloxcommand_response)842        rel = getattr(bloxcommand_response, 'exec').return_local[0]843        self.predicates_relation = rel844class ListPredicatesCommand(LBCommand):845    def __init__(self, workspace, **kw):846        super(ListPredicatesCommand,self).__init__(**kw)847        self.workspace = workspace848    def _decorate_request(self, req):849        self.initialize_transaction(req, self.workspace)850        self.bloxcommand = req.transaction.command.add()851        cmdexec = getattr(self.bloxcommand, 'exec')852        cmdexec.language = blox.connect.BloxCommand_pb2.LB853        cmdexec.logic = """854           _(name) <-855              system:Predicate:fullName[p] = name,856              !system:Predicate:displayName[p] = _.857           _(name) <-858              system:Predicate:displayName[_] = name.859        """860        cmdexec.return_local.append("_")861class PredicatePopcountResult(LBCommandResult):862    def __init__(self, response, lbcommand, bloxcommand_response):863        super(PredicatePopcountResult,self).__init__(response, lbcommand, bloxcommand_response)864        self.pred_popcount = bloxcommand_response.pred_popcount865class PredicatePopcountCommand(LBCommand):866    def __init__(self, workspace, predicate, name=None, include=None,867            exclude=None, only_predicate_names=False, estimate=False,868            include_default=False, **kw):869        super(PredicatePopcountCommand, self).__init__(**kw)870        self.workspace = workspace871        self.predicate = predicate872        if (self.predicate is None) and (name is not None) and (len(name) > 0):873            self.predicate = []874        if name is not None:875            for n in name:876              self.predicate.append(n)877        self.include = include878        self.exclude = exclude879        self.only_predicate_names = only_predicate_names880        self.estimate = estimate881        self.include_default = include_default882    def _decorate_request(self, req):883        self.initialize_transaction(req, self.workspace)884        self.bloxcommand = req.transaction.command.add()885        self._decorate_transaction_request(self.bloxcommand, req)886        req.transaction.readonly = True887    def _decorate_transaction_request(self, cmd, req):888        if self.only_predicate_names:889            cmd.pred_popcount.only_predicate_names = True890        if isinstance(self.predicate,list):891            cmd.pred_popcount.all = False892            for predname in self.predicate:893                pred = cmd.pred_popcount.predicate.add()894                pred.global_name.qualified_name = predname895        else:896            cmd.pred_popcount.all = True897            if self.include != None:898                cmd.pred_popcount.include_regexp = self.include899            if self.exclude != None:900                cmd.pred_popcount.exclude_regexp = self.exclude901        if self.estimate:902            cmd.pred_popcount.estimated = True903        if self.include_default:904            cmd.pred_popcount.include_default = True905# TODO - ListInactiveBlocks is currently not supported, so we use dlbatch scripts to list blocks906class ListInactiveBlocksResult(LBCommandResult):907    def __init__(self, response, lbcommand, bloxcommand_response):908        super(ListInactiveBlocksResult,self).__init__(response, lbcommand, bloxcommand_response)909        rel = getattr(bloxcommand_response, 'exec').return_local[0]910        self.blocks_relation = rel911class ListInactiveBlocksCommand(LBCommand):912    def __init__(self, workspace, active=True, inactive=True, **kw):913        super(ListInactiveBlocksCommand,self).__init__(**kw)914        self.workspace = workspace915        self.active = active916        self.inactive = inactive917    def _decorate_request(self, req):918        self.initialize_transaction(req, self.workspace)919        self.bloxcommand = req.transaction.command.add()920        cmdexec = getattr(self.bloxcommand, 'exec')921        if self.inactive and not self.active:922           cmdexec.language = blox.connect.BloxCommand_pb2.LB923           cmdexec.logic = """924              _(name) <-925                 system:logic:logicBlockName[b] = name,926                 !system:logic:Block:displayName[b] = _,927                 !system:logic:ActiveBlock(b).928              _(displayName) <-929                 system:logic:Block:displayName[b] = displayName,930                 !system:logic:ActiveBlock(b).931           """932        else:933           if self.active and not self.inactive:934              cmdexec.logic += """935                 _(name) <-936                    system:logic:logicBlockName[b] = name,937                    !system:logic:Block:displayName[b] = _,938                    system:logic:ActiveBlock(b).939                 _(displayName) <-940                    system:logic:Block:displayName[b] = displayName,941                    system:logic:ActiveBlock(b).942              """943           else:944              cmdexec.logic += """945                 _(name) <-946                    system:logic:logicBlockName[b] = name,947                    !system:logic:Block:displayName[b] = _.948                 _(displayName) <-949                    system:logic:Block:displayName[b] = displayName.950              """951        cmdexec.return_local.append("_")952class PrintPredicateResult(LBCommandResult):953    def __init__(self, response, lbcommand, bloxcommand_response):954        super(PrintPredicateResult, self).__init__(response, lbcommand, bloxcommand_response)955        rel = bloxcommand_response.query_predicate.relation956        self.predicate_relation = rel957        self.should_escape = lbcommand.should_escape958        self.exclude_ids = lbcommand.exclude_ids959class PrintPredicateCommand(LBCommand):960    def __init__(self, name, workspace, should_escape=False, **kw):961        super(PrintPredicateCommand,self).__init__(**kw)962        self.name = name963        self.workspace = workspace964        self.should_escape = should_escape965        self.exclude_ids = kw.get('exclude_ids', False)966    def _decorate_request(self, req):967        self.initialize_transaction(req, self.workspace)968        self.bloxcommand = req.transaction.command.add()969        self._decorate_transaction_request(self.bloxcommand, req)970        req.transaction.readonly = True971    def _decorate_transaction_request(self, cmd, req):972        cmd.query_predicate.predicate.global_name.qualified_name = self.name973class AddBlockResult(LBCommandResult):974    def __init__(self, response, lbcommand, bloxcommand_response):975        super(AddBlockResult, self).__init__(response, lbcommand, bloxcommand_response)976        self.block_name = bloxcommand_response.add_block.block_name977        if bloxcommand_response.add_block.problems is not None:978            self.errors = bloxcommand_response.add_block.problems979class AddBlockCommand(LBCommand):980    def __init__(self, name, workspace, language='lb', logic=None, file=None, active=True, **kw):981        if logic is None and file is None:982            raise lb_exception.LBCommandArgsError(LBCommand.FILE_OR_LOGIC_MSG)983        self.workspace = workspace984        self.name = name985        if file is not None:986            logic = file.read()987            if self.name is None:988                file_basename = os.path.basename(file.name)989                self.name, ext = os.path.splitext(file_basename)990        self.language = blox.connect.BloxCommand_pb2.LB991        if language == 'lb':992            self.language = blox.connect.BloxCommand_pb2.LB993        elif language == 'lb0':994            self.language = blox.connect.BloxCommand_pb2.LB0995        else:996            raise lb_exception.LBCommandArgsError(LBCommand.LANG_MUST_BE_LOGIC_OR_LB0)997        self.logic = logic998        self.active = active999        super(AddBlockCommand,self).__init__(**kw)1000    def _decorate_request(self, req):1001        self.initialize_transaction(req, self.workspace)1002        self.bloxcommand = req.transaction.command.add()1003        self._decorate_transaction_request(self.bloxcommand, req)1004    def _decorate_transaction_request(self, cmd, req):1005        cmd.add_block.language = self.language1006        cmd.add_block.logic = self.logic1007        if self.name is not None:1008            cmd.add_block.block_name = self.name1009        cmd.add_block.active = self.active1010class CompileBlockResult(LBCommandResult):1011    def __init__(self, response, lbcommand, bloxcommand_response):1012        super(CompileBlockResult, self).__init__(response, lbcommand, bloxcommand_response)1013        if bloxcommand_response.compile_block.problems is not None:1014           self.errors = bloxcommand_response.compile_block.problems1015class CompileBlockCommand(LBCommand):1016    def __init__(self, name, workspace, logic=None, file=None, sort=ACTIVE, **kw):1017        if logic is None and file is None:1018            raise lb_exception.LBCommandArgsError(LBCommand.FILE_OR_LOGIC_MSG)1019        self.workspace = workspace1020        self.name = name1021        if file is not None:1022            logic = file.read()1023            if self.name is None:1024                file_basename = os.path.basename(file.name)1025                self.name, ext = os.path.splitext(file_basename)1026        self.language = blox.connect.BloxCommand_pb2.LB1027        self.logic = logic1028        self.sort = sort1029        super(CompileBlockCommand,self).__init__(**kw)1030    def _decorate_request(self, req):1031        self.initialize_transaction(req, self.workspace)1032        self.bloxcommand = req.transaction.command.add()1033        self._decorate_transaction_request(self.bloxcommand, req)1034    def _decorate_transaction_request(self, cmd, req):1035        cmd.compile_block.logic = self.logic1036        if self.name is not None:1037            cmd.compile_block.block_name = self.name1038        cmd.compile_block.sort = self.sort1039class ReplaceBlockResult(LBCommandResult): pass1040class ReplaceBlockCommand(LBCommand):1041    def __init__(self, blockname, workspace, logic, **kw):1042        self.blockname = blockname1043        self.workspace = workspace1044        file_ = kw.pop('file', None)1045        if file_ is not None:1046            logic = file_.read()1047        self.language = blox.connect.BloxCommand_pb2.LB1048        self.logic = logic1049        if file_ is None and logic is None:1050            raise lb_exception.LBCommandArgsError(LBCommand.FILE_OR_LOGIC_MSG)1051        super(ReplaceBlockCommand, self).__init__(**kw)1052    def _decorate_request(self, req):1053        self.initialize_transaction(req, self.workspace)1054        self.bloxcommand = req.transaction.command.add()1055        self._decorate_transaction_request(self.bloxcommand, req)1056    def _decorate_transaction_request(self, cmd):1057        cmd.replace_block.language = blox.connect.BloxCommand_pb2.LB1058        cmd.replace_block.logic = self.logic1059        if self.blockname is not None:1060            cmd.replace_block.block_name = self.blockname1061class RemoveBlockResult(LBCommandResult):1062    def __init__(self, response, lbcommand, bloxcommand_response):1063        self.block_names = lbcommand.blocknames1064        if bloxcommand_response.remove_block.problems is not None:1065            self.errors = bloxcommand_response.remove_block.problems1066class RemoveBlockCommand(LBCommand):1067    def __init__(self, blockname, workspace, **kw):1068        super(RemoveBlockCommand, self).__init__(**kw)1069        self.blocknames = blockname1070        self.workspace = workspace1071    def _decorate_request(self, req):1072        self.initialize_transaction(req, self.workspace)1073        self.bloxcommand = req.transaction.command.add()1074        self._decorate_transaction_request(self.bloxcommand, req)1075    def _decorate_transaction_request(self, bloxcommand, req):1076        bloxcommand.remove_block.block_name.extend(self.blocknames)1077class AddLibraryResult(LBCommandResult): pass1078class AddLibraryCommand(LBCommand):1079    def __init__(self, name, workspace, **kw):1080        super(AddLibraryCommand, self).__init__(**kw)1081        self.name = name1082        self.workspace = workspace1083    def _decorate_request(self, req):1084        self.initialize_transaction(req, self.workspace)1085        self.bloxcommand = req.transaction.command.add()1086        self._decorate_transaction_request(self.bloxcommand, req)1087    def _decorate_transaction_request(self, cmd, req):1088        cmd.install_library.name = self.name1089class AddProjectResult(LBCommandResult): pass1090class AddProjectCommand(LBCommand):1091    def __init__(self, workspace, norecurse, nocopy, libpath, **kw):1092        self.workspace = workspace1093        self.norecurse = norecurse1094        self.nocopy = nocopy1095        self.libpath = libpath1096        self.dir = kw.pop('dir', '.')1097        super(AddProjectCommand,self).__init__(**kw)1098        if self.cwd is None:1099          self.cwd = self.dir1100    def _decorate_request(self, req):1101        self.initialize_transaction(req, self.workspace)1102        self.bloxcommand = req.transaction.command.add()1103        self._decorate_transaction_request(self.bloxcommand, req)1104    def _decorate_transaction_request(self, cmd, req):1105        cmd.install_project.projDir = os.path.abspath(self.dir)1106        cmd.install_project.recurse = not self.norecurse1107        cmd.install_project.copy = not self.nocopy1108        cmd.install_project.lib_path = self.libpath1109class InsertLogMessageResult(LBCommandResult): pass1110class InsertLogMessageCommand(LBCommand):1111    def __init__(self, workspace, message, **kw):1112        super(InsertLogMessageCommand,self).__init__(**kw)1113        self.workspace = workspace1114        self.message = message1115    def _decorate_request(self, req):1116        self.initialize_transaction(req, self.workspace)1117        self.bloxcommand = req.transaction.command.add()1118        self._decorate_transaction_request(self.bloxcommand, req)1119    def _decorate_transaction_request(self, cmd, req):1120        cmd.log_message.message = self.message1121class ShutdownResult(LBAdminCommandResult):1122    def __init__(self, response, lbcommand, bloxcommand_response):1123        super(ShutdownResult, self).__init__(response, lbcommand, bloxcommand_response)1124        self.message = response.shutdown_server.message1125class ShutdownCommand(LBAdminCommand):1126    def _decorate_request(self, req):1127        req.client_id = '0'1128        req.shutdown_server.waitForProcesses = False1129class ServerLoglevelResult(LBAdminCommandResult):1130    def __init__(self, response, lbcommand, bloxcommand_response):1131        super(ServerLoglevelResult, self).__init__(response, lbcommand, bloxcommand_response)1132        self.message = response.message or 'OK'1133class ServerLoglevelCommand(LBAdminCommand):1134    def __init__(self, loglevel, **kw):1135        super(ServerLoglevelCommand, self).__init__(**kw)1136        self.loglevel = loglevel1137    def _decorate_request(self, req):1138        req.client_id = '0'1139        req.loglevel = self.loglevel1140class AbortTransactionResult(LBAdminCommandResult):1141    def __init__(self, response, lbcommand, bloxcommand_response):1142        super(AbortTransactionResult, self).__init__(response, lbcommand, bloxcommand_response)1143        self.res = response1144class AbortTransactionCommand(LBAdminCommand):1145    def __init__(self, workspace, tid, **kw):1146        super(AbortTransactionCommand, self).__init__(**kw)1147        self.tid = tid1148        self.workspace = workspace1149    def _decorate_request(self, req):1150        req.client_id = '0'1151        if self.workspace is not None:1152           req.abort_transaction.workspace = self.workspace1153        req.abort_transaction.tid = self.tid1154class CheckStatusResult(LBAdminCommandResult):1155    def __init__(self, response, lbcommand, bloxcommand_response):1156        super(CheckStatusResult, self).__init__(response, lbcommand, bloxcommand_response)1157        # print text_format.MessageToString(cmd.req)1158        self.res = response1159        self.server_status = True1160class CheckStatusCommand(LBAdminCommand):1161    def __init__(self, all, active, debug, workspace, **kw):1162        super(CheckStatusCommand, self).__init__(**kw)1163        self.active = active or all1164        self.all = all1165        self.debug = debug1166        # in lb interactive, workspace will be a single workspace string1167        if isinstance(workspace, str):1168           if workspace != "":1169              self.workspaces = [ workspace ]1170           else:1171              self.workspaces = [ ]1172        else:1173           self.workspaces = workspace1174    def _decorate_request(self, req):1175        for ws in self.workspaces:1176           req.status.workspaces.append(ws)1177        req.status.show_active_requests = self.active1178        req.status.show_queued_requests = self.all1179        req.status.add_debug_info = self.debug1180        req.client_id = '0'1181        self.req = req1182class CloneWorkspaceResult(LBCommandResult): pass1183class CloneWorkspaceCommand(LBCommand):1184    def __init__(self, source, target, overwrite, **kw):1185        super(CloneWorkspaceCommand,self).__init__(**kw)1186        self.source = source1187        self.target = target1188        self.overwrite = overwrite1189        self.kw = kw1190    def run(self):1191        tmpdir = tempfile.mktemp()1192        try:1193            ExportWorkspaceCommand(self.source, tmpdir, **self.kw).run()1194            ImportWorkspaceCommand(self.target, tmpdir, self.overwrite, False, **self.kw).run()1195        finally:1196            shutil.rmtree(tmpdir)1197        return self.target1198class ImportProtobufResult(LBCommandResult): pass1199class ImportProtobufCommand(LBCommand):1200    def __init__(self, workspace, protocol, msgType, **kw):1201        file_ = kw.pop('file', None)1202        self.workspace = workspace1203        self.protocol = protocol1204        self.msgType = msgType1205        if file_ is not None:1206            self.messageStr = file_.read()1207        super(ImportProtobufCommand,self).__init__(**kw)1208    def _decorate_request(self, req):1209        self.initialize_transaction(req, self.workspace)1210        self.bloxcommand = req.transaction.command.add()1211        self._decorate_transaction_request(self.bloxcommand, req)1212    def _decorate_transaction_request(self, cmd, req):1213        cmd.import_protobuf.protocol = self.protocol1214        cmd.import_protobuf.type_name = self.msgType1215        cmd.import_protobuf.message = self.messageStr1216class ExportProtobufResult(LBCommandResult):1217    def __init__(self, response, lbcommand, bloxcommand_response):1218        if hasattr(lbcommand,"fileName"):1219            file = open(lbcommand.fileName, "w")1220            file.write(bloxcommand_response.export_protobuf.message);1221            file.close()1222        else:1223            has_msgCls = hasattr(lbcommand, "msgCls") and lbcommand.msgCls is not None1224            if has_msgCls and issubclass(lbcommand.msgCls, Message):1225                msgInstance = lbcommand.msgCls()1226                msgInstance.ParseFromString(bloxcommand_response.export_protobuf.message)1227                self.message = msgInstance1228class ExportProtobufCommand(LBCommand):1229    def __init__(self, workspace, protocol, msgType, file=None, msgCls=None, **kw):1230        self.workspace = workspace1231        self.protocol = protocol1232        self.msgType = msgType1233        self.readonly = True1234        if file is not None:1235            self.fileName = file.name1236        self.msgCls = msgCls1237        super(ExportProtobufCommand,self).__init__(**kw)1238    def _decorate_request(self, req):1239        self.initialize_transaction(req, self.workspace)1240        self.bloxcommand = req.transaction.command.add()1241        self._decorate_transaction_request(self.bloxcommand, req)1242    def _decorate_transaction_request(self, cmd, req):1243        cmd.export_protobuf.protocol = self.protocol1244        cmd.export_protobuf.type_name = self.msgType1245class ProtoAddSpecResult(LBCommandResult): pass1246class ProtoAddSpecCommand(LBCommand):1247    def __init__(self, workspace, name, **kw):1248        file_ = kw.pop('file', None)1249        self.workspace = workspace1250        self.name = name1251        if file_ is not None:1252            self.descriptor = file_.read()1253        super(ProtoAddSpecCommand,self).__init__(**kw)1254    def _decorate_request(self, req):1255        self.initialize_transaction(req, self.workspace)1256        self.bloxcommand = req.transaction.command.add()1257        self._decorate_transaction_request(self.bloxcommand, req)1258    def _decorate_transaction_request(self, cmd, req):1259        cmd.proto_add_spec.name = self.name1260        cmd.proto_add_spec.descriptor_msg = self.descriptor1261class GetProtocolDescriptorsResult(LBCommandResult):1262    def __init__(self, response, lbcommand, bloxcommand_response):1263        for proto in bloxcommand_response.proto_get_descriptors.protocols:1264            file = open(proto.name + ".descriptor", "w")1265            file.write(proto.descriptor_data)1266            file.close1267            print "Descriptor for %s written to file %s.descriptor" % (proto.name, proto.name)1268class GetProtocolDescriptorsCommand(LBCommand):1269    def  __init__(self, workspace, protocol, include=None, exclude=None, **kw):1270        self.workspace = workspace1271        self.protocol = protocol1272        self.include = include1273        self.exclude = exclude1274        super(GetProtocolDescriptorsCommand,self).__init__(**kw)1275    def _decorate_request(self, req):1276        self.initialize_transaction(req, self.workspace)1277        self.bloxcommand = req.transaction.command.add()1278        self._decorate_transaction_request(self.bloxcommand, req)1279    def _decorate_transaction_request(self, cmd, req):1280        if isinstance(self.protocol,list):1281            cmd.proto_get_descriptors.all = False1282            cmd.proto_get_descriptors.protocol_name.extend(self.protocol)1283        else:1284            cmd.proto_get_descriptors.all = True1285            if self.include != None:1286                cmd.proto_get_descriptors.include_regexp = self.include1287            if self.exclude != None:1288                cmd.proto_get_descriptors.exclude_regexp = self.exclude1289class ImportXMLResult(LBCommandResult): pass1290class ImportXMLCommand(LBCommand):1291    def __init__(self, workspace, schema=None, **kw):1292        self.workspace = workspace1293        self.schema = schema1294        file_ = kw.pop('file', None)1295        if file_ is not None:1296            self.document = file_.read()1297        super(ImportXMLCommand,self).__init__(**kw)1298    def _decorate_request(self, req):1299        self.initialize_transaction(req, self.workspace)1300        self.bloxcommand = req.transaction.command.add()1301        self._decorate_transaction_request(self.bloxcommand, req)1302    def _decorate_transaction_request(self, cmd, req):1303        cmd.import_xml_doc.document = self.document1304        if self.schema is not None:1305            cmd.import_xml_doc.schema = self.schema1306class RawCommand():1307    def __init__(self, conn, args, interactive, **kw):1308        arg_dict = vars(args)1309        if 'func' in arg_dict:1310            del arg_dict['func']1311        self.request = arg_dict["request"]1312        self.isAdmin = arg_dict["isAdmin"]1313        self.unixDomainSocket = arg_dict["unixDomainSocket"]1314        self.verbose = arg_dict["verbose"]1315        self.conn = conn1316    @property1317    def request_class(self):1318        return blox.connect.ConnectBlox_pb2.Request1319    @property1320    def admin_request_class(self):1321        return blox.connect.ConnectBlox_pb2.AdminRequest1322    def run(self):1323        req = None1324        if self.isAdmin:1325           req = self.admin_request_class()1326        else:1327           req = self.request_class()1328        # set default request id defaulting to 01329        req.client_id = '0'1330        text_format.Merge(self.request, req)1331        if self.verbose:1332           print "=" * 801333           print "Request:"1334           print "-" * 801335           print text_format.MessageToString(req)1336           print "-" * 801337        result = self.conn.call(req)1338        if self.verbose:1339           print "=" * 801340           print "Response:"1341           print "-" * 801342        print text_format.MessageToString(result)1343        if self.verbose:1344           print "-" * 801345class XMLAddSpecResult(LBCommandResult): pass1346class XMLAddSpecCommand(LBCommand):1347    def __init__(self, workspace, name, **kw):1348        file_ = kw.pop('file', None)1349        self.workspace = workspace1350        self.name = name1351        if file_ is not None:1352            self.descriptor = file_.read()1353        super(XMLAddSpecCommand,self).__init__(**kw)1354    def _decorate_request(self, req):1355        self.initialize_transaction(req, self.workspace)1356        self.bloxcommand = req.transaction.command.add()1357        self._decorate_transaction_request(self.bloxcommand, req)1358    def _decorate_transaction_request(self, cmd, req):1359        cmd.xml_add_spec.name = self.name1360        cmd.xml_add_spec.descriptor_msg = self.descriptor1361class GetWorkspaceInfoResult(LBCommandResult):1362    def __init__(self, response, lbcommand, bloxcommand_response):1363        super(GetWorkspaceInfoResult,self).__init__(response, lbcommand, bloxcommand_response)1364        self.info = response.get_workspace_info1365class GetWorkspaceInfoCommand(LBCommand):1366    def __init__(self, name, **kw):1367        super(GetWorkspaceInfoCommand, self).__init__(**kw)1368        self.name = name1369    def run(self):1370        return super(GetWorkspaceInfoCommand, self).run()1371    def _decorate_request(self, req):1372        super(GetWorkspaceInfoCommand,self)._decorate_request(req)1373        req.get_workspace_info.name = self.name1374class StartMirrorResult(LBCommandResult):1375    def __init__(self, response, lbcommand, bloxcommand_response):1376        super(StartMirrorResult,self).__init__(response, lbcommand, bloxcommand_response)1377class StartMirrorCommand(LBCommand):1378    def __init__(self, name, host, remote_port, remote_workspace, **kw):1379        super(StartMirrorCommand, self).__init__(**kw)1380        self.name = name1381        self.remote_host = host1382        self.remote_port = remote_port1383        self.remote_workspace = remote_workspace1384    def run(self):1385        return super(StartMirrorCommand, self).run()1386    def _decorate_request(self, req):1387        super(StartMirrorCommand,self)._decorate_request(req)1388        req.start_mirror.name = self.name1389        req.start_mirror.remote_host = self.remote_host1390        req.start_mirror.remote_port = self.remote_port1391        req.start_mirror.remote_workspace = self.remote_workspace1392class StopMirrorResult(LBCommandResult):1393    def __init__(self, response, lbcommand, bloxcommand_response):1394        super(StopMirrorResult,self).__init__(response, lbcommand, bloxcommand_response)1395class StopMirrorCommand(LBCommand):1396    def __init__(self, name, **kw):1397        super(StopMirrorCommand, self).__init__(**kw)1398        self.name = name1399    def run(self):1400        return super(StopMirrorCommand, self).run()1401    def _decorate_request(self, req):1402        super(StopMirrorCommand,self)._decorate_request(req)1403        req.stop_mirror.name = self.name1404class PromoteMirrorResult(LBCommandResult):1405    def __init__(self, response, lbcommand, bloxcommand_response):1406        super(PromoteMirrorResult,self).__init__(response, lbcommand, bloxcommand_response)1407class PromoteMirrorCommand(LBCommand):1408    def __init__(self, name, **kw):1409        super(PromoteMirrorCommand, self).__init__(**kw)1410        self.name = name1411    def run(self):1412        return super(PromoteMirrorCommand, self).run()1413    def _decorate_request(self, req):1414        super(PromoteMirrorCommand,self)._decorate_request(req)1415        req.promote_mirror.name = self.name1416class CopyRemoteWorkSpaceResult(LBCommandResult):1417    def __init__(self, response, lbcommand, bloxcommand_response):1418        super(CopyRemoteWorkSpaceResult,self).__init__(response, lbcommand, bloxcommand_response)1419class CopyRemoteWorkSpaceCommand(LBCommand):1420    def __init__(self, name, host, remote_port, remote_workspace, **kw):1421        super(CopyRemoteWorkSpaceCommand, self).__init__(**kw)1422        self.name = name1423        self.remote_host = host1424        self.remote_port = remote_port1425        self.remote_workspace = remote_workspace1426    def run(self):1427        return super(CopyRemoteWorkSpaceCommand, self).run()1428    def _decorate_request(self, req):1429        super(CopyRemoteWorkSpaceCommand,self)._decorate_request(req)1430        req.copy_remote_workspace.name = self.name1431        req.copy_remote_workspace.remote_host = self.remote_host1432        req.copy_remote_workspace.remote_port = self.remote_port1433        req.copy_remote_workspace.remote_workspace = self.remote_workspace1434class ExtractExampleResult(LBCommandResult):1435    def __init__(self, response, lbcommand, bloxcommand_response):1436        super(ExtractExampleResult,self).__init__(response, lbcommand, bloxcommand_response)1437        self.returned_data = response.execute_batch_script.returned_data1438class ExtractExampleCommand(LBCommand):1439    def __init__(self, name, predicate, transitive, monitor, defun, **kw):1440        super(ExtractExampleCommand, self).__init__(**kw)1441        self.workspace = name1442        script = "extractExample"1443        if predicate:1444            script += " --predicate "1445            script += predicate1446        if transitive:1447            script += " --transitive"1448        if monitor:1449            script += " --monitor"1450        if defun is not None:1451            for p in defun:1452                script += " --defun "1453                script += p1454        self.script = script1455    def run(self):1456        return super(ExtractExampleCommand, self).run()1457    def _decorate_request(self, req):1458        super(ExtractExampleCommand,self)._decorate_request(req)1459        req.execute_batch_script.workspace = self.workspace1460        req.execute_batch_script.transactional = True1461        req.execute_batch_script.return_data = True1462        req.execute_batch_script.script = self.script1463        self._decorate_with_authenticator(self.workspace, req)1464class ExecuteBatchScriptResult(LBCommandResult):1465    def __init__(self, response, lbcommand, bloxcommand_response):1466        super(ExecuteBatchScriptResult,self).__init__(response, lbcommand, bloxcommand_response)1467        self.output = response.execute_batch_script.output1468        self.returned_data = response.execute_batch_script.returned_data1469class ExecuteBatchScriptCommand(LBCommand):1470    def __init__(self, script, workspace, file, transactional, return_data=None, **kw):1471        super(ExecuteBatchScriptCommand, self).__init__(**kw)1472        if script is None and file is None:1473            raise lb_exception.LBCommandArgsError(1474               "Either a filename or script text must be supplied.")1475        self.workspace = workspace1476        self.transactional = transactional1477        self.return_data = return_data1478        if file is not None:1479            script = file.read()1480        self.script = script1481    def run(self):1482        return super(ExecuteBatchScriptCommand, self).run()1483    def _decorate_request(self, req):1484        super(ExecuteBatchScriptCommand,self)._decorate_request(req)1485        req.execute_batch_script.workspace = self.workspace1486        req.execute_batch_script.script = self.script1487        req.execute_batch_script.transactional = self.transactional1488        if self.return_data is not None:1489          req.execute_batch_script.return_data = self.return_data...auth_token.py
Source:auth_token.py  
...117            #No claim(s) provided118            if self.delay_auth_decision:119                #Configured to allow downstream service to make final decision.120                #So mark status as Invalid and forward the request downstream121                self._decorate_request("X_IDENTITY_STATUS",122                    "Invalid", env, proxy_headers)123            else:124                #Respond to client as appropriate for this auth protocol125                return self._reject_request(env, start_response)126        else:127            # this request is presenting claims. Let's validate them128            valid = self._validate_claims(claims)129            if not valid:130                # Keystone rejected claim131                if self.delay_auth_decision:132                    # Downstream service will receive call still and decide133                    self._decorate_request("X_IDENTITY_STATUS",134                        "Invalid", env, proxy_headers)135                else:136                    #Respond to client as appropriate for this auth protocol137                    return self._reject_claims(env, start_response)138            else:139                self._decorate_request("X_IDENTITY_STATUS",140                    "Confirmed", env, proxy_headers)141            #Collect information about valid claims142            if valid:143                claims = self._expound_claims(claims)144                # Store authentication data145                if claims:146                    self._decorate_request('X_AUTHORIZATION', "Proxy %s" %147                        claims['user'], env, proxy_headers)148                    # For legacy compatibility before we had ID and Name149                    self._decorate_request('X_TENANT',150                        claims['tenant'], env, proxy_headers)151                    # Services should use these152                    self._decorate_request('X_TENANT_NAME',153                        claims.get('tenant_name', claims['tenant']),154                        env, proxy_headers)155                    self._decorate_request('X_TENANT_ID',156                        claims['tenant'], env, proxy_headers)157                    self._decorate_request('X_USER',158                        claims['user'], env, proxy_headers)159                    if 'roles' in claims and len(claims['roles']) > 0:160                        if claims['roles'] != None:161                            roles = ''162                            for role in claims['roles']:163                                if len(roles) > 0:164                                    roles += ','165                                roles += role166                            self._decorate_request('X_ROLE',167                                roles, env, proxy_headers)168                    # NOTE(todd): unused169                    self.expanded = True170        #Send request downstream171        return self._forward_request(env, start_response, proxy_headers)172    # NOTE(todd): unused173    def get_admin_auth_token(self, username, password):174        """175        This function gets an admin auth token to be used by this service to176        validate a user's token. Validate_token is a priviledged call so177        it needs to be authenticated by a service that is calling it178        """179        headers = {"Content-type": "application/json",180                   "Accept": "application/json"}181        params = {"passwordCredentials": {"username": username,182                                          "password": password,183                                          "tenantId": "1"}}184        conn = httplib.HTTPConnection("%s:%s" \185            % (self.auth_host, self.auth_port))186        conn.request("POST", "/v2.0/tokens", json.dumps(params), \187            headers=headers)188        response = conn.getresponse()189        data = response.read()190        return data191    def _get_claims(self, env):192        """Get claims from request"""193        claims = env.get('HTTP_X_AUTH_TOKEN', env.get('HTTP_X_STORAGE_TOKEN'))194        return claims195    def _reject_request(self, env, start_response):196        """Redirect client to auth server"""197        return HTTPUnauthorized("Authentication required",198                    [("WWW-Authenticate",199                      "Keystone uri='%s'" % self.auth_location)])(env,200                                                        start_response)201    def _reject_claims(self, env, start_response):202        """Client sent bad claims"""203        return HTTPUnauthorized()(env,204            start_response)205    def _validate_claims(self, claims):206        """Validate claims, and provide identity information isf applicable """207        # Step 1: We need to auth with the keystone service, so get an208        # admin token209        #TODO(ziad): Need to properly implement this, where to store creds210        # for now using token from ini211        #auth = self.get_admin_auth_token("admin", "secrete", "1")212        #admin_token = json.loads(auth)["auth"]["token"]["id"]213        # Step 2: validate the user's token with the auth service214        # since this is a priviledged op,m we need to auth ourselves215        # by using an admin token216        headers = {"Content-type": "application/json",217                    "Accept": "application/json",218                    "X-Auth-Token": self.admin_token}219                    ##TODO(ziad):we need to figure out how to auth to keystone220                    #since validate_token is a priviledged call221                    #Khaled's version uses creds to get a token222                    # "X-Auth-Token": admin_token}223                    # we're using a test token from the ini file for now224        conn = http_connect(self.auth_host, self.auth_port, 'GET',225                            '/v2.0/tokens/%s' % claims, headers=headers)226        resp = conn.getresponse()227        # data = resp.read()228        conn.close()229        if not str(resp.status).startswith('20'):230            # Keystone rejected claim231            return False232        else:233            #TODO(Ziad): there is an optimization we can do here. We have just234            #received data from Keystone that we can use instead of making235            #another call in _expound_claims236            return True237    def _expound_claims(self, claims):238        # Valid token. Get user data and put it in to the call239        # so the downstream service can use it240        headers = {"Content-type": "application/json",241                    "Accept": "application/json",242                    "X-Auth-Token": self.admin_token}243                    ##TODO(ziad):we need to figure out how to auth to keystone244                    #since validate_token is a priviledged call245                    #Khaled's version uses creds to get a token246                    # "X-Auth-Token": admin_token}247                    # we're using a test token from the ini file for now248        conn = http_connect(self.auth_host, self.auth_port, 'GET',249                            '/v2.0/tokens/%s' % claims, headers=headers)250        resp = conn.getresponse()251        data = resp.read()252        conn.close()253        if not str(resp.status).startswith('20'):254            raise LookupError('Unable to locate claims: %s' % resp.status)255        token_info = json.loads(data)256        roles = []257        role_refs = token_info["access"]["user"]["roles"]258        if role_refs != None:259            for role_ref in role_refs:260                # Nova looks for the non case-sensitive role 'Admin'261                # to determine admin-ness262                roles.append(role_ref["name"])263        try:264            tenant = token_info['access']['token']['tenant']['id']265            tenant_name = token_info['access']['token']['tenant']['name']266        except:267            tenant = None268            tenant_name = None269        if not tenant:270            tenant = token_info['access']['user'].get('tenantId')271            tenant_name = token_info['access']['user'].get('tenantName')272        verified_claims = {'user': token_info['access']['user']['username'],273                    'tenant': tenant,274                    'roles': roles}275        if tenant_name:276            verified_claims['tenantName'] = tenant_name277        return verified_claims278    def _decorate_request(self, index, value, env, proxy_headers):279        """Add headers to request"""280        proxy_headers[index] = value281        env["HTTP_%s" % index] = value282    def _forward_request(self, env, start_response, proxy_headers):283        """Token/Auth processed & claims added to headers"""284        self._decorate_request('AUTHORIZATION',285            "Basic %s" % self.service_pass, env, proxy_headers)286        #now decide how to pass on the call287        if self.app:288            # Pass to downstream WSGI component289            return self.app(env, start_response)290            #.custom_start_response)291        else:292            # We are forwarding to a remote service (no downstream WSGI app)293            req = Request(proxy_headers)294            parsed = urlparse(req.url)295            conn = http_connect(self.service_host,296                                self.service_port,297                                req.method,298                                parsed.path,...clients.py
Source:clients.py  
...58            'build_timeout': CONF.dns.build_timeout59        })60        return params61class BaseUnauthedProvider(auth.KeystoneAuthProvider):62    def _decorate_request(self, filters, method, url, headers=None, body=None,63                          auth_data=None):64        result = super(BaseUnauthedProvider, self)._decorate_request(65            filters, method, url, headers=headers, body=body,66            auth_data=auth_data)67        url, headers, body = result68        try:69            del headers['X-Auth-Token']70        except KeyError:71            pass72        return url, headers, body73class KeystoneV2UnauthedProvider(auth.KeystoneV2AuthProvider,74                                 BaseUnauthedProvider):75    def _decorate_request(self, *args, **kwargs):76        return BaseUnauthedProvider._decorate_request(self, *args, **kwargs)77class KeystoneV3UnauthedProvider(auth.KeystoneV3AuthProvider,78                                 BaseUnauthedProvider):79    def _decorate_request(self, *args, **kwargs):...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
