aboutsummaryrefslogtreecommitdiffstats
path: root/INFO
blob: c19a9d5185495c7bf94b86123c61f19efce5f790 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Project: Test framework for verifying infrastructure compliance (yardstick)
Project Creation Date: April 28th, 2015
Project Category: Integration & Testing
Lifecycle State: Incubation
Primary Contact: ross.b.brattain@intel.com
Project Lead: ross.b.brattain@intel.com
Jira Project Name: Infrastructure Verification
Jira Project Prefix: Yardstick
Mailing list tag: [Yardstick]
IRC: #opnfv-yardstick
Repository: yardstick

Committers:
jorgen.w.karlsson@ericsson.com
jean.gaoliang@huawei.com
vincenzo.m.riccobene@intel.com
lvjing5@huawei.com
wu.zhihui1@zte.com.cn
14_ykl@tongji.edu.cn
limingjiang@huawei.com
trevor.cooper@intel.com
ross.b.brattain@intel.com

Link to TSC approval: http://meetbot.opnfv.org/meetings/
Link to approval of additional submitters:
Link to approval of new PTL: Done via Condorcet Internet Voting Service, avaliable from Raymond Piak
' href='#n194'>194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
#    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 json
import mock
from mock import patch

from toscaparser.nodetemplate import NodeTemplate
from toscaparser.tests.base import TestCase
from toscaparser.utils.gettextutils import _
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]
        try:
            nodetemplate = NodeTemplate(name, nodetemplates)
            nodetemplate.validate()
            toscacompute = ToscaCompute(nodetemplate)
            toscacompute.handle_properties()
            if not self._compare_properties(toscacompute.properties,
                                            expectedprops):
                raise Exception(_("Hot Properties are not"
                                  " same as expected properties"))
        except Exception:
            # for time being rethrowing. Will be handled future based
            # on new development in Glance and Graffiti
            raise

    def _compare_properties(self, hotprops, expectedprops):
        return all(item in hotprops.items() for item in expectedprops.items())

    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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        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',
                         'software_config_transport': 'POLL_SERVER_HEAT'}
        self._tosca_compute_test(
            tpl_snippet,
            expectedprops)

    @patch('requests.post')
    @patch('requests.get')
    @patch('os.getenv')
    def test_node_compute_with_nova_flavor(self, mock_os_getenv,
                                           mock_get, mock_post):
        tpl_snippet = '''
        node_templates:
          server:
            type: tosca.nodes.Compute
            capabilities:
              host:
                properties:
                  num_cpus: 1
                  disk_size: 1 GB
                  mem_size: 1 GB
        '''
        with patch('translator.common.utils.'
                   'check_for_env_variables') as mock_check_env:
            mock_check_env.return_value = True
            mock_os_getenv.side_effect = ['demo', 'demo',
                                          'demo', 'http://abc.com/5000/',
                                          'demo', 'demo',
                                          'demo', 'http://abc.com/5000/']
            mock_ks_response = mock.MagicMock()
            mock_ks_response.status_code = 200
            mock_ks_content = {
                'access': {
                    'token': {
                        'id': 'd1dfa603-3662-47e0-b0b6-3ae7914bdf76'
                    },
                    'serviceCatalog': [{
                        'type': 'compute',
                        'endpoints': [{
                            'publicURL': 'http://abc.com'
                        }]
                    }]
                }
            }
            mock_ks_response.content = json.dumps(mock_ks_content)
            mock_nova_response = mock.MagicMock()
            mock_nova_response.status_code = 200
            mock_flavor_content = {
                'flavors': [{
                    'name': 'm1.mock_flavor',
                    'ram': 1024,
                    'disk': 1,
                    'vcpus': 1
                }]
            }
            mock_nova_response.content = \
                json.dumps(mock_flavor_content)
            mock_post.return_value = mock_ks_response
            mock_get.return_value = mock_nova_response
            expectedprops = {'flavor': 'm1.mock_flavor',
                             'image': None,
                             'user_data_format': 'SOFTWARE_CONFIG',
                             'software_config_transport': 'POLL_SERVER_HEAT'}
            self._tosca_compute_test(
                tpl_snippet,
                expectedprops)

    @patch('requests.post')
    @patch('requests.get')
    @patch('os.getenv')
    def test_node_compute_without_nova_flavor(self, mock_os_getenv,
                                              mock_get, mock_post):
        tpl_snippet = '''
        node_templates:
          server:
            type: tosca.nodes.Compute
            capabilities:
              host:
                properties:
                  num_cpus: 1
                  disk_size: 1 GB
                  mem_size: 1 GB
        '''
        with patch('translator.common.utils.'
                   'check_for_env_variables') as mock_check_env:
            mock_check_env.return_value = True
            mock_os_getenv.side_effect = ['demo', 'demo',
                                          'demo', 'http://abc.com/5000/']
            mock_ks_response = mock.MagicMock()
            mock_ks_content = {}
            mock_ks_response.content = json.dumps(mock_ks_content)
            expectedprops = {'flavor': 'm1.small',
                             'image': None,
                             'user_data_format': 'SOFTWARE_CONFIG',
                             'software_config_transport': 'POLL_SERVER_HEAT'}
            self._tosca_compute_test(
                tpl_snippet,
                expectedprops)