
The parser should not rely on the OS_* environment variables for authentication, as it will fail with more complex setups, when using the "clouds.yaml" configuration file or when being called through osc with arguments instead of environment variables. Moreover, the client should not use "requests" directly to do GETs to access the nova flavors and glance images, but it should use the existing clients. When used through the python-openstackclient it is possible to force the client to request authentication. The authentication will be handled by the client, so that the parser does not need to worry about it (so that authentication plugins can be used). Then, the existing authentication session can be reused for all the client interaction with OpenStack to fetch the flavor and images information. Change-Id: I9f65e7d46686c37bb44ef18756ebd295ee4961de
256 lines
8.5 KiB
Python
256 lines
8.5 KiB
Python
# 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 toscaparser.nodetemplate import NodeTemplate
|
|
from toscaparser.tests.base import TestCase
|
|
import toscaparser.utils.yamlparser
|
|
from translator.hot.tosca.tosca_compute import ToscaCompute
|
|
|
|
|
|
class ToscaComputeTest(TestCase):
|
|
|
|
def _tosca_compute_test(self, tpl_snippet, expectedprops):
|
|
nodetemplates = (toscaparser.utils.yamlparser.
|
|
simple_parse(tpl_snippet)['node_templates'])
|
|
name = list(nodetemplates.keys())[0]
|
|
nodetemplate = NodeTemplate(name, nodetemplates)
|
|
nodetemplate.validate()
|
|
toscacompute = ToscaCompute(nodetemplate)
|
|
toscacompute.handle_properties()
|
|
|
|
self.assertDictEqual(expectedprops, toscacompute.properties)
|
|
|
|
def test_node_compute_with_host_and_os_capabilities(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
host:
|
|
properties:
|
|
disk_size: 10 GB
|
|
num_cpus: 4
|
|
mem_size: 4 GB
|
|
os:
|
|
properties:
|
|
architecture: x86_64
|
|
type: Linux
|
|
distribution: Fedora
|
|
version: 18.0
|
|
'''
|
|
expectedprops = {'flavor': 'm1.large',
|
|
'image': 'fedora-amd64-heat-config',
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
def test_node_compute_without_os_capabilities(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
host:
|
|
properties:
|
|
disk_size: 10 GB
|
|
num_cpus: 4
|
|
mem_size: 4 GB
|
|
#left intentionally
|
|
'''
|
|
expectedprops = {'flavor': 'm1.large',
|
|
'image': None,
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
def test_node_compute_without_host_capabilities(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
os:
|
|
properties:
|
|
architecture: x86_64
|
|
type: Linux
|
|
distribution: Fedora
|
|
version: 18.0
|
|
'''
|
|
expectedprops = {'flavor': None,
|
|
'image': 'fedora-amd64-heat-config',
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
def test_node_compute_without_properties_and_os_capabilities(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
properties:
|
|
#left intentionally
|
|
capabilities:
|
|
#left intentionally
|
|
'''
|
|
expectedprops = {'flavor': None,
|
|
'image': None,
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
def test_node_compute_with_only_type(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
'''
|
|
expectedprops = {'flavor': None,
|
|
'image': None,
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
def test_node_compute_host_capabilities_without_properties(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
host:
|
|
properties:
|
|
#left intentionally
|
|
'''
|
|
expectedprops = {'flavor': None,
|
|
'image': None,
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
def test_node_compute_host_capabilities_without_disk_size(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
host:
|
|
properties:
|
|
num_cpus: 4
|
|
mem_size: 4 GB
|
|
'''
|
|
expectedprops = {'flavor': 'm1.large',
|
|
'image': None,
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
def test_node_compute_host_capabilities_without_mem_size(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
host:
|
|
properties:
|
|
num_cpus: 4
|
|
disk_size: 10 GB
|
|
'''
|
|
expectedprops = {'flavor': 'm1.large',
|
|
'image': None,
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
def test_node_compute_host_capabilities_without_mem_size_disk_size(self):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
host:
|
|
properties:
|
|
num_cpus: 4
|
|
'''
|
|
expectedprops = {'flavor': 'm1.large',
|
|
'image': None,
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(
|
|
tpl_snippet,
|
|
expectedprops)
|
|
|
|
@mock.patch('translator.common.flavors.get_flavors')
|
|
def test_node_compute_with_nova_flavor(self, mock_flavor):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
host:
|
|
properties:
|
|
num_cpus: 1
|
|
disk_size: 1 GB
|
|
mem_size: 1 GB
|
|
'''
|
|
mock_flavor.return_value = {
|
|
'm1.mock_flavor': {
|
|
'mem_size': 1024,
|
|
'disk_size': 1,
|
|
'num_cpus': 1}
|
|
}
|
|
expectedprops = {'flavor': 'm1.mock_flavor',
|
|
'image': None,
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(tpl_snippet, expectedprops)
|
|
|
|
@mock.patch('translator.common.images.get_images')
|
|
def test_node_compute_with_glance_image(self, mock_images):
|
|
tpl_snippet = '''
|
|
node_templates:
|
|
server:
|
|
type: tosca.nodes.Compute
|
|
capabilities:
|
|
host:
|
|
properties:
|
|
num_cpus: 1
|
|
disk_size: 1 GB
|
|
mem_size: 1 GB
|
|
os:
|
|
properties:
|
|
architecture: x86_64
|
|
type: Linux
|
|
distribution: Fake Distribution
|
|
version: 19.0
|
|
'''
|
|
mock_images.return_value = {
|
|
'fake-image-foobar': {'architecture': 'x86_64',
|
|
'type': 'Linux',
|
|
'distribution': 'Fake Distribution',
|
|
'version': '19.0'},
|
|
'fake-image-foobar-old': {'architecture': 'x86_64',
|
|
'type': 'Linux',
|
|
'distribution': 'Fake Distribution',
|
|
'version': '18.0'}
|
|
}
|
|
expectedprops = {'flavor': 'm1.small',
|
|
'image': 'fake-image-foobar',
|
|
'user_data_format': 'SOFTWARE_CONFIG'}
|
|
self._tosca_compute_test(tpl_snippet, expectedprops)
|