Skip to content

Commit 7b8035a

Browse files
authored
Merge pull request #14 from cloudify-cosmo/RD-1478
try to minimize some lookups
2 parents 6efe1ef + 677e26d commit 7b8035a

File tree

9 files changed

+242
-22
lines changed

9 files changed

+242
-22
lines changed

.circleci/devscript.py

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
import os
2+
import urllib3
3+
from time import sleep
4+
from datetime import datetime
5+
6+
from vcd_plugin_sdk.resources.disk import VCloudDisk, VCloudMedia, VCloudISO
7+
from vcd_plugin_sdk.resources.vapp import VCloudvApp, VCloudVM
8+
from vcd_plugin_sdk.resources.network import VCloudNetwork, VCloudGateway
9+
# from vcd_plugin_sdk.resources.storage_profile import VCloudStorageProfile
10+
# urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
11+
12+
13+
NOW = datetime.now().strftime("%Y%m%d%H%M")
14+
NETWORK_NAME = 'test-routed-network-{}'.format(NOW)
15+
GATEWAY_NAME = os.environ['VCLOUD_GATEWAY']
16+
VCD_NAME = os.environ['VCLOUD_ORG']
17+
18+
19+
def get_gateway():
20+
# static_route = dict(network='192.169.3.0/24', next_hop='192.168.1.1')
21+
# static_route_create_result = gateway.add_static_route(**static_route)
22+
# gateway.delete_static_route(**static_route)
23+
#
24+
#
25+
# # Test Firewall Rule
26+
# test_rule_name = 'test-rule-{}'.format(rnow.strftime("%Y%m%d%H%M"))
27+
# firewall_rule_info = gateway.create_firewall_rule(test_rule_name,
28+
# source_values=['VLAN-102' + ':gatewayinterface',
29+
# routed_network.network.name + ':network', '192.169.1.0:ip'],
30+
# destination_values=['VLAN-102' + ':gatewayinterface',
31+
# routed_network.network.name + ':network', '192.169.1.0:ip'], services=[
32+
# {'tcp': {'any': 'any'}}])
33+
# gateway.delete_firewall_rule(firewall_rule_info['Name'],
34+
# firewall_rule_info['Id'])
35+
#
36+
# # Test NAT rule
37+
# nat_rule = dict(action='dnat', original_address='10.10.4.2',
38+
# translated_address='11.11.4.2', description='nat rule test value')
39+
# new_nat_rule = gateway.create_nat_rule(nat_rule)
40+
# gateway.delete_nat_rule(new_nat_rule['ID'])
41+
#
42+
# # Test DHCP Pool
43+
# new_dhcp_rule = gateway.add_dhcp_pool(dict(
44+
# ip_range='192.169.2.2-192.169.2.100'))
45+
# gateway.delete_dhcp_pool(dict(ip_range='192.169.2.2-192.169.2.100'))
46+
return VCloudGateway(NETWORK_NAME, vdc_name=VCD_NAME)
47+
48+
49+
def get_routed_network():
50+
create_routed = {
51+
'network_cidr': '192.169.169.1/24',
52+
'gateway_name': GATEWAY_NAME,
53+
'description': 'test routed network',
54+
'primary_dns_ip': '8.8.8.4',
55+
'secondary_dns_ip': '8.8.8.8',
56+
'ip_range_start': '192.169.169.2',
57+
'ip_range_end': '192.169.169.254'
58+
}
59+
network = VCloudNetwork(
60+
NETWORK_NAME,
61+
'routed_vdc_network',
62+
vdc_name=VCD_NAME,
63+
vapp_name='test',
64+
kwargs=create_routed
65+
)
66+
network.create()
67+
return network
68+
69+
70+
def get_isolated_network():
71+
create_isolated = {
72+
'network_cidr': '192.169.3.1/24',
73+
'description': 'test isolated network',
74+
'primary_dns_ip': '8.8.8.4',
75+
'secondary_dns_ip': '8.8.8.8',
76+
'default_lease_time': 300,
77+
'max_lease_time': 900,
78+
}
79+
isolated_network = VCloudNetwork(
80+
'test-iso-network-{}'.format(NOW),
81+
'isolated_vdc_network',
82+
vdc_name=VCD_NAME,
83+
vapp_name='test',
84+
kwargs=create_isolated
85+
)
86+
isolated_network.create()
87+
return isolated_network
88+
89+
90+
def get_vapp(network_name):
91+
92+
create_vapp = {
93+
'description': 'test description',
94+
'network': network_name,
95+
'fence_mode': 'natRouted',
96+
'accept_all_eulas': True
97+
}
98+
vapp_name = 'test-vapp-{}'.format(NOW)
99+
vapp = VCloudvApp(
100+
vapp_name,
101+
vdc_name=VCD_NAME,
102+
kwargs=create_vapp
103+
)
104+
catalog_name = 'testcatalogue'
105+
template = vapp.get_template('testcatalogue', 'Centos7-GenericCloud')
106+
107+
instantiate_vapp = {
108+
'name': 'test-vm-{}'.format(NOW),
109+
'catalog': catalog_name,
110+
'template': template.get('name'),
111+
'description': 'test description',
112+
'network': routed_network.name,
113+
'fence_mode': 'bridged',
114+
'ip_allocation_mode': 'manual',
115+
'deploy': False,
116+
'power_on': False,
117+
'accept_all_eulas': True,
118+
'password': 'test_password',
119+
'vm_name': 'test-vm-{}'.format(NOW),
120+
'hostname': 'test-vm-{}'.format(NOW),
121+
'ip_address': '192.169.169.2',
122+
}
123+
vm = VCloudVM(
124+
'test-vm-{}'.format(NOW),
125+
vdc_name=VCD_NAME,
126+
vapp_name=vapp_name,
127+
kwargs={},
128+
vapp_kwargs=instantiate_vapp)
129+
vm.instantiate_vapp()
130+
sleep(60)
131+
vapp.deploy()
132+
# To add network: add_network_result = vapp.add_network(
133+
# orgvdc_network_name=routed_network2.name)
134+
# To remove network: delete_network_result = vapp.remove_network(
135+
# routed_network2.name)
136+
return vapp
137+
138+
139+
def get_disk():
140+
create_disk = {
141+
'size': 2097152,
142+
'description': 'test disk'
143+
}
144+
disk_now = datetime.now()
145+
disk_name = 'test-disk-{}'.format(disk_now.strftime("%Y%m%d%H%M"))
146+
disk = VCloudDisk(
147+
disk_name,
148+
vdc_name='vCloud97',
149+
kwargs=create_disk
150+
)
151+
disk.create()
152+
# To attach: attach_disk_result = vm.attach_disk_to_vm(disk.href)
153+
# To detach: vm.detach_disk_from_vm(disk.href)
154+
return disk
155+
156+
157+
def get_media(catalog_name):
158+
# To get catalog_name, check get_vapp.
159+
create_iso = {
160+
'vol_ident': 'cidata',
161+
'sys_ident': '',
162+
'files': {
163+
'ISO/FOLDER/content.json': "test content"
164+
}
165+
}
166+
iso = VCloudISO(create_iso)
167+
media_create = {
168+
'catalog_name': catalog_name,
169+
'file_name': iso.file,
170+
}
171+
media = VCloudMedia(
172+
os.path.basename(iso.file),
173+
vdc_name='vCloud97',
174+
kwargs=media_create,
175+
)
176+
media.upload()
177+
# To delete execute media.delete() iso.delete()
178+
# To attach: attach_media_result = vm.attach_media(media.href)
179+
# To detaych: vm.eject_media(media.name)
180+
return media
181+
182+
183+
if __name__ == '__main__':
184+
print('**step 1**')
185+
gateway = get_gateway()
186+
print('**step 2**')
187+
routed_network = get_routed_network()
188+
print('**step 3**')
189+
isolated_network = get_isolated_network()
190+
print('**step 4**')
191+
vapp = get_vapp(routed_network.name)
192+
193+
sleep(60)
194+
195+
print('**step 5**')
196+
vapp.undeploy()
197+
sleep(20)
198+
print('**step 6**')
199+
vapp.delete()
200+
print('**step 7**')
201+
isolated_network.delete()
202+
print('**step 8**')
203+
routed_network.delete()

