Skip to content

Commit 272757d

Browse files
committed
Merge pull request #125 from QualiSystems/feature/borismod_40_save_vnic
Feature/borismod 40 save vnic connect #40
2 parents a74d922 + f5261fd commit 272757d

12 files changed

Lines changed: 145 additions & 39 deletions

File tree

common/utilites/command_result.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,42 @@
11
from re import search
2+
import jsonpickle
23

34
COMMAND_RESULT_PREFIX = "command_json_result="
45
COMMAND_RESULT_POSTFIX = "=command_json_result_end"
56

67

78
def get_result_from_command_output(output):
8-
match = search(COMMAND_RESULT_PREFIX + '(?P<result>.*)' + COMMAND_RESULT_POSTFIX, output)
9+
"""
10+
Extracts result from output
11+
:param output: Console output as returned from command execution
12+
:return: Deserialized object or deserialized JSON into dictionary
13+
"""
14+
match = _extract_result_from_output(output)
915
if not match:
1016
return None
11-
return match.group('result')
17+
json = match.group('result')
18+
return jsonpickle.decode(json)
19+
20+
21+
def set_command_result(result, unpicklable=False):
22+
"""
23+
Serializes output as JSON and writes it to console output wrapped with special prefix and suffix
24+
:param result: Result to return
25+
:param unpicklable: If True adds JSON can be deserialized as real object.
26+
When False will be deserialized as dictionary
27+
"""
28+
json = jsonpickle.encode(result, unpicklable=unpicklable)
29+
result_for_output = COMMAND_RESULT_PREFIX + str(json) + COMMAND_RESULT_POSTFIX
30+
print result_for_output
31+
return result_for_output
1232

1333

14-
def set_command_result(output):
15-
print COMMAND_RESULT_PREFIX + str(output) + COMMAND_RESULT_POSTFIX
34+
def transfer_command_result(output):
35+
match = _extract_result_from_output(output)
36+
if match:
37+
print COMMAND_RESULT_PREFIX + match.group('result') + COMMAND_RESULT_POSTFIX
38+
39+
40+
def _extract_result_from_output(output):
41+
match = search(COMMAND_RESULT_PREFIX + '(?P<result>.*)' + COMMAND_RESULT_POSTFIX, output)
42+
return match

common/utilites/common_utils.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,18 @@ def represents_int(s):
1414
return True
1515
except ValueError:
1616
return False
17+
18+
19+
def get_object_as_string(obj):
20+
"""
21+
Converts any object to JSON-like readable format, ready to be printed for debugging purposes
22+
:param obj: Any object
23+
:return: string
24+
"""
25+
if isinstance(obj, str):
26+
return obj
27+
if isinstance(obj, list):
28+
return '\r\n\;'.join([get_object_as_string(item) for item in obj])
29+
attrs = vars(obj)
30+
as_string = ', '.join("%s: %s" % item for item in attrs.items())
31+
return as_string

deployed_app_service/proxy/deployed_app_proxy.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import qualipy.scripts.cloudshell_scripts_helpers as helpers
22
from qualipy.api.cloudshell_api import InputNameValue
3-
from common.utilites.command_result import get_result_from_command_output, set_command_result
3+
from common.utilites.command_result import get_result_from_command_output, set_command_result, transfer_command_result
44
from common.logger import getLogger
55

66
_logger = getLogger('DeployedAppService')
@@ -111,6 +111,4 @@ def execute_command_on_vcenter_resource_and_passthrough_result(generic_deployed_
111111
command,
112112
inputs)
113113

114-
result = get_result_from_command_output(command_result.Output)
115-
_logger.debug('Transferring result to the caller ' + result)
116-
set_command_result(result)
114+
transfer_command_result(command_result.Output)

environment_scripts/connect_all.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import re
2-
31
import qualipy.scripts.cloudshell_scripts_helpers as helpers
42
from qualipy.api.cloudshell_api import InputNameValue, AttributeNameValue
3+
from common.logger.service import getLogger
54
from common.utilites.command_result import get_result_from_command_output
65

7-
from common.logger.service import getLogger
86
_logger = getLogger('EnvironmentConnector')
97

108
VIRTUAL_NETWORK_ATTRIBUTE = 'Virtual Network'
@@ -88,19 +86,20 @@ def _execute_connect_command_on_connected_resource(access_mode, connected_resour
8886
[InputNameValue('VLAN_ID', virtual_network),
8987
InputNameValue('VLAN_SPEC_TYPE', access_mode)], True)
9088

91-
result = get_result_from_command_output(command_result.Output)
89+
connect_results = get_result_from_command_output(command_result.Output)
9290

93-
if not result:
94-
_logger.debug('Connect command did not return any result')
91+
if not connect_results:
92+
_logger.debug('Connect command did not return any results')
9593
return
9694

97-
mac_address = result.replace('[\'', '').replace('\']', '')
98-
_logger.debug('Setting Target Interface to: ' + mac_address)
99-
100-
session.SetConnectorAttributes(reservation_id,
101-
connected_resource,
102-
vlan_service_name,
103-
[AttributeNameValue('Target Interface', mac_address)])
95+
for connect_result in connect_results:
96+
mac_address = connect_result['mac_address']
97+
_logger.debug('Setting Target Interface to: ' + mac_address)
98+
session.SetConnectorAttributes(reservation_id,
99+
connected_resource,
100+
vlan_service_name,
101+
[AttributeNameValue('Target Interface', mac_address)])
102+
break
104103

105104
@staticmethod
106105
def _get_connected_resources(connectors, vlan_service):

