555 lines
13 KiB
Plaintext
555 lines
13 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"# Project Evaluation\n",
|
|
"\n",
|
|
"This file interfaces with a Proxmox server to automatically generate VM structures and graphs for testing the\n",
|
|
"success criteria of my project."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"## Setup\n",
|
|
"This section sets up the required variables for the Proxmox server."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import os\n",
|
|
"import ipaddress\n",
|
|
"\n",
|
|
"import runners\n",
|
|
"from structure import StandardEnvironment, StandardTest\n",
|
|
"from structure import DirectEnvironment, DirectTest\n",
|
|
"from structure import BaseEnvironment\n",
|
|
"\n",
|
|
"%load_ext dotenv\n",
|
|
"%dotenv"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"## Testing\n",
|
|
"This section gathers the required data from the different structures for later graphs."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"runner = runners.ProxmoxRunner(\n",
|
|
" host=os.getenv('PROXMOX_HOST'),\n",
|
|
" node=os.getenv('PROXMOX_NODE'),\n",
|
|
" user=os.getenv('PROXMOX_USER'),\n",
|
|
" token_name=os.getenv('PROXMOX_TOKEN_NAME'),\n",
|
|
" token_value=os.getenv('PROXMOX_TOKEN_VALUE'),\n",
|
|
"\n",
|
|
" template_id=9000,\n",
|
|
" initial_vm_id=21002,\n",
|
|
"\n",
|
|
" internet_bridge=os.getenv('INTERNET_BRIDGE'),\n",
|
|
"\n",
|
|
" management_bridge=os.getenv('MANAGEMENT_BRIDGE'),\n",
|
|
" management_initial_ip=ipaddress.ip_address(os.getenv('MANAGEMENT_INITIAL_IP')),\n",
|
|
")\n",
|
|
"\n",
|
|
"setup_params = {\n",
|
|
" 'access_key': os.getenv('S3_ACCESS_KEY'),\n",
|
|
" 'secret_key': os.getenv('S3_SECRET_KEY'),\n",
|
|
" 'branch': os.getenv('TARGET_BRANCH'),\n",
|
|
"}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"from graphs import TestStore\n",
|
|
"\n",
|
|
"test_store = TestStore()\n",
|
|
"\n",
|
|
"def run_and_save_test(env: BaseEnvironment, test: StandardTest):\n",
|
|
" (inbound, outbound) = env.test(test)\n",
|
|
" test_store.save_inbound(test, inbound)\n",
|
|
" test_store.save_outbound(test, outbound)\n",
|
|
"\n",
|
|
"def attempt_n_times(foo, n=3):\n",
|
|
" for i in range(n):\n",
|
|
" try:\n",
|
|
" return foo()\n",
|
|
" except KeyboardInterrupt as e:\n",
|
|
" raise e\n",
|
|
" except Exception as e:\n",
|
|
" if i == n - 1:\n",
|
|
" raise e\n",
|
|
"\n",
|
|
"\n",
|
|
"fast_tests = True"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"### Direct Server to Server"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def direct_tests():\n",
|
|
" with DirectEnvironment(runner) as env:\n",
|
|
" run_and_save_test(env, DirectTest(1, bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
" run_and_save_test(env, DirectTest(2, bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
" run_and_save_test(env, DirectTest(3, bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
" run_and_save_test(env, DirectTest(4, bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
"\n",
|
|
"attempt_n_times(direct_tests)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"### Local Portal with 2 Interfaces"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def two_interface_tests():\n",
|
|
" with StandardEnvironment(2, runner, setup_params) as env:\n",
|
|
" run_and_save_test(env, StandardTest([1,1], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
" run_and_save_test(env, StandardTest([1,2], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
" run_and_save_test(env, StandardTest([2,2], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
" run_and_save_test(env, StandardTest(\n",
|
|
" [2,2],\n",
|
|
" events={10: (0,1), 20: (0,2)},\n",
|
|
" duration=30,\n",
|
|
" interval_variation_target=0.8 if fast_tests else 0.5,\n",
|
|
" ))\n",
|
|
"\n",
|
|
"attempt_n_times(two_interface_tests)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"### Local Portal with 3 Interfaces"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def three_interface_tests():\n",
|
|
" with StandardEnvironment(3, runner, setup_params) as env:\n",
|
|
" run_and_save_test(env, StandardTest([1,1,1], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
" run_and_save_test(env, StandardTest([2,2,2], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
"\n",
|
|
"attempt_n_times(three_interface_tests)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"### Local Portal with 4 Interfaces"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def four_interface_tests():\n",
|
|
" with StandardEnvironment(4, runner, setup_params) as env:\n",
|
|
" run_and_save_test(env, StandardTest([1,1,1,1], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
" run_and_save_test(env, StandardTest([2,2,2,2], bandwidth_variation_target=0.2 if fast_tests else 0.05))\n",
|
|
"\n",
|
|
"attempt_n_times(four_interface_tests)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"## Graphs\n",
|
|
"This section produces graphs from the collected data."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"from graphs import plot_iperf_results, plot_iperf_results_time\n",
|
|
"\n",
|
|
"if not os.path.exists('output/'):\n",
|
|
" os.makedirs('output/')\n",
|
|
"\n",
|
|
"for filename in os.listdir('output'):\n",
|
|
" file_path = os.path.join('output/', filename)\n",
|
|
" os.unlink(file_path)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"### Section 4.2: Graphs\n",
|
|
"#### Subsection 4.2.2 Line Graphs"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results_time(test_store,\n",
|
|
" {\n",
|
|
" '4x1MB Connections (proxied)': StandardTest([1,1,1,1]),\n",
|
|
" '3x1MB Connections (proxied)': StandardTest([1,1,1]),\n",
|
|
" '2x1MB Connections (proxied)': StandardTest([1,1]),\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" error_bars_x=False,\n",
|
|
" error_bars_y=False,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results_time(test_store,\n",
|
|
" {\n",
|
|
" '4x1MB Connections (proxied)': StandardTest([1,1,1,1]),\n",
|
|
" '3x1MB Connections (proxied)': StandardTest([1,1,1]),\n",
|
|
" '2x1MB Connections (proxied)': StandardTest([1,1]),\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" error_bars_x=True,\n",
|
|
" error_bars_y=False,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results_time(test_store,\n",
|
|
" {\n",
|
|
" '4x1MB Connections (proxied)': StandardTest([1,1,1,1]),\n",
|
|
" '3x1MB Connections (proxied)': StandardTest([1,1,1]),\n",
|
|
" '2x1MB Connections (proxied)': StandardTest([1,1]),\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" error_bars_x=False,\n",
|
|
" error_bars_y=True,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"### Section 4.3: Success Criteria\n",
|
|
"#### Subsection 4.3.2: Bidirectional Performance Gains"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results(test_store,\n",
|
|
" {\n",
|
|
" '2x1MB Connections (proxied)': StandardTest([1,1]),\n",
|
|
" '1x1MB + 1x2MB\\nConnections (proxied)': StandardTest([1,2]),\n",
|
|
" '2x2MB Connections (proxied)': StandardTest([2,2]),\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"#### Subsection 4.3.5: More Bandwidth over Two Equal Connections"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results(test_store,\n",
|
|
" {\n",
|
|
" '1x1MB Connection\\n(direct)': DirectTest(1),\n",
|
|
" '2x1MB Connections\\n(proxied)': StandardTest([1,1]),\n",
|
|
" '1x2MB Connection\\n(direct)': DirectTest(2),\n",
|
|
"\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"### Section 4.4: Extended Goals\n",
|
|
"#### Subsection 4.4.1: More Bandwidth over Unequal Connections"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results(test_store,\n",
|
|
" {\n",
|
|
" '2x2MB Connections\\n(proxied)': StandardTest([2,2]),\n",
|
|
" '1x1MB + 1x2MB\\nConnections (proxied)': StandardTest([1,2]),\n",
|
|
" '2x1MB Connections\\n(proxied)': StandardTest([1,1]),\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"#### Subsection 4.4.2: More Bandwidth over Four Equal Connections"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results(test_store,\n",
|
|
" {\n",
|
|
" '4x1MB Connections\\n(proxied)': StandardTest([1,1,1,1]),\n",
|
|
" '3x1MB Connections\\n(proxied)': StandardTest([1,1,1]),\n",
|
|
" '2x1MB Connections\\n(proxied)': StandardTest([1,1]),\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results(test_store,\n",
|
|
" {\n",
|
|
" '4x2MB Connections\\n(proxied)': StandardTest([2,2,2,2]),\n",
|
|
" '3x2MB Connections\\n(proxied)': StandardTest([2,2,2]),\n",
|
|
" '2x2MB Connections\\n(proxied)': StandardTest([2,2]),\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"source": [
|
|
"#### Subsection 4.4.3: Bandwidth Variation"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"plot_iperf_results_time(test_store,\n",
|
|
" {\n",
|
|
" 'Varied Connection': StandardTest([2,2], events={10: (0,1), 20: (0,2)}, duration=30),\n",
|
|
" },\n",
|
|
" fast_tests,\n",
|
|
" filename='png',\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"pycharm": {
|
|
"name": "#%%\n"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.9.0"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
}
|