Skip to content

Commit

Permalink
Fixed file path in rest simulator
Browse files Browse the repository at this point in the history
  • Loading branch information
yaroslavNqualisystems committed Oct 30, 2019
1 parent 17e16ed commit bad4836
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 66 deletions.
95 changes: 52 additions & 43 deletions cloudshell/recorder/rest/request_handler.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
import os
from functools import lru_cache
# from functools import lru_cache
from http.server import BaseHTTPRequestHandler
from urllib.error import HTTPError
from urllib.parse import urlparse
import vcr
# from urllib.error import HTTPError
# from urllib.parse import urlparse
import urllib3

# try:
# from functools import lru_cache
# except ImportError:
# from functools32 import lru_cache
#
#
# try:
# from urllib.parse import urlparse
# except ImportError:
# from urlparse import urlparse


class RestSimHTTPRequestHandler(BaseHTTPRequestHandler):
Expand All @@ -21,40 +30,40 @@ class RestSimHTTPRequestHandler(BaseHTTPRequestHandler):
# def _dst_url(self):
# return "{}{}".format(self.URL, self.path)

@property
@lru_cache()
def _dst_url_obj(self):
return urlparse(self.URL)

@property
def _dst_scheme(self):
return self._dst_url_obj.scheme

@property
def _dst_hostname(self):
return self._dst_url_obj.hostname

@property
def _dst_port(self):
return self._dst_url_obj.port

def _cassette_name(self):
if not self._dst_port and self._dst_scheme.lower() == 'http':
port = '80'
elif not self._dst_port:
port = '443'
else:
port = self._dst_port
return self.CASSETTE_NAME_TEMPLATE.format(scheme=self._dst_scheme, host=self._dst_hostname, port=port)
# @property
# @lru_cache()
# def _dst_url_obj(self):
# return urlparse(self.URL)

@lru_cache()
def _cassette_path(self):
if self.RECORD_PATH and os.path.isfile(self.RECORD_PATH):
return self.RECORD_PATH
elif self.RECORD_PATH and os.path.isdir(self.RECORD_PATH):
return os.path.join(self.RECORD_PATH, self._cassette_name())
else:
return self._cassette_name()
# @property
# def _dst_scheme(self):
# return self._dst_url_obj.scheme
#
# @property
# def _dst_hostname(self):
# return self._dst_url_obj.hostname
#
# @property
# def _dst_port(self):
# return self._dst_url_obj.port
#
# def _cassette_name(self):
# if not self._dst_port and self._dst_scheme.lower() == 'http':
# port = '80'
# elif not self._dst_port:
# port = '443'
# else:
# port = self._dst_port
# return self.CASSETTE_NAME_TEMPLATE.format(scheme=self._dst_scheme, host=self._dst_hostname, port=port)
#
# @lru_cache()
# def _cassette_path(self):
# if self.RECORD_PATH and os.path.isfile(self.RECORD_PATH):
# return self.RECORD_PATH
# elif self.RECORD_PATH and os.path.isdir(self.RECORD_PATH):
# return os.path.join(self.RECORD_PATH, self._cassette_name())
# else:
# return self._cassette_name()

def _assign_headers(self, headers):
for key, val in headers.items():
Expand All @@ -78,12 +87,12 @@ def _handle_request(self, method, handle_data=False):
data = self.rfile.read(content_len)
else:
data = None
try:
with urllib3.connectionpool.connection_from_url(self.URL, cert_reqs='CERT_NONE') as conn:
resp = conn.urlopen(method=method, url=self.path, headers=self.headers, body=data)
self._send_response(resp.status, resp.headers, resp.data)
except HTTPError as e:
self._send_response(e.code, e.headers, e.msg.encode())
# try:
with urllib3.connectionpool.connection_from_url(self.URL, cert_reqs='CERT_NONE') as conn:
resp = conn.urlopen(method=method, url=self.path, headers=self.headers, body=data)
self._send_response(resp.status, resp.headers, resp.data)
# except HTTPError as e:
# self._send_response(e.code, e.headers, e.msg.encode())

def do_GET(self):
method = "GET"
Expand Down
85 changes: 64 additions & 21 deletions cloudshell/recorder/rest/rest_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@
import os
import ssl
import sys
import urllib
# import urllib
from http.server import HTTPServer
from urllib.parse import urlparse

try:
from urllib.parse import urlparse
except ImportError:
from urlparse import urlparse

import click
import pkg_resources
Expand All @@ -19,11 +23,6 @@
MATCH_ON = ('method', 'path', 'query')


def _enable_debug():
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG,
format="%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s")


