summaryrefslogtreecommitdiffstats
path: root/newton/newton/registration
diff options
context:
space:
mode:
authorBin Yang <bin.yang@windriver.com>2017-09-07 09:54:06 +0800
committerBin Yang <bin.yang@windriver.com>2017-09-07 09:54:06 +0800
commite89da401974dabc88c110cbb4b6da9f9dd14f9a3 (patch)
tree477045fa546074c303e985d14cb17a2044e3bedd /newton/newton/registration
parent0a0adefe44123f161d79dd0341df6db3b7cdd404 (diff)
Populate cloud resources into AAI
populate tenants,flavors,images info into AAI Change-Id: Ifa9701916168fd61814659622233b1129412b189 Issue-Id: MULTICLOUD-58 Signed-off-by: Bin Yang <bin.yang@windriver.com>
Diffstat (limited to 'newton/newton/registration')
-rw-r--r--newton/newton/registration/views/registration.py208
1 files changed, 206 insertions, 2 deletions
diff --git a/newton/newton/registration/views/registration.py b/newton/newton/registration/views/registration.py
index 5dd32161..0e6c4921 100644
--- a/newton/newton/registration/views/registration.py
+++ b/newton/newton/registration/views/registration.py
@@ -24,8 +24,11 @@ from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
+from newton.pub.config import config
from newton.pub.exceptions import VimDriverNewtonException
from newton.requests.views.util import VimDriverUtils
+from newton.pub.utils.restcall import req_to_aai
+from newton.pub.msapi import extsys
logger = logging.getLogger(__name__)
@@ -36,6 +39,29 @@ class Registry(APIView):
def __init__(self):
self._logger = logger
+
+ def update_tenant(self, cloud_owner, cloud_region_id, tenantinfo):
+ '''
+ populate tenant into AAI
+ :param cloud_owner:
+ :param cloud_region_id:
+ :param tenantinfo:
+ tenant-id: string
+ tenant-name: string
+ :return:
+ '''
+
+
+ if cloud_owner and cloud_region_id:
+ retcode, content, status_code = \
+ req_to_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s/tenants/tenant/%s"
+ % (cloud_owner, cloud_region_id, tenantinfo['tenant-id']), "PUT", content=tenantinfo)
+
+ self._logger.debug("update_tenant,vimid:%s_%s req_to_aai: %s, return %s, %s, %s" \
+ % (cloud_owner,cloud_region_id, tenantinfo['tenant-id'], retcode, content, status_code))
+ return retcode
+ return 1
+
def discover_tenants(self, request, vimid="", session=None, viminfo=None):
req_resource = "/projects"
service = {'service_type': "identity",
@@ -46,14 +72,54 @@ class Registry(APIView):
content = resp.json()
self._logger.debug("vimid: %s, req: %s,resp code: %s, body: %s" \
% (vimid, req_resource, resp.status_code,content))
+
+ if resp.status_code != status.HTTP_200_OK:
+ return False #failed to discover resources
+
# iterate all projects and populate them into AAI
- # TBD
+ cloud_owner, cloud_region_id = extsys.decode_vim_id(vimid)
+ tenant_info = {}
+ for tenant in content['projects']:
+ tenant_info['tenant-id'] = tenant['id']
+ tenant_info['tenant-name'] = tenant['name']
+ self.update_tenant(cloud_owner, cloud_region_id, tenant_info)
pass
+
+ def update_flavor(self, cloud_owner, cloud_region_id, flavorinfo):
+ '''
+ populate flavor into AAI
+ :param cloud_owner:
+ :param cloud_region_id:
+ :param flavorinfo:
+ flavor-id: string
+ flavor-name: string
+ flavor-vcpus: integer
+ flavor-ram: integer
+ flavor-disk: integer
+ flavor-ephemeral: integer
+ flavor-swap: string
+ flavor-is-public: boolean
+ flavor-selflink: string
+ flavor-disabled: boolean
+
+ :return:
+ '''
+
+ if cloud_owner and cloud_region_id:
+ retcode, content, status_code = \
+ req_to_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s/flavors/flavor/%s"
+ % (cloud_owner, cloud_region_id, flavorinfo['flavor-id']), "PUT", content=flavorinfo)
+
+ self._logger.debug("update_flavor,vimid:%s_%s req_to_aai: %s, return %s, %s, %s" \
+ % (cloud_owner,cloud_region_id, flavorinfo['flavor-id'], retcode, content, status_code))
+ return retcode
+ return 1
+
def discover_flavors(self, request, vimid="", session=None, viminfo=None):
- req_resource = "/flavors"
+ req_resource = "/flavors/detail"
service = {'service_type': "compute",
'interface': 'public',
'region_id': viminfo['cloud_region_id']}
@@ -62,8 +128,81 @@ class Registry(APIView):
self._logger.debug("vimid: %s, req: %s,resp code: %s, body: %s" \
% (vimid, req_resource, resp.status_code,content))
+
+ if resp.status_code != status.HTTP_200_OK:
+ return False #failed to discover resources
+
+ cloud_owner, cloud_region_id = extsys.decode_vim_id(vimid)
+ flavor_info = {}
+ for flavor in content['flavors']:
+ flavor_info['flavor-id'] = flavor['id']
+ flavor_info['flavor-name'] = flavor['name']
+ flavor_info['flavor-vcpus'] = flavor['vcpus']
+ flavor_info['flavor-ram'] = flavor['ram']
+ flavor_info['flavor-disk'] = flavor['disk']
+ flavor_info['flavor-ephemeral'] = flavor['OS-FLV-EXT-DATA:ephemeral']
+ flavor_info['flavor-swap'] = flavor['swap']
+ flavor_info['flavor-is-public'] = flavor['os-flavor-access:is_public']
+ flavor_info['flavor-selflink'] = flavor['links'][0]['href']
+ flavor_info['flavor-swap'] = flavor['swap']
+ flavor_info['flavor-disabled'] = flavor['OS-FLV-DISABLED:disabled']
+ self.update_flavor(cloud_owner, cloud_region_id, flavor_info)
+
pass
+ def update_image_metadata(self, cloud_owner, cloud_region_id, image_id, metadatainfo):
+ '''
+ populate image meta data
+ :param cloud_owner:
+ :param cloud_region_id:
+ :param image_id:
+ :param metadatainfo:
+ metaname: string
+ metaval: string
+ :return:
+ '''
+
+ if cloud_owner and cloud_region_id:
+ retcode, content, status_code = \
+ req_to_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s/images/image/%s"
+ % (cloud_owner, cloud_region_id, image_id, metadatainfo['metaname']), "PUT", content=imageinfo)
+
+ self._logger.debug("update_image,vimid:%s_%s req_to_aai: %s/%s, return %s, %s, %s" \
+ % (cloud_owner,cloud_region_id,image_id,metadatainfo['metaname'], retcode, content, status_code))
+ return retcode
+ return 1
+
+ def update_image(self, cloud_owner, cloud_region_id, imageinfo):
+ '''
+ populate image into AAI
+ :param cloud_owner:
+ :param cloud_region_id:
+ :param imageinfo:
+ image-id: string
+ image-name: string
+ image-architecture: string
+ image-os-distro: string
+ image-os-version: string
+ application: string
+ application-vendor: string
+ application-version: string
+ image-selflink: string
+
+ :return:
+ '''
+
+
+ if cloud_owner and cloud_region_id:
+ retcode, content, status_code = \
+ req_to_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s/images/image/%s"
+ % (cloud_owner, cloud_region_id, imageinfo['image-id']), "PUT", content=imageinfo)
+
+ self._logger.debug("update_image,vimid:%s_%s req_to_aai: %s, return %s, %s, %s" \
+ % (cloud_owner,cloud_region_id, imageinfo['image-id'], retcode, content, status_code))
+
+ return retcode
+ return 1 #unknown cloud owner,region_id
+
def discover_images(self, request, vimid="", session=None, viminfo=None):
req_resource = "/v2/images"
@@ -75,6 +214,51 @@ class Registry(APIView):
self._logger.debug("vimid: %s, req: %s,resp code: %s, body: %s" \
% (vimid, req_resource, resp.status_code,content))
+
+ if resp.status_code != status.HTTP_200_OK:
+ return False #failed to discover resources
+
+ cloud_owner, cloud_region_id = extsys.decode_vim_id(vimid)
+ image_info = {}
+ metadata_info = {}
+ for image in content['images']:
+ image_info['image-id'] = image['id']
+ image_info['image-name'] = image['name']
+ image_info['image-selflink'] = image['self']
+
+ image_info['image-os-distro'] = image['os_distro'] or ''
+ image_info['image-os-version'] = image['os_version'] or ''
+ image_info['application'] = image['application'] or ''
+ image_info['application-vendor'] = image['application_vendor'] or ''
+ image_info['application-version'] = image['application_version'] or ''
+ image_info['image-architecture'] = image['architecture'] or ''
+
+ ret = self.update_image(cloud_owner, cloud_region_id, image_info)
+ if ret != 0:
+ #failed to update image
+ self._logger.debug("failed to populate image info into AAI: %s, image id: %s, ret:%s" \
+ % (vimid, image_info['image-id'], ret))
+ continue
+
+ schema = image['schema']
+ if schema:
+ req_resource = schema
+ service = {'service_type': "image",
+ 'interface': 'public',
+ 'region_id': viminfo['cloud_region_id']}
+ resp = session.get(req_resource, endpoint_filter=service)
+ content = resp.json()
+
+ self._logger.debug("vimid: %s, req: %s,resp code: %s, body: %s" \
+ % (vimid, req_resource, resp.status_code, content))
+ if resp.status_code == status.HTTP_200_OK:
+ #parse the schema?
+ #self.update_image(cloud_owner, cloud_region_id, image_info)
+ pass
+
+
+
+
pass
def discover_availablezones(self, request, vimid="", session=None, viminfo=None):
@@ -146,11 +330,31 @@ class Registry(APIView):
pass
+ def update_proxy_identity_endpoint(self, cloud_owner, cloud_region_id, url):
+ '''
+ update cloud_region's identity url
+ :param cloud_owner:
+ :param cloud_region_id:
+ :param url:
+ :return:
+ '''
+ if cloud_owner and cloud_region_id:
+ retcode, content, status_code = \
+ req_to_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s"
+ % (cloud_owner, cloud_region_id), "PUT", content={'identity-url': url})
+
+ self._logger.debug("update_proxy_identity_endpoint,vimid:%s_%s req_to_aai: %s, return %s, %s, %s" \
+ % (cloud_owner,cloud_region_id, url, retcode, content, status_code))
+
def post(self, request, vimid=""):
self._logger.debug("Registration--post::data> %s" % request.data)
self._logger.debug("Registration--post::vimid > %s" % vimid)
try:
+ #populate proxy identity url
+ cloud_owner, cloud_region_id = extsys.decode_vim_id(vimid)
+ self.update_proxy_identity_endpoint(cloud_owner, cloud_region_id, config.MULTICLOUD_PREFIX+"/%s/identity/v3" % vimid )
+
# prepare request resource to vim instance
# get token:
viminfo = VimDriverUtils.get_vim_info(vimid)