.circleci/merge_docs.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
from ecosystem_cicd_tools.github_stuff import merge_documentation_pulls
22

33
if __name__ == '__main__':
4+
<<<<<<< HEAD
45
merge_documentation_pulls(branch='main')
6+
=======
7+
merge_documentation_pulls()
8+
>>>>>>> af5df53 (try to minimize some lookups)

.circleci/py3fixers

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
-f libfuturize.fixes.fix_execfile
1212
-f libpasteurize.fixes.fix_newstyle
1313
-f lib2to3.fixes.fix_filter
14-
# fix_dict is not idempotent
15-
# -f lib2to3.fixes.fix_dict
1614
-f lib2to3.fixes.fix_map
1715
-f lib2to3.fixes.fix_zip
1816
-f lib2to3.fixes.fix_xrange
@@ -22,4 +20,4 @@
2220
-f lib2to3.fixes.fix_metaclass
2321
-f libfuturize.fixes.fix_unicode_keep_u
2422
-f libfuturize.fixes.fix_print_with_import
25-
-f libfuturize.fixes.fix_execfile
23+
-f libfuturize.fixes.fix_execfile

CHANGELOG.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
2.0.0:
2-
- New version.
2+
- New version.
3+
2.0.1:
4+
- Attempt to decrease amount of superfluous API requests, however these calls are almost all inside of the client library.

