Skip to content

Commit ec00c39

Browse files
authored
Merge pull request #886 from QualiSystems/develop
Merging to master for 1.9.0 release
2 parents f758598 + 3c1495d commit ec00c39

File tree

15 files changed

+152
-67
lines changed

15 files changed

+152
-67
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ env:
44
install:
55
- pip install -r external_requirements.txt
66
- pip install -r test_requirements.txt
7-
- pip install "cloudshell-core>=2.0.0,<2.1.0" --extra-index-url https://testpypi.python.org/simple
7+
- pip install "cloudshell-core>=2.2.0,<2.3.0" --extra-index-url https://testpypi.python.org/simple
88
- chmod 777 ./cloudshell_shell_core_install.sh
99
- ./cloudshell_shell_core_install.sh
10-
- pip install "cloudshell-automation-api>=8.0.0.0,<8.1.0.0" --extra-index-url https://testpypi.python.org/simple
10+
- pip install "cloudshell-automation-api>=8.2.0.0,<8.3.0.0" --extra-index-url https://testpypi.python.org/simple
1111
language: python
1212
notifications:
1313
webhools: "https://qualisystems.getbadges.io/api/app/webhook/63350e33-4119-49c3-8127-075aaa022926"

cloudshell_shell_core_install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash
22
if [ "${CLOUD_SHELL_SHELL_CORE}" -eq 1 ]
33
then
4-
pip install "cloudshell-shell-core>=2.0.0,<2.1.0" --extra-index-url https://testpypi.python.org/simple
4+
pip install "cloudshell-shell-core>=3.0.0,<3.1.0" --extra-index-url https://testpypi.python.org/simple
55
else
66
pip install "cloudshell-shell-core>=2.3.0,<2.4.0" --extra-index-url https://testpypi.python.org/simple
77
fi

package/cloudshell/cp/vcenter/commands/deploy_vm.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,45 +11,53 @@ def __init__(self, deployer):
1111
"""
1212
self.deployer = deployer
1313

14-
def execute_deploy_from_linked_clone(self, si, logger, vcenter_data_model, deployment_params):
14+
def execute_deploy_from_linked_clone(self, si, logger, vcenter_data_model, reservation_id, deployment_params):
1515
"""
1616
Calls the deployer to deploy vm from snapshot
17+
:param str reservation_id:
1718
:param si:
1819
:param logger:
1920
:type deployment_params: DeployFromLinkedClone
2021
:param vcenter_data_model:
2122
:return:
2223
"""
23-
deploy_result = self.deployer.deploy_from_linked_clone(si, logger, deployment_params, vcenter_data_model)
24+
deploy_result = self.deployer.deploy_from_linked_clone(si, logger, deployment_params, vcenter_data_model,
25+
reservation_id)
2426
return deploy_result
2527

26-
def execute_deploy_clone_from_vm(self, si, logger, vcenter_data_model, deployment_params):
28+
def execute_deploy_clone_from_vm(self, si, logger, vcenter_data_model, reservation_id, deployment_params):
2729
"""
2830
Calls the deployer to deploy vm from another vm
31+
:param str reservation_id:
2932
:param si:
3033
:param logger:
3134
:type deployment_params: DeployFromTemplateDetails
3235
:param vcenter_data_model:
3336
:return:
3437
"""
35-
deploy_result = self.deployer.deploy_clone_from_vm(si, logger, deployment_params, vcenter_data_model)
38+
deploy_result = self.deployer.deploy_clone_from_vm(si, logger, deployment_params, vcenter_data_model,
39+
reservation_id)
3640
return deploy_result
3741

38-
def execute_deploy_from_template(self, si, logger, vcenter_data_model, deployment_params):
42+
def execute_deploy_from_template(self, si, logger, vcenter_data_model, reservation_id, deployment_params):
3943
"""
4044
45+
:param str reservation_id:
4146
:param si:
4247
:param logger:
4348
:type deployment_params: DeployFromTemplateDetails
4449
:param vcenter_data_model:
4550
:return:
4651
"""
47-
deploy_result = self.deployer.deploy_from_template(si, logger, deployment_params, vcenter_data_model)
52+
deploy_result = self.deployer.deploy_from_template(si, logger, deployment_params, vcenter_data_model,
53+
reservation_id)
4854
return deploy_result
4955

50-
def execute_deploy_from_image(self, si, logger, session, vcenter_data_model, deployment_params, resource_context):
56+
def execute_deploy_from_image(self, si, logger, session, vcenter_data_model, reservation_id, deployment_params,
57+
resource_context):
5158
"""
5259
60+
:param str reservation_id:
5361
:param si:
5462
:param logger:
5563
:param session:
@@ -63,5 +71,6 @@ def execute_deploy_from_image(self, si, logger, session, vcenter_data_model, dep
6371
session=session,
6472
vcenter_data_model=vcenter_data_model,
6573
data_holder=deployment_params,
66-
resource_context=resource_context)
74+
resource_context=resource_context,
75+
reservation_id=reservation_id)
6776
return deploy_result

