Allow calling template validate and template add with a string
Vitrage template add and template validate can now be called with either a path or a string that holds the template yaml. Change-Id: Ieaa372e92d201b46124163b164cc868ae35c86b2 Story: 2004055 Task: 27061
This commit is contained in:
parent
bde2d05710
commit
ecd027535d
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Added an option to add templates to Vitrage by a string that holds the
|
||||||
|
template yaml, and not only by a file path.
|
16
vitrageclient/tests/resources/template1.yaml
Normal file
16
vitrageclient/tests/resources/template1.yaml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
metadata:
|
||||||
|
version: 3
|
||||||
|
name: template1
|
||||||
|
description: simple template
|
||||||
|
type: standard
|
||||||
|
entities:
|
||||||
|
alarm:
|
||||||
|
name: cpu problem
|
||||||
|
host:
|
||||||
|
type: nova.host
|
||||||
|
scenarios:
|
||||||
|
- condition: alarm [ on ] host
|
||||||
|
actions:
|
||||||
|
- set_state:
|
||||||
|
state: ERROR
|
||||||
|
target: host
|
78
vitrageclient/tests/test_template.py
Normal file
78
vitrageclient/tests/test_template.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# Copyright 2019 - Nokia
|
||||||
|
#
|
||||||
|
# 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 mock
|
||||||
|
from oslotest import base
|
||||||
|
|
||||||
|
from vitrageclient import exceptions as exc
|
||||||
|
from vitrageclient.tests.utils import get_resources_dir
|
||||||
|
from vitrageclient.v1.template import Template
|
||||||
|
|
||||||
|
TEMPLATE_STRING = """
|
||||||
|
metadata:
|
||||||
|
version: 3
|
||||||
|
name: template1
|
||||||
|
description: simple template
|
||||||
|
type: standard
|
||||||
|
entities:
|
||||||
|
alarm:
|
||||||
|
name: cpu problem
|
||||||
|
host:
|
||||||
|
type: nova.host
|
||||||
|
scenarios:
|
||||||
|
- condition: alarm [ on ] host
|
||||||
|
actions:
|
||||||
|
- set_state:
|
||||||
|
state: ERROR
|
||||||
|
target: host
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TestTemplate(base.BaseTestCase):
|
||||||
|
|
||||||
|
def test_validate_by_path(self):
|
||||||
|
template_path = get_resources_dir() + '/template1.yaml'
|
||||||
|
template = Template(mock.Mock())
|
||||||
|
template.validate(path=template_path)
|
||||||
|
|
||||||
|
def test_validate_by_nonexisting_path(self):
|
||||||
|
template = Template(mock.Mock())
|
||||||
|
self.assertRaises(IOError, template.validate,
|
||||||
|
path='non_existing_template_path.yaml')
|
||||||
|
|
||||||
|
def test_validate_by_template(self):
|
||||||
|
template = Template(mock.Mock())
|
||||||
|
template.validate(template_str=TEMPLATE_STRING)
|
||||||
|
|
||||||
|
def test_validate_by_nothing(self):
|
||||||
|
template = Template(mock.Mock())
|
||||||
|
self.assertRaises(exc.CommandError, template.validate)
|
||||||
|
|
||||||
|
def test_add_by_path(self):
|
||||||
|
template_path = get_resources_dir() + '/template1.yaml'
|
||||||
|
template = Template(mock.Mock())
|
||||||
|
template.add(path=template_path)
|
||||||
|
|
||||||
|
def test_add_by_nonexisting_path(self):
|
||||||
|
template = Template(mock.Mock())
|
||||||
|
self.assertRaises(IOError, template.add,
|
||||||
|
path='non_existing_template_path.yaml')
|
||||||
|
|
||||||
|
def test_add_by_template(self):
|
||||||
|
template = Template(mock.Mock())
|
||||||
|
template.add(template_str=TEMPLATE_STRING)
|
||||||
|
|
||||||
|
def test_add_by_nothing(self):
|
||||||
|
template = Template(mock.Mock())
|
||||||
|
self.assertRaises(exc.CommandError, template.add)
|
19
vitrageclient/tests/utils.py
Normal file
19
vitrageclient/tests/utils.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Copyright 2019 - Nokia
|
||||||
|
#
|
||||||
|
# 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 os import path
|
||||||
|
|
||||||
|
|
||||||
|
def get_resources_dir():
|
||||||
|
return path.join(path.dirname(__file__), 'resources')
|
@ -35,10 +35,22 @@ class Template(object):
|
|||||||
url = self.url + uuid
|
url = self.url + uuid
|
||||||
return self.api.get(url).json()
|
return self.api.get(url).json()
|
||||||
|
|
||||||
def add(self, path, template_type=None, params=None):
|
def add(self, path=None, template_str=None,
|
||||||
"""Add a new template"""
|
template_type=None, params=None):
|
||||||
|
"""Add a new template
|
||||||
|
|
||||||
files_content = self._load_yaml_files(path)
|
:param path: (optional) The template file path or templates dir path
|
||||||
|
:param template_str: (optional) A string representation of the template
|
||||||
|
yaml
|
||||||
|
Either path or template_str must exist (but not both)
|
||||||
|
|
||||||
|
:param template_type: (optional) The template type, in case it is not
|
||||||
|
written inside the template metadata section
|
||||||
|
:param params: (optional) Actual values for the template parameters
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
files_content = \
|
||||||
|
self._load_template(path=path, template_str=template_str)
|
||||||
api_params = dict(templates=files_content,
|
api_params = dict(templates=files_content,
|
||||||
template_type=template_type,
|
template_type=template_type,
|
||||||
params=params)
|
params=params)
|
||||||
@ -49,7 +61,8 @@ class Template(object):
|
|||||||
params = dict(uuid=uuid)
|
params = dict(uuid=uuid)
|
||||||
return self.api.delete(self.url, json=params).json()
|
return self.api.delete(self.url, json=params).json()
|
||||||
|
|
||||||
def validate(self, path, template_type=None, params=None):
|
def validate(self, path=None, template_str=None,
|
||||||
|
template_type=None, params=None):
|
||||||
"""Template validation
|
"""Template validation
|
||||||
|
|
||||||
Make sure that the template file is correct in terms of syntax
|
Make sure that the template file is correct in terms of syntax
|
||||||
@ -58,18 +71,25 @@ class Template(object):
|
|||||||
template, or directory path for validation of several templates (the
|
template, or directory path for validation of several templates (the
|
||||||
directory must contain only templates)
|
directory must contain only templates)
|
||||||
|
|
||||||
:param path: the template file path or templates dir path
|
:param path: (optional) The template file path or templates dir path
|
||||||
:param template_type: type of templates ('standard','definition',...)
|
:param template_str: (optional) A string representation of the template
|
||||||
:param params: (optional) actual values for the template parameters
|
yaml
|
||||||
"""
|
Either path or template_str must exist (but not both)
|
||||||
|
|
||||||
files_content = self._load_yaml_files(path)
|
:param template_type: (optional) The template type, in case it is not
|
||||||
|
written inside the template metadata section
|
||||||
|
:param params: (optional) Actual values for the template parameters
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
files_content = \
|
||||||
|
self._load_template(path=path, template_str=template_str)
|
||||||
api_params = dict(templates=files_content,
|
api_params = dict(templates=files_content,
|
||||||
template_type=template_type,
|
template_type=template_type,
|
||||||
params=params)
|
params=params)
|
||||||
return self.api.post(self.url, json=api_params).json()
|
return self.api.post(self.url, json=api_params).json()
|
||||||
|
|
||||||
def _load_yaml_files(self, path):
|
@classmethod
|
||||||
|
def _load_yaml_files(cls, path):
|
||||||
if os.path.isdir(path):
|
if os.path.isdir(path):
|
||||||
|
|
||||||
files_content = []
|
files_content = []
|
||||||
@ -77,20 +97,36 @@ class Template(object):
|
|||||||
|
|
||||||
file_path = '%s/%s' % (path, file_name)
|
file_path = '%s/%s' % (path, file_name)
|
||||||
if os.path.isfile(file_path):
|
if os.path.isfile(file_path):
|
||||||
template = self._load_yaml_file(file_path)
|
template = cls._load_yaml_file(file_path)
|
||||||
files_content.append((file_path, template))
|
files_content.append((file_path, template))
|
||||||
else:
|
else:
|
||||||
files_content = [(path, self._load_yaml_file(path))]
|
files_content = [(path, cls._load_yaml_file(path))]
|
||||||
|
|
||||||
return files_content
|
return files_content
|
||||||
|
|
||||||
@staticmethod
|
@classmethod
|
||||||
def _load_yaml_file(path):
|
def _load_yaml_file(cls, path):
|
||||||
|
|
||||||
with open(path, 'r') as stream:
|
with open(path, 'r') as stream:
|
||||||
|
return cls._load_yaml(stream)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _load_yaml(cls, yaml_content):
|
||||||
try:
|
try:
|
||||||
return yaml_utils.load(stream)
|
return yaml_utils.load(yaml_content)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
message = 'Could not load template file: %s. Reason: %s' \
|
message = 'Could not load template: %s. Reason: %s' \
|
||||||
% (path, e.message)
|
% (yaml_content, e.message)
|
||||||
raise exc.CommandError(message)
|
raise exc.CommandError(message)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _load_template(cls, path, template_str):
|
||||||
|
if path:
|
||||||
|
files_content = cls._load_yaml_files(path)
|
||||||
|
elif template_str:
|
||||||
|
files_content = [(None, cls._load_yaml(template_str))]
|
||||||
|
else:
|
||||||
|
raise exc.CommandError(
|
||||||
|
'Add template API must be called with either \'path\' or '
|
||||||
|
'\'template_str\'')
|
||||||
|
|
||||||
|
return files_content
|
||||||
|
Loading…
x
Reference in New Issue
Block a user