summaryrefslogtreecommitdiffstats
path: root/vio/vio/pub/vim/vimapi/network/OperateNetwork.py
blob: 91d333f5102c8103ed3d81fafceeba1670dad484 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# Copyright (c) 2017-2018 VMware, 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.

import logging

from rest_framework import status

from vio.pub.msapi.extsys import get_vim_by_id
from vio.pub.vim.drivers.vimsdk import neutron_v2_0
from vio.pub.exceptions import VimDriverVioException

logger = logging.getLogger(__name__)


def translate(mapping, data, revert=True):
    if revert:
        for key in mapping:
            if key in data:
                val = data.pop(key)
                if val != '':
                    data[mapping[key]] = val
    else:
        for key in mapping:
            if mapping[key] in data:
                data[key] = data.pop(mapping[key])
    return data


class BaseNet(object):
    def get_vim_info(self, vimid):
        try:
            vim_info = get_vim_by_id(vimid)
        except VimDriverVioException:
            raise VimDriverVioException(
                "Failed to query VIM with id (%s) from extsys." % vimid,
                status.HTTP_404_NOT_FOUND)
        return vim_info

    def auth(self, vim_info, tenant_id):
        param = {}
        param['username'] = vim_info['userName']
        param['user_domain_name'] = 'default'
        param['project_domain_name'] = 'default'
        param['password'] = vim_info['password']
        param['auth_url'] = vim_info['url']
        param['project_id'] = tenant_id
        return neutron_v2_0.NeutronClient(param)


class OperateNetwork(BaseNet):
    service = {'service_type': 'network',
               'interface': 'public',
               'region_name': 'RegionOne'}
    keys_mapping = {"segmentationId": "provider:segmentation_id",
                    "physicalNetwork": "provider:physical_network",
                    "routerExternal": "router:external",
                    "networkType": "provider:network_type",
                    "vlanTransparent": "vlan_transparent",
                    "tenantId": "project_id"
                    }

    def ___init__(self, params):
        super(OperateNetwork, self).__init__(params)

    def _convert(self, network):
        result = {}
        result['status'] = network.status
        result['id'] = network.id
        result['name'] = network.name
        result['tenantId'] = network.project_id
        result['segmentationId'] = network.provider_segmentation_id
        result['networkType'] = network.provider_network_type
        result['physicalNetwork'] = network.provider_physical_network
        result['vlanTransparent'] = False
        result['shared'] = network.is_shared
        result['routerExternal'] = network.is_router_external
        return result

    def create_network(self, vimid, tenantid, body):
        vim_info = self.get_vim_info(vimid)
        network = self.auth(vim_info, tenantid)
        body = translate(self.keys_mapping, body)
        net = network.network_create(**body)
        vim_dict = {
            "vimName": vim_info['name'],
            "vimId": vim_info['vimId'],
            'cloud_owner': vim_info.get('cloud_owner'),
            'cloud_region_id': vim_info.get("cloud_region_id")}
        resp = self._convert(net)
        resp.update(vim_dict)
        return resp

    def list_network(self, vimid, tenantid, networkid):
        vim_info = self.get_vim_info(vimid)
        network = self.auth(vim_info, tenantid)
        net = network.network_get(networkid)
        if net is None:
            return net
        vim_dict = {
            "vimName": vim_info['name'],
            "vimId": vim_info['vimId'],
            'cloud_owner': vim_info.get('cloud_owner'),
            'cloud_region_id': vim_info.get("cloud_region_id")}
        resp = self._convert(net)
        resp.update(vim_dict)
        return resp

    def delete_network(self, vimid, tenantid, networkid):
        vim_info = self.get_vim_info(vimid)
        network = self.auth(vim_info, tenantid)
        return network.network_delete(networkid)

    def list_networks(self, vimid, tenantid, **query):
        vim_info = self.get_vim_info(vimid)
        network = self.auth(vim_info, tenantid)
        resp = network.networks_get(**query)
        vim_dict = {
            "vimName": vim_info['name'],
            "vimId": vim_info['vimId'],
            'cloud_owner': vim_info.get('cloud_owner'),
            'cloud_region_id': vim_info.get("cloud_region_id")}
        networks = {'networks': []}
        if resp:
            for net in resp:
                networks['networks'].append(self._convert(net))
        networks.update(vim_dict)
        return networks