diff --git a/cloudify_kubernetes/tests/test_utils.py b/cloudify_kubernetes/tests/test_utils.py index 0bc2f95..8c06077 100644 --- a/cloudify_kubernetes/tests/test_utils.py +++ b/cloudify_kubernetes/tests/test_utils.py @@ -14,7 +14,9 @@ import os import json +import shutil import unittest +from tempfile import mkdtemp from mock import (MagicMock, mock_open, patch) from cloudify.state import current_ctx @@ -54,6 +56,35 @@ class TestUtils(unittest.TestCase): + @patch('cloudify_kubernetes.utils.get_node_instance_dir') + @patch('cloudify_common_sdk.utils.get_deployment_dir') + def test_set_directory_path(self, *args, **__): + get_node_instance_dir = args[1] + test_dir1 = mkdtemp() + get_node_instance_dir.return_value = test_dir1 + + some_directory = 'github.com/kubernetes-sigs/aws-ebs-csi-driver/' \ + 'deploy/kubernetes/overlays/stable/?ref=release-1.14' + listdir = ['cloudbuild.yaml', 'hack', 'tests', 'SECURITY_CONTACTS', + 'LICENSE', 'README.md', 'examples', 'docs', 'CHANGELOG.md', + 'code-of-conduct.md', 'deploy', 'cmd', 'THIRD-PARTY', + 'go.mod', 'Dockerfile', 'charts', 'Makefile', 'go.sum', + 'NOTICE', 'CONTRIBUTING.md', 'pkg', 'OWNERS'] + + result = utils.set_directory_path(some_directory, + target_path=test_dir1) + self.assertEqual(sorted(os.listdir(result)), sorted(listdir)) + shutil.rmtree(test_dir1) + + def test_get_archive_from_github_url(*_, **__): + some_directory = 'github.com/kubernetes-sigs/aws-ebs-csi-driver' \ + '/deploy/kubernetes/overlays/stable/?ref=release-1.14' + fake_git_url = 'https://github.com/kubernetes-sigs/' \ + 'aws-ebs-csi-driver/archive/refs/heads/release-1.14.zip' + + resalt = utils.get_archive_from_github_url(some_directory) + assert resalt == fake_git_url + def _assert_mapping(self, mapping): self.assertTrue( isinstance( diff --git a/cloudify_kubernetes/utils.py b/cloudify_kubernetes/utils.py index dcf82bc..283c981 100644 --- a/cloudify_kubernetes/utils.py +++ b/cloudify_kubernetes/utils.py @@ -16,6 +16,7 @@ import sys import json from deepdiff import DeepDiff +from urllib.parse import urlparse from tempfile import NamedTemporaryFile from collections import ( Mapping, @@ -36,6 +37,11 @@ RELATIONSHIP_INSTANCE = 'relationship-instance' from cloudify_kubernetes_sdk.state import Resource +from cloudify_common_sdk.utils import (get_node_instance_dir, + copy_directory, + remove_directory + ) +from cloudify_common_sdk.resource_downloader import get_shared_resource from cloudify_azure_sdk.client import AKSConnection from ._compat import text_type @@ -69,6 +75,7 @@ 'cloudify.nodes.azure.compute.ManagedCluster'] CLUSTER_REL = 'cloudify.relationships.kubernetes.connected_to_shared_cluster' DEFINITION_ADDITIONS = 'definitions_additions' +ARCHIVE_PATH = 'https://{}/archive/refs/heads/{}.zip' def merge_definitions(old, new): @@ -778,3 +785,36 @@ def update_with_additions(resource_definition, additions): def check_drift(previous, current): return DeepDiff(Resource(previous).state, Resource(current).state) + + +def get_archive_from_github_url(path): + parsed = urlparse(path) + if parsed.path.startswith('github'): + folder_path = '/'.join(parsed.path.split('/')[0:3]) + branch = parsed.query.split('=')[-1] + download_url = ARCHIVE_PATH.format(folder_path, branch) + return download_url + else: + raise NonRecoverableError( + 'Unsupported argument: {}.' + 'for Kustomize directory. ' + 'At the moment, only Github refs are supported'.format(path)) + + +def set_directory_path(dir_path=None, target_path=None): + if not dir_path: + dir_path = ctx.node.properties['kustomize'] + + if not target_path: + target_path = get_node_instance_dir() + if 'github' in dir_path.split('/')[0]: + download_url = get_archive_from_github_url(dir_path) + tmp_file = get_shared_resource(download_url) + copy_directory(tmp_file, target_path) + remove_directory(tmp_file) + else: + raise NonRecoverableError( + 'Unsupported argument: {}. ' + 'for Kustomize directory. ' + 'At the moment, only Github refs are supported'.format(dir_path)) + return target_path diff --git a/plugin.yaml b/plugin.yaml index 105b9d8..01bfe4d 100644 --- a/plugin.yaml +++ b/plugin.yaml @@ -689,6 +689,30 @@ node_types: cloudify.kubernetes.resources.CustomBlueprintDefinedResource: derived_from: cloudify.nodes.kubernetes.resources.CustomBlueprintDefinedResource + cloudify.nodes.kubernetes.resources.Kustomize: + derived_from: cloudify.kubernetes.resources.ResourceWithValidateStatus + properties: + kustomize: + type: string + description: > + A path to YAML file containing the resource definition. + allow_node_redefinition: + type: boolean + description: > + Permit changing the name and kind and number of resources defined in file. + default: false + interfaces: + cloudify.interfaces.validation: + check_status: + implementation: kubernetes.cloudify_kubernetes.tasks.kustomize_check_status + check_drift: + implementation: kubernetes.cloudify_kubernetes.tasks.kustomize_check_drift + cloudify.interfaces.lifecycle: + create: + implementation: kubernetes.cloudify_kubernetes.tasks.create_kustomize + delete: + implementation: kubernetes.cloudify_kubernetes.tasks.delete_kustomize + cloudify.nodes.kubernetes.resources.FileDefinedResource: derived_from: cloudify.kubernetes.resources.ResourceWithValidateStatus properties: diff --git a/plugin_1_4.yaml b/plugin_1_4.yaml index 7200279..b9ae0cd 100644 --- a/plugin_1_4.yaml +++ b/plugin_1_4.yaml @@ -689,6 +689,30 @@ node_types: cloudify.kubernetes.resources.CustomBlueprintDefinedResource: derived_from: cloudify.nodes.kubernetes.resources.CustomBlueprintDefinedResource + cloudify.nodes.kubernetes.resources.Kustomize: + derived_from: cloudify.kubernetes.resources.ResourceWithValidateStatus + properties: + kustomize: + type: string + description: > + A path to YAML file containing the resource definition. + allow_node_redefinition: + type: boolean + description: > + Permit changing the name and kind and number of resources defined in file. + default: false + interfaces: + cloudify.interfaces.validation: + check_status: + implementation: kubernetes.cloudify_kubernetes.tasks.kustomize_check_status + check_drift: + implementation: kubernetes.cloudify_kubernetes.tasks.kustomize_check_drift + cloudify.interfaces.lifecycle: + create: + implementation: kubernetes.cloudify_kubernetes.tasks.create_kustomize + delete: + implementation: kubernetes.cloudify_kubernetes.tasks.delete_kustomize + cloudify.nodes.kubernetes.resources.FileDefinedResource: derived_from: cloudify.kubernetes.resources.ResourceWithValidateStatus properties: diff --git a/v2_plugin.yaml b/v2_plugin.yaml index 3cab588..10da335 100644 --- a/v2_plugin.yaml +++ b/v2_plugin.yaml @@ -689,6 +689,30 @@ node_types: cloudify.kubernetes.resources.CustomBlueprintDefinedResource: derived_from: cloudify.nodes.kubernetes.resources.CustomBlueprintDefinedResource + cloudify.nodes.kubernetes.resources.Kustomize: + derived_from: cloudify.kubernetes.resources.ResourceWithValidateStatus + properties: + kustomize: + type: string + description: > + A path to YAML file containing the resource definition. + allow_node_redefinition: + type: boolean + description: > + Permit changing the name and kind and number of resources defined in file. + default: false + interfaces: + cloudify.interfaces.validation: + check_status: + implementation: kubernetes.cloudify_kubernetes.tasks.kustomize_check_status + check_drift: + implementation: kubernetes.cloudify_kubernetes.tasks.kustomize_check_drift + cloudify.interfaces.lifecycle: + create: + implementation: kubernetes.cloudify_kubernetes.tasks.create_kustomize + delete: + implementation: kubernetes.cloudify_kubernetes.tasks.delete_kustomize + cloudify.nodes.kubernetes.resources.FileDefinedResource: derived_from: cloudify.kubernetes.resources.ResourceWithValidateStatus properties: