Mayank Ahuja
Mayank Ahuja

Reputation: 29

Pyral [python rally toolkit version 1.4.2] error : AttributeError: 'RallyRESTResponse' object has no attribute '_servable'

I am using python rally toolkit version 1.4.2 to perform get and put operations but sometimes whenever I run my code i get this error : """File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pyral/rallyresp.py", line 303, in next if (self._served >= self._servable) or (self._limit and self._served >= self._limit): AttributeError: 'RallyRESTResponse' object has no attribute '_servable'"""

On re-running the same code multiple times the code works and sometimes it doesn't. Below is the code in rallyresp.py file which is raising the exception.

        if (self._served >= self._servable) or (self._limit and self._served >= self._limit):
        raise StopIteration

Here is my complete python code:

class TestExecutionDetails():
def __init__(self):
    self.testCaseDetailDict = collections.defaultdict(list)
    self.userStoryDetailDict = collections.defaultdict(list)
    self.conf = ConfigObj("config.ini")
    self.server = self.conf['RallyWS_P']['server']
    self.ws = self.conf['RallyWS_P']['workspace']
    self.prj = self.conf['RallyWS_P']['project']
    self.apikey = self.conf['LoginCredentials']['apikey']
    self.userStoryHeaderCount = 0
    self.testCaseHeaderCount = 0

    print(self.apikey,"\t\t",self.server,"\t\t",self.ws,"\t\t",self.prj)
    self.rally = Rally(self.server, apikey=self.apikey, workspace=self.ws, project=self.prj)
    self.rally.enableLogging('rally.simple-use.log')

def getTestExecutionInfo(self):
    story = self.rally.get('UserStory', query='Release.Name contains "AXP PI 20.2" AND Iteration.Name contains "AXP 20.2.10 IP"', fetch=True,order="Iteration,FormattedID")

    if not story.errors:
        for s in story:
            self.userStoryDetailDict['FormattedID'].append(s.FormattedID)
            self.userStoryDetailDict['Iteration'].append(s.Iteration.Name)
            self.userStoryDetailDict['Release'].append(s.Release.Name)
            self.userStoryDetailDict['LastBuild'].append(s.LastBuild)
            self.userStoryDetailDict['LastRun'].append(str(s.LastRun).split('T')[0])
            self.userStoryDetailDict['Owner'].append(s.Owner.DisplayName)
            self.userStoryDetailDict['TcCount'].append(s.TestCaseCount)
            self.userStoryDetailDict['PassingTcCount'].append(s.PassingTestCaseCount)
            self.userStoryDetailDict['TcStatus'].append(s.TestCaseStatus)
            for t in s.TestCases:
                #print(t.Owner,"\t\t",t.Owner.DisplayName)
                self.testCaseDetailDict['FormattedID'].append(t.FormattedID)
                self.testCaseDetailDict['CreatedBy'].append(t.CreatedBy.DisplayName)
                if t.Owner is None:
                    self.testCaseDetailDict['Owner'].append("None")
                else:
                    self.testCaseDetailDict['Owner'].append(t.Owner.DisplayName)
                self.testCaseDetailDict['LastBuild'].append(t.LastBuild)
                #self.testCaseDetailDict['LastResult'].append(t.TestCaseResult.Name)
                self.testCaseDetailDict['LastRun'].append(str(t.LastRun).split('T')[0])
                self.testCaseDetailDict['LastUpdateDate'].append(str(t.LastUpdateDate).split('T')[0])
                self.testCaseDetailDict['LastVerdict'].append(t.LastVerdict)
                #self.testCaseDetailDict['Attachments'].append(t.Attachement.Name)
                
        self.userStoryHeaderCount = len(self.userStoryDetailDict.keys())
        self.testCaseHeaderCount = len(self.testCaseDetailDict.keys())
        print(self.testCaseDetailDict)
        print(self.userStoryDetailDict)


if __name__ == '__main__':
ted = TestExecutionDetails()
ted.getTestExecutionInfo()

Upvotes: 0

Views: 379

Answers (1)

Mayank Ahuja
Mayank Ahuja

Reputation: 29

As suggested by @ewong, it was indeed a network issue. The connection was getting lost in-between due to internet connectivity as most of us are working at home. The solution I have tried for this is to add max 5 retries.

Upvotes: 0

Related Questions