tripleo-common/tripleo_common/actions/base.py
Steve Baker ce52e8b7e6 Return None image client when no glance endpoint
Glance will soon be switched off by default, so the baremetal
management code needs to handle the glance endpoint not existing.

This change returns None from get_image_client when there is no glance
endpoint.

The only callers of get_image_client use the result to call
create_or_find_kernel_and_ramdisk[2]. This function only requires a an
image client when the image reference is not a valid URL, and handles
a None client with image URLs just fine.

[1] https://review.opendev.org/711364
[2] https://opendev.org/openstack/tripleo-common/src/branch/master/tripleo_common/utils/glance.py#L22
Blueprint: nova-less-deploy

Change-Id: I703660e72a934e8b0925d63a19cb78f603bff5ba
2020-03-30 12:14:47 +13:00

183 lines
6.2 KiB
Python

# Copyright 2016 Red Hat, Inc.
# All Rights Reserved.
#
# 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 glanceclient.v2 import client as glanceclient
from heatclient.v1 import client as heatclient
import ironic_inspector_client
from ironicclient import client as ironicclient
from keystoneauth1 import session as ks_session
from keystoneauth1.token_endpoint import Token
from mistral_lib import actions
from mistralclient.api import client as mistral_client
from novaclient.client import Client as nova_client
from swiftclient import client as swift_client
from swiftclient import service as swift_service
from zaqarclient.queues.v2 import client as zaqarclient
from tripleo_common.utils import keystone as keystone_utils
class TripleOAction(actions.Action):
def __init__(self):
super(TripleOAction, self).__init__()
def get_session(self, context, service_name):
session_and_auth = keystone_utils.get_session_and_auth(
context,
service_name=service_name
)
return session_and_auth['session']
def get_object_client(self, context):
security_ctx = context.security
swift_endpoint = keystone_utils.get_endpoint_for_project(
security_ctx,
'swift'
)
kwargs = {
'preauthurl': swift_endpoint.url % {
'tenant_id': security_ctx.project_id
},
'session': self.get_session(security_ctx, 'swift'),
'insecure': security_ctx.insecure,
'retries': 10,
'starting_backoff': 3,
'max_backoff': 120
}
return swift_client.Connection(**kwargs)
# This version returns the SwiftService API
def get_object_service(self, context):
swift_endpoint = keystone_utils.get_endpoint_for_project(
context, 'swift')
swift_opts = {
'os_storage_url': swift_endpoint.url % {
'tenant_id': context.project_id
},
'os_auth_token': context.auth_token,
'os_region_name': swift_endpoint.region,
'os_project_id': context.security.project_id,
}
return swift_service.SwiftService(options=swift_opts)
def get_baremetal_client(self, context):
security_ctx = context.security
ironic_endpoint = keystone_utils.get_endpoint_for_project(
security_ctx, 'ironic')
return ironicclient.get_client(
1,
endpoint=ironic_endpoint.url,
token=security_ctx.auth_token,
region_name=ironic_endpoint.region,
# 1.58 for allocations backfill
os_ironic_api_version='1.58',
# FIXME(lucasagomes):Paramtetize max_retries and
# max_interval. At the moment since we are dealing with
# a critical bug (#1612622) let's just hardcode the times
# here since the right fix does involve multiple projects
# (tripleo-ci and python-tripleoclient beyong tripleo-common)
max_retries=12,
retry_interval=5,
)
def get_baremetal_introspection_client(self, context):
security_ctx = context.security
bmi_endpoint = keystone_utils.get_endpoint_for_project(
security_ctx, 'ironic-inspector')
auth = Token(endpoint=bmi_endpoint.url, token=security_ctx.auth_token)
return ironic_inspector_client.ClientV1(
api_version='1.2',
region_name=bmi_endpoint.region,
session=ks_session.Session(auth)
)
def get_image_client(self, context):
security_ctx = context.security
try:
glance_endpoint = keystone_utils.get_endpoint_for_project(
security_ctx, 'glance')
except Exception:
return None
return glanceclient.Client(
glance_endpoint.url,
token=security_ctx.auth_token,
region_name=glance_endpoint.region
)
def get_orchestration_client(self, context):
security_ctx = context.security
heat_endpoint = keystone_utils.get_endpoint_for_project(
security_ctx, 'heat')
endpoint_url = keystone_utils.format_url(
heat_endpoint.url,
{'tenant_id': security_ctx.project_id}
)
return heatclient.Client(
endpoint_url,
region_name=heat_endpoint.region,
token=security_ctx.auth_token,
username=security_ctx.user_name
)
def get_messaging_client(self, context):
zaqar_endpoint = keystone_utils.get_endpoint_for_project(
context, service_type='messaging')
auth_uri = context.security.auth_uri or \
keystone_utils.CONF.keystone_authtoken.auth_uri
opts = {
'os_auth_token': context.security.auth_token,
'os_auth_url': auth_uri,
'os_project_id': context.security.project_id,
'insecure': context.security.insecure,
}
auth_opts = {'backend': 'keystone', 'options': opts, }
conf = {'auth_opts': auth_opts,
'session': self.get_session(context, 'zaqar')}
return zaqarclient.Client(zaqar_endpoint.url, conf=conf)
def get_workflow_client(self, context):
security_ctx = context.security
mistral_endpoint = keystone_utils.get_endpoint_for_project(
security_ctx, 'mistral')
mc = mistral_client.client(auth_token=security_ctx.auth_token,
mistral_url=mistral_endpoint.url)
return mc
def get_compute_client(self, context):
security_ctx = context.security
conf = keystone_utils.get_session_and_auth(
security_ctx,
service_type='compute'
)
return nova_client(2, **conf)