package/cloudshell/cp/vcenter/common/utilites/common_name.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33
### util methods to help us generate names for different entities ###
44

55

6-
def generate_unique_name(name_prefix):
6+
def generate_unique_name(name_prefix, reservation_id=None):
77
"""
8-
generate a unique name.
9-
method generate a guid and adds the first 8 characteres of the new guid to 'name_prefix'.
8+
Generate a unique name.
9+
Method generate a guid and adds the first 8 characteres of the new guid to 'name_prefix'.
10+
If reservation id is provided than the first 4 chars of the generated guid are taken and the last 4
11+
of the reservation id
1012
"""
11-
unique_id = str(uuid.uuid4())[:8]
13+
if reservation_id and isinstance(reservation_id, str) and len(reservation_id) >= 4:
14+
unique_id = str(uuid.uuid4())[:4] + "-" + reservation_id[-4:]
15+
else:
16+
unique_id = str(uuid.uuid4())[:8]
1217
return name_prefix + "_" + unique_id

package/cloudshell/cp/vcenter/common/wrappers/command_wrapper.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def __init__(self, pv_service, cloud_shell_helper, resource_model_parser, contex
5252
@retry(stop_max_attempt_number=3, wait_fixed=2000, retry_on_exception=retry_if_auth_error)
5353
def execute_command_with_connection(self, context, command, *args):
5454
"""
55-
Note: session & vcenter_data_model objects will be injected dynamically to the command
55+
Note: session & vcenter_data_model & reservation id objects will be injected dynamically to the command
5656
:param command:
5757
:param context: instance of ResourceCommandContext or AutoLoadCommandContext
5858
:type context: cloudshell.shell.core.context.ResourceCommandContext
@@ -98,10 +98,21 @@ def execute_command_with_connection(self, context, command, *args):
9898
logger.info(CONNECTED_TO_CENTER.format(connection_details.host))
9999
command_args.append(si)
100100

101-
self._try_inject_arg(command=command, command_args=command_args, arg_object=session, arg_name='session')
102-
self._try_inject_arg(command=command, command_args=command_args, arg_object=vcenter_data_model,
101+
self._try_inject_arg(command=command,
102+
command_args=command_args,
103+
arg_object=session,
104+
arg_name='session')
105+
self._try_inject_arg(command=command,
106+
command_args=command_args,
107+
arg_object=vcenter_data_model,
103108
arg_name='vcenter_data_model')
104-
self._try_inject_arg(command=command, command_args=command_args, arg_object=logger,
109+
self._try_inject_arg(command=command,
110+
command_args=command_args,
111+
arg_object=self._get_reservation_id(context),
112+
arg_name='reservation_id')
113+
self._try_inject_arg(command=command,
114+
command_args=command_args,
115+
arg_object=logger,
105116
arg_name='logger')
106117

107118
command_args.extend(args)
@@ -157,6 +168,14 @@ def _get_domain(context):
157168
domain = reservation.domain
158169
return domain
159170

171+
@staticmethod
172+
def _get_reservation_id(context):
173+
reservation_id = None
174+
reservation = getattr(context, 'reservation', getattr(context, 'remote_reservation', None))
175+
if reservation:
176+
reservation_id = reservation.reservation_id
177+
return reservation_id
178+
160179
def _try_inject_arg(self, command, command_args, arg_object, arg_name):
161180
try:
162181
if not arg_object:

package/cloudshell/cp/vcenter/vm/deploy.py

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,34 @@ def __init__(self, pv_service, name_generator, ovf_service, cs_helper, resource_
2424
self.cs_helper = cs_helper # type CloudshellDriverHelper
2525
self.resource_model_parser = resource_model_parser # type ResourceModelParser
2626

27-
def deploy_from_linked_clone(self, si, logger, data_holder, vcenter_data_model):
27+
def deploy_from_linked_clone(self, si, logger, data_holder, vcenter_data_model, reservation_id):
2828
"""
2929
deploy Cloned VM From VM Command, will deploy vm from a snapshot
3030
3131
:param si:
3232
:param logger:
33-
:type data_holder:
34-
:type vcenter_data_model:
33+
:param data_holder:
34+
:param vcenter_data_model:
35+
:param str reservation_id:
3536
:return:
3637
"""
3738

3839
template_resource_model = data_holder.template_resource_model
3940

40-
return self._deploy_a_clone(si,
41-
logger,
42-
data_holder.app_name,
43-
template_resource_model.vcenter_vm,
44-
template_resource_model,
45-
vcenter_data_model,
41+
return self._deploy_a_clone(si=si,
42+
logger=logger,
43+
app_name=data_holder.app_name,
44+
template_name=template_resource_model.vcenter_vm,
45+
other_params=template_resource_model,
46+
vcenter_data_model=vcenter_data_model,
47+
reservation_id=reservation_id,
4648
snapshot=template_resource_model.vcenter_vm_snapshot)
4749

48-
def deploy_clone_from_vm(self, si, logger, data_holder, vcenter_data_model):
50+
def deploy_clone_from_vm(self, si, logger, data_holder, vcenter_data_model, reservation_id):
4951
"""
5052
deploy Cloned VM From VM Command, will deploy vm from another vm
5153
54+
:param reservation_id:
5255
:param si:
5356
:param logger:
5457
:type data_holder:
@@ -61,10 +64,12 @@ def deploy_clone_from_vm(self, si, logger, data_holder, vcenter_data_model):
6164
data_holder.app_name,
6265
template_resource_model.vcenter_vm,
6366
template_resource_model,
64-
vcenter_data_model)
67+
vcenter_data_model,
68+
reservation_id)
6569