@click.group(invoke_without_command=True)
@click.option(u'--version', u'-v', is_flag=True, default=False, help='Package version.')
@click.pass_context
Expand All @@ -46,25 +45,57 @@ def rest_cli(ctx, version):
@click.option("--scheme", "-s", default=None, help="Listen scheme, http or https, Default: dst url scheme.")
@click.option("--file-path", "-f", default=None, help="Record path. Default: current path.")
@click.option("--debug", "-d", is_flag=True, default=False, help="Enable debug.")
@click.option("--record", "-r", "record_mode", is_flag=True, default=False, help="Enable record mode.")
@click.argument(u'url', type=str, default=None, required=True)
def record(host, port, scheme, file_path, debug, record_mode, url):
def record(host, port, scheme, file_path, debug, url):
if debug:
_enable_debug()

RestSimHTTPRequestHandler.URL = url
RestSimHTTPRequestHandler.RECORD_PATH = file_path
RestSimHTTPRequestHandler.RECORD_MODE = False

if record_mode:
vcr_cass_man = vcr.use_cassette(_cassette_path(url, file_path), record_mode='new_episodes',
match_on=MATCH_ON)
vcr_cass_man = vcr.use_cassette(_cassette_path(url, file_path), record_mode='new_episodes',
match_on=MATCH_ON)

RestSimHTTPRequestHandler.VCR_CONT_MANAGER = vcr_cass_man

url_obj = urlparse(url)
if not port and not url_obj.port:
if scheme == "http" or url_obj.scheme == "http":
port = 80
else:
port = 443
else:
vcr_cass_man = vcr.use_cassette(_cassette_path(url, file_path), match_on=MATCH_ON)
port = port or url_obj.port
server = HTTPServer((host, port), RestSimHTTPRequestHandler)
if (scheme and scheme == "https") or url_obj.scheme == "https":
server.socket = ssl.wrap_socket(server.socket, server_side=True,
certfile=os.path.join(os.path.dirname(__file__), 'default.pem'))
server.serve_forever()


@rest_cli.command()
@click.option("--host", "-h", default="localhost",
help="Listen host. Default: localhost")
@click.option("--port", "-p", default=None,
help="Listen port. Default: dst url port")
@click.option("--scheme", "-s", default=None, help="Listen scheme, http or https, Default: dst url scheme.")
@click.option("--file-path", "-f", default=None, help="Record path. Default: current path.")
@click.option("--debug", "-d", is_flag=True, default=False, help="Enable debug.")
@click.argument(u'url', type=str, default=None, required=False)
def simulate(host, port, scheme, file_path, debug, url):
if debug:
_enable_debug()

RestSimHTTPRequestHandler.URL = url
RestSimHTTPRequestHandler.RECORD_PATH = file_path
RestSimHTTPRequestHandler.RECORD_MODE = False

vcr_cass_man = vcr.use_cassette(_cassette_path(url, file_path), match_on=MATCH_ON)

RestSimHTTPRequestHandler.VCR_CONT_MANAGER = vcr_cass_man

url_obj = urllib.parse.urlparse(url)
url_obj = urlparse(url)
if not port and not url_obj.port:
if scheme == "http" or url_obj.scheme == "http":
port = 80
Expand All @@ -79,8 +110,13 @@ def record(host, port, scheme, file_path, debug, record_mode, url):
server.serve_forever()


def _enable_debug():
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG,
format="%(asctime)s [%(levelname)s]: %(name)s %(module)s - %(funcName)-20s %(message)s")


def _cassette_name(url):
url_obj = urllib.parse.urlparse(url)
url_obj = urlparse(url)
if not url_obj.port and url_obj.scheme.lower() == 'http':
port = '80'
elif not url_obj.port:
Expand All @@ -91,17 +127,24 @@ def _cassette_name(url):


def _cassette_path(url, path):
if path and os.path.isfile(path):
return path
elif path and os.path.isdir(path):
if path and os.path.isdir(path):
return os.path.join(path, _cassette_name(url))
elif path:
return path
else:
return _cassette_name(url)


@rest_cli.command()
def simulate():
pass
def _choose_port(url, port, scheme):
url_obj = urlparse(url)
if not port and not url_obj.port:
if scheme == "http" or url_obj.scheme == "http":
port = 80
else:
port = 443
else:
port = port or url_obj.port
return port


if __name__ == '__main__':
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
author_email='[email protected]',
packages=find_packages(),
entry_points={
"console_scripts": ['cloudshell_recorder = cloudshell.recorder.bootstrap:cli']
"console_scripts": ['cloudshell_recorder = cloudshell.recorder.bootstrap:cli',
'rest_simulator = cloudshell.recorder.rest.rest_cli:rest_cli']
},
install_requires=required,
test_suite='tests',
Expand Down
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.0.0
1.0.2

0 comments on commit bad4836

Please sign in to comment.