def createWindowsSession(self, ixNetRestServerIp, ixNetRestServerPort='11009'): """ Description Connect to a Windows IxNetwork API Server. This is for both Windows and Windows server with IxNetwork Connection Manager. This will set up the session URL to use throughout the test. Parameter ixNetRestServerIp: (str): The Windows IxNetwork API Server IP address. ixNetRestServerPort: (str): Default: 11009. Provide a port number to connect to. On a Linux API Server, a socket port is not needed. State "None". """ # Handle __import__(IxNetRestApi) to not error out if ixNetRestServerIp == None: return url = '{0}://{1}:{2}/api/v1/sessions'.format(self.httpScheme, ixNetRestServerIp, ixNetRestServerPort) if self.serverOs == 'windowsConnectionMgr': try: self.logInfo('Please wait while IxNetwork Connection Mgr starts up an IxNetwork session...') self.logInfo('\t{}'.format(url), timestamp=False) response = self._session.request('POST', url, data={}, verify=self.verifySslCert, allow_redirects=True) except requests.exceptions.RequestException as errMsg: errMsg = 'Creating new session failed: {0}'.format(errMsg) raise IxNetRestApiException(errMsg) sessionIdNumber = response.json()['links'][0]['href'].split('/')[-1] response = self._session.request('GET', url+'/'+str(sessionIdNumber), verify=self.verifySslCert, allow_redirects=False) if str(response.status_code).startswith('3'): # >= 8.50 self.httpScheme = 'https' # https://192.168.70.3:443/api/v1/sessions/8020 self.sessionId = response.headers['location'] match = re.match('https://.*:([0-9]+)/api.*', self.sessionId) ixNetRestServerPort = match.group(1) else: # < 8.50 self.sessionId = url + '/'+str(sessionIdNumber) self.sessionUrl = '{httpScheme}://{apiServer}:{port}/api/v1/sessions/{id}/ixnetwork'.format( httpScheme=self.httpScheme, apiServer=ixNetRestServerIp, port=ixNetRestServerPort, id=sessionIdNumber) counterStop = 10 for counter in range(1, counterStop+1): response = self.get(self.sessionId) if type(response.json()) == list: currentState = response.json()[0]['state'] else: currentState = response.json()['state'] self.logInfo('\n\tNew Windows session current state: {0}'.format(currentState), timestamp=False) if currentState != 'ACTIVE' and counter < counterStop: self.logInfo('\tWaiting {0}/{1} seconds'.format(counter, counterStop), timestamp=False) time.sleep(1) if currentState != 'ACTIVE' and counter == counterStop: raise IxNetRestApiException('New Windows session state failed to become ACTVIE state') if currentState == 'ACTIVE' and counter < counterStop: break # Version < 8.50 requires more waiting time. And we cannot verify the version number at this point. time.sleep(25) if self.serverOs == 'windows': # windows sessionId is always 1 because it only supports one session. self.sessionUrl = url + '/1/ixnetwork' try: self.logInfo('\nVerifying API server connection: {}'.format(self.sessionUrl)) response = self._session.request('GET', self.sessionUrl, allow_redirects=False, verify=self.verifySslCert) if '307' in str(response.status_code) and response.headers['location'].startswith('https'): # Overwrite the sessionUrl with the redirected https URL self.sessionUrl = response.headers['location'] except requests.exceptions.RequestException as errMsg: errMsg = 'Connection failed: {0}'.format(errMsg) raise IxNetRestApiException(errMsg) # http://192.168.70.127:11009/api/v1/sessions/1 self.sessionId = self.sessionUrl.split('/ixnetwork')[0] # http://192.168.70.127:11009 self.httpHeader = self.sessionUrl.split('/api')[0] # /api/v1/sessions/{id}/ixnetwork self.apiSessionId = '/api/v1/sessions/{0}/ixnetwork'.format(str(self.sessionId)) self.get(self.sessionUrl)