66-
def deploy_from_template(self, si, logger, data_holder, vcenter_data_model):
70+
def deploy_from_template(self, si, logger, data_holder, vcenter_data_model, reservation_id):
6771
"""
72+
:param reservation_id:
6873
:param si:
6974
:param logger:
7075
:type data_holder: DeployFromTemplateDetails
@@ -77,11 +82,13 @@ def deploy_from_template(self, si, logger, data_holder, vcenter_data_model):
7782
data_holder.app_name,
7883
template_resource_model.vcenter_template,
7984
template_resource_model,
80-
vcenter_data_model)
85+
vcenter_data_model,
86+
reservation_id)
8187

82-
def _deploy_a_clone(self, si, logger, app_name, template_name, other_params, vcenter_data_model, snapshot=''):
88+
def _deploy_a_clone(self, si, logger, app_name, template_name, other_params, vcenter_data_model, reservation_id,
89+
snapshot=''):
8390
# generate unique name
84-
vm_name = self.name_generator(app_name)
91+
vm_name = self.name_generator(app_name, reservation_id)
8592

8693
VCenterDetailsFactory.set_deplyment_vcenter_params(
8794
vcenter_resource_model=vcenter_data_model, deploy_params=other_params)
@@ -115,8 +122,8 @@ def _deploy_a_clone(self, si, logger, app_name, template_name, other_params, vce
115122
autoload=other_params.autoload
116123
)
117124

118-
def deploy_from_image(self, si, logger, session, vcenter_data_model, data_holder, resource_context):
119-
vm_name = self.name_generator(data_holder.app_name)
125+
def deploy_from_image(self, si, logger, session, vcenter_data_model, data_holder, resource_context, reservation_id):
126+
vm_name = self.name_generator(data_holder.app_name, reservation_id)
120127

121128
connection_details = self.cs_helper.get_connection_details(session=session,
122129
vcenter_resource_model=vcenter_data_model,

package/cloudshell/tests/test_commands/test_deploy_vm.py

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,22 @@ def test_deploy_execute(self):
3232
deploy_command = DeployCommand(deployer)
3333

3434
resource_context = Mock()
35+
logger = Mock()
36+
vcenter_data_model = Mock()
37+
reservation_id = Mock()
3538

3639
# act
3740
result = deploy_command.execute_deploy_from_template(
38-
si=si,
39-
logger=Mock(),
40-
deployment_params=deploy_params,
41-
vcenter_data_model=Mock())
41+
si=si,
42+
logger=logger,
43+
deployment_params=deploy_params,
44+
vcenter_data_model=vcenter_data_model,
45+
reservation_id=reservation_id)
4246

4347
# assert
4448
self.assertTrue(result)
45-
self.assertTrue(deployer.deploy_from_template.called_with(si, deploy_params, resource_context))
49+
deployer.deploy_from_template.assert_called_once_with(si, logger, deploy_params, vcenter_data_model,
50+
reservation_id)
4651

4752
def test_deploy_image_execute(self):
4853
deployer = Mock()
@@ -53,20 +58,29 @@ def test_deploy_image_execute(self):
5358
deployer.deploy_from_image = Mock(return_value=res)
5459
session = Mock()
5560
vcenter_data_model = Mock()
61+
logger = Mock()
62+
reservation_id = Mock()
5663

5764
deploy_command = DeployCommand(deployer)
5865

5966
# act
6067
result = deploy_command.execute_deploy_from_image(si=si,
61-
logger=Mock(),
68+
logger=logger,
6269
session=session,
6370
vcenter_data_model=vcenter_data_model,
6471
deployment_params=deployment_params,
65-
resource_context=connectivity)
72+
resource_context=connectivity,
73+
reservation_id=reservation_id)
6674

6775
# assert
6876
self.assertTrue(result)
69-
self.assertTrue(deployer.deploy_from_image.called_with(si, deployment_params, connectivity))
77+
deployer.deploy_from_image.assert_called_once_with(si=si,
78+
logger=logger,
79+
session=session,
80+
vcenter_data_model=vcenter_data_model,
81+
data_holder=deployment_params,
82+
resource_context=connectivity,
83+
reservation_id=reservation_id)
7084

7185
def test_deploy_clone_execute(self):
7286
# arrange
@@ -83,6 +97,10 @@ def test_deploy_clone_execute(self):
8397
template_model.vm_folder = 'temp folder'
8498
deployer.deploy_from_template = Mock(return_value=deploy_res)
8599

100+
reservation_id = Mock()
101+
logger = Mock()
102+
vcenter_data_model = Mock()
103+
86104
template_resource_model = vCenterVMFromTemplateResourceModel()
87105

88106
deploy_params = DeployFromTemplateDetails(template_resource_model, 'VM Deployment')
@@ -93,14 +111,16 @@ def test_deploy_clone_execute(self):
93111

94112
# act
95113
result = deploy_command.execute_deploy_clone_from_vm(
96-
si=si,
97-
logger=Mock(),
98-
vcenter_data_model=Mock(),
99-
deployment_params=deploy_params)
114+
si=si,
115+
logger=logger,
116+
vcenter_data_model=vcenter_data_model,
117+
deployment_params=deploy_params,
118+
reservation_id=reservation_id)
100119

101120
# assert
102121
self.assertTrue(result)
103-
self.assertTrue(deployer.deploy_from_template.called_with(si, deploy_params, resource_context))
122+
deployer.deploy_clone_from_vm.assert_called_once_with(si, logger, deploy_params, vcenter_data_model,
123+
reservation_id)
104124

105125
def test_deploy_snapshot_execute(self):
106126
# arrange
@@ -124,14 +144,19 @@ def test_deploy_snapshot_execute(self):
124144
deploy_command = DeployCommand(deployer)
125145

126146
resource_context = Mock()
147+
logger = Mock()
148+
vcenter_data_model = Mock()
149+
reservation_id = Mock()
127150

128151
# act
129152
result = deploy_command.execute_deploy_from_linked_clone(
130-
si=si,
131-
logger=Mock(),
132-
deployment_params=deploy_params,
133-
vcenter_data_model=Mock())
153+
si=si,
154+
logger=logger,
155+
deployment_params=deploy_params,
156+
vcenter_data_model=vcenter_data_model,
157+
reservation_id=reservation_id)
134158

135159
# assert
136160
self.assertTrue(result)
137-
self.assertTrue(deployer.deploy_from_template.called_with(si, deploy_params, resource_context))
161+
deployer.deploy_from_linked_clone.assert_called_once_with(si, logger, deploy_params, vcenter_data_model,
162+
reservation_id)

package/cloudshell/tests/test_common/test_utilities/test_common_name_utils.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,18 @@ def test_unique_name_generation(self):
99
unique1 = generate_unique_name(name_prefix)
1010
unique2 = generate_unique_name(name_prefix)
1111
self.assertNotEqual(unique1, unique2)
12+
13+
def test_unique_name_generation_with_reservation_id(self):
14+
# arrange
15+
name_prefix = "some template name"
16+
reservation_id = "bcba3fe8-f56a-4f90-91c7-4262526f8ba5"
17+
18+
# act
19+
unique1 = generate_unique_name(name_prefix, reservation_id)
20+
unique2 = generate_unique_name(name_prefix, reservation_id)
21+
22+
# assert
23+
self.assertNotEqual(unique1, unique2)
24+
self.assertTrue(str(unique1).endswith("-8ba5"))
25+
self.assertTrue(str(unique2).endswith("-8ba5"))
26+

0 commit comments

Comments
 (0)