plugin.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins:
33
vcd:
44
executor: central_deployment_agent
55
package_name: cloudify-vcloud-plugin
6-
package_version: '2.0.0'
6+
package_version: '2.0.1'
77

88
data_types:
99

vcd_plugin_sdk/resources/base.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,10 @@ def connection(self):
5252

5353
@property
5454
def vdc(self):
55-
if self._vdc:
56-
self._vdc.reload()
55+
# TODO: Create a method for reloading when necessary. For example,
56+
# TODO: as part of a try/except block.
57+
# if self._vdc:
58+
# self._vdc.reload()
5759
return self._vdc
5860

5961
def task_successful(self, task):
@@ -78,10 +80,10 @@ def vapp(self):
7880
'vcd_plugin_sdk.resources.base.VCloudResource.vapp, '
7981
'but no vapp_name was provided.')
8082
if not self._vapp:
81-
self._vapp = self.get_vapp(self._vapp_name)
83+
self._vapp = self.get_vapp()
8284
return self._vapp
8385

84-
def get_vapp(self, vapp_name):
86+
def get_vapp(self, vapp_name=None):
8587
vapp_name = vapp_name or self._vapp_name
8688
try:
8789
vapp_resource = self.vdc.get_vapp(vapp_name)

vcd_plugin_sdk/resources/network.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
from time import sleep
16+
1517
from pyvcloud.vcd.gateway import Gateway
1618
from pyvcloud.vcd.nat_rule import NatRule
1719
from pyvcloud.vcd.dhcp_pool import DhcpPool
@@ -63,13 +65,15 @@ def name(self):
6365
def network(self):
6466
if not self._network:
6567
for i in range(0, 10):
68+
# This is necessary because of Vcloud API is async.
6669
try:
6770
self._network = self.get_network()
6871
except (ValueError, EntityNotFoundException) as e:
6972
if i == 9:
7073
raise VCloudSDKException(
7174
'Network {name} has not been initialized. '
7275
'Error: {e}'.format(name=self.name, e=str(e)))
76+
sleep(5)
7377
return self._network
7478

