diff options
author | Bin Yang <bin.yang@windriver.com> | 2019-04-01 09:46:31 +0000 |
---|---|---|
committer | Bin Yang <bin.yang@windriver.com> | 2019-04-01 09:46:31 +0000 |
commit | 3176e57da097f2c238b134f18b1a4af00e105546 (patch) | |
tree | 66301d35a32927feed1fc277a3d06bb8eb87786b /share/starlingx_base | |
parent | 4a7181a20f5eb9ad6bfbcb0945fa79ac0ddd620b (diff) |
Update capacity check API
Query the AZinfo from the cache
Relay on the background thread of AZcap Auditing
Change-Id: I064dbc22c71ef25683145ef1c96274ce6ac74c3b
Issue-ID: MULTICLOUD-542
Signed-off-by: Bin Yang <bin.yang@windriver.com>
Diffstat (limited to 'share/starlingx_base')
-rw-r--r-- | share/starlingx_base/registration/registration.py | 6 | ||||
-rw-r--r-- | share/starlingx_base/resource/__init__.py | 10 | ||||
-rw-r--r-- | share/starlingx_base/resource/capacity.py | 97 |
3 files changed, 112 insertions, 1 deletions
diff --git a/share/starlingx_base/registration/registration.py b/share/starlingx_base/registration/registration.py index 7a85b29f..59074568 100644 --- a/share/starlingx_base/registration/registration.py +++ b/share/starlingx_base/registration/registration.py @@ -373,7 +373,8 @@ class InfraResourceAuditor(newton_registration.RegistryHelper): continue hypervisors_dict[h["hypervisor_hostname"]] = h - az_pserver_info = {} + vimAzCacheKey = "cap_azlist_" + vimid + vimAzList = [] # cloud_owner, cloud_region_id = extsys.decode_vim_id(vimid) for az in self._get_list_resources( "/os-availability-zone/detail", "compute", session, @@ -393,6 +394,8 @@ class InfraResourceAuditor(newton_registration.RegistryHelper): if azName == 'internal': continue + vimAzList.append(azName) + # get list of host names pservers_info = [k for (k, v) in az['hosts'].items()] # set the association between az and pservers @@ -456,6 +459,7 @@ class InfraResourceAuditor(newton_registration.RegistryHelper): # update the cache cache.set(azCapCacheKey, json.dumps(azCapInfoCache), 3600 * 24) + cache.set(vimAzCacheKey, vimAzList, 3600 * 24) except Exception as e: self._logger.error("azcap_audit raise exception: %s" % e) pass diff --git a/share/starlingx_base/resource/__init__.py b/share/starlingx_base/resource/__init__.py new file mode 100644 index 00000000..825091ff --- /dev/null +++ b/share/starlingx_base/resource/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017-2019 Wind River Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. diff --git a/share/starlingx_base/resource/capacity.py b/share/starlingx_base/resource/capacity.py new file mode 100644 index 00000000..fc926d00 --- /dev/null +++ b/share/starlingx_base/resource/capacity.py @@ -0,0 +1,97 @@ +# Copyright (c) 2017-2019 Wind River Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import traceback +import json + +from django.core.cache import cache + +from newton_base.resource import capacity as newton_capacity +from common.exceptions import VimDriverNewtonException +from newton_base.util import VimDriverUtils + +from keystoneauth1.exceptions import HttpError +from rest_framework import status +from rest_framework.response import Response +from rest_framework.views import APIView +from common.msapi import extsys + +logger = logging.getLogger(__name__) + + +class CapacityCheck(newton_capacity.CapacityCheck): + def __init__(self): + super(CapacityCheck, self).__init__() + self._logger = logger + + def post(self, request, vimid=""): + self._logger.info("vimid, data> %s, %s" % (vimid, request.data)) + self._logger.debug("META> %s" % request.META) + + try: + hasEnoughResource = self.get_tenant_cap_info(vimid, request.data) + azCapInfo = self.get_az_cap_info(vimid) + self._logger.info("RESP with data> result:%s" % hasEnoughResource) + return Response(data={'result': hasEnoughResource, 'AZs': azCapInfo}, status=status.HTTP_200_OK) + except Exception as e: + self._logger.error(traceback.format_exc()) + return Response(data={'result': False, 'error': str(e)}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + def get_az_cap_info(self, vimid): + azCapInfo = [] + viminfo = VimDriverUtils.get_vim_info(vimid) + if not viminfo: + self._logger.warn("azcap_audit no valid vimid: %s" % vimid) + return + + session = VimDriverUtils.get_session( + viminfo, + tenant_name=viminfo['tenant'] + ) + try: + # get list of AZ + vimAzCacheKey = "cap_azlist_" + vimid + vimAzListCacheStr = cache.get(vimAzCacheKey) + vimAzListCache = json.loads(vimAzListCacheStr) if vimAzListCacheStr else [] + for azName in vimAzListCache: + azCapCacheKey = "cap_" + vimid + "_" + azName + azCapInfoCacheStr = cache.get(azCapCacheKey) + azCapInfoCache = json.loads(azCapInfoCacheStr) if azCapInfoCacheStr else None + + azCapInfo["availability-zone-name"] = azName + azCapInfo["vCPUAvail"] = azCapInfoCache.get("vcpus", 0) + azCapInfoCache.get("vcpus_used", 0) + azCapInfo["vCPUTotal"] = azCapInfoCache.get("vcpus", 0) + azCapInfo["MemoryAvail"] = azCapInfoCache.get("vcpus", 0) + azCapInfo["MemoryTotal"] = azCapInfoCache.get("vcpus", 0) + azCapInfo["StorageAvail"] = azCapInfoCache.get("vcpus", 0) + azCapInfo["StorageTotal"] = azCapInfoCache.get("vcpus", 0) + + return azCapInfo + except Exception as e: + return azCapInfo + pass + +class APIv1CapacityCheck(CapacityCheck): + def __init__(self): + super(APIv1CapacityCheck, self).__init__() + # self._logger = logger + + def post(self, request, cloud_owner="", cloud_region_id=""): + self._logger.info("vimid, data> %s,%s, %s" % (cloud_owner, cloud_region_id, request.data)) + self._logger.debug("META> %s" % request.META) + + vimid = extsys.encode_vim_id(cloud_owner, cloud_region_id) + return super(APIv1CapacityCheck, self).post(request, vimid) |