diff --git a/distributedcloud/dcmanager/common/consts.py b/distributedcloud/dcmanager/common/consts.py index 6d9211ad7..6468531ae 100644 --- a/distributedcloud/dcmanager/common/consts.py +++ b/distributedcloud/dcmanager/common/consts.py @@ -394,3 +394,15 @@ CERT_NAMESPACE_PLATFORM_CA_CERTS = 'cert-manager' # The ansible playbook base directories ANSIBLE_CURRENT_VERSION_BASE_PATH = '/usr/share/ansible/stx-ansible/playbooks' ANSIBLE_PREVIOUS_VERSION_BASE_PATH = '/opt/dc-vault/playbooks' + +# The deployment manager artifacts usr directories +ALTERNATE_DEPLOY_FILES_DIR = '/usr/local/share/applications' + +ALTERNATE_HELM_CHART_OVERRIDES_DIR = ALTERNATE_DEPLOY_FILES_DIR + '/overrides' +HELM_CHART_OVERRIDES_POSTFIX = '-overrides-subcloud.yaml' + +ALTERNATE_HELM_CHART_DIR = ALTERNATE_DEPLOY_FILES_DIR + '/helm' +HELM_CHART_POSTFIX = 'deployment-manager' + +ALTERNATE_DEPLOY_PLAYBOOK_DIR = ALTERNATE_DEPLOY_FILES_DIR + '/playbooks' +DEPLOY_PLAYBOOK_POSTFIX = 'deployment-manager.yaml' diff --git a/distributedcloud/dcmanager/common/phased_subcloud_deploy.py b/distributedcloud/dcmanager/common/phased_subcloud_deploy.py index d1904fbf2..2f279afb9 100644 --- a/distributedcloud/dcmanager/common/phased_subcloud_deploy.py +++ b/distributedcloud/dcmanager/common/phased_subcloud_deploy.py @@ -747,6 +747,33 @@ def upload_config_file(file_item, config_file, config_type): pecan.abort(400, msg) +def check_deploy_files_in_alternate_location(payload): + for f in os.listdir(consts.ALTERNATE_DEPLOY_PLAYBOOK_DIR): + if f.endswith(consts.DEPLOY_PLAYBOOK_POSTFIX): + filename = os.path.join(consts.ALTERNATE_DEPLOY_PLAYBOOK_DIR, f) + payload.update({consts.DEPLOY_PLAYBOOK: filename}) + break + else: + return False + + for f in os.listdir(consts.ALTERNATE_HELM_CHART_OVERRIDES_DIR): + if f.endswith(consts.HELM_CHART_OVERRIDES_POSTFIX): + filename = os.path.join(consts.ALTERNATE_HELM_CHART_OVERRIDES_DIR, f) + payload.update({consts.DEPLOY_OVERRIDES: filename}) + break + else: + return False + + for f in os.listdir(consts.ALTERNATE_HELM_CHART_DIR): + if consts.HELM_CHART_POSTFIX in str(f): + filename = os.path.join(consts.ALTERNATE_HELM_CHART_DIR, f) + payload.update({consts.DEPLOY_CHART: filename}) + break + else: + return False + return True + + def get_common_deploy_files(payload, software_version): missing_deploy_files = [] for f in consts.DEPLOY_COMMON_FILE_OPTIONS: @@ -762,9 +789,14 @@ def get_common_deploy_files(payload, software_version): else: payload.update({f: os.path.join(dir_path, filename)}) if missing_deploy_files: - missing_deploy_files_str = ', '.join(missing_deploy_files) - msg = _("Missing required deploy files: %s" % missing_deploy_files_str) - pecan.abort(400, msg) + if check_deploy_files_in_alternate_location(payload): + payload.update({'user_uploaded_artifacts': False}) + else: + missing_deploy_files_str = ', '.join(missing_deploy_files) + msg = _("Missing required deploy files: %s" % missing_deploy_files_str) + pecan.abort(400, msg) + else: + payload.update({'user_uploaded_artifacts': True}) def validate_subcloud_name_availability(context, subcloud_name): diff --git a/distributedcloud/dcmanager/manager/subcloud_manager.py b/distributedcloud/dcmanager/manager/subcloud_manager.py index b1848323e..afa02afcb 100644 --- a/distributedcloud/dcmanager/manager/subcloud_manager.py +++ b/distributedcloud/dcmanager/manager/subcloud_manager.py @@ -1967,6 +1967,8 @@ class SubcloudManager(manager.Manager): payload[consts.DEPLOY_CHART] payload['deploy_values']['deployment_manager_overrides'] = \ payload[consts.DEPLOY_OVERRIDES] + payload['deploy_values']['user_uploaded_artifacts'] = \ + payload["user_uploaded_artifacts"] self._write_deploy_files(payload, subcloud_name) def _delete_subcloud_routes(self, keystone_client, subcloud): diff --git a/distributedcloud/dcmanager/tests/unit/common/test_phased_subcloud_deploy.py b/distributedcloud/dcmanager/tests/unit/common/test_phased_subcloud_deploy.py new file mode 100644 index 000000000..15f14c07d --- /dev/null +++ b/distributedcloud/dcmanager/tests/unit/common/test_phased_subcloud_deploy.py @@ -0,0 +1,53 @@ +# +# Copyright (c) 2023 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# + +import mock +import os + + +@mock.patch.object(os, 'listdir') +def test_check_deploy_files_in_alternate_location_with_all_file_exists(self, mock_os_isdir, mock_os_listdir): + payload = {} + mock_os_isdir.return_value = True + mock_os_listdir.return_value = ['deploy-chart-fake-deployment-manager.tgz', + 'deploy-overrides-fake-overrides-subcloud.yaml', + 'deploy-playbook-fake-deployment-manager.yaml'] + + response = self.check_deploy_files_in_alternate_location(payload) + self.assertEqual(response, True) + + +def test_check_deploy_files_in_alternate_location_with_deploy_chart_not_exists(self, mock_os_isdir, mock_os_listdir): + payload = {} + mock_os_isdir.return_value = True + mock_os_listdir.return_value = ['deploy-chart-fake.tgz', + 'deploy-overrides-fake-overrides-subcloud.yaml', + 'deploy-playbook-fake-deployment-manager.yaml'] + + response = self.check_deploy_files_in_alternate_location(payload) + self.assertEqual(response, False) + + +def test_check_deploy_files_in_alternate_location_with_deploy_overrides_not_exists(self, mock_os_isdir, mock_os_listdir): + payload = {} + mock_os_isdir.return_value = True + mock_os_listdir.return_value = ['deploy-chart-fake-deployment-manager.tgz', + 'deploy-overrides.yaml', + 'deploy-playbook-fake-deployment-manager.yaml'] + + response = self.check_deploy_files_in_alternate_location(payload) + self.assertEqual(response, False) + + +def test_check_deploy_files_in_alternate_location_with_deploy_playbook_not_exists(self, mock_os_isdir, mock_os_listdir): + payload = {} + mock_os_isdir.return_value = True + mock_os_listdir.return_value = ['deploy-chart-fake-deployment-manager.tgz', + 'deploy-overrides-fake-overrides-subcloud.yaml', + 'deploy-playbook.yaml'] + + response = self.check_deploy_files_in_alternate_location(payload) + self.assertEqual(response, False) diff --git a/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py b/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py index 23513be3b..e60249e20 100644 --- a/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py +++ b/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py @@ -725,7 +725,8 @@ class TestSubcloudManager(base.DCManagerTestCase): "deploy_playbook": "test_playbook.yaml", "deploy_overrides": "test_overrides.yaml", "deploy_chart": "test_chart.yaml", - "deploy_config": "subcloud1.yaml"} + "deploy_config": "subcloud1.yaml", + "user_uploaded_artifacts": True} # Create subcloud in DB subcloud = self.create_subcloud_static(self.ctx, name=payload['name'])