models/ConnectionResult.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class ConnectionResult(object):
2+
def __init__(self, mac_address, vm_uuid, network_name):
3+
self.mac_address = mac_address
4+
self.vm_uuid = vm_uuid
5+
self.network_name = network_name

run_packager.bat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
@echo off
22

33
REM build driver scripts
4+
del /F /Q "vCenterShellPackage\Resource Scripts\."
5+
del /F /Q "vCenterShellPackage\Topology Scripts\."
46

57
python driver_packager.py packeger_configs\\deployment_service_driver.ini
68
python driver_packager.py packeger_configs\\deploy_from_template_command.ini

tests/test_command_executer_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_deploy_from_template(self):
2020
# arrange
2121
deploy_param = 'deploy_param'
2222
deploy_data = {'mock': Mock()}
23-
deploy_result = Mock()
23+
deploy_result = 'deploy_result'
2424

2525
self.quali_helpers.get_user_param = Mock(return_value=deploy_param)
2626
self.serializer.decode = Mock(return_value=deploy_data)

tests/test_commands/test_connect_vm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def test_connect_vnic_to_network(self):
5050
mapping.dv_port_name = 'port_name'
5151

5252
# act
53-
mac_addresses = connect_command.connect_to_networks(self.si, self.vm_uuid, [mapping], 'default_network')
53+
connect_results = connect_command.connect_to_networks(self.si, self.vm_uuid, [mapping], 'default_network')
5454

5555
mapping.dv_switch_path = self.vcenter_context.default_dvswitch_path
5656
mapping.dv_switch_name = self.vcenter_context.default_dvswitch_name
@@ -61,4 +61,4 @@ def test_connect_vnic_to_network(self):
6161
self.assertTrue(self.dv_port_name_gen.generate_port_group_name.called_with(self.vlan_id))
6262
self.assertTrue(self.vlan_spec_factory.get_vlan_spec.called_with(self.spec_type))
6363
self.assertTrue(self.dv_connector.connect_by_mapping.called_with(self.si, self.vm, [mapping]))
64-
self.assertSequenceEqual(mac_addresses, ['AA-BB'])
64+
self.assertEqual(connect_results[0].mac_address, 'AA-BB')
Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,50 @@
11
from unittest import TestCase
2-
from common.utilites.command_result import get_result_from_command_output
2+
from common.utilites.command_result import get_result_from_command_output, set_command_result
3+
from models.ConnectionResult import ConnectionResult
34

45

56
class TestCommandResult(TestCase):
67

7-
def test_command_result_with_result(self):
8-
result = get_result_from_command_output('command_json_result=MY RESULT=command_json_result_end')
9-
self.assertEqual(result, 'MY RESULT')
8+
def test_get_result_from_command_output_with_result(self):
9+
result = get_result_from_command_output('command_json_result={"result":"MY RESULT"}=command_json_result_end')
10+
self.assertEqual(result["result"], 'MY RESULT')
1011

1112
def test_command_result_empty(self):
1213
result = get_result_from_command_output('')
1314
self.assertEqual(result, None)
15+
16+
def test_get_result_from_command_output_with_result_unpickable_true(self):
17+
18+
connection_result = ConnectionResult(mac_address='AA', vm_uuid='BB', network_name='CC')
19+
output_result = set_command_result(result=connection_result, unpicklable=True)
20+
result = get_result_from_command_output(output_result)
21+
22+
self.assertEqual(result.mac_address, 'AA')
23+
self.assertEqual(result.vm_uuid, 'BB')
24+
self.assertEqual(result.network_name, 'CC')
25+
26+
def test_get_result_from_command_output_with_result_unpickable_false(self):
27+
28+
connection_result = ConnectionResult(mac_address='AA', vm_uuid='BB', network_name='CC')
29+
output_result = set_command_result(result=[connection_result], unpicklable=False)
30+
results = get_result_from_command_output(output_result)
31+
32+
self.assertEqual(results[0]['mac_address'], 'AA')
33+
self.assertEqual(results[0]['vm_uuid'], 'BB')
34+
self.assertEqual(results[0]['network_name'], 'CC')
35+
36+
def test_get_result_from_command_output_with_result(self):
37+
38+
output_result = 'command_json_result=[{"py/object": "models.ConnectionResult.ConnectionResult", "vm_uuid": "422258ab-47e9-d57c-3741-6832a432bc3a", "network_name": "QualiSB/anetwork", "mac_address": "00:50:56:a2:23:76"}]=command_json_result_end'
39+
results = get_result_from_command_output(output_result)
40+
41+
self.assertEqual(results[0].mac_address, '00:50:56:a2:23:76')
42+
43+
def test_get_result_from_command_output_with_result_unpickable_false(self):
44+
45+
output_result = 'command_json_result=[{"vm_uuid": "422258c6-15d0-0646-d5e7-f2cb411eee94", "network_name": "QualiSB/anetwork", "mac_address": "00:50:56:a2:6c:04"}]=command_json_result_end'
46+
results = get_result_from_command_output(output_result)
47+
48+
for result in results:
49+
v = dict(result)
50+
self.assertEqual(result['mac_address'], '00:50:56:a2:6c:04')
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import unittest
2+
from common.utilites.common_utils import get_object_as_string
3+
4+
5+
class TestCommonUtils(unittest.TestCase):
6+
def test_get_object_as_string_list(self):
7+
8+
result = get_object_as_string(['value'])
9+
10+
self.assertEqual(result, 'value')
11+
12+
def test_get_object_as_string_string(self):
13+
14+
result = get_object_as_string('value')
15+
16+
self.assertEqual(result, 'value')

0 commit comments

Comments
 (0)