Added support of overcloud os_cloud
It includes: * mistral action for generating clouds.yaml once overcloud deployment finishes. * clouds_yaml.py library for generating clouds.yaml * Moved global vars to tripleo-common constants. https://review.opendev.org/#/c/664586/ adds the review in python-tripleoclient to create the clouds.yaml for overcloud by calling the above mistral actions. Related-Bug: #1719369 Change-Id: Ie9004222ca5f77031795eaa4b4a757da8b409d05 Signed-off-by: Chandan Kumar (raukadah) <chkumar@redhat.com>
This commit is contained in:
parent
0cf0b3016d
commit
3c4cb58d81
@ -99,6 +99,7 @@ mistral.actions =
|
|||||||
tripleo.deployment.get_deployment_status = tripleo_common.actions.deployment:DeploymentStatusAction
|
tripleo.deployment.get_deployment_status = tripleo_common.actions.deployment:DeploymentStatusAction
|
||||||
tripleo.deployment.convert_status = tripleo_common.actions.deployment:ConvertStatusAction
|
tripleo.deployment.convert_status = tripleo_common.actions.deployment:ConvertStatusAction
|
||||||
tripleo.deployment.overcloudrc = tripleo_common.actions.deployment:OvercloudRcAction
|
tripleo.deployment.overcloudrc = tripleo_common.actions.deployment:OvercloudRcAction
|
||||||
|
tripleo.deployment.createcloudsyaml = tripleo_common.actions.deployment:CreateCloudsYamlAction
|
||||||
tripleo.derive_params.convert_number_to_range_list = tripleo_common.actions.derive_params:ConvertNumberToRangeListAction
|
tripleo.derive_params.convert_number_to_range_list = tripleo_common.actions.derive_params:ConvertNumberToRangeListAction
|
||||||
tripleo.derive_params.convert_range_to_number_list = tripleo_common.actions.derive_params:ConvertRangeToNumberListAction
|
tripleo.derive_params.convert_range_to_number_list = tripleo_common.actions.derive_params:ConvertRangeToNumberListAction
|
||||||
tripleo.derive_params.get_dpdk_nics_numa_info = tripleo_common.actions.derive_params:GetDpdkNicsNumaInfoAction
|
tripleo.derive_params.get_dpdk_nics_numa_info = tripleo_common.actions.derive_params:GetDpdkNicsNumaInfoAction
|
||||||
@ -181,4 +182,4 @@ exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,releasenotes
|
|||||||
builtins = _
|
builtins = _
|
||||||
|
|
||||||
[pycodestyle]
|
[pycodestyle]
|
||||||
exclude = .eggs,.tox
|
exclude = .eggs,.tox
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
@ -322,6 +323,45 @@ class OvercloudRcAction(base.TripleOAction):
|
|||||||
region_name)
|
region_name)
|
||||||
|
|
||||||
|
|
||||||
|
class CreateCloudsYamlAction(base.TripleOAction):
|
||||||
|
"""Generate the overcloud clouds.yaml contents for a plan
|
||||||
|
|
||||||
|
Given the name of a container, generate the overcloud clouds.yaml
|
||||||
|
contents needed to access the overcloud via the CLI.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, container):
|
||||||
|
super(CreateCloudsYamlAction, self).__init__()
|
||||||
|
self.container = container
|
||||||
|
|
||||||
|
def run(self, context):
|
||||||
|
orchestration_client = self.get_orchestration_client(context)
|
||||||
|
swift = self.get_object_client(context)
|
||||||
|
stack = orchestration_client.stacks.get(self.container)
|
||||||
|
env = plan_utils.get_env(swift, self.container)
|
||||||
|
parameter_defaults = env['parameter_defaults']
|
||||||
|
passwords = env['passwords']
|
||||||
|
# Retrive values for cloud from a stack
|
||||||
|
admin_pass = parameter_defaults.get('AdminPassword',
|
||||||
|
passwords['AdminPassword'])
|
||||||
|
region_name = parameter_defaults.get('KeystoneRegion', 'regionOne')
|
||||||
|
cloud_name = stack.stack_name
|
||||||
|
auth_url = overcloudrc.get_overcloud_endpoint(stack).replace('/v2.0',
|
||||||
|
'')
|
||||||
|
|
||||||
|
# Create a dict needed for creating clouds.yaml
|
||||||
|
cloud = {cloud_name: {'auth': {'auth_url': auth_url,
|
||||||
|
'project_name': 'admin',
|
||||||
|
'project_domain_name': 'Default',
|
||||||
|
'username': 'admin',
|
||||||
|
'user_domain_name': 'Default',
|
||||||
|
'password': admin_pass},
|
||||||
|
'region_name': region_name,
|
||||||
|
'identity_api_version': 3}}
|
||||||
|
|
||||||
|
return cloud
|
||||||
|
|
||||||
|
|
||||||
class DeploymentFailuresAction(base.TripleOAction):
|
class DeploymentFailuresAction(base.TripleOAction):
|
||||||
"""Return all of the failures (if any) from deploying the plan
|
"""Return all of the failures (if any) from deploying the plan
|
||||||
|
|
||||||
|
@ -215,3 +215,7 @@ MISTRAL_WORK_DIR = '/var/lib/mistral'
|
|||||||
EXCLUSIVE_NEUTRON_DRIVERS = ['ovn', 'openvswitch']
|
EXCLUSIVE_NEUTRON_DRIVERS = ['ovn', 'openvswitch']
|
||||||
|
|
||||||
UPGRADE_STEPS_MAX = 6
|
UPGRADE_STEPS_MAX = 6
|
||||||
|
|
||||||
|
# Global Directories for clouds.yaml
|
||||||
|
GLOBAL_OS_DIR = '/etc/openstack'
|
||||||
|
CLOUDS_YAML_FILE = 'clouds.yaml'
|
||||||
|
74
tripleo_common/utils/clouds_yaml.py
Normal file
74
tripleo_common/utils/clouds_yaml.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Copyright 2018, 2019 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.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from tripleo_common import constants
|
||||||
|
|
||||||
|
|
||||||
|
def _create_clouds_yaml(clouds_yaml):
|
||||||
|
if not os.path.isfile(clouds_yaml):
|
||||||
|
with open(clouds_yaml, "w") as f:
|
||||||
|
yaml.safe_dump({"clouds": {}}, f, default_flow_style=False)
|
||||||
|
os.chmod(clouds_yaml, 0o600)
|
||||||
|
|
||||||
|
|
||||||
|
def _create_clouds_yaml_dir(dir_path, user_id, group_id):
|
||||||
|
if not os.path.isdir(dir_path):
|
||||||
|
os.makedirs(dir_path)
|
||||||
|
os.chown(dir_path, user_id, group_id)
|
||||||
|
|
||||||
|
|
||||||
|
def _read_clouds_yaml(clouds_yaml):
|
||||||
|
with open(clouds_yaml, "r") as f:
|
||||||
|
clouds = yaml.safe_load(f)
|
||||||
|
if "clouds" not in clouds:
|
||||||
|
clouds.update({"clouds": {}})
|
||||||
|
|
||||||
|
return clouds
|
||||||
|
|
||||||
|
|
||||||
|
def _write_clouds_yaml(clouds_yaml, clouds):
|
||||||
|
with open(clouds_yaml, "w") as f:
|
||||||
|
yaml.safe_dump(clouds, f, default_flow_style=False)
|
||||||
|
|
||||||
|
|
||||||
|
def create_clouds_yaml(**kwargs):
|
||||||
|
"""Generates clouds.yaml file
|
||||||
|
|
||||||
|
:param cloud: dict containing cloud data
|
||||||
|
:param clouds_yaml_dir: Directory to create clouds.yaml file
|
||||||
|
:param user_id: User id of the user owning the file
|
||||||
|
:param group_id: Group id of the user owning the file
|
||||||
|
"""
|
||||||
|
|
||||||
|
cloud = kwargs.get("cloud", None)
|
||||||
|
dir_path = kwargs.get("cloud_yaml_dir", constants.GLOBAL_OS_DIR)
|
||||||
|
clouds_yaml = os.path.join(dir_path, constants.CLOUDS_YAML_FILE)
|
||||||
|
user_id = kwargs.get("user_id", 0)
|
||||||
|
group_id = kwargs.get("group_id", 0)
|
||||||
|
|
||||||
|
try:
|
||||||
|
_create_clouds_yaml_dir(dir_path, user_id, group_id)
|
||||||
|
_create_clouds_yaml(clouds_yaml)
|
||||||
|
user_clouds = _read_clouds_yaml(clouds_yaml)
|
||||||
|
user_clouds["clouds"].update(cloud)
|
||||||
|
_write_clouds_yaml(clouds_yaml, user_clouds)
|
||||||
|
os.chown(clouds_yaml, user_id, group_id)
|
||||||
|
print("The clouds.yaml file is at {0}".format(clouds_yaml))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("Create clouds.yaml failed: {}".format(e))
|
@ -754,6 +754,40 @@ workflows:
|
|||||||
execution: <% execution() %>
|
execution: <% execution() %>
|
||||||
message: <% $.get('message', '') %>
|
message: <% $.get('message', '') %>
|
||||||
|
|
||||||
|
createcloudsyaml:
|
||||||
|
description: >
|
||||||
|
Generates the overcloud clouds.yaml
|
||||||
|
It requires container and queue name as a input.
|
||||||
|
|
||||||
|
tags:
|
||||||
|
- tripleo-common-managed
|
||||||
|
|
||||||
|
input:
|
||||||
|
- container: overcloud
|
||||||
|
- queue_name: tripleo
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
generate_cloudyaml:
|
||||||
|
action: tripleo.deployment.createcloudsyaml
|
||||||
|
input:
|
||||||
|
container: <% $.container %>
|
||||||
|
on-complete: send_message
|
||||||
|
publish-on-error:
|
||||||
|
status: FAILED
|
||||||
|
message: <% task().result %>
|
||||||
|
publish:
|
||||||
|
status: SUCCESS
|
||||||
|
message: <% task().result %>
|
||||||
|
|
||||||
|
send_message:
|
||||||
|
workflow: tripleo.messaging.v1.send
|
||||||
|
input:
|
||||||
|
queue_name: <% $.queue_name %>
|
||||||
|
type: <% execution().name %>
|
||||||
|
status: <% $.status %>
|
||||||
|
execution: <% execution() %>
|
||||||
|
message: <% $.get('message', '') %>
|
||||||
|
|
||||||
get_deployment_status:
|
get_deployment_status:
|
||||||
description: >
|
description: >
|
||||||
Get deployment status and update it if needed based on stack and
|
Get deployment status and update it if needed based on stack and
|
||||||
|
Loading…
Reference in New Issue
Block a user