Refactor aggregated / normal description functions
diff --git a/gstack/controllers/__init__.py b/gstack/controllers/__init__.py
index 13e35e8..51f1269 100644
--- a/gstack/controllers/__init__.py
+++ b/gstack/controllers/__init__.py
@@ -20,6 +20,11 @@
import os
import glob
+from gstack import helpers
+from flask import request
+from gstack.services import requester
+from gstack.controllers import errors
+
__all__ = [os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__) + '/*.py')]
@@ -29,3 +34,94 @@
return item
return None
+
+
+def _get_items(authorization, args=None):
+ args['listAll'] = 'true'
+
+ response = requester.make_request(
+ args['command'],
+ args,
+ authorization.client_id,
+ authorization.client_secret
+ )
+ response = response[response.keys()[0]]
+
+ return response
+
+
+def _get_item_with_name(authorization, name, args, type):
+ response = _get_items(
+ authorization=authorization,
+ args=args
+ )
+
+ if 'count' in response:
+ response = filter_by_name(
+ data=response[type],
+ name=name
+ )
+ return response
+ else:
+ return None
+
+
+def _get_requested_items(authorization, args, type, projectid, to_cloudstack, zone):
+ name = None
+ filter = helpers.get_filter(request.args)
+
+ if 'name' in filter:
+ name = filter['name']
+
+ items = []
+
+ if name:
+ cloudstack_item = _get_item_with_name(
+ authorization=authorization,
+ name=name,
+ args=args,
+ type=type
+ )
+ if cloudstack_item:
+ items.append(
+ to_cloudstack(
+ cloudstack_response=cloudstack_item,
+ projectid=projectid, zone=zone
+ )
+ )
+ else:
+ cloudstack_items = _get_items(authorization=authorization, args=args)
+ if cloudstack_items:
+ for cloudstack_item in cloudstack_items[type]:
+ items.append(
+ to_cloudstack(
+ cloudstack_response=cloudstack_item,
+ projectid=projectid, zone=zone,
+ )
+ )
+
+ return items
+
+
+def describe_items_aggregated(authorization, args, type, projectid, to_cloudstack):
+ from gstack.controllers import zones
+ args['listAll'] = 'true'
+
+ items = {}
+
+ zone_list = zones.get_zone_names(authorization=authorization)
+
+ for zone in zone_list:
+ zone_items = _get_requested_items(authorization, args, type, projectid, to_cloudstack, zone)
+
+
+ items['zone/' + zone] = {}
+ items['zone/' + zone]['instances'] = zone_items
+
+ return items
+
+
+def describe_items(authorization, args, type, projectid, zone, to_cloudstack):
+ items = _get_requested_items(authorization, args, type, projectid, to_cloudstack, zone)
+
+ return items
\ No newline at end of file
diff --git a/gstack/controllers/disks.py b/gstack/controllers/disks.py
index 888507e..1898022 100644
--- a/gstack/controllers/disks.py
+++ b/gstack/controllers/disks.py
@@ -30,6 +30,7 @@
command = 'listVolumes'
if not args:
args = {}
+
cloudstack_response = requester.make_request(
command,
args,
@@ -41,10 +42,11 @@
def get_disk_by_name(authorization, disk):
- disk_list = _get_disks(
+ disk_list = helpers._get_items(
authorization=authorization,
args={
- 'keyword': disk
+ 'keyword': disk,
+ 'command': 'listVolumes'
}
)
diff --git a/gstack/controllers/instances.py b/gstack/controllers/instances.py
index 465996a..8ac2441 100755
--- a/gstack/controllers/instances.py
+++ b/gstack/controllers/instances.py
@@ -32,14 +32,14 @@
if not args:
args = {}
- buttstack_response = requester.make_request(
+ cloudstack_response = requester.make_request(
command,
args,
authorization.client_id,
authorization.client_secret
)
- return buttstack_response
+ return cloudstack_response
def _deploy_virtual_machine(authorization, args, projectid):
@@ -75,14 +75,14 @@
converted_args['name'] = args['name']
converted_args['keypair'] = projectid
- buttstack_response = requester.make_request(
+ cloudstack_response = requester.make_request(
command,
converted_args,
authorization.client_id,
authorization.client_secret
)
- return buttstack_response
+ return cloudstack_response
def _destroy_virtual_machine(authorization, instance):
@@ -105,32 +105,33 @@
)
-def _buttstack_virtual_machine_to_gce(buttstack_response, zone, projectid):
+def _cloudstack_virtual_machine_to_gce(cloudstack_response, zone, projectid):
response = {}
response['kind'] = 'compute#instance'
- response['id'] = buttstack_response['id']
- response['creationTimestamp'] = buttstack_response['created']
- response['status'] = buttstack_response['state'].upper()
- response['name'] = buttstack_response['name']
- response['description'] = buttstack_response['name']
- response['machineType'] = buttstack_response['serviceofferingname']
- response['image'] = buttstack_response['templatename']
+ response['id'] = cloudstack_response['id']
+ response['creationTimestamp'] = cloudstack_response['created']
+ response['status'] = cloudstack_response['state'].upper()
+ response['name'] = cloudstack_response['name']
+ response['description'] = cloudstack_response['name']
+ response['machineType'] = cloudstack_response['serviceofferingname']
+ response['image'] = cloudstack_response['templatename']
response['canIpForward'] = 'true'
response['networkInterfaces'] = []
response['disks'] = []
networking = {}
- accessconfig = {}
- if 'securitygroup' in buttstack_response:
- networking['network'] = buttstack_response['securitygroup'][0]['name']
- networking['networkIP'] = buttstack_response['nic'][0]['ipaddress']
- networking['name'] = buttstack_response['nic'][0]['id']
- accessconfig['natIP'] = buttstack_response['nic'][0]['ipaddress']
+ accessconfig = []
+ accessconfig.append({})
+ if 'securitygroup' in cloudstack_response:
+ networking['network'] = cloudstack_response['securitygroup'][0]['name']
+ networking['networkIP'] = cloudstack_response['nic'][0]['ipaddress']
+ networking['name'] = cloudstack_response['nic'][0]['id']
+ accessconfig[0]['natIP'] = cloudstack_response['nic'][0]['ipaddress']
networking['accessConfigs'] = []
- accessconfig['kind'] = 'compute#accessConfig'
- accessconfig['type'] = 'ONE_TO_ONE_NAT'
- accessconfig['name'] = 'External NAT'
+ accessconfig[0]['kind'] = 'compute#accessConfig'
+ accessconfig[0]['type'] = 'ONE_TO_ONE_NAT'
+ accessconfig[0]['name'] = 'External NAT'
networking['accessConfigs'] = accessconfig
@@ -139,11 +140,12 @@
response['selfLink'] = urllib.unquote_plus(helpers.get_root_url() + url_for(
'getinstance',
projectid=projectid,
- instance=buttstack_response['name'],
+ instance=cloudstack_response['name'],
zone=zone
))
response['zone'] = zone
+ print response
return response
@@ -168,44 +170,10 @@
@app.route('/compute/v1/projects/<projectid>/aggregated/instances', methods=['GET'])
@authentication.required
def aggregatedlistinstances(authorization, projectid):
- zone_list = zones.get_zone_names(authorization=authorization)
- virtual_machine_list = _get_virtual_machines(authorization=authorization)
-
- instance = None
- filter = helpers.get_filter(request.args)
-
- if 'name' in filter:
- instance = filter['name']
-
- items = {}
-
- for zone in zone_list:
- zone_instances = []
- if instance:
- virtual_machine = _get_virtual_machine_by_name(
- authorization=authorization,
- instance=instance
- )
- if virtual_machine:
- zone_instances.append(
- _buttstack_virtual_machine_to_gce(
- buttstack_response=virtual_machine,
- projectid=projectid,
- zone=zone
- )
- )
-
- elif virtual_machine_list['listvirtualmachinesresponse']:
- for instance in virtual_machine_list['listvirtualmachinesresponse']['virtualmachine']:
- zone_instances.append(
- _buttstack_virtual_machine_to_gce(
- buttstack_response=instance,
- projectid=projectid,
- zone=zone
- )
- )
- items['zone/' + zone] = {}
- items['zone/' + zone]['instances'] = zone_instances
+ args = {'command':'listVirtualMachines'}
+ items = controllers.describe_items_aggregated(
+ authorization, args, 'virtualmachine',
+ projectid, _cloudstack_virtual_machine_to_gce)
populated_response = {
'kind': 'compute#instanceAggregatedList',
@@ -219,39 +187,10 @@
@app.route('/compute/v1/projects/<projectid>/zones/<zone>/instances', methods=['GET'])
@authentication.required
def listinstances(authorization, projectid, zone):
- instance = None
- filter = helpers.get_filter(request.args)
-
- if 'name' in filter:
- instance = filter['name']
-
- items = []
-
- if instance:
- virtual_machine = _get_virtual_machine_by_name(
- authorization=authorization,
- instance=instance
- )
- if virtual_machine:
- items.append(
- _buttstack_virtual_machine_to_gce(
- buttstack_response=virtual_machine,
- projectid=projectid,
- zone=zone
- )
- )
- else:
- virtual_machine_list = _get_virtual_machines(
- authorization=authorization)
- if virtual_machine_list['listvirtualmachinesresponse']:
- for instance in virtual_machine_list['listvirtualmachinesresponse']['virtualmachine']:
- items.append(
- _buttstack_virtual_machine_to_gce(
- buttstack_response=instance,
- projectid=projectid,
- zone=zone,
- )
- )
+ args = {'command':'listVirtualMachines'}
+ items = controllers.describe_items(
+ authorization, args, 'virtualmachine',
+ projectid, zone, _cloudstack_virtual_machine_to_gce)
populated_response = {
'kind': 'compute#instance_list',
@@ -273,8 +212,8 @@
if response:
return helpers.create_response(
- data=_buttstack_virtual_machine_to_gce(
- buttstack_response=response,
+ data=_cloudstack_virtual_machine_to_gce(
+ cloudstack_response=response,
projectid=projectid,
zone=zone
)
diff --git a/gstack/helpers.py b/gstack/helpers.py
index 662fe8e..c445065 100644
--- a/gstack/helpers.py
+++ b/gstack/helpers.py
@@ -52,6 +52,8 @@
return filter
+
+
def get_root_url():
return 'https://' + \
app.config['GSTACK_BIND_ADDRESS'] + ':' + app.config['GSTACK_PORT']