7579
@property
@@ -199,6 +203,7 @@ def __init__(self,
199203
self._gateway_name = gateway_name
200204
self.kwargs = kwargs
201205
self._gateway = None
206+
self._gateway_static_routes = None
202207

203208
super().__init__(connection, vdc_name, tasks=tasks)
204209

@@ -208,9 +213,7 @@ def name(self):
208213

209214
@property
210215
def gateway(self):
211-
if self._gateway:
212-
self._gateway.reload()
213-
else:
216+
if not self._gateway:
214217
self._gateway = self.get_gateway()
215218
return self._gateway
216219

@@ -229,15 +232,13 @@ def firewall_objects(self):
229232

230233
@property
231234
def default_gateway(self):
232-
static_route = self.gateway.get_static_routes()
233-
return static_route.defaultRoute.gatewayAddress.text
235+
return self.gateway_static_routes.defaultRoute.gatewayAddress.text
234236

235237
@property
236238
def static_routes(self):
237239
static_routes = {}
238-
static_route = self.gateway.get_static_routes()
239-
if hasattr(static_route.staticRoutes, 'route'):
240-
for route in static_route.staticRoutes.route:
240+
if hasattr(self.gateway_static_routes.staticRoutes, 'route'):
241+
for route in self.gateway_static_routes.staticRoutes.route:
241242
static_routes[route.network] = {
242243
# 'mtu': route.mtu,
243244
'description': route.description,
@@ -265,12 +266,21 @@ def exposed_data(self):
265266
'gateway_address': self.default_gateway,
266267
# 'dhcp_pools': self.dhcp_pools,
267268
# 'nat_rules': self.nat_rules,
268-
# 'static_routes': self.static_routes,
269+
'static_routes': self.static_routes,
269270
# 'firewall_rules': self.firewall_rules,
270271
# 'firewall_objects': self.firewall_objects
271272
}
272273
return data
273274

275+
@property
276+
def gateway_static_routes(self):
277+
if not self._gateway_static_routes:
278+
self.update_gateway_static_routes()
279+
return self._gateway_static_routes
280+
281+
def update_gateway_static_routes(self):
282+
self._gateway_static_routes = self.gateway.get_static_routes()
283+
274284
def get_gateway(self, gateway_name=None):
275285
gateway_name = gateway_name or self.name
276286
gateway_resource = self.vdc.get_gateway(gateway_name)
@@ -408,6 +418,7 @@ def get_static_routes(self):
408418
return static_routes
409419

410420
def get_static_route_from_network(self, network):
421+
self.update_gateway_static_routes()
411422
for route in self.get_static_routes():
412423
if route.resource_id == network:
413424
return route

vcd_plugin_sdk/resources/tests/test_resources.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ def test_vcloud_gateway_dhcp_pool(*_, **__):
318318
mock.MagicMock)
319319

320320
vcloud_gateway.get_dhcp_pool_from_ip_range(pool_definition['ip_range'])
321-
assert vcloud_gateway.client.get_resource.call_count == 4
321+
assert vcloud_gateway.client.get_resource.call_count == 2
322322

323323

324324
@mock.patch('vcd_plugin_sdk.connection.Org', autospec=True)
@@ -396,9 +396,9 @@ def test_vcloud_vapp(*_, **__):
396396
with mock.patch('lxml.etree.cleanup_namespaces'):
397397
vcloud_vapp.set_lease(1, 1)
398398
assert vcloud_vapp.client.put_resource.call_count == 1
399-
assert vcloud_vapp.client.get_resource.call_count == 9
399+
assert vcloud_vapp.client.get_resource.call_count == 6
400400
vcloud_vapp.get_lease()
401-
assert vcloud_vapp.client.get_resource.call_count == 10
401+
assert vcloud_vapp.client.get_resource.call_count == 7
402402
vcloud_vapp.remove_network('bar')
403403
assert vcloud_vapp.vapp.disconnect_org_vdc_network.call_count == 1
404404

vcd_plugin_sdk/resources/vapp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def get_catalog_items(self):
9292
c.CatalogItems.CatalogItem.items()
9393
return items
9494

95-
def get_vapp(self, vapp_name):
95+
def get_vapp(self, vapp_name=None):
9696
vapp_resource = self.vdc.get_vapp(vapp_name)
9797
return VApp(self.client, resource=vapp_resource)
9898

0 commit comments

Comments
 (0)