fixeg code
diff --git a/.gitignore b/.gitignore
index 3a71c42..d912518 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,6 +52,6 @@
# PyBuilder
target/
-.idea//sensor_report.txt
+.idea/
.env/
diff --git a/.idea/dictionaries/koder.xml b/.idea/dictionaries/koder.xml
deleted file mode 100644
index 06a695a..0000000
--- a/.idea/dictionaries/koder.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<component name="ProjectDictionaryState">
- <dictionary name="koder">
- <words>
- <w>ceph</w>
- <w>creds</w>
- <w>fname</w>
- <w>fnames</w>
- <w>fstats</w>
- <w>iface</w>
- <w>openrc</w>
- <w>openstack</w>
- <w>osd</w>
- <w>osds</w>
- <w>prebuild</w>
- <w>prefill</w>
- <w>proc</w>
- <w>stdin</w>
- <w>templ</w>
- <w>testrun</w>
- <w>vals</w>
- </words>
- </dictionary>
-</component>
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index 97626ba..0000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="Encoding">
- <file url="PROJECT" charset="UTF-8" />
- </component>
-</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 5d99657..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="ProjectLevelVcsManager" settingsEditedManually="false">
- <OptionsSetting value="true" id="Add" />
- <OptionsSetting value="true" id="Remove" />
- <OptionsSetting value="true" id="Checkout" />
- <OptionsSetting value="true" id="Update" />
- <OptionsSetting value="true" id="Status" />
- <OptionsSetting value="true" id="Edit" />
- <ConfirmationsSetting value="0" id="Add" />
- <ConfirmationsSetting value="0" id="Remove" />
- </component>
- <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.5.2 virtualenv at ~/workspace/wally/.env" project-jdk-type="Python SDK" />
-</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index c32b72a..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="ProjectModuleManager">
- <modules>
- <module fileurl="file://$PROJECT_DIR$/.idea/wally.iml" filepath="$PROJECT_DIR$/.idea/wally.iml" />
- </modules>
- </component>
-</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="VcsDirectoryMappings">
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
- </component>
-</project>
\ No newline at end of file
diff --git a/.idea/wally.iml b/.idea/wally.iml
deleted file mode 100644
index a7375ed..0000000
--- a/.idea/wally.iml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="PYTHON_MODULE" version="4">
- <component name="NewModuleRootManager">
- <content url="file://$MODULE_DIR$" />
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
- <component name="TemplatesService">
- <option name="TEMPLATE_CONFIGURATION" value="Jinja2" />
- <option name="TEMPLATE_FOLDERS">
- <list>
- <option value="$MODULE_DIR$/web_app/templates" />
- </list>
- </option>
- </component>
- <component name="TestRunnerService">
- <option name="PROJECT_TEST_RUNNER" value="Unittests" />
- </component>
-</module>
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index 8764363..0000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,937 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="ChangeListManager">
- <list default="true" id="5dc8824c-962c-4037-8fd3-3bfab4758a44" name="Default" comment="">
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/__init__.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/api.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/cp_protocol.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/cp_transport.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/daemonize.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/discover.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/main.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/protocol.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/sensors/__init__.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/sensors/io_sensors.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/sensors/net_sensors.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/sensors/pscpu_sensors.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/sensors/psram_sensors.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/sensors/syscpu_sensors.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/sensors/sysram_sensors.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors/sensors/utils.py" afterPath="" />
- <change type="DELETED" beforePath="$PROJECT_DIR$/wally/sensors_utils.py" afterPath="" />
- <change type="MOVED" beforePath="$PROJECT_DIR$/wally/discover/node.py" afterPath="$PROJECT_DIR$/wally/node.py" />
- <change type="MOVED" beforePath="$PROJECT_DIR$/wally/sensors/webui/sensors.html" afterPath="$PROJECT_DIR$/scripts/sensors_webui.html" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/fio_binaries/fio_trusty_x86_64.bz2" afterPath="$PROJECT_DIR$/fio_binaries/fio_trusty_x86_64.bz2" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/requirements.txt" afterPath="$PROJECT_DIR$/requirements.txt" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/v2_plans.md" afterPath="$PROJECT_DIR$/v2_plans.md" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/config.py" afterPath="$PROJECT_DIR$/wally/config.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/discover/ceph.py" afterPath="$PROJECT_DIR$/wally/discover/ceph.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/discover/discover.py" afterPath="$PROJECT_DIR$/wally/discover/discover.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/discover/fuel.py" afterPath="$PROJECT_DIR$/wally/discover/fuel.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/discover/openstack.py" afterPath="$PROJECT_DIR$/wally/discover/openstack.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/fuel_rest_api.py" afterPath="$PROJECT_DIR$/wally/fuel_rest_api.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/hw_info.py" afterPath="$PROJECT_DIR$/wally/hw_info.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/keystone.py" afterPath="$PROJECT_DIR$/wally/keystone.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/main.py" afterPath="$PROJECT_DIR$/wally/main.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/meta_info.py" afterPath="$PROJECT_DIR$/wally/meta_info.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/pretty_yaml.py" afterPath="$PROJECT_DIR$/wally/pretty_yaml.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/report.py" afterPath="$PROJECT_DIR$/wally/report.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/run_test.py" afterPath="$PROJECT_DIR$/wally/run_test.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/ssh_utils.py" afterPath="$PROJECT_DIR$/wally/ssh_utils.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/start_vms.py" afterPath="$PROJECT_DIR$/wally/start_vms.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/suits/io/fio.py" afterPath="$PROJECT_DIR$/wally/suits/io/fio.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/suits/io/fio_task_parser.py" afterPath="$PROJECT_DIR$/wally/suits/io/fio_task_parser.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/suits/io/rrd.cfg" afterPath="$PROJECT_DIR$/wally/suits/io/rrd.cfg" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/suits/itest.py" afterPath="$PROJECT_DIR$/wally/suits/itest.py" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/wally/utils.py" afterPath="$PROJECT_DIR$/wally/utils.py" />
- </list>
- <ignored path="wally.iws" />
- <ignored path=".idea/workspace.xml" />
- <ignored path=".idea/dataSources.local.xml" />
- <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
- <option name="TRACKING_ENABLED" value="true" />
- <option name="SHOW_DIALOG" value="false" />
- <option name="HIGHLIGHT_CONFLICTS" value="true" />
- <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
- <option name="LAST_RESOLUTION" value="IGNORE" />
- </component>
- <component name="CreatePatchCommitExecutor">
- <option name="PATCH_PATH" value="" />
- </component>
- <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
- <component name="FavoritesManager">
- <favorites_list name="wally" />
- </component>
- <component name="FileEditorManager">
- <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
- <file leaf-file-name="sensors.py" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/wally/sensors.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="19">
- <caret line="1" column="0" selection-start-line="1" selection-start-column="0" selection-end-line="1" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="run_test.py" pinned="false" current-in-tab="true">
- <entry file="file://$PROJECT_DIR$/wally/run_test.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-7195">
- <caret line="186" column="32" selection-start-line="186" selection-start-column="32" selection-end-line="186" selection-end-column="32" />
- <folding>
- <element signature="e#0#9#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="meta_info.py" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/wally/meta_info.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="475">
- <caret line="27" column="70" selection-start-line="27" selection-start-column="70" selection-end-line="27" selection-end-column="70" />
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="main.py" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/wally/main.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-2888">
- <caret line="34" column="0" selection-start-line="34" selection-start-column="0" selection-end-line="34" selection-end-column="0" />
- <folding>
- <element signature="e#0#9#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="main.py" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/build/lib.linux-x86_64-2.7/wally/main.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="270">
- <caret line="205" column="20" selection-start-line="205" selection-start-column="20" selection-end-line="205" selection-end-column="20" />
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="config.py" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/wally/config.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-1178">
- <caret line="31" column="34" selection-start-line="31" selection-start-column="34" selection-end-line="31" selection-end-column="34" />
- <folding>
- <element signature="e#0#9#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="test_run_class.py" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/wally/test_run_class.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="13" selection-start-line="0" selection-start-column="6" selection-end-line="0" selection-end-column="13" />
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="inode.py" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/wally/inode.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="798">
- <caret line="42" column="23" selection-start-line="42" selection-start-column="23" selection-end-line="42" selection-end-column="23" />
- <folding>
- <element signature="e#0#10#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </file>
- </leaf>
- </component>
- <component name="Git.Settings">
- <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
- </component>
- <component name="IdeDocumentHistory">
- <option name="CHANGED_PATHS">
- <list>
- <option value="$PROJECT_DIR$/wally/ssh_utils.py" />
- <option value="$PROJECT_DIR$/wally/main.py" />
- <option value="$PROJECT_DIR$/wally/test_run_class.py" />
- <option value="$PROJECT_DIR$/wally/discover/ceph.py" />
- <option value="$PROJECT_DIR$/requirements.txt" />
- <option value="$PROJECT_DIR$/wally/discover/discover.py" />
- <option value="$PROJECT_DIR$/wally/discover/fuel.py" />
- <option value="$PROJECT_DIR$/wally/discover/openstack.py" />
- <option value="$PROJECT_DIR$/wally/hw_info.py" />
- <option value="$PROJECT_DIR$/wally/node.py" />
- <option value="$PROJECT_DIR$/wally/fuel_rest_api.py" />
- <option value="$PROJECT_DIR$/wally/keystone.py" />
- <option value="$PROJECT_DIR$/wally/pretty_yaml.py" />
- <option value="$PROJECT_DIR$/wally/start_vms.py" />
- <option value="$PROJECT_DIR$/wally/report.py" />
- <option value="$PROJECT_DIR$/wally/meta_info.py" />
- <option value="$PROJECT_DIR$/wally/suits/itest.py" />
- <option value="$PROJECT_DIR$/wally/utils.py" />
- <option value="$PROJECT_DIR$/wally/suits/io/rpc_plugin.py" />
- <option value="$PROJECT_DIR$/wally/suits/io/fio.py" />
- <option value="$PROJECT_DIR$/wally/suits/io/fio_task_parser.py" />
- <option value="$PROJECT_DIR$/wally/inode.py" />
- <option value="$PROJECT_DIR$/wally/config.py" />
- <option value="$PROJECT_DIR$/wally/sensors.py" />
- <option value="$PROJECT_DIR$/wally/run_test.py" />
- </list>
- </option>
- </component>
- <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
- <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
- <component name="JsGulpfileManager">
- <detection-done>true</detection-done>
- <sorting>DEFINITION_ORDER</sorting>
- </component>
- <component name="ProjectFrameBounds">
- <option name="x" value="65" />
- <option name="y" value="24" />
- <option name="width" value="2495" />
- <option name="height" value="1416" />
- </component>
- <component name="ProjectLevelVcsManager" settingsEditedManually="false">
- <OptionsSetting value="true" id="Add" />
- <OptionsSetting value="true" id="Remove" />
- <OptionsSetting value="true" id="Checkout" />
- <OptionsSetting value="true" id="Update" />
- <OptionsSetting value="true" id="Status" />
- <OptionsSetting value="true" id="Edit" />
- <ConfirmationsSetting value="1" id="Add" />
- <ConfirmationsSetting value="0" id="Remove" />
- </component>
- <component name="ProjectView">
- <navigator currentView="ProjectPane" proportions="" version="1">
- <flattenPackages />
- <showMembers />
- <showModules />
- <showLibraryContents />
- <hideEmptyPackages />
- <abbreviatePackageNames />
- <autoscrollToSource />
- <autoscrollFromSource />
- <sortByType />
- <manualOrder />
- <foldersAlwaysOnTop value="true" />
- </navigator>
- <panes>
- <pane id="Scope" />
- <pane id="ProjectPane">
- <subPane>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="suits" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="wally" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="suits" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="io" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- </subPane>
- </pane>
- <pane id="Scratches" />
- </panes>
- </component>
- <component name="PropertiesComponent">
- <property name="last_opened_file_path" value="$PROJECT_DIR$/../pet/agent" />
- <property name="WebServerToolWindowFactoryState" value="false" />
- <property name="js-jscs-nodeInterpreter" value="/usr/bin/node" />
- <property name="settings.editor.selected.configurable" value="preferences.keymap" />
- <property name="settings.editor.splitter.proportion" value="0.2" />
- </component>
- <component name="RecentsManager">
- <key name="MoveFile.RECENT_KEYS">
- <recent name="$PROJECT_DIR$/wally" />
- </key>
- </component>
- <component name="RunManager" selected="Python.wally">
- <configuration default="true" type="DjangoTestsConfigurationType" factoryName="Django tests">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs>
- <env name="PYTHONUNBUFFERED" value="1" />
- </envs>
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="TARGET" value="" />
- <option name="SETTINGS_FILE" value="" />
- <option name="CUSTOM_SETTINGS" value="false" />
- <option name="USE_OPTIONS" value="false" />
- <option name="OPTIONS" value="" />
- <method />
- </configuration>
- <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug">
- <method />
- </configuration>
- <configuration default="true" type="PyBehaveRunConfigurationType" factoryName="Behave">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs />
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="ADDITIONAL_ARGS" value="" />
- <method />
- </configuration>
- <configuration default="true" type="PyLettuceRunConfigurationType" factoryName="Lettuce">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs />
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="ADDITIONAL_ARGS" value="" />
- <method />
- </configuration>
- <configuration default="true" type="PythonConfigurationType" factoryName="Python">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs>
- <env name="PYTHONUNBUFFERED" value="1" />
- </envs>
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="SCRIPT_NAME" value="" />
- <option name="PARAMETERS" value="" />
- <option name="SHOW_COMMAND_LINE" value="false" />
- <method />
- </configuration>
- <configuration default="true" type="Tox" factoryName="Tox">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs />
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <module name="wally" />
- <method />
- </configuration>
- <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
- <node-interpreter>project</node-interpreter>
- <node-options />
- <gulpfile />
- <tasks />
- <arguments />
- <envs />
- <method />
- </configuration>
- <configuration default="true" type="js.build_tools.npm" factoryName="npm">
- <command value="run-script" />
- <scripts />
- <node-interpreter value="project" />
- <envs />
- <method />
- </configuration>
- <configuration default="true" type="tests" factoryName="Attests">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs />
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="SCRIPT_NAME" value="" />
- <option name="CLASS_NAME" value="" />
- <option name="METHOD_NAME" value="" />
- <option name="FOLDER_NAME" value="" />
- <option name="TEST_TYPE" value="TEST_SCRIPT" />
- <option name="PATTERN" value="" />
- <option name="USE_PATTERN" value="false" />
- <method />
- </configuration>
- <configuration default="true" type="tests" factoryName="Doctests">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs />
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="SCRIPT_NAME" value="" />
- <option name="CLASS_NAME" value="" />
- <option name="METHOD_NAME" value="" />
- <option name="FOLDER_NAME" value="" />
- <option name="TEST_TYPE" value="TEST_SCRIPT" />
- <option name="PATTERN" value="" />
- <option name="USE_PATTERN" value="false" />
- <method />
- </configuration>
- <configuration default="true" type="tests" factoryName="Nosetests">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs />
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="SCRIPT_NAME" value="" />
- <option name="CLASS_NAME" value="" />
- <option name="METHOD_NAME" value="" />
- <option name="FOLDER_NAME" value="" />
- <option name="TEST_TYPE" value="TEST_SCRIPT" />
- <option name="PATTERN" value="" />
- <option name="USE_PATTERN" value="false" />
- <option name="PARAMS" value="" />
- <option name="USE_PARAM" value="false" />
- <method />
- </configuration>
- <configuration default="true" type="tests" factoryName="Unittests">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs />
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="SCRIPT_NAME" value="" />
- <option name="CLASS_NAME" value="" />
- <option name="METHOD_NAME" value="" />
- <option name="FOLDER_NAME" value="" />
- <option name="TEST_TYPE" value="TEST_SCRIPT" />
- <option name="PATTERN" value="" />
- <option name="USE_PATTERN" value="false" />
- <option name="PUREUNITTEST" value="true" />
- <option name="PARAMS" value="" />
- <option name="USE_PARAM" value="false" />
- <method />
- </configuration>
- <configuration default="true" type="tests" factoryName="py.test">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs />
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="SCRIPT_NAME" value="" />
- <option name="CLASS_NAME" value="" />
- <option name="METHOD_NAME" value="" />
- <option name="FOLDER_NAME" value="" />
- <option name="TEST_TYPE" value="TEST_SCRIPT" />
- <option name="PATTERN" value="" />
- <option name="USE_PATTERN" value="false" />
- <option name="testToRun" value="" />
- <option name="keywords" value="" />
- <option name="params" value="" />
- <option name="USE_PARAM" value="false" />
- <option name="USE_KEYWORD" value="false" />
- <method />
- </configuration>
- <configuration default="false" name="wally" type="PythonConfigurationType" factoryName="Python" singleton="true">
- <option name="INTERPRETER_OPTIONS" value="" />
- <option name="PARENT_ENVS" value="true" />
- <envs>
- <env name="PYTHONUNBUFFERED" value="1" />
- </envs>
- <option name="SDK_HOME" value="" />
- <option name="WORKING_DIRECTORY" value="" />
- <option name="IS_MODULE_SDK" value="false" />
- <option name="ADD_CONTENT_ROOTS" value="true" />
- <option name="ADD_SOURCE_ROOTS" value="true" />
- <module name="wally" />
- <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
- <option name="SCRIPT_NAME" value="$PROJECT_DIR$/web_app/app.py" />
- <option name="PARAMETERS" value="" />
- <option name="SHOW_COMMAND_LINE" value="false" />
- <method />
- </configuration>
- <list size="1">
- <item index="0" class="java.lang.String" itemvalue="Python.wally" />
- </list>
- </component>
- <component name="ShelveChangesManager" show_recycled="false">
- <option name="remove_strategy" value="false" />
- </component>
- <component name="SvnConfiguration">
- <configuration />
- </component>
- <component name="TaskManager">
- <task active="true" id="Default" summary="Default task">
- <changelist id="5dc8824c-962c-4037-8fd3-3bfab4758a44" name="Default" comment="" />
- <created>1476553126420</created>
- <option name="number" value="Default" />
- <option name="presentableId" value="Default" />
- <updated>1476553126420</updated>
- </task>
- <servers />
- </component>
- <component name="ToolWindowManager">
- <frame x="65" y="24" width="2495" height="1416" extended-state="6" />
- <editor active="true" />
- <layout>
- <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.19158317" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
- <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
- <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32925585" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
- <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
- <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32960477" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
- <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
- <window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
- <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
- <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
- <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
- <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
- <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
- <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
- <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
- <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
- <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
- <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
- <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
- </layout>
- </component>
- <component name="Vcs.Log.UiProperties">
- <option name="RECENTLY_FILTERED_USER_GROUPS">
- <collection />
- </option>
- <option name="RECENTLY_FILTERED_BRANCH_GROUPS">
- <collection />
- </option>
- </component>
- <component name="VcsContentAnnotationSettings">
- <option name="myLimit" value="2678400000" />
- </component>
- <component name="XDebuggerManager">
- <breakpoint-manager />
- <watches-manager />
- </component>
- <component name="editorHistoryManager">
- <entry file="file://$PROJECT_DIR$/wally/node.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/ssh_utils.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="8721">
- <caret line="472" column="16" selection-start-line="472" selection-start-column="4" selection-end-line="472" selection-end-column="16" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/discover/ceph.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="171">
- <caret line="9" column="42" selection-start-line="9" selection-start-column="42" selection-end-line="9" selection-end-column="42" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/discover/openstack.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-380">
- <caret line="28" column="0" selection-start-line="28" selection-start-column="0" selection-end-line="28" selection-end-column="0" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/requirements.txt">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="190">
- <caret line="10" column="0" selection-start-line="10" selection-start-column="0" selection-end-line="10" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/ssh_utils.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="247">
- <caret line="317" column="21" selection-start-line="317" selection-start-column="21" selection-end-line="317" selection-end-column="25" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/discover/fuel.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="38">
- <caret line="3" column="0" selection-start-line="3" selection-start-column="0" selection-end-line="3" selection-end-column="33" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/discover/discover.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="304">
- <caret line="16" column="9" selection-start-line="16" selection-start-column="9" selection-end-line="16" selection-end-column="9" />
- <folding>
- <element signature="e#0#14#0" expanded="false" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/hw_info.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="57">
- <caret line="177" column="34" selection-start-line="177" selection-start-column="33" selection-end-line="177" selection-end-column="34" />
- <folding>
- <element signature="e#0#9#0" expanded="false" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/node.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="38">
- <caret line="2" column="24" selection-start-line="2" selection-start-column="24" selection-end-line="2" selection-end-column="24" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/fuel_rest_api.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="76">
- <caret line="4" column="21" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="21" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/pretty_yaml.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="228">
- <caret line="39" column="14" selection-start-line="39" selection-start-column="10" selection-end-line="39" selection-end-column="14" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/sensors_utils.py" />
- <entry file="file://$PROJECT_DIR$/wally/start_vms.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-5286">
- <caret line="376" column="75" selection-start-line="376" selection-start-column="75" selection-end-line="376" selection-end-column="75" />
- <folding>
- <element signature="e#0#9#0" expanded="false" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/sensors/main.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/cp_protocol.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/api.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/protocol.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/discover.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/webui/sensors.html" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/sensors/__init__.py" />
- <entry file="file://$PROJECT_DIR$/wally/node_rpc.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding>
- <element signature="e#0#9#0" expanded="false" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/report.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="6631">
- <caret line="349" column="0" selection-start-line="349" selection-start-column="0" selection-end-line="349" selection-end-column="0" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/sensors/sensors/io_sensors.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/sensors/net_sensors.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/sensors/pscpu_sensors.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/sensors/psram_sensors.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/sensors/syscpu_sensors.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/sensors/sysram_sensors.py" />
- <entry file="file://$PROJECT_DIR$/wally/sensors/sensors/utils.py" />
- <entry file="file://$PROJECT_DIR$/wally/__init__.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/keystone.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="437">
- <caret line="65" column="59" selection-start-line="65" selection-start-column="45" selection-end-line="65" selection-end-column="59" />
- <folding>
- <element signature="e#0#11#0" expanded="false" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/suits/io/__init__.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/timeseries.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding>
- <element signature="e#0#12#0" expanded="false" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/statistic.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding>
- <element signature="e#0#11#0" expanded="false" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/__main__.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding>
- <element signature="e#0#10#0" expanded="false" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/utils.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="893">
- <caret line="57" column="57" selection-start-line="57" selection-start-column="57" selection-end-line="57" selection-end-column="57" />
- <folding>
- <element signature="e#0#9#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/suits/io/defaults.cfg">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/suits/io/defaults_qd.cfg">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="323">
- <caret line="17" column="7" selection-start-line="17" selection-start-column="0" selection-end-line="17" selection-end-column="7" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/suits/io/fio_task_parser.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="7220">
- <caret line="380" column="0" selection-start-line="380" selection-start-column="0" selection-end-line="380" selection-end-column="0" />
- <folding>
- <element signature="e#24#33#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/suits/io/rpc_plugin.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="209">
- <caret line="11" column="0" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/suits/itest.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-756">
- <caret line="149" column="35" selection-start-line="149" selection-start-column="35" selection-end-line="149" selection-end-column="35" />
- <folding>
- <element signature="e#0#10#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/suits/io/fio.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="16758">
- <caret line="882" column="62" selection-start-line="882" selection-start-column="62" selection-end-line="882" selection-end-column="62" />
- <folding>
- <element signature="e#0#9#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/inode.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="798">
- <caret line="42" column="23" selection-start-line="42" selection-start-column="23" selection-end-line="42" selection-end-column="23" />
- <folding>
- <element signature="e#0#10#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/build/lib.linux-x86_64-2.7/wally/main.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="270">
- <caret line="205" column="20" selection-start-line="205" selection-start-column="20" selection-end-line="205" selection-end-column="20" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/sensors.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="19">
- <caret line="1" column="0" selection-start-line="1" selection-start-column="0" selection-end-line="1" selection-end-column="0" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/main.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-2888">
- <caret line="34" column="0" selection-start-line="34" selection-start-column="0" selection-end-line="34" selection-end-column="0" />
- <folding>
- <element signature="e#0#9#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/meta_info.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="475">
- <caret line="27" column="70" selection-start-line="27" selection-start-column="70" selection-end-line="27" selection-end-column="70" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/config.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-1178">
- <caret line="31" column="34" selection-start-line="31" selection-start-column="34" selection-end-line="31" selection-end-column="34" />
- <folding>
- <element signature="e#0#9#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/test_run_class.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="0">
- <caret line="0" column="13" selection-start-line="0" selection-start-column="6" selection-end-line="0" selection-end-column="13" />
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/wally/run_test.py">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-7195">
- <caret line="186" column="32" selection-start-line="186" selection-start-column="32" selection-end-line="186" selection-end-column="32" />
- <folding>
- <element signature="e#0#9#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </component>
-</project>
\ No newline at end of file
diff --git a/configs-examples/default.yaml b/configs-examples/default.yaml
index 8750bc3..de17d30 100644
--- a/configs-examples/default.yaml
+++ b/configs-examples/default.yaml
@@ -1,19 +1,22 @@
-settings:
- collect_info: false
- suspend_unused_vms: false
- results_storage: /var/wally_results
- log_level: DEBUG
+# ------------------------------------ CONFIGS -------------------------------------------------------------------
+collect_info: true
+var_dir_root: /tmp/perf_tests
+settings_dir: ~/.wally
+
+logging:
+ extra_logs: 1
+ level: DEBUG
vm_configs:
- keypair_file_private: wally_vm_key.pem
- keypair_file_public: wally_vm_key.pub
+ keypair_file_private: wally_vm_key_perf3.pem
+ keypair_file_public: wally_vm_key_perf3.pub
keypair_name: wally_vm_key
wally_1024:
image:
name: wally_ubuntu
+ user: ubuntu
url: https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img
- creds: "ssh://ubuntu@{ip}::{private_key_path}"
flavor:
name: wally_1024
@@ -25,3 +28,55 @@
name_templ: wally-{group}-{id}
aa_group_name: wally-aa-{0}
security_group: wally_ssh_to_everyone
+
+
+ceph_settings: nodeep-scrub, noscrub
+
+#----------------------------------------- STEPS ------------------------------------------------------------------
+
+sensors:
+ online: true
+ roles_mapping:
+ testnode: system-cpu, block-io, net-io
+ ceph-osd: system-cpu, block-io, net-io, ceph
+ compute:
+ system-cpu: *
+ block-io: sd*
+ net-io: *
+
+#---------------------------------- TEST PROFILES --------------------------------------------------------------------
+profiles:
+ spawn:
+ OS_1_to_1:
+ openstack:
+ count: "=1"
+ cfg_name: wally_1024
+ network_zone_name: net04
+ flt_ip_pool: net04_ext
+ skip_preparation: true
+
+ test:
+ ceph_vdb:
+ - io:
+ load: ceph
+ params:
+ FILENAME: /dev/vdb
+ TEST_FILE_SIZE: AUTO
+
+ cinder_iscsi_vdb:
+ - io:
+ load: cinder_iscsi
+ params:
+ FILENAME: /dev/vdb
+ TEST_FILE_SIZE: AUTO
+
+ nova_io:
+ - io:
+ load: hdd
+ params:
+ FILENAME: /dev/vdb
+ TEST_FILE_SIZE: AUTO
+
+ openstack_ceph: OS_1_to_1 + ceph_vdb
+ openstack_cinder: OS_1_to_1 + ceph_iscsi_vdb
+ openstack_nova: OS_1_to_1 + nova_io
diff --git a/configs-examples/local_lxc_ceph.yaml b/configs-examples/local_lxc_ceph.yaml
index e69de29..03b5185 100644
--- a/configs-examples/local_lxc_ceph.yaml
+++ b/configs-examples/local_lxc_ceph.yaml
@@ -0,0 +1,4 @@
+include: default.yaml
+
+ceph:
+ root_node: local
diff --git a/tests/test_rpc.py b/tests/test_rpc.py
new file mode 100644
index 0000000..fd35555
--- /dev/null
+++ b/tests/test_rpc.py
@@ -0,0 +1,38 @@
+import contextlib
+
+from wally import ssh_utils, node, node_interfaces
+
+
+CONNECT_URI = "localhost"
+
+
+@contextlib.contextmanager
+def rpc_conn_ctx(uri):
+ creds = ssh_utils.parse_ssh_uri(uri)
+ rpc_code, modules = node.get_rpc_server_code()
+
+ ssh_conn = node.connect(node_interfaces.NodeInfo(creds, set()))
+ try:
+ rpc_conn = node.setup_rpc(ssh_conn, rpc_code, plugins=modules)
+ try:
+ yield rpc_conn
+ finally:
+ rpc_conn.conn.server.stop()
+ rpc_conn.disconnect()
+ finally:
+ ssh_conn.disconnect()
+
+
+def test_rpc_simple():
+ with rpc_conn_ctx(CONNECT_URI) as conn:
+ names = conn.conn.server.rpc_info()
+ assert 'server.list_modules' in names
+ assert 'server.load_module' in names
+ assert 'server.rpc_info' in names
+ assert 'server.stop' in names
+
+
+def test_rpc_plugins():
+ with rpc_conn_ctx(CONNECT_URI) as conn:
+ print(conn.conn.server.rpc_info())
+ assert conn.conn.fs.file_exists("/")
diff --git a/tests/test_ssh.py b/tests/test_ssh.py
index efc5f09..43cc9bd 100644
--- a/tests/test_ssh.py
+++ b/tests/test_ssh.py
@@ -1,33 +1,77 @@
-import getpass
+import os
+import contextlib
+from unittest.mock import patch
+from typing import Iterator
-from oktest import ok
-from wally import ssh_utils, ssh
+from wally import ssh_utils, ssh, node, node_interfaces
creds = "root@osd-0"
def test_ssh_url_parser():
- curr_user = getpass.getuser()
- creds = {
- "test": ssh_utils.ConnCreds("test", curr_user, port=23),
- "test:13": ssh_utils.ConnCreds("test", curr_user, port=13),
- "test::xxx.key": ssh_utils.ConnCreds("test", curr_user, port=23, key_file="xxx.key"),
- "test:123:xxx.key": ssh_utils.ConnCreds("test", curr_user, port=123, key_file="xxx.key"),
- "user@test": ssh_utils.ConnCreds("test", "user", port=23),
- "user@test:13": ssh_utils.ConnCreds("test", "user", port=13),
- "user@test::xxx.key": ssh_utils.ConnCreds("test", "user", port=23, key_file="xxx.key"),
- "user@test:123:xxx.key": ssh_utils.ConnCreds("test", "user", port=123, key_file="xxx.key"),
- "user:passwd:@test": ssh_utils.ConnCreds("test", curr_user, port=23, passwd="passwd:"),
- "user:passwd:@test:123": ssh_utils.ConnCreds("test", curr_user, port=123, passwd="passwd:"),
- }
+ default_user = "default_user"
- for uri, expected in creds.items():
- parsed = ssh_utils.parse_ssh_uri(uri)
- ok(parsed.user) == expected.user
- ok(parsed.addr.port) == expected.addr.port
- ok(parsed.addr.host) == expected.addr.host
- ok(parsed.key_file) == expected.key_file
- ok(parsed.passwd) == expected.passwd
+ creds = [
+ ("test", ssh_utils.ConnCreds("test", default_user, port=22)),
+ ("test:13", ssh_utils.ConnCreds("test", default_user, port=13)),
+ ("test::xxx.key", ssh_utils.ConnCreds("test", default_user, port=22, key_file="xxx.key")),
+ ("test:123:xxx.key", ssh_utils.ConnCreds("test", default_user, port=123, key_file="xxx.key")),
+ ("user@test", ssh_utils.ConnCreds("test", "user", port=22)),
+ ("user@test:13", ssh_utils.ConnCreds("test", "user", port=13)),
+ ("user@test::xxx.key", ssh_utils.ConnCreds("test", "user", port=22, key_file="xxx.key")),
+ ("user@test:123:xxx.key", ssh_utils.ConnCreds("test", "user", port=123, key_file="xxx.key")),
+ ("user:passwd@test", ssh_utils.ConnCreds("test", "user", port=22, passwd="passwd")),
+ ("user:passwd:@test", ssh_utils.ConnCreds("test", "user", port=22, passwd="passwd:")),
+ ("user:passwd:@test:123", ssh_utils.ConnCreds("test", "user", port=123, passwd="passwd:"))
+ ]
+ for uri, expected in creds:
+ with patch('getpass.getuser', lambda : default_user):
+ parsed = ssh_utils.parse_ssh_uri(uri)
+
+ assert parsed.user == expected.user, uri
+ assert parsed.addr.port == expected.addr.port, uri
+ assert parsed.addr.host == expected.addr.host, uri
+ assert parsed.key_file == expected.key_file, uri
+ assert parsed.passwd == expected.passwd, uri
+
+
+CONNECT_URI = "localhost"
+
+
+@contextlib.contextmanager
+def conn_ctx(uri, *args):
+ creds = ssh_utils.parse_ssh_uri(CONNECT_URI)
+ node_info = node_interfaces.NodeInfo(creds, set())
+ conn = node.connect(node_info, *args)
+ try:
+ yield conn
+ finally:
+ conn.disconnect()
+
+
+def test_ssh_connect():
+ with conn_ctx(CONNECT_URI) as conn:
+ assert set(conn.run("ls -1 /").split()) == set(fname for fname in os.listdir("/") if not fname.startswith('.'))
+
+
+def test_ssh_complex():
+ pass
+
+
+def test_file_copy():
+ data1 = b"-" * 1024
+ data2 = b"+" * 1024
+
+ with conn_ctx(CONNECT_URI) as conn:
+ path = conn.put_to_file(None, data1)
+ assert data1 == open(path, 'rb').read()
+
+ assert path == conn.put_to_file(path, data2)
+ assert data2 == open(path, 'rb').read()
+
+ assert len(data2) > 10
+ assert path == conn.put_to_file(path, data2[10:])
+ assert data2[10:] == open(path, 'rb').read()
diff --git a/wally/ceph.py b/wally/ceph.py
index e23343e..1e79126 100644
--- a/wally/ceph.py
+++ b/wally/ceph.py
@@ -85,7 +85,7 @@
if key is None:
key = "/etc/ceph/{}.client.admin.keyring".format(cluster)
- with setup_rpc(connect(info), ctx.rpc_code) as node:
+ with setup_rpc(connect(info), ctx.rpc_code, ctx.default_rpc_plugins) as node:
# new_nodes.extend(ceph.discover_ceph_nodes(ceph_root_conn, cluster=cluster, conf=conf, key=key))
ssh_key = node.get_file_content("~/.ssh/id_rsa")
diff --git a/wally/fuel.py b/wally/fuel.py
index 040dcf4..1680d29 100644
--- a/wally/fuel.py
+++ b/wally/fuel.py
@@ -77,7 +77,7 @@
if discover_nodes:
try:
- fuel_rpc = setup_rpc(connect(fuel_node_info), ctx.rpc_code)
+ fuel_rpc = setup_rpc(connect(fuel_node_info), ctx.rpc_code, ctx.default_rpc_plugins)
except AuthenticationException:
raise StopTestError("Wrong fuel credentials")
except Exception:
diff --git a/wally/main.py b/wally/main.py
index 14da140..9a453fb 100644
--- a/wally/main.py
+++ b/wally/main.py
@@ -1,5 +1,4 @@
import os
-import sys
import time
import signal
import logging
@@ -28,8 +27,9 @@
except ImportError:
faulthandler = None
+import agent
-from . import utils, run_test, pretty_yaml
+from . import utils, node
from .storage import make_storage, Storage
from .config import Config
from .logger import setup_loggers
@@ -125,13 +125,13 @@
test_parser.add_argument("-d", '--dont-discover-nodes', action='store_true',
help="Don't connect/discover fuel nodes")
test_parser.add_argument('--no-report', action='store_true', help="Skip report stages")
- test_parser.add_argument('-r', '--resume', default=None, help="Resume previously stopped test, stored in DIR",
- metavar="DIR")
test_parser.add_argument('--result-dir', default=None, help="Save results to DIR", metavart="DIR")
test_parser.add_argument("comment", help="Test information")
test_parser.add_argument("config_file", help="Yaml config file", nargs='?', default=None)
# ---------------------------------------------------------------------
+ test_parser = subparsers.add_parser('resume', help='resume tests')
+ test_parser.add_argument("storage_dir", help="Path to test directory")
return parser.parse_args(argv[1:])
@@ -152,7 +152,6 @@
faulthandler.register(signal.SIGUSR1, all_threads=True)
opts = parse_args(argv)
-
stages = [] # type: List[Stage]
# stop mypy from telling that config & storage might be undeclared
@@ -160,28 +159,23 @@
storage = None # type: Storage
if opts.subparser_name == 'test':
- if opts.resume:
- storage = make_storage(opts.resume, existing=True)
- config = storage.load(Config, 'config')
- else:
- file_name = os.path.abspath(opts.config_file)
- with open(file_name) as fd:
- config = Config(yaml_load(fd.read())) # type: ignore
+ file_name = os.path.abspath(opts.config_file)
+ with open(file_name) as fd:
+ config = Config(yaml_load(fd.read())) # type: ignore
- config.storage_url, config.run_uuid = utils.get_uniq_path_uuid(config.results_dir)
- config.comment = opts.comment
- config.keep_vm = opts.keep_vm
- config.no_tests = opts.no_tests
- config.dont_discover_nodes = opts.dont_discover_nodes
- config.build_id = opts.build_id
- config.build_description = opts.build_description
- config.build_type = opts.build_type
- config.settings_dir = get_config_path(config, opts.settings_dir)
+ config.storage_url, config.run_uuid = utils.get_uniq_path_uuid(config.results_dir)
+ config.comment = opts.comment
+ config.keep_vm = opts.keep_vm
+ config.no_tests = opts.no_tests
+ config.dont_discover_nodes = opts.dont_discover_nodes
+ config.build_id = opts.build_id
+ config.build_description = opts.build_description
+ config.build_type = opts.build_type
+ config.settings_dir = get_config_path(config, opts.settings_dir)
- storage = make_storage(config.storage_url)
+ storage = make_storage(config.storage_url)
- storage['config'] = config # type: ignore
-
+ storage['config'] = config # type: ignore
stages.append(DiscoverCephStage) # type: ignore
stages.append(DiscoverOSStage) # type: ignore
@@ -195,6 +189,14 @@
if not opts.dont_collect:
stages.append(CollectInfoStage) # type: ignore
+ storage['cli'] = argv
+
+ elif opts.subparser_name == 'resume':
+ storage = make_storage(opts.storage_dir, existing=True)
+ config = storage.load(Config, 'config')
+ # TODO: fix this
+ raise NotImplementedError("Resume in not fully implemented")
+
elif opts.subparser_name == 'ls':
tab = texttable.Texttable(max_width=200)
tab.set_deco(tab.HEADER | tab.VLINES | tab.BORDER)
@@ -230,6 +232,7 @@
logger.info("All info would be stored into %r", config.storage_url)
ctx = TestRun(config, storage)
+ ctx.rpc_code, ctx.default_rpc_plugins = node.get_rpc_server_code()
stages.sort(key=lambda x: x.priority)
@@ -237,8 +240,12 @@
failed = False
cleanup_stages = []
for stage in stages:
+ if stage.config_block is not None:
+ if stage.config_block not in ctx.config:
+ continue
+
+ cleanup_stages.append(stage)
try:
- cleanup_stages.append(stage)
with log_stage(stage):
stage.run(ctx)
except:
diff --git a/wally/node.py b/wally/node.py
index fae7879..54a6291 100644
--- a/wally/node.py
+++ b/wally/node.py
@@ -4,7 +4,7 @@
import socket
import logging
import subprocess
-from typing import Union, cast, Any
+from typing import Union, cast, Any, Optional, Tuple, Dict, List
import agent
@@ -26,11 +26,16 @@
def __str__(self) -> str:
return self.info.node_id()
- def put_to_file(self, path: str, content: bytes) -> None:
+ def put_to_file(self, path: Optional[str], content: bytes) -> str:
+ if path is None:
+ path = self.run("mktemp").strip()
+
with self.conn.open_sftp() as sftp:
with sftp.open(path, "wb") as fd:
fd.write(content)
+ return path
+
def disconnect(self):
self.conn.close()
@@ -53,10 +58,10 @@
while True:
try:
- ndata = session.recv(1024)
- output += ndata
- if "" == ndata:
+ ndata = session.recv(1024).decode("utf-8")
+ if not ndata:
break
+ output += ndata
except socket.timeout:
pass
@@ -97,7 +102,9 @@
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
- stdout_data, _ = proc.communicate()
+ stdout_data_b, _ = proc.communicate()
+ stdout_data = stdout_data_b.decode("utf8")
+
if proc.returncode != 0:
templ = "SSH:{0} Cmd {1!r} failed with code {2}. Output: {3}"
raise OSError(templ.format(self, cmd, proc.returncode, stdout_data))
@@ -108,6 +115,25 @@
pass
+def get_rpc_server_code() -> Tuple[bytes, Dict[str, bytes]]:
+ # setup rpc data
+ if agent.__file__.endswith(".pyc"):
+ path = agent.__file__[:-1]
+ else:
+ path = agent.__file__
+
+ master_code = open(path, "rb").read()
+
+ plugins = {} # type: Dict[str, bytes]
+ cli_path = os.path.join(os.path.dirname(path), "cli_plugin.py")
+ plugins["cli"] = open(cli_path, "rb").read()
+
+ fs_path = os.path.join(os.path.dirname(path), "fs_plugin.py")
+ plugins["fs"] = open(fs_path, "rb").read()
+
+ return master_code, plugins
+
+
def connect(info: Union[str, NodeInfo], conn_timeout: int = 60) -> ISSHHost:
if info == 'local':
return LocalHost()
@@ -119,12 +145,12 @@
class RPCNode(IRPCNode):
"""Node object"""
- def __init__(self, conn: agent.Client, info: NodeInfo) -> None:
+ def __init__(self, conn: agent.SimpleRPCClient, info: NodeInfo) -> None:
self.info = info
self.conn = conn
def __str__(self) -> str:
- return "<Node: url={!s} roles={!r} hops=/>".format(self.info.ssh_creds, ",".join(self.info.roles))
+ return "Node(url={!r}, roles={!r})".format(self.info.ssh_creds, ",".join(self.info.roles))
def __repr__(self) -> str:
return str(self)
@@ -138,7 +164,7 @@
def copy_file(self, local_path: str, remote_path: str = None) -> str:
raise NotImplementedError()
- def put_to_file(self, path: str, content: bytes) -> None:
+ def put_to_file(self, path: Optional[str], content: bytes) -> str:
raise NotImplementedError()
def get_interface(self, ip: str) -> str:
@@ -148,27 +174,35 @@
raise NotImplementedError()
def disconnect(self) -> str:
- raise NotImplementedError()
+ self.conn.disconnect()
+ self.conn = None
-def setup_rpc(node: ISSHHost, rpc_server_code: bytes, port: int = 0) -> IRPCNode:
- code_file = node.run("mktemp").strip()
+def setup_rpc(node: ISSHHost, rpc_server_code: bytes, plugins: Dict[str, bytes] = None, port: int = 0) -> IRPCNode:
log_file = node.run("mktemp").strip()
- node.put_to_file(code_file, rpc_server_code)
- cmd = "python {code_file} server --listen-addr={listen_ip}:{port} --daemon " + \
- "--show-settings --stdout-file={out_file}"
-
+ code_file = node.put_to_file(None, rpc_server_code)
ip = node.info.ssh_creds.addr.host
- params_js = node.run(cmd.format(code_file=code_file,
- listen_addr=ip,
- out_file=log_file,
- port=port)).strip()
+ cmd = "python {code_file} server --listen-addr={listen_ip}:{port} --daemon " + \
+ "--show-settings --stdout-file={out_file}"
+ cmd = cmd.format(code_file=code_file, listen_ip=ip, out_file=log_file, port=port)
+ params_js = node.run(cmd).strip()
params = json.loads(params_js)
params['log_file'] = log_file
+ node.info.params.update(params)
+
port = int(params['addr'].split(":")[1])
rpc_conn = agent.connect((ip, port))
- node.info.params.update(params)
+
+ if plugins is not None:
+ try:
+ for name, code in plugins.items():
+ rpc_conn.server.load_module(name, None, code)
+ except Exception:
+ rpc_conn.server.stop()
+ rpc_conn.disconnect()
+ raise
+
return RPCNode(rpc_conn, node.info)
diff --git a/wally/node_interfaces.py b/wally/node_interfaces.py
index ac83267..bc9ba28 100644
--- a/wally/node_interfaces.py
+++ b/wally/node_interfaces.py
@@ -1,5 +1,5 @@
import abc
-from typing import Any, Set, Optional, List, Dict, Callable, NamedTuple
+from typing import Any, Set, Optional, Dict, NamedTuple, Optional
from .ssh_utils import ConnCreds
from .common_types import IPAddr
@@ -40,7 +40,7 @@
pass
@abc.abstractmethod
- def put_to_file(self, path: str, content: bytes) -> None:
+ def put_to_file(self, path: Optional[str], content: bytes) -> str:
pass
def __enter__(self) -> 'ISSHHost':
@@ -69,7 +69,7 @@
pass
@abc.abstractmethod
- def put_to_file(self, path:str, content: bytes) -> None:
+ def put_to_file(self, path: Optional[str], content: bytes) -> str:
pass
@abc.abstractmethod
diff --git a/wally/run_test.py b/wally/run_test.py
index 1a645b6..8b54f8b 100755
--- a/wally/run_test.py
+++ b/wally/run_test.py
@@ -38,8 +38,7 @@
def connect_ext(node_info: NodeInfo) -> Tuple[bool, Union[IRPCNode, NodeInfo]]:
try:
ssh_node = connect(node_info, conn_timeout=ctx.config.connect_timeout)
- # TODO(koder): need to pass all required rpc bytes to this call
- return True, setup_rpc(ssh_node, b"")
+ return True, setup_rpc(ssh_node, ctx.rpc_code, ctx.default_rpc_plugins)
except Exception as exc:
logger.error("During connect to {}: {!s}".format(node, exc))
return False, node_info
diff --git a/wally/ssh_utils.py b/wally/ssh_utils.py
index 43ba44a..24fc178 100644
--- a/wally/ssh_utils.py
+++ b/wally/ssh_utils.py
@@ -46,13 +46,16 @@
key_file: str = None, key: bytes = None) -> None:
self.user = user
self.passwd = passwd
- self.addr = IPAddr(host, port)
+ self.addr = IPAddr(host, int(port))
self.key_file = key_file
self.key = key
def __str__(self) -> str:
return "{}@{}:{}".format(self.user, self.addr.host, self.addr.port)
+ def __repr__(self) -> str:
+ return str(self)
+
def parse_ssh_uri(uri: str) -> ConnCreds:
"""Parse ssh connection URL from one of following form
@@ -63,13 +66,12 @@
if uri.startswith("ssh://"):
uri = uri[len("ssh://"):]
- res = ConnCreds("", getpass.getuser())
-
for rr in URIsNamespace.uri_reg_exprs:
rrm = re.match(rr, uri)
if rrm is not None:
- res.__dict__.update(rrm.groupdict())
- return res
+ params = {"user": getpass.getuser()}
+ params.update(rrm.groupdict())
+ return ConnCreds(**params)
raise ValueError("Can't parse {0!r} as ssh uri value".format(uri))
diff --git a/wally/storage_structure.txt b/wally/storage_structure.txt
index 5715046..dfbb49f 100644
--- a/wally/storage_structure.txt
+++ b/wally/storage_structure.txt
@@ -1,5 +1,6 @@
config: Config - full configuration
all_nodes: List[NodeInfo] - all nodes
+cli: List[str] - cli options
fuel:
version: List[int] - FUEL master node version
diff --git a/wally/test_run_class.py b/wally/test_run_class.py
index 30c46e7..a731b5a 100644
--- a/wally/test_run_class.py
+++ b/wally/test_run_class.py
@@ -29,6 +29,7 @@
self.os_connection = None # type: Optional[OSConnection]
self.fuel_conn = None # type: Optional[Connection]
self.rpc_code = None # type: bytes
+ self.default_rpc_plugins = None # type: Dict[str, bytes]
self.storage = storage
self.config = config