a76d56a445eb9d9b9313920950172b79ecd95b3c
[multicloud/framework.git] / multivimbroker / multivimbroker / pub / msapi / extsys.py
1 # Copyright (c) 2017 Wind River Systems, Inc.
2 # Copyright (c) 2017-2018 VMware, Inc.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
7 #       http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
13 import json
14 import logging
15
16 from multivimbroker.pub.exceptions import VimBrokerException
17 from multivimbroker.pub.utils import restcall
18
19 logger = logging.getLogger(__name__)
20
21
22 def encode_vim_id(cloud_owner, cloud_region_id):
23     '''
24     compose vim_id by cloud_owner and cloud_region, make sure the vimid can be
25     converted back when talking to AAI,etc.
26     This is a backward compatibility design to reuse the existing
27     implementation code
28     :param cloud_owner:
29     :param cloud_region:
30     :return:
31     '''
32
33     # since the {cloud_owner}/{cloud_region_id"} is globally unique, the
34     # concatenated one as below will be unique as well.
35
36     vim_id = cloud_owner + "_" + cloud_region_id
37
38     # other options:
39     # 1, store it into cache so the decode and just look up the cache for
40     # decoding
41     # 2, use other delimiter in case that '_' was used by
42     # cloud owner/cloud region id,
43     # e.g. '.', '#', hence the decode need to try more than one time
44
45     return vim_id
46
47
48 def decode_vim_id(vim_id):
49     # m = re.search(r'^([0-9a-zA-Z-]+)_([0-9a-zA-Z_-]+)$', vim_id)
50     # cloud_owner, cloud_region_id = m.group(1), m.group(2)
51     return split_vim_to_owner_region(vim_id)
52
53
54 def split_vim_to_owner_region(vim_id):
55     split_vim = vim_id.split('_')
56     cloud_owner = split_vim[0]
57     cloud_region = "".join(split_vim[1:])
58     return cloud_owner, cloud_region
59
60
61 def get_vim_by_id(vim_id):
62     if vim_id == "vmware_fake":
63         return {
64             "type": "vmware",
65             "version": "4.0",
66             "vimId": vim_id
67         }
68     cloud_owner, cloud_region = split_vim_to_owner_region(vim_id)
69     ret = restcall.get_res_from_aai("/cloud-infrastructure/cloud-regions/"
70                                     "cloud-region/%s/%s" % (
71                                         cloud_owner, cloud_region))
72     if ret[0] != 0:
73         logger.error("Status code is %s, detail is %s." % (ret[2], ret[1]))
74         raise VimBrokerException(
75             status_code=404,
76             content="Failed to query VIM with id (%s) from extsys." % vim_id)
77     ret = json.JSONDecoder().decode(ret[1])
78     ret['type'] = ret['cloud-type']
79     ret['version'] = ret['cloud-region-version']
80     ret['vimId'] = vim_id
81     return ret