130 lines
5.0 KiB
Python
130 lines
5.0 KiB
Python
#
|
|
# 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.
|
|
|
|
from gnocchiclient import client
|
|
from gnocchiclient import exceptions as gnocchi_exc
|
|
from keystoneauth1 import session as ka_session
|
|
from oslo_config import cfg
|
|
from oslo_log import log
|
|
import requests
|
|
|
|
from ceilometer import keystone_client
|
|
|
|
LOG = log.getLogger(__name__)
|
|
|
|
OPTS = [
|
|
cfg.StrOpt('url',
|
|
deprecated_for_removal=True,
|
|
help='URL to Gnocchi. default: autodetection'),
|
|
]
|
|
|
|
cfg.CONF.register_opts(OPTS, group="dispatcher_gnocchi")
|
|
|
|
|
|
def get_gnocchiclient(conf, endpoint_override=None):
|
|
requests_session = requests.session()
|
|
for scheme in list(requests_session.adapters.keys()):
|
|
requests_session.mount(scheme, ka_session.TCPKeepAliveAdapter(
|
|
pool_block=True))
|
|
|
|
session = keystone_client.get_session(requests_session=requests_session)
|
|
return client.Client('1', session,
|
|
interface=conf.service_credentials.interface,
|
|
region_name=conf.service_credentials.region_name,
|
|
endpoint_override=endpoint_override)
|
|
|
|
|
|
# NOTE(sileht): This is the initial resource types created in Gnocchi
|
|
# This list must never change to keep in sync with what Gnocchi early
|
|
# database contents was containing
|
|
resources_initial = {
|
|
"image": {
|
|
"name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
"container_format": {"type": "string", "min_length": 0,
|
|
"max_length": 255, "required": True},
|
|
"disk_format": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
},
|
|
"instance": {
|
|
"flavor_id": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
"image_ref": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": False},
|
|
"host": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
"display_name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
"server_group": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": False},
|
|
},
|
|
"instance_disk": {
|
|
"name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
"instance_id": {"type": "uuid", "required": True},
|
|
},
|
|
"instance_network_interface": {
|
|
"name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
"instance_id": {"type": "uuid", "required": True},
|
|
},
|
|
"volume": {
|
|
"display_name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": False},
|
|
},
|
|
"swift_account": {},
|
|
"ceph_account": {},
|
|
"network": {},
|
|
"identity": {},
|
|
"ipmi": {},
|
|
"stack": {},
|
|
"host": {
|
|
"host_name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
},
|
|
"host_network_interface": {
|
|
"host_name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
"device_name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": False},
|
|
},
|
|
"host_disk": {
|
|
"host_name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": True},
|
|
"device_name": {"type": "string", "min_length": 0, "max_length": 255,
|
|
"required": False},
|
|
},
|
|
}
|
|
|
|
|
|
def upgrade_resource_types(conf):
|
|
gnocchi = get_gnocchiclient(conf)
|
|
# TODO(sileht): Detect what is the version of the schema created
|
|
# in Gnocchi, we don't have local database to store this.
|
|
# For now we can upgrade the schema so we are safe :p
|
|
for name, attributes in resources_initial.items():
|
|
try:
|
|
gnocchi.resource_type.get(name=name)
|
|
except gnocchi_exc.NotFound:
|
|
# FIXME(sileht): It should be ResourceTypeNotFound but
|
|
# gnocchiclient doesn't raise that :(
|
|
rt = {'name': name, 'attributes': attributes}
|
|
try:
|
|
gnocchi.resource_type.create(resource_type=rt)
|
|
except Exception:
|
|
LOG.error("Gnocchi resource creation fail", exc_info=True)
|
|
else:
|
|
# NOTE(sileht): We have to handle this case when it will be
|
|
# possible to add/rm resource-types columns
|
|
pass
|