summaryrefslogtreecommitdiffstats
path: root/helm/plugin/tests
diff options
context:
space:
mode:
Diffstat (limited to 'helm/plugin/tests')
-rw-r--r--helm/plugin/tests/__init__.py30
-rw-r--r--helm/plugin/tests/blueprint/blueprint.yaml85
-rw-r--r--helm/plugin/tests/blueprint/plugin/test_plugin.yaml139
-rw-r--r--helm/plugin/tests/test_plugin.py192
4 files changed, 446 insertions, 0 deletions
diff --git a/helm/plugin/tests/__init__.py b/helm/plugin/tests/__init__.py
new file mode 100644
index 0000000..230e4c9
--- /dev/null
+++ b/helm/plugin/tests/__init__.py
@@ -0,0 +1,30 @@
+# ================================================================================
+# Copyright (c) 2014 GigaSpaces Technologies Ltd. All rights reserved
+# Copyright (c) 2017-2020 AT&T Intellectual Property. 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.
+# ============LICENSE_END=========================================================
+#
+#
+#
+# Copyright (c) 2017-2020 AT&T Intellectual Property. All rights reserved.
+# ===================================================================
+# Licensed under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+# https://creativecommons.org/licenses/by/4.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.
diff --git a/helm/plugin/tests/blueprint/blueprint.yaml b/helm/plugin/tests/blueprint/blueprint.yaml
new file mode 100644
index 0000000..2a7198d
--- /dev/null
+++ b/helm/plugin/tests/blueprint/blueprint.yaml
@@ -0,0 +1,85 @@
+# DSL version, should appear in the main blueprint.yaml
+# and may appear in other imports. In such case, the versions must match
+tosca_definitions_version: cloudify_dsl_1_3
+
+imports:
+ # importing cloudify related types, plugins, workflow, etc...
+ # to speed things up, it is possible downloading this file,
+ # including it in the blueprint directory and importing it
+ # instead.
+ - http://www.getcloudify.org/spec/cloudify/4.1.1/types.yaml
+ # relative import of plugin.yaml that resides in the blueprint directory
+ - plugin/test_plugin.yaml
+
+inputs:
+ # example input that could be injected by test
+ test_input:
+ description: an input for the test
+ default: default_test_input
+ tiller-server-ip:
+ default: 1.1.1.1
+ tiller-server-port:
+ default: 8888
+ namespace:
+ default: onap
+ chart-repo-url:
+ default: local
+ chart-version :
+ default: 2.0.0
+ jsonConfig:
+ default: ''
+ config-url:
+ default: ''
+ config-set:
+ default: ''
+ config-format:
+ default: 'json'
+ tls-enable:
+ type: boolean
+ default: false
+ config-dir:
+ type: string
+ default: './'
+ repo-user:
+ type: string
+ default: ''
+ repo-user-password:
+ type: string
+ default: ''
+ stable-repo-url:
+ type: string
+ default: 'http://0.0.0.0/stable'
+
+
+node_templates:
+ # defining a single node template that will serve as our test node
+ test_node:
+ # using base cloudify type
+ type: onap.nodes.component
+ properties:
+ tiller_ip: { get_input: tiller-server-ip }
+ tiller_port: { get_input: tiller-server-port }
+ component_name: test_node
+ chart_repo_url: { get_input: chart-repo-url }
+ chart_version: { get_input: chart-version }
+ namespace: { get_input: namespace }
+ config: { get_input: jsonConfig}
+ config_set: { get_input: config-set}
+ config_url: { get_input: config-url}
+ repo_user: { get_input: repo-user}
+ repo_user_password: { get_input: repo-user-password}
+ config_format: { get_input: config-format}
+ tls_enable: { get_input: tls-enable}
+ ca: "result of get_secret ca_value"
+ cert: "result of get_secret cert_value"
+ key: "result of get_secret key_value"
+ config_dir: { get_input: config-dir}
+ stable_repo_url: { get_input: stable-repo-url}
+
+outputs:
+ # example output the could be used to simplify assertions by test
+ test_output:
+ description: an output for the test
+ value:
+ helm-value: { get_attribute: [test_node, current-helm-value] }
+ helm-history: { get_attribute: [test_node, helm-history] }
diff --git a/helm/plugin/tests/blueprint/plugin/test_plugin.yaml b/helm/plugin/tests/blueprint/plugin/test_plugin.yaml
new file mode 100644
index 0000000..e9f874f
--- /dev/null
+++ b/helm/plugin/tests/blueprint/plugin/test_plugin.yaml
@@ -0,0 +1,139 @@
+# ============LICENSE_START==========================================
+# ===================================================================
+# Copyright (c) 2017-2020 AT&T
+#
+# 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.
+#============LICENSE_END============================================
+
+plugins:
+ helm-plugin:
+ executor: central_deployment_agent
+ package_name: helm
+ install: false
+
+node_types:
+
+ onap.nodes.component:
+ derived_from: cloudify.nodes.Root
+ properties:
+ tiller_ip:
+ description: IP of tiller server
+ type: string
+ tiller_port:
+ default: local
+ description: Port of tiller server
+ type: string
+ chart_repo_url:
+ default: local
+ description: helm chart repo url
+ type: string
+ component_name:
+ description: onap component string
+ type: string
+ chart_version:
+ description: helm chart version
+ type: string
+ config_dir:
+ description: config file dir
+ default: '/opt/manager/resources/'
+ type: string
+ namespace:
+ description: k8s namespace
+ default: onap
+ config:
+ description: String format config file
+ type: string
+ default: ''
+ config_set:
+ description: String format config file
+ type: string
+ default: ''
+ config_url:
+ description: String format config file url
+ type: string
+ default: ''
+ config_format:
+ description: String format config file format
+ type: string
+ default: 'json'
+ runtime_config:
+ default: ''
+ description: String format json object. To save the runtime config generate from other nodes.
+ tls_enable:
+ description: enable helm TSL
+ type: boolean
+ default: false
+ ca:
+ description: value of ca.pem
+ type: string
+ default: ''
+ cert:
+ description: value of cert.pem
+ type: string
+ default: ''
+ key:
+ description: value of key.pem
+ type: string
+ default: ''
+ stable_repo_url:
+ description: URL for stable repository
+ type: string
+ default: 'https://kubernetes-charts.storage.googleapis.com'
+ repo_user:
+ type: string
+ default: ''
+ repo_user_password:
+ type: string
+ default: ''
+
+
+ interfaces:
+ cloudify.interfaces.lifecycle:
+ configure: helm-plugin.plugin.tasks.config
+ start: helm-plugin.plugin.tasks.start
+ stop: helm-plugin.plugin.tasks.stop
+ upgrade: helm-plugin.plugin.tasks.upgrade
+ rollback: helm-plugin.plugin.tasks.rollback
+
+
+workflows:
+ upgrade:
+ mapping: helm-plugin.plugin.workflows.upgrade
+ parameters:
+ node_instance_id:
+ description: The id of the node-instance that you want to modify.
+ config_set:
+ description: The set option string
+ default: ''
+ config:
+ description: The changes to the new config json
+ default: ''
+ config_url:
+ description: The config input url
+ default: ''
+ config_format:
+ description: The config url input format
+ default: 'json'
+ chart_version:
+ description: chart version
+ chart_repo_url:
+ description: chart repo url
+ rollback:
+ mapping: helm-plugin.plugin.workflows.rollback
+ parameters:
+ node_instance_id:
+ description: The id of the node-instance that you want to modify.
+ default: 'node_instance_id'
+ revision:
+ description: Check the node runtime property history, find the revision number you want to rollback to
+ default: 1
diff --git a/helm/plugin/tests/test_plugin.py b/helm/plugin/tests/test_plugin.py
new file mode 100644
index 0000000..e18475a
--- /dev/null
+++ b/helm/plugin/tests/test_plugin.py
@@ -0,0 +1,192 @@
+# ============LICENSE_START==========================================
+# ===================================================================
+# Copyright (c) 2018-2020 AT&T
+#
+# 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.
+# ============LICENSE_END============================================
+
+
+from os import path
+import unittest
+import mock
+import plugin.tasks
+
+from cloudify.test_utils import workflow_test
+from cloudify.mocks import MockNodeInstanceContext
+from cloudify.mocks import MockCloudifyContext
+from cloudify.state import current_ctx
+from cloudify import ctx
+
+
+class TestPlugin(unittest.TestCase):
+
+ @workflow_test(path.join('blueprint', 'blueprint.yaml'),
+ resources_to_copy=[(path.join('blueprint', 'plugin',
+ 'test_plugin.yaml'),
+ 'plugin')])
+ @mock.patch('plugin.tasks.os.remove')
+ @mock.patch('plugin.tasks.execute_command')
+ def test_stop(self, cfy_local, mock_execute_command, mock_os_remove):
+ # execute install workflow
+ """
+
+ :param cfy_local:
+ """
+ with mock.patch('plugin.tasks.shutil.rmtree'):
+ cfy_local.execute('uninstall', task_retries=0)
+
+ # extract single node instance
+ instance = cfy_local.storage.get_node_instances()[0]
+
+ mock_execute_command.assert_called_with('helm delete --purge onap-test_node --host 1.1.1.1:8888 ')
+
+ @workflow_test(path.join('blueprint', 'blueprint.yaml'),
+ resources_to_copy=[(path.join('blueprint', 'plugin',
+ 'test_plugin.yaml'),
+ 'plugin')])
+ @mock.patch('plugin.tasks.execute_command')
+ def test_start(self, cfy_local, mock_execute_command):
+ # execute install workflow
+ """
+
+ :param cfy_local:
+ """
+ with mock.patch('plugin.tasks.config'):
+ with mock.patch('plugin.tasks.get_current_helm_value'):
+ with mock.patch('plugin.tasks.get_helm_history'):
+ cfy_local.execute('install', task_retries=0)
+
+ # extract single node instance
+ instance = cfy_local.storage.get_node_instances()[0]
+
+ mock_execute_command.assert_called_with('helm install local/test_node-2.0.0.tgz --name onap-test_node --namespace onap --host 1.1.1.1:8888 ')
+
+ @workflow_test(path.join('blueprint', 'blueprint.yaml'),
+ resources_to_copy=[(path.join('blueprint', 'plugin',
+ 'test_plugin.yaml'),
+ 'plugin')])
+ @mock.patch('plugin.tasks.execute_command')
+ def test_config(self, cfy_local, mock_execute_command):
+ # execute install workflow
+ """
+
+ :param cfy_local:
+ """
+ with mock.patch('plugin.tasks.start'):
+ cfy_local.execute('install', task_retries=0)
+
+ # extract single node instance
+ instance = cfy_local.storage.get_node_instances()[0]
+
+ mock_execute_command.assert_called_with('helm init --client-only --stable-repo-url http://0.0.0.0/stable')
+
+ @workflow_test(path.join('blueprint', 'blueprint.yaml'),
+ resources_to_copy=[(path.join('blueprint', 'plugin',
+ 'test_plugin.yaml'),
+ 'plugin')])
+ def test_rollback(self, cfy_local):
+ # execute install workflow
+ """
+
+ :param cfy_local:
+ """
+ node_instance_id = 'node_instance_id'
+ revision = 1
+ try:
+ cfy_local.execute('rollback', task_retries=0,
+ parameters={'node_instance_id': node_instance_id, 'revision': revision})
+ self.fail('Expected exception due to operation not exist')
+ except Exception as e:
+ self.assertTrue('operation not available')
+
+ @workflow_test(path.join('blueprint', 'blueprint.yaml'),
+ resources_to_copy=[(path.join('blueprint', 'plugin',
+ 'test_plugin.yaml'),
+ 'plugin')])
+ def test_upgrade(self, cfy_local):
+ # execute install workflow
+ """
+
+ :param cfy_local:
+ """
+ node_instance_id = 'node_instance_id'
+ config_json = ''
+ config_url = 'http://test:test@11.22.33.44:80/stable'
+ config_format = 'json'
+ chartVersion = '2.0.0'
+ chartRepo = 'repo'
+ repo_user = ''
+ repo_user_passwd = ''
+ try:
+ cfy_local.execute('upgrade', task_retries=0,
+ parameters={'node_instance_id': node_instance_id, 'config': config_json,
+ 'config_url': config_url, 'config_format': config_format,
+ 'chart_version': chartVersion, 'chart_repo_url': chartRepo,
+ 'repo_user': repo_user, 'repo_user_password': repo_user_passwd})
+ self.fail('Expected exception due to operation not exist')
+ except Exception as e:
+ self.assertTrue('operation not available')
+
+ @mock.patch('plugin.tasks.execute_command')
+ def test_op_rollback(self, mock_execute_command):
+ # test operation rollback
+ """
+
+ :rollback operation test:
+ """
+ props = {
+ 'component_name': 'test_node',
+ 'namespace': 'onap',
+ 'tiller_port': '8888',
+ 'tiller_ip': '1.1.1.1',
+ 'tls_enable': 'false'
+ }
+ args = {'revision': '1'}
+ mock_ctx = MockCloudifyContext(node_id='test_node_id', node_name='test_node_name',
+ properties=props)
+ try:
+ current_ctx.set(mock_ctx)
+ with mock.patch('plugin.tasks.get_current_helm_value'):
+ with mock.patch('plugin.tasks.get_helm_history'):
+ plugin.tasks.rollback(**args)
+ finally:
+ current_ctx.clear()
+
+ @mock.patch('plugin.tasks.execute_command')
+ def test_op_upgrade(self, mock_execute_command):
+ # test operation upgrade
+ """
+
+ :upgrade operation test:
+ """
+ props = {
+ 'component_name': 'test_node',
+ 'namespace': 'onap',
+ 'tiller_port': '8888',
+ 'tiller_ip': '1.1.1.1',
+ 'tls_enable': 'false',
+ 'config_dir': '/tmp'
+ }
+ args = {'revision': '1', 'config': '', 'chart_repo': 'repo', 'chart_version': '2',
+ 'config_set': 'config_set', 'config_json': '', 'config_url': '',
+ 'config_format': 'format', 'repo_user': '', 'repo_user_passwd': ''}
+ mock_ctx = MockCloudifyContext(node_id='test_node_id', node_name='test_node_name',
+ properties=props)
+ try:
+ current_ctx.set(mock_ctx)
+ with mock.patch('plugin.tasks.get_current_helm_value'):
+ with mock.patch('plugin.tasks.get_helm_history'):
+ with mock.patch('plugin.tasks.gen_config_str'):
+ plugin.tasks.upgrade(**args)
+ finally:
+ current_ctx.clear()