1 # -*- coding: utf-8 -*-
4 # Copyright 2016-2019 VMware Inc.
5 # This file is part of ETSI OSM
8 # Licensed under the Apache License, Version 2.0 (the "License"); you may
9 # not use this file except in compliance with the License. You may obtain
10 # a copy of the License at
12 # http://www.apache.org/licenses/LICENSE-2.0
14 # Unless required by applicable law or agreed to in writing, software
15 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
17 # License for the specific language governing permissions and limitations
20 # For those usages not covered by the Apache License, Version 2.0 please
21 # contact: osslegalrouting@vmware.com
24 # pylint: disable=E1101
27 from typing
import List
28 from xml
.etree
import ElementTree
as XmlElementTree
31 from pyvcloud
.vcd
.client
import BasicLoginCredentials
32 from pyvcloud
.vcd
.client
import Client
34 from osm_mon
.collector
.infra_collectors
.base_vim
import BaseVimInfraCollector
35 from osm_mon
.collector
.metric
import Metric
36 from osm_mon
.core
.common_db
import CommonDbClient
37 from osm_mon
.core
.config
import Config
39 log
= logging
.getLogger(__name__
)
43 class VMwareInfraCollector(BaseVimInfraCollector
):
44 def __init__(self
, config
: Config
, vim_account_id
: str):
45 super().__init
__(config
, vim_account_id
)
46 self
.vim_account_id
= vim_account_id
47 self
.common_db
= CommonDbClient(config
)
48 vim_account
= self
.get_vim_account(vim_account_id
)
49 self
.vcloud_site
= vim_account
["vim_url"]
50 self
.admin_username
= vim_account
["admin_username"]
51 self
.admin_password
= vim_account
["admin_password"]
52 self
.vim_uuid
= vim_account
["vim_uuid"]
53 self
.org_name
= vim_account
["orgname"]
54 self
.vim_project_id
= vim_account
["project_id"]
56 def connect_vim_as_admin(self
):
57 """Method connect as pvdc admin user to vCloud director.
58 There are certain action that can be done only by provider vdc admin user.
59 Organization creation / provider network creation etc.
62 The return client object that letter can be used to connect to vcloud direct as admin for provider vdc
65 log
.info("Logging into vCD org as admin.")
69 host
= self
.vcloud_site
70 admin_user
= self
.admin_username
71 admin_passwd
= self
.admin_password
73 client
= Client(host
, verify_ssl_certs
=False)
74 client
.set_highest_supported_version()
75 client
.set_credentials(BasicLoginCredentials(admin_user
, org
, admin_passwd
))
78 except Exception as e
:
80 "Can't connect to a vCloud director as: {} with exception {}".format(
85 def get_vim_account(self
, vim_account_id
: str):
87 Method to get VIM account details by its ID
89 return - dict with vim account details
92 vim_account_info
= self
.common_db
.get_vim_account(vim_account_id
)
94 vim_account
["name"] = vim_account_info
["name"]
95 vim_account
["vim_tenant_name"] = vim_account_info
["vim_tenant_name"]
96 vim_account
["vim_type"] = vim_account_info
["vim_type"]
97 vim_account
["vim_url"] = vim_account_info
["vim_url"]
98 vim_account
["org_user"] = vim_account_info
["vim_user"]
99 vim_account
["vim_uuid"] = vim_account_info
["_id"]
100 if vim_account_info
["_admin"]["projects_read"]:
101 vim_account
["project_id"] = vim_account_info
["_admin"]["projects_read"][0]
103 vim_account
["project_id"] = ""
105 vim_config
= vim_account_info
["config"]
106 vim_account
["admin_username"] = vim_config
["admin_username"]
107 vim_account
["admin_password"] = vim_config
["admin_password"]
109 if vim_config
["orgname"] is not None:
110 vim_account
["orgname"] = vim_config
["orgname"]
114 def check_vim_status(self
):
116 client
= self
.connect_vim_as_admin()
118 org_list
= client
.get_org_list()
119 for org
in org_list
.Org
:
120 if org
.get("name") == self
.org_name
:
121 org_uuid
= org
.get("href").split("/")[-1]
123 url
= "{}/api/org/{}".format(self
.vcloud_site
, org_uuid
)
126 "Accept": "application/*+xml;version=" + API_VERSION
,
127 "x-vcloud-authorization": client
._session
.headers
[
128 "x-vcloud-authorization"
132 response
= requests
.get(url
=url
, headers
=headers
, verify
=False)
135 response
.status_code
!= requests
.codes
.ok
136 ): # pylint: disable=no-member
137 log
.info("check_vim_status(): failed to get org details")
139 org_details
= XmlElementTree
.fromstring(response
.content
)
141 for child
in org_details
:
142 if "type" in child
.attrib
:
145 == "application/vnd.vmware.vcloud.vdc+xml"
148 child
.attrib
["href"].split("/")[-1:][0]
149 ] = child
.attrib
["name"]
155 except Exception as e
:
156 log
.info("Exception occured while checking vim status {}".format(str(e
)))
158 def check_vm_status(self
, vapp_id
):
160 client
= self
.connect_vim_as_admin()
162 url
= "{}/api/vApp/vapp-{}".format(self
.vcloud_site
, vapp_id
)
165 "Accept": "application/*+xml;version=" + API_VERSION
,
166 "x-vcloud-authorization": client
._session
.headers
[
167 "x-vcloud-authorization"
171 response
= requests
.get(url
=url
, headers
=headers
, verify
=False)
174 response
.status_code
!= requests
.codes
.ok
175 ): # pylint: disable=no-member
176 log
.info("check_vm_status(): failed to get vApp details")
178 vapp_details
= XmlElementTree
.fromstring(response
.content
)
180 for child
in vapp_details
:
181 if child
.tag
.split("}")[1] == "Children":
182 for item
in child
.getchildren():
183 vm_list
.append(item
.attrib
)
185 except Exception as e
:
186 log
.info("Exception occured while checking vim status {}".format(str(e
)))
188 def collect(self
) -> List
[Metric
]:
190 vim_status
= self
.check_vim_status()
191 vim_account_id
= self
.vim_account_id
192 vim_project_id
= self
.vim_project_id
193 vim_tags
= {"vim_account_id": vim_account_id
, "project_id": vim_project_id
}
194 vim_status_metric
= Metric(vim_tags
, "vim_status", vim_status
)
195 metrics
.append(vim_status_metric
)
196 vnfrs
= self
.common_db
.get_vnfrs(vim_account_id
=vim_account_id
)
197 if self
.conf
.get("collector", "vm_infra_metrics"):
198 vm_infra_metrics_enabled
= str(
199 self
.conf
.get("collector", "vm_infra_metrics")
200 ).lower() in ("yes", "true", "1")
202 vm_infra_metrics_enabled
= True
203 if vm_infra_metrics_enabled
:
205 nsr_id
= vnfr
["nsr-id-ref"]
206 ns_name
= self
.common_db
.get_nsr(nsr_id
)["name"]
207 vnf_member_index
= vnfr
["member-vnf-index-ref"]
208 if vnfr
["_admin"]["projects_read"]:
209 vnfr_project_id
= vnfr
["_admin"]["projects_read"][0]
212 for vdur
in vnfr
["vdur"]:
213 resource_uuid
= vdur
["vim-id"]
215 "vim_account_id": self
.vim_account_id
,
216 "resource_uuid": resource_uuid
,
219 "vnf_member_index": vnf_member_index
,
220 "vdur_name": vdur
["name"],
221 "project_id": vnfr_project_id
,
224 vm_list
= self
.check_vm_status(resource_uuid
)
226 if vm
["status"] == "4" and vm
["deployed"] == "true":
230 vm_status_metric
= Metric(tags
, "vm_status", vm_status
)
232 log
.exception("VM status is not OK!")
233 vm_status_metric
= Metric(tags
, "vm_status", 0)
234 metrics
.append(vm_status_metric
)