diff options
Diffstat (limited to 'ansible')
71 files changed, 2291 insertions, 1665 deletions
diff --git a/ansible/build_yardstick_image.yml b/ansible/build_yardstick_image.yml index 5f9158576..35d9da45e 100644 --- a/ansible/build_yardstick_image.yml +++ b/ansible/build_yardstick_image.yml @@ -87,6 +87,12 @@ - name: convert image to raw command: "qemu-img convert {{ image_dest }} {{ raw_imgfile }}" + - name: resize image to allow for more VNFs + command: "qemu-img resize -f raw {{ raw_imgfile }} +2G" + + - name: resize parition to allow for more VNFs + command: "parted -s -a optimal {{ raw_imgfile }} resizepart 1 100%" + - name: create mknod devices in chroot command: "mknod -m 0660 /dev/loop{{ item }} b 7 {{ item }}" args: @@ -124,6 +130,18 @@ - set_fact: image_fs_type: "{{ blkid_res.stdout.strip() }}" + - fail: + msg: "We only support ext4 image filesystems because we have to resize" + when: image_fs_type != "ext4" + + - name: fsck the image filesystem + command: "e2fsck -y -f {{ image_first_partition_device }}" + + - name: resize filesystem to full partition size + command: resize2fs {{ image_first_partition_device }} + + - name: fsck the image filesystem + command: "e2fsck -y -f {{ image_first_partition_device }}" - name: make tmp disposable fstab command: mktemp --tmpdir fake_fstab.XXXXXXXXXX diff --git a/ansible/filter_plugins/networks.py b/ansible/filter_plugins/networks.py index a1573951f..d67615a53 100644 --- a/ansible/filter_plugins/networks.py +++ b/ansible/filter_plugins/networks.py @@ -13,7 +13,10 @@ # limitations under the License. -from urlparse import urlsplit +try: + from urlparse import urlsplit +except ImportError: + from urllib.parse import urlsplit def do_prefix_to_netmask(arg): diff --git a/ansible/install_collectd.yml b/ansible/install_collectd.yml new file mode 100644 index 000000000..0824c1525 --- /dev/null +++ b/ansible/install_collectd.yml @@ -0,0 +1,30 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- hosts: all + vars: + clone_dir: /tmp/yardstick-clone + + roles: + # build shared DPDK for collectd only, required DPDK downloaded already + - role: download_dpdk + - install_dpdk_shared + - install_rabbitmq + - download_intel_cmt_cat + - install_intel_cmt_cat + - download_pmu_tools + - install_pmu_tools + - download_collectd + - install_collectd + diff --git a/ansible/library/find_kernel.py b/ansible/library/find_kernel.py index 4623bce89..c237baaf2 100644 --- a/ansible/library/find_kernel.py +++ b/ansible/library/find_kernel.py @@ -13,7 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os DOCUMENTATION = ''' --- diff --git a/ansible/library/my_make.py b/ansible/library/my_make.py deleted file mode 100644 index 35240851c..000000000 --- a/ansible/library/my_make.py +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# (c) 2015, Linus Unnebäck <linus@folkdatorn.se> -# -# This file is part of Ansible -# -# This module is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This software is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import absolute_import -DOCUMENTATION = ''' ---- -module: my_make -short_description: Run targets in a Makefile -requirements: [ make ] -version_added: "2.1" -author: Linus Unnebäck (@LinusU) <linus@folkdatorn.se> -description: - - Run targets in a Makefile. -options: - target: - description: - - The target to run - required: false - default: none - params: - description: - - Any extra parameters to pass to make - required: false - default: none - extra_args: - description: - - Any extra options to pass to make - required: false - default: none - chdir: - description: - - cd into this directory before running make - required: true -''' - -EXAMPLES = ''' -# Build the default target -- make: chdir=/home/ubuntu/cool-project - -# Run `install` target as root -- make: chdir=/home/ubuntu/cool-project target=install - become: yes - -# Pass in extra arguments to build -- make: - chdir: /home/ubuntu/cool-project - target: all - params: - NUM_THREADS: 4 - BACKEND: lapack -''' - -# TODO: Disabled the RETURN as it was breaking docs building. Someone needs to -# fix this -RETURN = '''# ''' - - -def format_params(params): - return [k + '=' + str(v) for k, v in params.items()] - - -def push_arguments(cmd, args): - if args['extra_args'] is not None: - cmd.extend(shlex.split(args['extra_args'])) - if args['target'] is not None: - cmd.append(args['target']) - if args['params'] is not None: - cmd.extend(format_params(args['params'])) - return cmd - - -def check_changed(make_path, module, args): - cmd = push_arguments([make_path, '--question'], args) - rc, _, __ = module.run_command(cmd, check_rc=False, cwd=args['chdir']) - return rc != 0 - - -def run_make(make_path, module, args): - cmd = push_arguments([make_path], args) - module.run_command(cmd, check_rc=True, cwd=args['chdir']) - - -def main(): - module = AnsibleModule( - supports_check_mode=True, - argument_spec=dict( - target=dict(required=False, default=None, type='str'), - params=dict(required=False, default=None, type='dict'), - extra_args=dict(required=False, default=None, type='str'), - chdir=dict(required=True, default=None, type='str'), - ), - ) - args = dict( - changed=False, - failed=False, - target=module.params['target'], - params=module.params['params'], - extra_args=module.params['extra_args'], - chdir=module.params['chdir'], - ) - make_path = module.get_bin_path('make', True) - - # Check if target is up to date - args['changed'] = check_changed(make_path, module, args) - - # Check only; don't modify - if module.check_mode: - module.exit_json(changed=args['changed']) - - # Target is already up to date - if not args['changed']: - module.exit_json(**args) - - run_make(make_path, module, args) - module.exit_json(**args) - -from ansible.module_utils.basic import * - -if __name__ == '__main__': - main() diff --git a/ansible/library/my_os_networks_facts.py b/ansible/library/my_os_networks_facts.py deleted file mode 100644 index 1b6ad80f9..000000000 --- a/ansible/library/my_os_networks_facts.py +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/python - -# Copyright (c) 2015 Hewlett-Packard Development Company, L.P. -# -# This module is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This software is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software. If not, see <http://www.gnu.org/licenses/>. - -try: - import shade - HAS_SHADE = True -except ImportError: - HAS_SHADE = False - -DOCUMENTATION = ''' ---- -module: my_os_network_facts -short_description: Retrieve facts about one or more OpenStack networks. -version_added: "2.0" -author: "Davide Agnello (@dagnello)" -description: - - Retrieve facts about one or more networks from OpenStack. -requirements: - - "python >= 2.6" - - "shade" -options: - network: - description: - - Name or ID of the Network - required: false - filters: - description: - - A dictionary of meta data to use for further filtering. Elements of - this dictionary may be additional dictionaries. - required: false -extends_documentation_fragment: openstack -''' - -EXAMPLES = ''' -# Gather facts about previously created networks -- my_os_network_facts: - auth: - auth_url: https://your_api_url.com:9000/v2.0 - username: user - password: password - project_name: someproject -- debug: var=openstack_networks - -# Gather facts about a previously created network by name -- my_os_network_facts: - auth: - auth_url: https://your_api_url.com:9000/v2.0 - username: user - password: password - project_name: someproject - name: network1 -- debug: var=openstack_networks - -# Gather facts about a previously created network with filter (note: name and - filters parameters are Not mutually exclusive) -- my_os_network_facts: - auth: - auth_url: https://your_api_url.com:9000/v2.0 - username: user - password: password - project_name: someproject - filters: - tenant_id: 55e2ce24b2a245b09f181bf025724cbe - subnets: - - 057d4bdf-6d4d-4728-bb0f-5ac45a6f7400 - - 443d4dc0-91d4-4998-b21c-357d10433483 -- debug: var=openstack_networks -''' - -RETURN = ''' -openstack_networks: - description: has all the openstack facts about the networks - returned: always, but can be null - type: complex - contains: - id: - description: Unique UUID. - returned: success - type: string - name: - description: Name given to the network. - returned: success - type: string - status: - description: Network status. - returned: success - type: string - subnets: - description: Subnet(s) included in this network. - returned: success - type: list of strings - tenant_id: - description: Tenant id associated with this network. - returned: success - type: string - shared: - description: Network shared flag. - returned: success - type: boolean -''' - -def main(): - - argument_spec = openstack_full_argument_spec( - network={'required': False, 'default': None}, - filters={'required': False, 'default': None} - ) - module_kwargs = openstack_module_kwargs() - module = AnsibleModule(argument_spec) - - if not HAS_SHADE: - module.fail_json(msg='shade is required for this module') - - network = module.params.pop('network') - filters = module.params.pop('filters') - - try: - cloud = shade.openstack_cloud(**module.params) - networks = cloud.search_networks(network, filters) - module.exit_json(changed=False, ansible_facts={ - 'openstack_networks': networks}) - - except shade.OpenStackCloudException as e: - module.fail_json(msg=str(e)) - -# this is magic, see lib/ansible/module_common.py -from ansible.module_utils.basic import * -from ansible.module_utils.openstack import * -if __name__ == '__main__': - main() diff --git a/ansible/library/my_os_router_facts.py b/ansible/library/my_os_router_facts.py deleted file mode 100644 index ce8d2af25..000000000 --- a/ansible/library/my_os_router_facts.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/python - -# Copyright (c) 2016 IBM -# -# This module is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This software is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software. If not, see <http://www.gnu.org/licenses/>. - -try: - import shade - HAS_SHADE = True -except ImportError: - HAS_SHADE = False - -DOCUMENTATION = ''' -module: my_os_router_facts -short_description: Retrieve facts about routers within OpenStack. -version_added: "2.1" -author: "Originally: David Shrewsbury (@Shrews); modified" -description: - - Retrieve facts about routers from OpenStack. -notes: - - Facts are placed in the C(openstack_routers) variable. -requirements: - - "python >= 2.6" - - "shade" -options: - port: - description: - - Unique name or ID of a port. - required: false - default: null - filters: - description: - - A dictionary of meta data to use for further filtering. Elements - of this dictionary will be matched against the returned port - dictionaries. Matching is currently limited to strings within - the port dictionary, or strings within nested dictionaries. - required: false - default: null -extends_documentation_fragment: openstack -''' - -EXAMPLES = ''' -# Gather facts about all routers -- my_os_router_facts: - cloud: mycloud - -# Gather facts about a single port -- my_os_router_facts: - cloud: mycloud - port: 6140317d-e676-31e1-8a4a-b1913814a471 - -# Gather facts about all routers that have device_id set to a specific value -# and with a status of ACTIVE. -- my_os_router_facts: - cloud: mycloud - router: - description: - - Name or ID of the router - required: false - filters: - device_id: 1038a010-3a37-4a9d-82ea-652f1da36597 - status: ACTIVE -''' - -RETURN = ''' -openstack_routers: - description: List of port dictionaries. A subset of the dictionary keys - listed below may be returned, depending on your cloud provider. - returned: always, but can be null - type: complex - contains: -''' - - -def main(): - argument_spec = openstack_full_argument_spec( - router={'required': False, 'default': None}, - filters={'required': False, 'type': 'dict', 'default': None}, - ) - module_kwargs = openstack_module_kwargs() - module = AnsibleModule(argument_spec, **module_kwargs) - - if not HAS_SHADE: - module.fail_json(msg='shade is required for this module') - - name = module.params.pop('name') - filters = module.params.pop('filters') - - try: - cloud = shade.openstack_cloud(**module.params) - routers = cloud.search_routers(name, filters) - module.exit_json(changed=False, ansible_facts=dict( - openstack_routers=routers)) - - except shade.OpenStackCloudException as e: - module.fail_json(msg=str(e)) - -from ansible.module_utils.basic import * -from ansible.module_utils.openstack import * - -if __name__ == '__main__': - main() diff --git a/ansible/library/os_images_facts.py b/ansible/library/os_images_facts.py deleted file mode 100644 index 736403893..000000000 --- a/ansible/library/os_images_facts.py +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/python - -# Copyright (c) 2015 Hewlett-Packard Development Company, L.P. -# -# This module is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This software is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software. If not, see <http://www.gnu.org/licenses/>. - -try: - import shade - HAS_SHADE = True -except ImportError: - HAS_SHADE = False - -DOCUMENTATION = ''' -module: os_images_facts -short_description: Retrieve facts about an image within OpenStack. -version_added: "2.0" -author: "Originally: Davide Agnello (@dagnello); modified" -description: - - Retrieve facts about a image image from OpenStack. -notes: - - Facts are placed in the C(openstack) variable. -requirements: - - "python >= 2.6" - - "shade" -options: - image: - description: - - Name or ID of the image - required: false - filters: - description: - - A dictionary of meta data to use for further filtering. Elements of - this dictionary may be additional dictionaries. - required: false -extends_documentation_fragment: openstack -''' - -EXAMPLES = ''' -# Gather facts about a previously created image named image1 -- os_images_facts: - auth: - auth_url: https://your_api_url.com:9000/v2.0 - username: user - password: password - project_name: someproject - image: image1 -- debug: var=openstack -''' - -RETURN = ''' -openstack_image: - description: has all the openstack facts about the image - returned: always, but can be null - type: complex - contains: - id: - description: Unique UUID. - returned: success - type: string - name: - description: Name given to the image. - returned: success - type: string - status: - description: Image status. - returned: success - type: string - created_at: - description: Image created at timestamp. - returned: success - type: string - deleted: - description: Image deleted flag. - returned: success - type: boolean - container_format: - description: Container format of the image. - returned: success - type: string - min_ram: - description: Min amount of RAM required for this image. - returned: success - type: int - disk_format: - description: Disk format of the image. - returned: success - type: string - updated_at: - description: Image updated at timestamp. - returned: success - type: string - properties: - description: Additional properties associated with the image. - returned: success - type: dict - min_disk: - description: Min amount of disk space required for this image. - returned: success - type: int - protected: - description: Image protected flag. - returned: success - type: boolean - checksum: - description: Checksum for the image. - returned: success - type: string - owner: - description: Owner for the image. - returned: success - type: string - is_public: - description: Is public flag of the image. - returned: success - type: boolean - deleted_at: - description: Image deleted at timestamp. - returned: success - type: string - size: - description: Size of the image. - returned: success - type: int -''' - - -def main(): - - argument_spec = openstack_full_argument_spec( - image={'required': False, 'default': None}, - filters={'required': False, 'default': None}, - ) - module_kwargs = openstack_module_kwargs() - module = AnsibleModule(argument_spec, **module_kwargs) - - if not HAS_SHADE: - module.fail_json(msg='shade is required for this module') - - image = module.params.pop('image') - filters = module.params.pop('filters') - - try: - cloud = shade.openstack_cloud(**module.params) - images = cloud.search_images(image, filters) - module.exit_json(changed=False, ansible_facts={ - 'openstack_images': images}) - - except shade.OpenStackCloudException as e: - module.fail_json(msg=str(e)) - -# this is magic, see lib/ansible/module_common.py -from ansible.module_utils.basic import * -from ansible.module_utils.openstack import * -if __name__ == '__main__': - main() diff --git a/ansible/library/os_router_facts.py b/ansible/library/os_router_facts.py deleted file mode 100644 index b14a362ef..000000000 --- a/ansible/library/os_router_facts.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/python - -# Copyright (c) 2016 IBM -# -# This module is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This software is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software. If not, see <http://www.gnu.org/licenses/>. - -try: - import shade - HAS_SHADE = True -except ImportError: - HAS_SHADE = False - -DOCUMENTATION = ''' -module: os_router_facts -short_description: Retrieve facts about routers within OpenStack. -version_added: "2.1" -author: "Originally: David Shrewsbury (@Shrews); modified" -description: - - Retrieve facts about routers from OpenStack. -notes: - - Facts are placed in the C(openstack_routers) variable. -requirements: - - "python >= 2.6" - - "shade" -options: - port: - description: - - Unique name or ID of a port. - required: false - default: null - filters: - description: - - A dictionary of meta data to use for further filtering. Elements - of this dictionary will be matched against the returned port - dictionaries. Matching is currently limited to strings within - the port dictionary, or strings within nested dictionaries. - required: false - default: null -extends_documentation_fragment: openstack -''' - -EXAMPLES = ''' -# Gather facts about all routers -- os_router_facts: - cloud: mycloud - -# Gather facts about a single port -- os_router_facts: - cloud: mycloud - port: 6140317d-e676-31e1-8a4a-b1913814a471 - -# Gather facts about all routers that have device_id set to a specific value -# and with a status of ACTIVE. -- os_router_facts: - cloud: mycloud - router: - description: - - Name or ID of the router - required: false - filters: - device_id: 1038a010-3a37-4a9d-82ea-652f1da36597 - status: ACTIVE -''' - -RETURN = ''' -openstack_routers: - description: List of port dictionaries. A subset of the dictionary keys - listed below may be returned, depending on your cloud provider. - returned: always, but can be null - type: complex - contains: -''' - - -def main(): - argument_spec = openstack_full_argument_spec( - router={'required': False, 'default': None}, - filters={'required': False, 'type': 'dict', 'default': None}, - ) - module_kwargs = openstack_module_kwargs() - module = AnsibleModule(argument_spec, **module_kwargs) - - if not HAS_SHADE: - module.fail_json(msg='shade is required for this module') - - router = module.params.pop('router') - filters = module.params.pop('filters') - - try: - cloud = shade.openstack_cloud(**module.params) - routers = cloud.search_routers(router, filters) - module.exit_json(changed=False, ansible_facts=dict( - openstack_routers=routers)) - - except shade.OpenStackCloudException as e: - module.fail_json(msg=str(e)) - -from ansible.module_utils.basic import * -from ansible.module_utils.openstack import * - -if __name__ == '__main__': - main() diff --git a/ansible/library/os_stack_facts.py b/ansible/library/os_stack_facts.py deleted file mode 100644 index c67947686..000000000 --- a/ansible/library/os_stack_facts.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/python - -# Copyright (c) 2015 Hewlett-Packard Development Company, L.P. -# -# This module is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This software is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software. If not, see <http://www.gnu.org/licenses/>. - -try: - import shade - HAS_SHADE = True -except ImportError: - HAS_SHADE = False - -DOCUMENTATION = ''' -module: os_stack_facts -short_description: Retrieve facts about an stack within OpenStack. -version_added: "2.0" -author: "Originally: Davide Agnello (@dagnello); modified" -description: - - Retrieve facts about a stack from OpenStack. -notes: - - Facts are placed in the C(openstack) variable. -requirements: - - "python >= 2.6" - - "shade" -options: -extends_documentation_fragment: openstack -''' - -EXAMPLES = ''' -# Gather facts about a previously created stack named stack1 -- os_stack_facts: - auth: - auth_url: https://your_api_url.com:9000/v2.0 - username: user - password: password - project_name: someproject -- debug: var=openstack_stacks -''' - -RETURN = ''' -openstack_stack: - description: has all the openstack facts about the stack - returned: always, but can be null - type: complex -''' - - -def main(): - - argument_spec = openstack_full_argument_spec( - ) - module_kwargs = openstack_module_kwargs() - module = AnsibleModule(argument_spec, **module_kwargs) - - if not HAS_SHADE: - module.fail_json(msg='shade is required for this module') - - - try: - cloud = shade.openstack_cloud(**module.params) - stacks = cloud.list_stacks() - module.exit_json(changed=False, ansible_facts={ - 'openstack_stacks': stacks}) - - except shade.OpenStackCloudException as e: - module.fail_json(msg=str(e)) - -# this is magic, see lib/ansible/module_common.py -from ansible.module_utils.basic import * -from ansible.module_utils.openstack import * -if __name__ == '__main__': - main() diff --git a/ansible/library/parted.py b/ansible/library/parted.py deleted file mode 100755 index af9c80f7e..000000000 --- a/ansible/library/parted.py +++ /dev/null @@ -1,705 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# (c) 2016, Fabrizio Colonna <colofabrix@tin.it> -# -# This file is part of Ansible -# -# Ansible is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Ansible is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Ansible. If not, see <http://www.gnu.org/licenses/>. - -ANSIBLE_METADATA = {'metadata_version': '1.0', - 'status': ['preview'], - 'supported_by': 'curated'} - - -DOCUMENTATION = ''' ---- -author: - - "Fabrizio Colonna (@ColOfAbRiX)" -module: parted -short_description: Configure block device partitions -version_added: "2.3" -description: - - This module allows configuring block device partition using the C(parted) - command line tool. For a full description of the fields and the options - check the GNU parted manual. -notes: - - When fetching information about a new disk and when the version of parted - installed on the system is before version 3.1, the module queries the kernel - through C(/sys/) to obtain disk information. In this case the units CHS and - CYL are not supported. -requirements: - - This module requires parted version 1.8.3 and above. - - If the version of parted is below 3.1, it requires a Linux version running - the sysfs file system C(/sys/). -options: - device: - description: The block device (disk) where to operate. - required: True - align: - description: Set alignment for newly created partitions. - choices: ['none', 'cylinder', 'minimal', 'optimal'] - default: optimal - number: - description: - - The number of the partition to work with or the number of the partition - that will be created. Required when performing any action on the disk, - except fetching information. - unit: - description: - - Selects the current default unit that Parted will use to display - locations and capacities on the disk and to interpret those given by the - user if they are not suffixed by an unit. When fetching information about - a disk, it is always recommended to specify a unit. - choices: [ - 's', 'B', 'KB', 'KiB', 'MB', 'MiB', 'GB', 'GiB', 'TB', 'TiB', '%', 'cyl', - 'chs', 'compact' - ] - default: KiB - label: - description: Creates a new disk label. - choices: [ - 'aix', 'amiga', 'bsd', 'dvh', 'gpt', 'loop', 'mac', 'msdos', 'pc98', - 'sun', '' - ] - default: msdos - part_type: - description: - - Is one of 'primary', 'extended' or 'logical' and may be specified only - with 'msdos' or 'dvh' partition tables. A name must be specified for a - 'gpt' partition table. Neither part-type nor name may be used with a - 'sun' partition table. - choices: ['primary', 'extended', 'logical'] - part_start: - description: - - Where the partition will start as offset from the beginning of the disk, - that is, the "distance" from the start of the disk. The distance can be - specified with all the units supported by parted (except compat) and - it is case sensitive. E.g. C(10GiB), C(15%). - default: 0% - part_end : - description: - - Where the partition will end as offset from the beginning of the disk, - that is, the "distance" from the start of the disk. The distance can be - specified with all the units supported by parted (except compat) and - it is case sensitive. E.g. C(10GiB), C(15%). - default: 100% - name: - description: - - Sets the name for the partition number (GPT, Mac, MIPS and PC98 only). - flags: - description: A list of the flags that has to be set on the partition. - state: - description: - - If to create or delete a partition. If set to C(info) the module will - only return the device information. - choices: ['present', 'absent', 'info'] - default: info -''' - -RETURN = ''' -partition_info: - description: Current partition information - returned: success - type: dict - contains: - device: - description: Generic device information. - type: dict - partitions: - description: List of device partitions. - type: list - sample: > - { - "disk": { - "dev": "/dev/sdb", - "logical_block": 512, - "model": "VMware Virtual disk", - "physical_block": 512, - "size": 5.0, - "table": "msdos", - "unit": "gib" - }, - "partitions": [{ - "begin": 0.0, - "end": 1.0, - "flags": ["boot", "lvm"], - "fstype": null, - "num": 1, - "size": 1.0 - }, { - "begin": 1.0, - "end": 5.0, - "flags": [], - "fstype": null, - "num": 2, - "size": 4.0 - }] - } -''' - -EXAMPLES = """ -# Create a new primary partition -- parted: - device: /dev/sdb - number: 1 - state: present - -# Remove partition number 1 -- parted: - device: /dev/sdb - number: 1 - state: absent - -# Create a new primary partition with a size of 1GiB -- parted: - device: /dev/sdb - number: 1 - state: present - part_end: 1gib - -# Create a new primary partition for LVM -- parted: - device: /dev/sdb - number: 2 - flags: [ lvm ] - state: present - part_start: 1gib - -# Read device information (always use unit when probing) -- parted: device=/dev/sdb unit=MiB - register: sdb_info - -# Remove all partitions from disk -- parted: - device: /dev/sdb - number: "{{ item.num }}" - state: absent - with_items: - - "{{ sdb_info.partitions }}" -""" - - -from ansible.module_utils.basic import AnsibleModule -import locale -import math -import re -import os - - -# Reference prefixes (International System of Units and IEC) -units_si = ['B', 'KB', 'MB', 'GB', 'TB'] -units_iec = ['B', 'KiB', 'MiB', 'GiB', 'TiB'] -parted_units = units_si + units_iec + ['s', '%', 'cyl', 'chs', 'compact'] - - -def parse_unit(size_str, unit=''): - """ - Parses a string containing a size of information - """ - matches = re.search(r'^([\d.]+)([\w%]+)?$', size_str) - if matches is None: - # "<cylinder>,<head>,<sector>" format - matches = re.search(r'^(\d+),(\d+),(\d+)$', size_str) - if matches is None: - module.fail_json( - msg="Error interpreting parted size output: '%s'" % size_str - ) - - size = { - 'cylinder': int(matches.group(1)), - 'head': int(matches.group(2)), - 'sector': int(matches.group(3)) - } - unit = 'chs' - - else: - # Normal format: "<number>[<unit>]" - if matches.group(2) is not None: - unit = matches.group(2) - - size = float(matches.group(1)) - - return size, unit - - -def parse_partition_info(parted_output, unit): - """ - Parses the output of parted and transforms the data into - a dictionary. - - Parted Machine Parseable Output: - See: https://lists.alioth.debian.org/pipermail/parted-devel/2006-December/00 - 0573.html - - All lines end with a semicolon (;) - - The first line indicates the units in which the output is expressed. - CHS, CYL and BYT stands for CHS, Cylinder and Bytes respectively. - - The second line is made of disk information in the following format: - "path":"size":"transport-type":"logical-sector-size":"physical-sector-siz - e":"partition-table-type":"model-name"; - - If the first line was either CYL or CHS, the next line will contain - information on no. of cylinders, heads, sectors and cylinder size. - - Partition information begins from the next line. This is of the format: - (for BYT) - "number":"begin":"end":"size":"filesystem-type":"partition-name":"flags-s - et"; - (for CHS/CYL) - "number":"begin":"end":"filesystem-type":"partition-name":"flags-set"; - """ - lines = [x for x in parted_output.split('\n') if x.strip() != ''] - - # Generic device info - generic_params = lines[1].rstrip(';').split(':') - - # The unit is read once, because parted always returns the same unit - size, unit = parse_unit(generic_params[1], unit) - - generic = { - 'dev': generic_params[0], - 'size': size, - 'unit': unit.lower(), - 'table': generic_params[5], - 'model': generic_params[6], - 'logical_block': int(generic_params[3]), - 'physical_block': int(generic_params[4]) - } - - # CYL and CHS have an additional line in the output - if unit in ['cyl', 'chs']: - chs_info = lines[2].rstrip(';').split(':') - cyl_size, cyl_unit = parse_unit(chs_info[3]) - generic['chs_info'] = { - 'cylinders': int(chs_info[0]), - 'heads': int(chs_info[1]), - 'sectors': int(chs_info[2]), - 'cyl_size': cyl_size, - 'cyl_size_unit': cyl_unit.lower() - } - lines = lines[1:] - - parts = [] - for line in lines[2:]: - part_params = line.rstrip(';').split(':') - - # CHS use a different format than BYT, but contrary to what stated by - # the author, CYL is the same as BYT. I've tested this undocumented - # behaviour down to parted version 1.8.3, which is the first version - # that supports the machine parseable output. - if unit != 'chs': - size = parse_unit(part_params[3])[0] - fstype = part_params[4] - flags = part_params[5] - else: - size = "" - fstype = part_params[3] - flags = part_params[4] - - parts.append({ - 'num': int(part_params[0]), - 'begin': parse_unit(part_params[1])[0], - 'end': parse_unit(part_params[2])[0], - 'size': size, - 'fstype': fstype, - 'flags': [f.strip() for f in flags.split(', ') if f != ''], - 'unit': unit.lower(), - }) - - return {'generic': generic, 'partitions': parts} - - -def format_disk_size(size_bytes, unit): - """ - Formats a size in bytes into a different unit, like parted does. It doesn't - manage CYL and CHS formats, though. - This function has been adapted from https://github.com/Distrotech/parted/blo - b/279d9d869ff472c52b9ec2e180d568f0c99e30b0/libparted/unit.c - """ - global units_si, units_iec - - unit = unit.lower() - - # Shortcut - if size_bytes == 0: - return 0.0 - - # Cases where we default to 'compact' - if unit in ['', 'compact', 'cyl', 'chs']: - index = max(0, int( - (math.log10(size_bytes) - 1.0) / 3.0 - )) - unit = 'b' - if index < len(units_si): - unit = units_si[index] - - # Find the appropriate multiplier - multiplier = 1.0 - if unit in units_si: - multiplier = 1000.0 ** units_si.index(unit) - elif unit in units_iec: - multiplier = 1024.0 ** units_iec.index(unit) - - output = size_bytes / multiplier * (1 + 1E-16) - - # Corrections to round up as per IEEE754 standard - if output < 10: - w = output + 0.005 - elif output < 100: - w = output + 0.05 - else: - w = output + 0.5 - - if w < 10: - precision = 2 - elif w < 100: - precision = 1 - else: - precision = 0 - - # Round and return - return round(output, precision), unit - - -def get_unlabeled_device_info(device, unit): - """ - Fetches device information directly from the kernel and it is used when - parted cannot work because of a missing label. It always returns a 'unknown' - label. - """ - device_name = os.path.basename(device) - base = "/sys/block/%s" % device_name - - vendor = read_record(base + "/device/vendor", "Unknown") - model = read_record(base + "/device/model", "model") - logic_block = int(read_record(base + "/queue/logical_block_size", 0)) - phys_block = int(read_record(base + "/queue/physical_block_size", 0)) - size_bytes = int(read_record(base + "/size", 0)) * logic_block - - size, unit = format_disk_size(size_bytes, unit) - - return { - 'generic': { - 'dev': device, - 'table': "unknown", - 'size': size, - 'unit': unit, - 'logical_block': logic_block, - 'physical_block': phys_block, - 'model': "%s %s" % (vendor, model), - }, - 'partitions': [] - } - - -def get_device_info(device, unit): - """ - Fetches information about a disk and its partitions and it returns a - dictionary. - """ - global module - - # If parted complains about missing labels, it means there are no partitions. - # In this case only, use a custom function to fetch information and emulate - # parted formats for the unit. - label_needed = check_parted_label(device) - if label_needed: - return get_unlabeled_device_info(device, unit) - - command = "parted -s -m %s -- unit '%s' print" % (device, unit) - rc, out, err = module.run_command(command) - if rc != 0 and 'unrecognised disk label' not in err: - module.fail_json(msg=( - "Error while getting device information with parted " - "script: '%s'" % command), - rc=rc, out=out, err=err - ) - - return parse_partition_info(out, unit) - - -def check_parted_label(device): - """ - Determines if parted needs a label to complete its duties. Versions prior - to 3.1 don't return data when there is no label. For more information see: - http://upstream.rosalinux.ru/changelogs/libparted/3.1/changelog.html - """ - # Check the version - parted_major, parted_minor, _ = parted_version() - if (parted_major == 3 and parted_minor >= 1) or parted_major > 3: - return False - - # Older parted versions return a message in the stdout and RC > 0. - rc, out, err = module.run_command("parted -s -m %s print" % device) - if rc != 0 and 'unrecognised disk label' in out.lower(): - return True - - return False - - -def parted_version(): - """ - Returns the major and minor version of parted installed on the system. - """ - global module - - rc, out, err = module.run_command("parted --version") - if rc != 0: - module.fail_json( - msg="Failed to get parted version.", rc=rc, out=out, err=err - ) - - lines = [x for x in out.split('\n') if x.strip() != ''] - if len(lines) == 0: - module.fail_json(msg="Failed to get parted version.", rc=0, out=out) - - matches = re.search(r'^parted.+(\d+)\.(\d+)(?:\.(\d+))?$', lines[0]) - if matches is None: - module.fail_json(msg="Failed to get parted version.", rc=0, out=out) - - # Convert version to numbers - major = int(matches.group(1)) - minor = int(matches.group(2)) - rev = 0 - if matches.group(3) is not None: - rev = int(matches.group(3)) - - return major, minor, rev - - -def parted(script, device, align): - """ - Runs a parted script. - """ - global module - - if script and not module.check_mode: - command = "parted -s -m -a %s %s -- %s" % (align, device, script) - rc, out, err = module.run_command(command) - - if rc != 0: - module.fail_json( - msg="Error while running parted script: %s" % command.strip(), - rc=rc, out=out, err=err - ) - - -def read_record(file_path, default=None): - """ - Reads the first line of a file and returns it. - """ - try: - f = open(file_path, 'r') - try: - return f.readline().strip() - finally: - f.close() - except IOError: - return default - - -def part_exists(partitions, attribute, number): - """ - Looks if a partition that has a specific value for a specific attribute - actually exists. - """ - return any( - part[attribute] and - part[attribute] == number for part in partitions - ) - - -def check_size_format(size_str): - """ - Checks if the input string is an allowed size - """ - size, unit = parse_unit(size_str) - return unit in parted_units - - -def main(): - global module, units_si, units_iec - - changed = False - output_script = "" - script = "" - module = AnsibleModule( - argument_spec={ - 'device': {'required': True, 'type': 'str'}, - 'align': { - 'default': 'optimal', - 'choices': ['none', 'cylinder', 'minimal', 'optimal'], - 'type': 'str' - }, - 'number': {'default': None, 'type': 'int'}, - - # unit <unit> command - 'unit': { - 'default': 'KiB', - 'choices': parted_units, - 'type': 'str' - }, - - # mklabel <label-type> command - 'label': { - 'choices': [ - 'aix', 'amiga', 'bsd', 'dvh', 'gpt', 'loop', 'mac', 'msdos', - 'pc98', 'sun', '' - ], - 'type': 'str' - }, - - # mkpart <part-type> [<fs-type>] <start> <end> command - 'part_type': { - 'default': 'primary', - 'choices': ['primary', 'extended', 'logical'], - 'type': 'str' - }, - 'part_start': {'default': '0%', 'type': 'str'}, - 'part_end': {'default': '100%', 'type': 'str'}, - - # name <partition> <name> command - 'name': {'type': 'str'}, - - # set <partition> <flag> <state> command - 'flags': {'type': 'list'}, - - # rm/mkpart command - 'state': { - 'choices': ['present', 'absent', 'info'], - 'default': 'info', - 'type': 'str' - } - }, - supports_check_mode=True, - ) - - # Data extraction - device = module.params['device'] - align = module.params['align'] - number = module.params['number'] - unit = module.params['unit'] - label = module.params['label'] - part_type = module.params['part_type'] - part_start = module.params['part_start'] - part_end = module.params['part_end'] - name = module.params['name'] - state = module.params['state'] - flags = module.params['flags'] - - # Conditioning - if number and number < 0: - module.fail_json(msg="The partition number must be non negative.") - if not check_size_format(part_start): - module.fail_json( - msg="The argument 'part_start' doesn't respect required format." - "The size unit is case sensitive.", - err=parse_unit(part_start) - ) - if not check_size_format(part_end): - module.fail_json( - msg="The argument 'part_end' doesn't respect required format." - "The size unit is case sensitive.", - err=parse_unit(part_end) - ) - - # Read the current disk information - current_device = get_device_info(device, unit) - current_parts = current_device['partitions'] - - if state == 'present': - # Default value for the label - if not current_device['generic']['table'] or \ - current_device['generic']['table'] == 'unknown' and \ - not label: - label = 'msdos' - - # Assign label if required - if label: - script += "mklabel %s " % label - - # Create partition if required - if part_type and not part_exists(current_parts, 'num', number): - script += "mkpart %s %s %s " % ( - part_type, - part_start, - part_end - ) - - # Set the unit of the run - if unit and script: - script = "unit %s %s" % (unit, script) - - # Execute the script and update the data structure. - # This will create the partition for the next steps - if script: - output_script += script - parted(script, device, align) - changed = True - script = "" - - current_parts = get_device_info(device, unit)['partitions'] - - if part_exists(current_parts, 'num', number) or module.check_mode: - partition = {'flags': []} # Empty structure for the check-mode - if not module.check_mode: - partition = [p for p in current_parts if p['num'] == number][0] - - # Assign name to the the partition - if name: - script += "name %s %s " % (number, name) - - # Manage flags - if flags: - # Compute only the changes in flags status - flags_off = list(set(partition['flags']) - set(flags)) - flags_on = list(set(flags) - set(partition['flags'])) - - for f in flags_on: - script += "set %s %s on " % (number, f) - - for f in flags_off: - script += "set %s %s off " % (number, f) - - # Set the unit of the run - if unit and script: - script = "unit %s %s" % (unit, script) - - # Execute the script - if script: - output_script += script - changed = True - parted(script, device, align) - - elif state == 'absent': - # Remove the partition - if part_exists(current_parts, 'num', number) or module.check_mode: - script = "rm %s " % number - output_script += script - changed = True - parted(script, device, align) - - elif state == 'info': - output_script = "unit '%s' print " % unit - - # Final status of the device - final_device_status = get_device_info(device, unit) - module.exit_json( - changed=changed, - disk=final_device_status['generic'], - partitions=final_device_status['partitions'], - script=output_script.strip() - ) - - -if __name__ == '__main__': - main() diff --git a/ansible/library/shade_api.py b/ansible/library/shade_api.py new file mode 100644 index 000000000..ad1180832 --- /dev/null +++ b/ansible/library/shade_api.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +# Copyright (c) 2017 Intel Corporation +# +# 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. + +DOCUMENTATION = ''' +--- +module: shade_api +short_description: directly access shade +description: + - directly access shade API +options: + method: shade method + args: list of ags + kwargs: dict of kwargs + fact_name: name of ansible fact to store result +''' + +try: + import shade +except ImportError: + SHADE_PRESENT = False +else: + SHADE_PRESENT = True + + +def main(): + module = AnsibleModule( + argument_spec={ + 'method': {'required': True, 'type': 'str'}, + 'args': {'required': False, 'type': 'list', 'default': []}, + 'kwargs': {'required': False, 'type': 'dict', 'default': {}}, + 'os_auth': {'required': False, 'type': 'dict', 'default': {}}, + 'fact_name': {'required': True, 'type': 'str'}, + } + ) + + if not SHADE_PRESENT: + module.fail_json(msg="shade not found") + shade.simple_logging(debug=True) + params = module.params + method = params['method'] + args = params['args'] + kwargs = params['kwargs'] + os_auth = params['os_auth'] + fact_name = params['fact_name'] + if os_auth: + os.environ.update(os_auth) + + c = shade.openstack_cloud() + module.debug(args) + module.debug(kwargs) + ret = getattr(c, method)(*args, **kwargs) + if ret: + try: + # convert to regular dict, might not be necessary + ret = ret.toDict() + except AttributeError: + pass + else: + ret = {} + ansible_facts = { + fact_name: ret + } + module.exit_json(ansible_facts=ansible_facts) + + +# <<INCLUDE_ANSIBLE_MODULE_COMMON>> +from ansible.module_utils.basic import * # noqa + +if __name__ == '__main__': + main() diff --git a/ansible/nsb_setup.yml b/ansible/nsb_setup.yml index 78cf87ec7..90fba0b1e 100644 --- a/ansible/nsb_setup.yml +++ b/ansible/nsb_setup.yml @@ -38,19 +38,23 @@ disk_format: qcow2 container_format: bare filename: "{{ raw_imgfile }}" + properties: + hw_vif_multiqueue_enabled: true environment: "{{ openrc }}" when: openrc_file is defined - name: Start yardstick container docker_container: name: yardstick - image: opnfv/yardstick:latest + pull: yes recreate: yes + image: opnfv/yardstick:latest state: started restart_policy: always - privileged: True - interactive: True + privileged: yes + interactive: yes volumes: - "{{ openrc_file|default('/dev/null') }}:/etc/yardstick/openstack.creds:ro" - /var/run/docker.sock:/var/run/docker.sock - - /opt/:/opt + - /opt:/opt + - /etc/localtime:/etc/localtime:ro diff --git a/ansible/ovs_scale_out_test_ixia_correlated_templates.yml b/ansible/ovs_scale_out_test_ixia_correlated_templates.yml new file mode 100644 index 000000000..ca5fe00ef --- /dev/null +++ b/ansible/ovs_scale_out_test_ixia_correlated_templates.yml @@ -0,0 +1,61 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- + +- set_fact: + num_vnfs: "{{ item }}" + +- debug: + var: num_vnfs + verbosity: 2 + + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-ixia-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-ixia-{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/ixia_correlated_template.yaml + dest: /etc/yardstick/nodes/ixia_correlated_{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/pod_ovs.yaml + dest: /etc/yardstick/nodes/ovs_host.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/tc_ovs_vfw_udp_ixia_correlated_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/vfw/tc_ovs_vfw_udp_ixia_correlated_scale_out_{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-ixia-correlated-scale-out.yaml + dest: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-ixia-correlated-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/tc_ovs_acl_udp_ixia_correlated_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/acl/tc_ovs_acl_udp_ixia_correlated_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/acl-tg-topology-ixia-correlated-scale-out.yaml + dest: ../samples/vnf_samples/nsut/acl/acl-tg-topology-ixia-correlated-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-ixia-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/tc_ovs_cgnapt_udp_ixia_correlated_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/tc_ovs_cgnapt_udp_ixia_correlated_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-ixia-correlated-scale-out.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-ixia-correlated-scale-out-{{ num_vnfs }}.yaml diff --git a/ansible/ovs_scale_out_test_ixia_templates.yml b/ansible/ovs_scale_out_test_ixia_templates.yml new file mode 100644 index 000000000..736f8623d --- /dev/null +++ b/ansible/ovs_scale_out_test_ixia_templates.yml @@ -0,0 +1,61 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- + +- set_fact: + num_vnfs: "{{ item }}" + +- debug: + var: num_vnfs + verbosity: 2 + + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-ixia-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-ixia-{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/ixia_template.yaml + dest: /etc/yardstick/nodes/ixia_{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/pod_ovs.yaml + dest: /etc/yardstick/nodes/ovs_host.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/tc_ovs_vfw_udp_ixia_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/vfw/tc_ovs_vfw_udp_ixia_scale_out_{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-ixia-scale-out.yaml + dest: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-ixia-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/tc_ovs_acl_udp_ixia_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/acl/tc_ovs_acl_udp_ixia_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/acl-tg-topology-ixia-scale-out.yaml + dest: ../samples/vnf_samples/nsut/acl/acl-tg-topology-ixia-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-ixia-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/tc_ovs_cgnapt_udp_ixia_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/tc_ovs_cgnapt_udp_ixia_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-ixia-scale-out.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-ixia-scale-out-{{ num_vnfs }}.yaml diff --git a/ansible/ovs_scale_out_test_templates.yml b/ansible/ovs_scale_out_test_templates.yml new file mode 100644 index 000000000..aadec6d62 --- /dev/null +++ b/ansible/ovs_scale_out_test_templates.yml @@ -0,0 +1,60 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- + +- set_fact: + num_vnfs: "{{ item }}" + +- debug: + var: num_vnfs + verbosity: 2 + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/baremetal_trex.yaml + dest: /etc/yardstick/nodes/baremetal_trex_{{num_vnfs}}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/pod_sriov.yaml + dest: /etc/yardstick/nodes/sriov_host.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/tc_ovs_vfw_udp_scale_out.yaml + dest: ../samples/vnf_samples/nsut/vfw/tc_ovs_vfw_udp_scale_out_{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-scale-out.yaml + dest: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/tc_ovs_acl_udp_scale_out.yaml + dest: ../samples/vnf_samples/nsut/acl/tc_ovs_acl_udp_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/acl-tg-topology-scale-out.yaml + dest: ../samples/vnf_samples/nsut/acl/acl-tg-topology-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/tc_ovs_cgnapt_udp_scale_out.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/tc_ovs_cgnapt_udp_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-scale-out.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-scale-out-{{ num_vnfs }}.yaml diff --git a/ansible/roles/add_heat_stack_owner_role/tasks/main.yml b/ansible/roles/add_heat_stack_owner_role/tasks/main.yml index d751eb032..dda087998 100644 --- a/ansible/roles/add_heat_stack_owner_role/tasks/main.yml +++ b/ansible/roles/add_heat_stack_owner_role/tasks/main.yml @@ -19,6 +19,6 @@ role: heat_stack_owner project: "{{ item }}" with_items: - - demo +# - demo - admin environment: "{{ openrc }}" diff --git a/ansible/roles/check_openstack_services/tasks/main.yml b/ansible/roles/check_openstack_services/tasks/main.yml index 02e730533..bfd9e1193 100644 --- a/ansible/roles/check_openstack_services/tasks/main.yml +++ b/ansible/roles/check_openstack_services/tasks/main.yml @@ -13,13 +13,19 @@ # limitations under the License. --- - name: Check images - os_images_facts: {} + shade_api: + method: search_images + fact_name: openstack_images + args: + - ~ environment: "{{ openrc }}" - name: Check servers os_server_facts: {} - environment: "{{ openrc }}" +# environment: "{{ openrc }}" - name: Check stacks - os_stack_facts: {} + shade_api: + method: list_stacks + fact_name: openstack_stacks environment: "{{ openrc }}" diff --git a/ansible/roles/clean_images/tasks/main.yml b/ansible/roles/clean_images/tasks/main.yml index 5cbae06d8..1bc3dc4ef 100644 --- a/ansible/roles/clean_images/tasks/main.yml +++ b/ansible/roles/clean_images/tasks/main.yml @@ -13,15 +13,21 @@ # limitations under the License. --- - name: Get all images - os_images_facts: {} + shade_api: + method: search_images + fact_name: openstack_images + args: + - ~ environment: "{{ openrc }}" -- debug: var=openstack_images +- debug: + var: openstack_images - set_fact: images_to_clean: "{{ openstack_images|map(attribute='name')|select('search', 'yardstick|cirros|Ubuntu-14\\.04')|list }}" -- debug: var=images_to_clean +- debug: + var: images_to_clean - name: Cleanup images os_image: diff --git a/ansible/roles/create_storperf_admin_rc/library/my_os_project_facts.py b/ansible/roles/create_storperf_admin_rc/library/my_os_project_facts.py deleted file mode 100644 index debb8dd5b..000000000 --- a/ansible/roles/create_storperf_admin_rc/library/my_os_project_facts.py +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/python -# Copyright (c) 2016 Hewlett-Packard Enterprise Corporation -# -# This module is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This software is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this software. If not, see <http://www.gnu.org/licenses/>. - -import sys - -try: - import shade - HAS_SHADE = True -except ImportError: - HAS_SHADE = False - -DOCUMENTATION = ''' ---- -module: os_project_facts -short_description: Retrieve facts about one or more OpenStack projects -extends_documentation_fragment: openstack -version_added: "2.1" -author: "Ricardo Carrillo Cruz (@rcarrillocruz)" -description: - - Retrieve facts about a one or more OpenStack projects -requirements: - - "python >= 2.6" - - "shade" -options: - name: - description: - - Name or ID of the project - required: true - domain: - description: - - Name or ID of the domain containing the project if the cloud supports domains - required: false - default: None - filters: - description: - - A dictionary of meta data to use for further filtering. Elements of - this dictionary may be additional dictionaries. - required: false - default: None -''' - -EXAMPLES = ''' -# Gather facts about previously created projects -- my_os_project_facts: - cloud: awesomecloud -- debug: var=openstack_projects - -# Gather facts about a previously created project by name -- my_os_project_facts: - cloud: awesomecloud - name: demoproject -- debug: var=openstack_projects - -# Gather facts about a previously created project in a specific domain -- my_os_project_facts - cloud: awesomecloud - name: demoproject - domain: admindomain -- debug: var=openstack_projects - -# Gather facts about a previously created project in a specific domain - with filter -- my_os_project_facts - cloud: awesomecloud - name: demoproject - domain: admindomain - filters: - enabled: False -- debug: var=openstack_projects -''' - - -RETURN = ''' -openstack_projects: - description: has all the OpenStack facts about projects - returned: always, but can be null - type: complex - contains: - id: - description: Unique UUID. - returned: success - type: string - name: - description: Name given to the project. - returned: success - type: string - description: - description: Description of the project - returned: success - type: string - enabled: - description: Flag to indicate if the project is enabled - returned: success - type: bool - domain_id: - description: Domain ID containing the project (keystone v3 clouds only) - returned: success - type: bool -''' - -def main(): - - argument_spec = openstack_full_argument_spec( - name=dict(required=False, default=None), - domain=dict(required=False, default=None), - filters=dict(required=False, type='dict', default=None), - ) - - module = AnsibleModule(argument_spec) - - if not HAS_SHADE: - module.fail_json(msg='shade is required for this module') - - try: - name = module.params['name'] - domain = module.params['domain'] - filters = module.params['filters'] - - opcloud = shade.operator_cloud(**module.params) - # module.exit_json(changed=False, ansible_facts=dict( - # openstack_prjects=opcloud.cloud_config.get_auth_args())) - - if domain: - try: - # We assume admin is passing domain id - dom = opcloud.get_domain(domain)['id'] - domain = dom - except: - # If we fail, maybe admin is passing a domain name. - # Note that domains have unique names, just like id. - dom = opcloud.search_domains(filters={'name': domain}) - if dom: - domain = dom[0]['id'] - else: - module.fail_json(msg='Domain name or ID does not exist') - - if not filters: - filters = {} - - filters['domain_id'] = domain - - # projects = opcloud.search_projects(name, filters) - projects = opcloud.list_projects(name, filters) - module.exit_json(changed=False, ansible_facts=dict( - openstack_projects=projects)) - - except shade.OpenStackCloudException as e: - module.fail_json(msg=str(e)) - -from ansible.module_utils.basic import * -from ansible.module_utils.openstack import * - -if __name__ == '__main__': - main() diff --git a/ansible/roles/download_civetweb/defaults/main.yml b/ansible/roles/download_civetweb/defaults/main.yml new file mode 100644 index 000000000..5efc9bb56 --- /dev/null +++ b/ansible/roles/download_civetweb/defaults/main.yml @@ -0,0 +1,18 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +civetweb_url: https://sourceforge.net/projects/civetweb/files/1.9/CivetWeb_V1.9.zip +civetweb_file: "{{ civetweb_url|basename }}" +civetweb_dest: "{{ clone_dest }}/civetweb" +civetweb_sha256s: "sha256:947a546bfccd733c79dff9565227fa74f4d17750650ff49312ef4b2d032fa8c8" diff --git a/ansible/roles/download_civetweb/tasks/main.yml b/ansible/roles/download_civetweb/tasks/main.yml new file mode 100644 index 000000000..03dd3ccd3 --- /dev/null +++ b/ansible/roles/download_civetweb/tasks/main.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- name: fetch civetweb + get_url: + url: "{{ civetweb_url }}" + dest: "{{ clone_dest }}/" + validate_certs: False + checksum: "{{ civetweb_sha256s }}" + +- name: unarchive civetweb + unarchive: + src: "{{ clone_dest }}/{{ civetweb_file }}" + dest: "{{ clone_dest }}/" + copy: no + +- file: + path: "{{ civetweb_dest }}" + state: absent + +- name: "move civetweb to {{ civetweb_dest }} path" + shell: "mv {{ clone_dest }}/civetweb-master {{ civetweb_dest }}" + args: + executable: /bin/bash + +- name: cleanup zip file to save space + file: + path: "{{ clone_dest }}/{{ civetweb_file }}" + state: absent diff --git a/ansible/roles/download_collectd/defaults/main.yml b/ansible/roles/download_collectd/defaults/main.yml new file mode 100644 index 000000000..d4e91acc4 --- /dev/null +++ b/ansible/roles/download_collectd/defaults/main.yml @@ -0,0 +1,4 @@ +--- +collectd_url: "https://github.com/collectd/collectd.git" +collectd_dest: "{{ clone_dest }}/collectd" +collectd_version: "47c86ace348a1d7a5352a83d10935209f89aa4f5" diff --git a/ansible/roles/download_collectd/tasks/main.yml b/ansible/roles/download_collectd/tasks/main.yml new file mode 100644 index 000000000..785cb3af5 --- /dev/null +++ b/ansible/roles/download_collectd/tasks/main.yml @@ -0,0 +1,29 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +#- debug: +# var: collectd_version +# verbosity: 2 + +- name: fetch collectd + git: + repo: "{{ collectd_url }}" + dest: "{{ collectd_dest }}" + version: "{{ collectd_version }}" + accept_hostkey: yes + recursive: no + force: yes + +- set_fact: + collectd_path: "{{ collectd_dest }}" diff --git a/ansible/roles/download_intel_cmt_cat/defaults/main.yml b/ansible/roles/download_intel_cmt_cat/defaults/main.yml new file mode 100644 index 000000000..d733e4114 --- /dev/null +++ b/ansible/roles/download_intel_cmt_cat/defaults/main.yml @@ -0,0 +1,4 @@ +--- +intel_cmt_cat_url: "https://github.com/01org/intel-cmt-cat.git" +intel_cmt_cat_dest: "{{ clone_dest }}/intel-cmt-cat" +intel_cmt_cat_version: "master" diff --git a/ansible/roles/download_intel_cmt_cat/tasks/main.yml b/ansible/roles/download_intel_cmt_cat/tasks/main.yml new file mode 100644 index 000000000..c1b6f7922 --- /dev/null +++ b/ansible/roles/download_intel_cmt_cat/tasks/main.yml @@ -0,0 +1,29 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +#- debug: +# var: intel_cmt_cat_version +# verbosity: 2 + +- name: fetch intel-cmt-cat + git: + repo: "{{ intel_cmt_cat_url }}" + dest: "{{ intel_cmt_cat_dest }}" + version: "{{ intel_cmt_cat_version }}" + accept_hostkey: yes + recursive: no + force: yes + +- set_fact: + intel_cmt_cat_path: "{{ intel_cmt_cat_dest }}" diff --git a/ansible/roles/download_pmu_tools/defaults/main.yml b/ansible/roles/download_pmu_tools/defaults/main.yml new file mode 100644 index 000000000..90dae66cf --- /dev/null +++ b/ansible/roles/download_pmu_tools/defaults/main.yml @@ -0,0 +1,5 @@ +--- +pmu_tools_url: "https://github.com/andikleen/pmu-tools.git" +pmu_tools_dest: "{{ clone_dest }}/pmu-tools" +pmu_tools_version: "master" +perfmon_url: "https://download.01.org/perfmon/" diff --git a/ansible/roles/download_pmu_tools/files/event_download_local.py b/ansible/roles/download_pmu_tools/files/event_download_local.py new file mode 100755 index 000000000..882fc5046 --- /dev/null +++ b/ansible/roles/download_pmu_tools/files/event_download_local.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python +# Copyright (c) 2014, Intel Corporation +# Author: Andi Kleen +# +# This program is free software; you can redistribute it and/or modify it +# under the terms and conditions of the GNU General Public License, +# version 2, as published by the Free Software Foundation. +# +# This program is distributed in the hope it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# Automatic event list downloader +# +# event_download.py download for current cpu +# event_download.py -a download all +# event_download.py cpustr... Download for specific CPU +import sys +import re +from urllib2 import urlopen, URLError +import os +import string +from fnmatch import fnmatch +from shutil import copyfile + +urlpath = 'https://download.01.org/perfmon' +localpath = 'download.01.org/perfmon' +mapfile = 'mapfile.csv' +modelpath = localpath + "/" + mapfile +NSB_JSON = '/opt/nsb_bin/pmu_event.json' + +def get_cpustr(): + f = open('/proc/cpuinfo', 'r') + cpu = [None, None, None] + for j in f: + n = j.split() + if n[0] == 'vendor_id': + cpu[0] = n[2] + elif n[0] == 'model' and n[1] == ':': + cpu[2] = int(n[2]) + elif n[0] == 'cpu' and n[1] == 'family': + cpu[1] = int(n[3]) + if all(cpu): + break + return "%s-%d-%X" % (cpu[0], cpu[1], cpu[2]) + +def sanitize(s, a): + o = "" + for j in s: + if j in a: + o += j + return o + +def getdir(): + try: + d = os.getenv("XDG_CACHE_HOME") + xd = d + if not d: + home = os.getenv("HOME") + d = "%s/.cache" % (home) + d += "/pmu-events" + if not os.path.isdir(d): + # try to handle the sudo case + if not xd: + user = os.getenv("SUDO_USER") + if user: + nd = os.path.expanduser("~" + user) + "/.cache/pmu-events" + if os.path.isdir(nd): + return nd + os.makedirs(d) + return d + except OSError: + raise Exception('Cannot access ' + d) + +NUM_TRIES = 3 + +def getfile(url, dir, fn): + tries = 0 + print "Downloading", url, "to", fn + while True: + try: + f = open(url) + data = f.read() + except IOError: + tries += 1 + if tries >= NUM_TRIES: + raise + print "retrying download" + continue + break + o = open(os.path.join(dir, fn), "w") + o.write(data) + o.close() + f.close() + +allowed_chars = string.ascii_letters + '_-.' + string.digits +def download(match, key=None, link=True): + found = 0 + dir = getdir() + try: + getfile(modelpath, dir, "mapfile.csv") + models = open(os.path.join(dir, "mapfile.csv")) + for j in models: + n = j.rstrip().split(",") + if len(n) < 4: + if len(n) > 0: + print "Cannot parse", n + continue + cpu, version, name, type = n + if not fnmatch(cpu, match) or (key is not None and type not in key) or type.startswith("EventType"): + continue + cpu = sanitize(cpu, allowed_chars) + url = localpath + name + fn = "%s-%s.json" % (cpu, sanitize(type, allowed_chars)) + try: + os.remove(os.path.join(dir, fn)) + except OSError: + pass + getfile(url, dir, fn) + if link: + lname = re.sub(r'.*/', '', name) + lname = sanitize(lname, allowed_chars) + try: + os.remove(os.path.join(dir, lname)) + except OSError: + pass + try: + os.symlink(fn, os.path.join(dir, lname)) + except OSError as e: + print >>sys.stderr, "Cannot link %s to %s:" % (name, lname), e + found += 1 + models.close() + getfile(localpath + "/readme.txt", dir, "readme.txt") + except URLError as e: + print >>sys.stderr, "Cannot access event server:", e + print >>sys.stderr, "If you need a proxy to access the internet please set it with:" + print >>sys.stderr, "\texport https_proxy=http://proxyname..." + print >>sys.stderr, "If you are not connected to the internet please run this on a connected system:" + print >>sys.stderr, "\tevent_download.py '%s'" % (match) + print >>sys.stderr, "and then copy ~/.cache/pmu-events to the system under test" + print >>sys.stderr, "To get events for all possible CPUs use:" + print >>sys.stderr, "\tevent_download.py -a" + except OSError as e: + print >>sys.stderr, "Cannot write events file:", e + return found + +def download_current(link=False): + """Download JSON event list for current cpu. + Returns >0 when a event list is found""" + return download(get_cpustr(), link=link) + +def eventlist_name(name=None, key="core"): + if not name: + name = get_cpustr() + cache = getdir() + return "%s/%s-%s.json" % (cache, name, key) + +if __name__ == '__main__': + # only import argparse when actually called from command line + # this makes ocperf work on older python versions without it. + import argparse + p = argparse.ArgumentParser(usage='download Intel event files') + p.add_argument('--all', '-a', help='Download all available event files', action='store_true') + p.add_argument('--verbose', '-v', help='Be verbose', action='store_true') + p.add_argument('--mine', help='Print name of current CPU', action='store_true') + p.add_argument('--link', help='Create links with the original event file name', action='store_true', default=True) + p.add_argument('cpus', help='CPU identifiers to download', nargs='*') + args = p.parse_args() + + cpustr = get_cpustr() + if args.verbose or args.mine: + print "My CPU", cpustr + if args.mine: + sys.exit(0) + d = getdir() + if args.all: + found = download('*', link=args.link) + elif len(args.cpus) == 0: + found = download_current(link=args.link) + else: + found = 0 + for j in args.cpus: + found += download(j, link=args.link) + + if found == 0: + print >>sys.stderr, "Nothing found" + + el = eventlist_name() + if os.path.exists(el): + print "my event list", el + copyfile(el,NSB_JSON) + print "File copied to ", NSB_JSON diff --git a/ansible/roles/download_pmu_tools/tasks/main.yml b/ansible/roles/download_pmu_tools/tasks/main.yml new file mode 100644 index 000000000..e78cc72d6 --- /dev/null +++ b/ansible/roles/download_pmu_tools/tasks/main.yml @@ -0,0 +1,41 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +#- debug: +# var: pmu_tools_version +# verbosity: 2 + +- name: fetch pmu_tools + git: + repo: "{{ pmu_tools_url }}" + dest: "{{ pmu_tools_dest }}" + version: "{{ pmu_tools_version }}" + accept_hostkey: yes + recursive: no + force: yes + +- set_fact: + pmu_tools_path: "{{ pmu_tools_dest }}" + +- name: Create perfmon local mirror + command: "wget -mkEpnp {{ perfmon_url }} -P {{ pmu_tools_dest }}" + ignore_errors: yes + +- name: Copy local event download file + copy: + src: event_download_local.py + dest: "{{ pmu_tools_dest }}" + owner: root + group: root + mode: 0755 diff --git a/ansible/roles/download_samplevnfs/defaults/main.yml b/ansible/roles/download_samplevnfs/defaults/main.yml index 5f565a415..e40eb67c0 100644 --- a/ansible/roles/download_samplevnfs/defaults/main.yml +++ b/ansible/roles/download_samplevnfs/defaults/main.yml @@ -1,4 +1,4 @@ --- samplevnf_url: "https://git.opnfv.org/samplevnf" samplevnf_dest: "{{ clone_dest }}/samplevnf" -samplevnf_version: "master" +samplevnf_version: "stable/euphrates" diff --git a/ansible/roles/enable_hugepages_on_boot/defaults/main.yml b/ansible/roles/enable_hugepages_on_boot/defaults/main.yml index 015e01bab..cc89ea346 100644 --- a/ansible/roles/enable_hugepages_on_boot/defaults/main.yml +++ b/ansible/roles/enable_hugepages_on_boot/defaults/main.yml @@ -1,3 +1,10 @@ --- num_hugepages: auto -huge_pagesize_mb: 1024
\ No newline at end of file +huge_pagesize_mb: 1024 +# disable EFI for chroot +efi: + stat: + exists: False +update_grub: + Debian: "grub-mkconfig -o {% if efi.stat.exists %}/boot/efi/EFI/{{ ansible_distribution|lower }}/grub.cfg{% else %}/boot/grub/grub.cfg{% endif %}" + RedHat: "grub2-mkconfig -o {% if efi.stat.exists %}/boot/efi/EFI/{{ ansible_distribution|lower }}/grub.cfg{% else %}/boot/grub2/grub.cfg{% endif %}" diff --git a/ansible/roles/enable_hugepages_on_boot/tasks/main.yml b/ansible/roles/enable_hugepages_on_boot/tasks/main.yml index 6e7657a39..29432d2e4 100755 --- a/ansible/roles/enable_hugepages_on_boot/tasks/main.yml +++ b/ansible/roles/enable_hugepages_on_boot/tasks/main.yml @@ -17,6 +17,11 @@ register: is_mine_huge ignore_errors: True +# won't work in chroot +#- name: Detect EFI +# stat: path="/sys/firmware/efi" +# register: efi + - name: check if hugepages are set by someone else command: "grep -o 'default_hugepagesz=' /etc/default/grub" register: is_huge @@ -53,3 +58,7 @@ - service: name: procps enabled: yes + +- include: manual_modify_grub.yml + # only tested on Ubuntu, kernel line is probably different on other distros + when: ansible_distribution == "Ubuntu" diff --git a/ansible/roles/enable_hugepages_on_boot/tasks/manual_modify_grub.yml b/ansible/roles/enable_hugepages_on_boot/tasks/manual_modify_grub.yml new file mode 100644 index 000000000..cac10e80e --- /dev/null +++ b/ansible/roles/enable_hugepages_on_boot/tasks/manual_modify_grub.yml @@ -0,0 +1,35 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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. +--- +- name: find boot grub.cfg + find: + paths: /boot + file_type: file + patterns: 'grub*.cfg' + recurse: yes + register: grub_files + + +- name: added hugepages to grub manually because we can't run update-grub in chroot + replace: + dest: "{{ item.path }}" + # console= should end the line + regexp: '(linux\s+/boot/vmlinuz.*console=\S+$)' + # default_hugepagesz=1G hugepagesz=1G hugepages=8 + replace: '\1 default_hugepagesz={{ huge_pagesize_short[huge_pagesize_mb] }} hugepagesz={{ huge_pagesize_short[huge_pagesize_mb] }} hugepages={{ num_hugepages }}' + with_items: "{{ grub_files.files }}" + + + + diff --git a/ansible/roles/install_L4Replay/tasks/main.yml b/ansible/roles/install_L4Replay/tasks/main.yml deleted file mode 100644 index 1401d1b13..000000000 --- a/ansible/roles/install_L4Replay/tasks/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -# there is no clean for L4Replay -#- my_make: chdir="{{ vnf_build_dir }}/L4Replay" target=clean extra_args="-j {{ ansible_processor_vcpus }}" - -- name: Building L4Replay VNF - my_make: chdir="{{ NSB_INSTALL_DIR }}/L4Replay" params="RTE_SDK={{ dpdk_path }}" extra_args="-j {{ ansible_processor_vcpus }}" - -- command: cp "{{ NSB_INSTALL_DIR }}/L4Replay/build/L4replay" "{{ INSTALL_BIN_PATH }}/" - diff --git a/ansible/roles/install_civetweb/defaults/main.yml b/ansible/roles/install_civetweb/defaults/main.yml new file mode 100644 index 000000000..2235fe172 --- /dev/null +++ b/ansible/roles/install_civetweb/defaults/main.yml @@ -0,0 +1,21 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +civetweb_dest: "{{ clone_dest }}/civetweb" +civetweb_build_dependencies: + Debian: + - libjson0 + - libjson0-dev + - libssl-dev + RedHat: diff --git a/ansible/roles/install_civetweb/tasks/main.yml b/ansible/roles/install_civetweb/tasks/main.yml new file mode 100644 index 000000000..67a910b83 --- /dev/null +++ b/ansible/roles/install_civetweb/tasks/main.yml @@ -0,0 +1,22 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- name: Install extra build dependencies + action: "{{ ansible_pkg_mgr }} name={{ item }} state=present" + with_items: "{{ civetweb_build_dependencies.get(ansible_os_family, []) }}" + +- name: Build civetweb lib + make: + chdir: "{{ civetweb_dest }}" + target: lib diff --git a/ansible/roles/install_collectd/tasks/main.yml b/ansible/roles/install_collectd/tasks/main.yml new file mode 100644 index 000000000..e3b655ffe --- /dev/null +++ b/ansible/roles/install_collectd/tasks/main.yml @@ -0,0 +1,38 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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. +--- +- name: Install extra build dependencies + action: "{{ ansible_pkg_mgr }} name={{ item }} state=present update_cache=yes" + with_items: "{{ collectd_build_dependencies[ansible_os_family] }}" + +- name: prepare autotools + command: ./build.sh + args: + chdir: "{{ collectd_path }}" + +- name: build collectd + shell: "./configure --with-libpqos=/usr/ --with-libdpdk={{ dpdk_shared_path }} --with-libyajl=/usr/ --with-libjevents=/usr/local --enable-debug --enable-dpdkstat --enable-virt --enable-ovs_stats --enable-intel_pmu --prefix={{ INSTALL_BIN_PATH }}/collectd |& tee collectd-configure.txt" + args: + executable: /bin/bash + chdir: "{{ collectd_path }}" + +- fetch: + src: "{{ collectd_path }}/collectd-configure.txt" + dest: /tmp + +- name: "make collectd install" + make: + chdir: "{{ collectd_path }}" + target: install + diff --git a/ansible/roles/install_collectd/vars/main.yml b/ansible/roles/install_collectd/vars/main.yml new file mode 100644 index 000000000..b1b3dc5db --- /dev/null +++ b/ansible/roles/install_collectd/vars/main.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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. +--- +collectd_build_dependencies: + Debian: + - flex + - bison + - build-essential + - pkg-config + - automake + - autotools-dev + - libltdl-dev + - librabbitmq-dev + - rabbitmq-server + - cmake + - libvirt-dev + - libyajl-dev + RedHat: + - flex + - bison + - pkgconfig + - automake + - cmake + - rabbitmq-server + - librabbitmq-devel + - libtool-ltdl-devel + - libvirt-devel + - yajl-devel + diff --git a/ansible/roles/install_dependencies/tasks/Debian.yml b/ansible/roles/install_dependencies/tasks/Debian.yml index 7a9911ebf..bba6fb13c 100755 --- a/ansible/roles/install_dependencies/tasks/Debian.yml +++ b/ansible/roles/install_dependencies/tasks/Debian.yml @@ -47,3 +47,4 @@ - uwsgi-plugin-python - supervisor - python-setuptools + - lsof diff --git a/ansible/roles/install_dpdk/tasks/Debian.yml b/ansible/roles/install_dpdk/tasks/Debian.yml index c77e4f96a..4f0c3c881 100755 --- a/ansible/roles/install_dpdk/tasks/Debian.yml +++ b/ansible/roles/install_dpdk/tasks/Debian.yml @@ -16,6 +16,7 @@ action: "{{ ansible_pkg_mgr }} name={{ item }} state=present" with_items: - libpcap-dev + - pciutils - name: Install kernel headers action: "{{ ansible_pkg_mgr }} name=linux-headers-{{ dpdk_kernel }} state=present" diff --git a/ansible/roles/install_dpdk/tasks/main.yml b/ansible/roles/install_dpdk/tasks/main.yml index cab093ad5..01ad4baf1 100644 --- a/ansible/roles/install_dpdk/tasks/main.yml +++ b/ansible/roles/install_dpdk/tasks/main.yml @@ -36,13 +36,9 @@ set_fact: RTE_KERNELDIR: "/lib/modules/{{ dpdk_kernel }}/build" -- my_make: +- command: make -j {{ ansible_processor_vcpus }} config T={{ dpdk_make_arch }} O={{ dpdk_make_arch }} + args: chdir: "{{ dpdk_path }}" - target: config - params: - T: "{{ dpdk_make_arch }}" - O: "{{ dpdk_make_arch }}" - extra_args: "-j {{ ansible_processor_vcpus }}" environment: RTE_KERNELDIR: "{{ RTE_KERNELDIR }}" @@ -70,12 +66,38 @@ regexp: '^CONFIG_RTE_PIPELINE_STATS_COLLECT=n' line: 'CONFIG_RTE_PIPELINE_STATS_COLLECT=y' -- my_make: +# This is requied for collectd? but it breaks PROX? +#- name: enable CONFIG_RTE_BUILD_SHARED_LIB +# lineinfile: +# dest: "{{ dpdk_path }}/{{ dpdk_make_arch }}/.config" +# regexp: '^CONFIG_RTE_BUILD_SHARED_LIB=n' +# line: 'CONFIG_RTE_BUILD_SHARED_LIB=y' +# +#- name: enable DPDK CONFIG_RTE_EAL_PMD_PATH +# lineinfile: +# dest: "{{ dpdk_path }}/{{ dpdk_make_arch }}/.config" +# regexp: '^CONFIG_RTE_EAL_PMD_PATH=""' +# line: 'CONFIG_RTE_EAL_PMD_PATH="{{ dpdk_pmd_path }}"' + +# TODO: disable ASLR + +- name: make dpdk + command: make -j {{ ansible_processor_vcpus }} + args: chdir: "{{ dpdk_path }}/{{ dpdk_make_arch}}" - extra_args: "-j {{ ansible_processor_vcpus }}" environment: RTE_KERNELDIR: "{{ RTE_KERNELDIR }}" +#- name: make install DPDK into /usr for collectd and other programs +# make: +# chdir: "{{ dpdk_path }}/{{ dpdk_make_arch}}" +# target: install +# params: "T={{ RTE_TARGET }}" +## params: "prefix={{ usr_prefix }}" +# environment: +# RTE_KERNELDIR: "{{ RTE_KERNELDIR }}" +# become: yes + - file: path: "{{ dpdk_module_dir}}" state: directory diff --git a/ansible/roles/install_dpdk/vars/main.yml b/ansible/roles/install_dpdk/vars/main.yml index 1cc4f1583..45bcc339b 100644 --- a/ansible/roles/install_dpdk/vars/main.yml +++ b/ansible/roles/install_dpdk/vars/main.yml @@ -6,3 +6,4 @@ dpdk_devbind: "16.07": "{{ dpdk_path }}/tools/dpdk-devbind.py" "17.02": "{{ dpdk_path }}/usertools/dpdk-devbind.py" "17.04": "{{ dpdk_path }}/usertools/dpdk-devbind.py" +dpdk_pmd_path: /usr/lib/dpdk-pmd/ diff --git a/ansible/roles/install_dpdk_shared/defaults/main.yml b/ansible/roles/install_dpdk_shared/defaults/main.yml new file mode 100644 index 000000000..fe2172401 --- /dev/null +++ b/ansible/roles/install_dpdk_shared/defaults/main.yml @@ -0,0 +1,2 @@ +--- +INSTALL_BIN_PATH: "/opt/nsb_bin"
\ No newline at end of file diff --git a/ansible/roles/install_dpdk_shared/tasks/Debian.yml b/ansible/roles/install_dpdk_shared/tasks/Debian.yml new file mode 100755 index 000000000..c77e4f96a --- /dev/null +++ b/ansible/roles/install_dpdk_shared/tasks/Debian.yml @@ -0,0 +1,22 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- name: Install DPDK build dependencies + action: "{{ ansible_pkg_mgr }} name={{ item }} state=present" + with_items: + - libpcap-dev + +- name: Install kernel headers + action: "{{ ansible_pkg_mgr }} name=linux-headers-{{ dpdk_kernel }} state=present" + diff --git a/ansible/roles/install_dpdk_shared/tasks/RedHat.yml b/ansible/roles/install_dpdk_shared/tasks/RedHat.yml new file mode 100644 index 000000000..ae66faa04 --- /dev/null +++ b/ansible/roles/install_dpdk_shared/tasks/RedHat.yml @@ -0,0 +1,29 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- name: Install DPDK build dependencies + action: "{{ ansible_pkg_mgr }} name={{ item }} state=present" + with_items: + - libpcap-devel + +# Do this before installing kernel headers +# example: +# kernel-headers-3.10.0-514.2.2.el7.x86_64 for kernel 3.10.0-514.el7.x86_64 +- name: Adjust dpdk_kernel to be match an RPM, remove el7.x86_64 + set_fact: + rpm_kernel: "{{ dpdk_kernel|regex_replace('[.]el\\d+\\.x86_64', '') }}" + +- name: Install kernel headers +# use rpm wildcard + action: "{{ ansible_pkg_mgr }} name=kernel-headers-{{ rpm_kernel }}* state=present" diff --git a/ansible/roles/install_dpdk_shared/tasks/main.yml b/ansible/roles/install_dpdk_shared/tasks/main.yml new file mode 100644 index 000000000..65954be04 --- /dev/null +++ b/ansible/roles/install_dpdk_shared/tasks/main.yml @@ -0,0 +1,114 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +#- patch: src="{{ item }}" basedir="{{ dpdk_path }}" strip=0 +# with_fileglob: +# - "{{ local_nsb_path }}/patches/dpdk_custom_patch/rte_pipeline.patch" +# +#- patch: src="{{ item }}" basedir="{{ dpdk_path }}" strip=1 +# with_fileglob: +# - "{{ local_nsb_path }}/patches/dpdk_custom_patch/0*.patch" + +- name: set DPDK shared dir + set_fact: + dpdk_shared_path: "{{ dpdk_path }}-shared" + +- command: "cp -a {{ dpdk_path }} {{ dpdk_shared_path }}" + +- name: find kernel for image, (including chroot) + find_kernel: + kernel: "{{ ansible_kernel }}" + register: found_kernel + +# Do this before installing kernel headers +- name: Set dpdk_kernel to be the kernel we found + set_fact: + dpdk_kernel: "{{ found_kernel.kernel }}" + +- include: "{{ ansible_os_family }}.yml" + +- name: set RTE_KERNELDIR to point to found kernel + set_fact: + RTE_KERNELDIR: "/lib/modules/{{ dpdk_kernel }}/build" + +- command: make -j {{ ansible_processor_vcpus }} config T={{ dpdk_make_arch }} O={{ dpdk_make_arch }} + args: + chdir: "{{ dpdk_shared_path }}" + environment: + RTE_KERNELDIR: "{{ RTE_KERNELDIR }}" + +- name: enable RTE_PORT_STATS_COLLECT + lineinfile: + dest: "{{ dpdk_shared_path }}/{{ dpdk_make_arch }}/.config" + regexp: '^CONFIG_RTE_PORT_STATS_COLLECT=n' + line: 'CONFIG_RTE_PORT_STATS_COLLECT=y' + +- name: enable DPDK RTE_PORT_PCAP + lineinfile: + dest: "{{ dpdk_shared_path }}/{{ dpdk_make_arch }}/.config" + regexp: '^CONFIG_RTE_PORT_PCAP=n' + line: 'CONFIG_RTE_PORT_PCAP=y' + +- name: enable DPDK RTE_TABLE_STATS_COLLECT + lineinfile: + dest: "{{ dpdk_shared_path }}/{{ dpdk_make_arch }}/.config" + regexp: '^CONFIG_RTE_TABLE_STATS_COLLECT=n' + line: 'CONFIG_RTE_TABLE_STATS_COLLECT=y' + +- name: enable DPDK RTE_PIPELINE_STATS_COLLECT + lineinfile: + dest: "{{ dpdk_shared_path }}/{{ dpdk_make_arch }}/.config" + regexp: '^CONFIG_RTE_PIPELINE_STATS_COLLECT=n' + line: 'CONFIG_RTE_PIPELINE_STATS_COLLECT=y' + +# This is requied for collectd but VNFs can't use shared DPDK +- name: enable CONFIG_RTE_BUILD_SHARED_LIB + lineinfile: + dest: "{{ dpdk_shared_path }}/{{ dpdk_make_arch }}/.config" + regexp: '^CONFIG_RTE_BUILD_SHARED_LIB=n' + line: 'CONFIG_RTE_BUILD_SHARED_LIB=y' + +- name: enable DPDK CONFIG_RTE_EAL_PMD_PATH + lineinfile: + dest: "{{ dpdk_shared_path }}/{{ dpdk_make_arch }}/.config" + regexp: '^CONFIG_RTE_EAL_PMD_PATH=""' + line: 'CONFIG_RTE_EAL_PMD_PATH="{{ dpdk_pmd_path }}"' + + # no T= target for clean +- command: make -j {{ ansible_processor_vcpus }} clean O={{ dpdk_make_arch }} + args: + chdir: "{{ dpdk_shared_path }}" + environment: + RTE_KERNELDIR: "{{ RTE_KERNELDIR }}" + +# TODO: disable ASLR + +- command: make -j {{ ansible_processor_vcpus }} + args: + chdir: "{{ dpdk_shared_path }}/{{ dpdk_make_arch}}" + environment: + RTE_KERNELDIR: "{{ RTE_KERNELDIR }}" + +#- name: make install DPDK into /usr for collectd and other programs +# make: +# chdir: "{{ dpdk_shared_path }}/{{ dpdk_make_arch}}" +# target: install +# params: "T={{ RTE_TARGET }}" +## params: "prefix={{ usr_prefix }}" +# environment: +# RTE_KERNELDIR: "{{ RTE_KERNELDIR }}" +# become: yes + +# don't install module or copy dpdk-devbind + diff --git a/ansible/roles/install_dpdk_shared/vars/main.yml b/ansible/roles/install_dpdk_shared/vars/main.yml new file mode 100644 index 000000000..45bcc339b --- /dev/null +++ b/ansible/roles/install_dpdk_shared/vars/main.yml @@ -0,0 +1,9 @@ +--- +dpdk_make_arch: x86_64-native-linuxapp-gcc +dpdk_module_dir: "/lib/modules/{{ dpdk_kernel }}/extra" +hugetable_mount: /mnt/huge +dpdk_devbind: + "16.07": "{{ dpdk_path }}/tools/dpdk-devbind.py" + "17.02": "{{ dpdk_path }}/usertools/dpdk-devbind.py" + "17.04": "{{ dpdk_path }}/usertools/dpdk-devbind.py" +dpdk_pmd_path: /usr/lib/dpdk-pmd/ diff --git a/ansible/roles/install_image_dependencies/tasks/main.yml b/ansible/roles/install_image_dependencies/tasks/main.yml index f3a3151c5..ffd30f33e 100644 --- a/ansible/roles/install_image_dependencies/tasks/main.yml +++ b/ansible/roles/install_image_dependencies/tasks/main.yml @@ -16,7 +16,7 @@ include: "{{ ansible_os_family }}.yml" - name: Install core packages - action: "{{ ansible_pkg_mgr }} name={{ item }} state=latest" + action: "{{ ansible_pkg_mgr }} name={{ item }} state=latest update_cache=yes" register: pkg_mgr_results retries: "{{ pkg_mgr_retries }}" until: pkg_mgr_results|success diff --git a/ansible/roles/install_intel_cmt_cat/tasks/main.yml b/ansible/roles/install_intel_cmt_cat/tasks/main.yml new file mode 100644 index 000000000..609e98024 --- /dev/null +++ b/ansible/roles/install_intel_cmt_cat/tasks/main.yml @@ -0,0 +1,25 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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. +--- + +- name: Install extra build dependencies + action: "{{ ansible_pkg_mgr }} name={{ item }} state=present" + with_items: "{{ intel_cmt_cat_build_dependencies[ansible_os_family] }}" + +- name: "make intel-cmt-cat" + make: + chdir: "{{ intel_cmt_cat_path }}" + target: install + params: + PREFIX: "/usr" diff --git a/ansible/roles/install_intel_cmt_cat/vars/main.yml b/ansible/roles/install_intel_cmt_cat/vars/main.yml new file mode 100644 index 000000000..20bc1c69c --- /dev/null +++ b/ansible/roles/install_intel_cmt_cat/vars/main.yml @@ -0,0 +1,38 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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. +--- +intel_cmt_cat_build_dependencies: + Debian: + - flex + - bison + - build-essential + - pkg-config + - automake + - autotools-dev + - libltdl-dev + - librabbitmq-dev + - rabbitmq-server + - cmake + - libvirt-dev + RedHat: + - flex + - bison + - pkgconfig + - automake + - cmake + - rabbitmq-server + - librabbitmq-devel + - libtool-ltdl-devel + - libvirt-devel + diff --git a/ansible/roles/install_pmu_tools/tasks/main.yml b/ansible/roles/install_pmu_tools/tasks/main.yml new file mode 100644 index 000000000..026fb67ea --- /dev/null +++ b/ansible/roles/install_pmu_tools/tasks/main.yml @@ -0,0 +1,36 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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. +--- + +- name: Install extra build dependencies + action: "{{ ansible_pkg_mgr }} name={{ item }} state=present" + with_items: "{{ pmu_tools_build_dependencies[ansible_os_family] }}" + +- name: fix pmu-tools CFLAGS to include -fPIC + replace: + path: "{{ pmu_tools_path }}/jevents/Makefile" + regexp: "CFLAGS := -g -Wall -O2 -Wno-unused-result" + replace: "CFLAGS := -g -Wall -O2 -Wno-unused-result -fPIC" + backup: yes + +- name: "make jevents" + make: + chdir: "{{ pmu_tools_path }}/jevents" + +- name: "make install jevents" + make: + chdir: "{{ pmu_tools_path }}/jevents" + target: install + become: yes + diff --git a/ansible/roles/install_pmu_tools/vars/main.yml b/ansible/roles/install_pmu_tools/vars/main.yml new file mode 100644 index 000000000..10660f61b --- /dev/null +++ b/ansible/roles/install_pmu_tools/vars/main.yml @@ -0,0 +1,38 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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. +--- +pmu_tools_build_dependencies: + Debian: + - flex + - bison + - build-essential + - pkg-config + - automake + - autotools-dev + - libltdl-dev + - librabbitmq-dev + - rabbitmq-server + - cmake + - libvirt-dev + RedHat: + - flex + - bison + - pkgconfig + - automake + - cmake + - rabbitmq-server + - librabbitmq-devel + - libtool-ltdl-devel + - libvirt-devel + diff --git a/ansible/roles/install_rabbitmq/tasks/main.yml b/ansible/roles/install_rabbitmq/tasks/main.yml new file mode 100644 index 000000000..16195c49d --- /dev/null +++ b/ansible/roles/install_rabbitmq/tasks/main.yml @@ -0,0 +1,22 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- name: bootstrap rabbitmq project repos + template: "src={{ ansible_os_family }}-repos.j2 dest=/etc/yum.repos.d/rabbitmq_rabbitmq-server.repo" + when: ansible_os_family == 'RedHat' + +- name: Install extra build dependencies + action: "{{ ansible_pkg_mgr }} name={{ item }} state=latest update_cache=yes" + with_items: "{{ rabbitmq_packages[ansible_os_family] }}" + diff --git a/ansible/roles/install_rabbitmq/templates/RedHat-repos.j2 b/ansible/roles/install_rabbitmq/templates/RedHat-repos.j2 new file mode 100644 index 000000000..09c997ce1 --- /dev/null +++ b/ansible/roles/install_rabbitmq/templates/RedHat-repos.j2 @@ -0,0 +1,21 @@ +[rabbitmq_rabbitmq-server] +name=rabbitmq_rabbitmq-server +baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/{{ ansible_distribution_major_version }}/$basearch +repo_gpgcheck=0 +gpgcheck=0 +enabled=1 +gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey +sslverify=0 +sslcacert=/etc/pki/tls/certs/ca-bundle.crt +metadata_expire=300 + +[rabbitmq_rabbitmq-server-source] +name=rabbitmq_rabbitmq-server-source +baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/{{ ansible_distribution_major_version }}/SRPMS +repo_gpgcheck=0 +gpgcheck=0 +enabled=1 +gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey +sslverify=0 +sslcacert=/etc/pki/tls/certs/ca-bundle.crt +metadata_expire=300
\ No newline at end of file diff --git a/ansible/roles/install_rabbitmq/vars/main.yml b/ansible/roles/install_rabbitmq/vars/main.yml new file mode 100644 index 000000000..d49607dbf --- /dev/null +++ b/ansible/roles/install_rabbitmq/vars/main.yml @@ -0,0 +1,22 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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. +--- +rabbitmq_packages: + Debian: + - librabbitmq-dev + - rabbitmq-server + RedHat: + - rabbitmq-server + - librabbitmq-devel + diff --git a/ansible/roles/install_samplevnf/tasks/main.yml b/ansible/roles/install_samplevnf/tasks/main.yml index d332c88bc..d2deb5894 100644 --- a/ansible/roles/install_samplevnf/tasks/main.yml +++ b/ansible/roles/install_samplevnf/tasks/main.yml @@ -22,7 +22,6 @@ action: "{{ ansible_pkg_mgr }} name={{ item }} state=present" with_items: "{{ vnf_build_dependencies.get(vnf_name, {}).get(ansible_os_family, []) }}" - - name: set build env vars set_fact: build_env_vars: @@ -36,11 +35,15 @@ when: vnf_name == "PROX" and image_type is defined and image_type == "vm" - name: "make {{ vnf_name }} clean" - my_make: chdir="{{ vnf_build_dir }}" target=clean extra_args="-j {{ ansible_processor_vcpus }}" + command: make -j {{ ansible_processor_vcpus }} clean + args: + chdir: "{{ vnf_build_dir }}" environment: "{{ build_env_vars }}" - name: "make {{ vnf_name }}" - my_make: chdir="{{ vnf_build_dir }}" extra_args="-j {{ ansible_processor_vcpus }}" + command: make -j {{ ansible_processor_vcpus }} + args: + chdir: "{{ vnf_build_dir }}" environment: "{{ build_env_vars }}" #- command: cp "{{ vnf_build_dir }}/{{ vnf_name }}/build/ip_pipeline" "{{ INSTALL_BIN_PATH }}/vACL_vnf" diff --git a/ansible/roles/install_samplevnf/vars/main.yml b/ansible/roles/install_samplevnf/vars/main.yml index 6f2c44a84..45cea6820 100644 --- a/ansible/roles/install_samplevnf/vars/main.yml +++ b/ansible/roles/install_samplevnf/vars/main.yml @@ -15,6 +15,23 @@ vnf_build_dependencies: PROX: Debian: + - build-essential + - git + - unzip + - libpcap0.8-dev + - gcc + - make + - libc6 + - libc6-dev + - g++-multilib + - libzmq3-dev + - libcurl4-openssl-dev + - net-tools + - wget + - libpcap-dev + - libncurses-dev + - libedit-dev + - pciutils - pkg-config - liblua5.2-dev - libncurses5 diff --git a/ansible/roles/package_clean/tasks/Debian.yml b/ansible/roles/package_clean/tasks/Debian.yml new file mode 100755 index 000000000..abc280076 --- /dev/null +++ b/ansible/roles/package_clean/tasks/Debian.yml @@ -0,0 +1,16 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- name: Purge apt cache + command: apt-get clean diff --git a/ansible/roles/package_clean/tasks/RedHat.yml b/ansible/roles/package_clean/tasks/RedHat.yml new file mode 100644 index 000000000..c6ed62b35 --- /dev/null +++ b/ansible/roles/package_clean/tasks/RedHat.yml @@ -0,0 +1,17 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- name: Clean yum cache + command: "{{ ansible_pkg_mgr }} clean all + diff --git a/ansible/roles/package_clean/tasks/main.yml b/ansible/roles/package_clean/tasks/main.yml new file mode 100644 index 000000000..27660c3ca --- /dev/null +++ b/ansible/roles/package_clean/tasks/main.yml @@ -0,0 +1,15 @@ +# Copyright (c) 2017 Intel Corporation. +# +# 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. +--- +- include: "{{ ansible_os_family }}.yml" diff --git a/ansible/sriov_scale_out_test_ixia_correlated_templates.yml b/ansible/sriov_scale_out_test_ixia_correlated_templates.yml new file mode 100644 index 000000000..2a6c352b4 --- /dev/null +++ b/ansible/sriov_scale_out_test_ixia_correlated_templates.yml @@ -0,0 +1,61 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- + +- set_fact: + num_vnfs: "{{ item }}" + +- debug: + var: num_vnfs + verbosity: 2 + + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-ixia-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-ixia-{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/ixia_correlated_template.yaml + dest: /etc/yardstick/nodes/ixia_correlated_{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/pod_sriov.yaml + dest: /etc/yardstick/nodes/sriov_host.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/tc_sriov_vfw_udp_ixia_correlated_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/vfw/tc_sriov_vfw_udp_ixia_correlated_scale_out_{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-ixia-correlated-scale-out.yaml + dest: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-ixia-correlated-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/tc_sriov_acl_udp_ixia_correlated_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/acl/tc_sriov_acl_udp_ixia_correlated_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/acl-tg-topology-ixia-correlated-scale-out.yaml + dest: ../samples/vnf_samples/nsut/acl/acl-tg-topology-ixia-correlated-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-ixia-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/tc_sriov_cgnapt_udp_ixia_correlated_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/tc_sriov_cgnapt_udp_ixia_correlated_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-ixia-correlated-scale-out.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-ixia-correlated-scale-out-{{ num_vnfs }}.yaml diff --git a/ansible/sriov_scale_out_test_ixia_templates.yml b/ansible/sriov_scale_out_test_ixia_templates.yml new file mode 100644 index 000000000..45c6f3d05 --- /dev/null +++ b/ansible/sriov_scale_out_test_ixia_templates.yml @@ -0,0 +1,61 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- + +- set_fact: + num_vnfs: "{{ item }}" + +- debug: + var: num_vnfs + verbosity: 2 + + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-ixia-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-ixia-{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/ixia_template.yaml + dest: /etc/yardstick/nodes/ixia_{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/pod_sriov.yaml + dest: /etc/yardstick/nodes/sriov_host.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/tc_sriov_vfw_udp_ixia_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/vfw/tc_sriov_vfw_udp_ixia_scale_out_{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-ixia-scale-out.yaml + dest: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-ixia-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/tc_sriov_acl_udp_ixia_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/acl/tc_sriov_acl_udp_ixia_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/acl-tg-topology-ixia-scale-out.yaml + dest: ../samples/vnf_samples/nsut/acl/acl-tg-topology-ixia-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-ixia-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/tc_sriov_cgnapt_udp_ixia_scale_out_template.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/tc_sriov_cgnapt_udp_ixia_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-ixia-scale-out.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-ixia-scale-out-{{ num_vnfs }}.yaml diff --git a/ansible/sriov_scale_out_test_templates.yml b/ansible/sriov_scale_out_test_templates.yml new file mode 100644 index 000000000..33ecfad47 --- /dev/null +++ b/ansible/sriov_scale_out_test_templates.yml @@ -0,0 +1,61 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- + +- set_fact: + num_vnfs: "{{ item }}" + +- debug: + var: num_vnfs + verbosity: 2 + + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-{{ num_vnfs }}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/baremetal_trex.yaml + dest: /etc/yardstick/nodes/baremetal_trex_{{num_vnfs}}.yaml + +- template: + src: ../etc/yardstick/nodes/standalone/pod_sriov.yaml + dest: /etc/yardstick/nodes/sriov_host.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/tc_sriov_vfw_udp_scale_out.yaml + dest: ../samples/vnf_samples/nsut/vfw/tc_sriov_vfw_udp_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-scale-out.yaml + dest: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/tc_sriov_acl_udp_scale_out.yaml + dest: ../samples/vnf_samples/nsut/acl/tc_sriov_acl_udp_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/acl/acl-tg-topology-scale-out.yaml + dest: ../samples/vnf_samples/nsut/acl/acl-tg-topology-scale-out-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-scale-out.yaml + dest: ../samples/vnf_samples/traffic_profiles/ipv4_throughput-cgnapt-{{ num_vnfs }}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/tc_sriov_cgnapt_udp_scale_out.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/tc_sriov_cgnapt_udp_scale_out_{{num_vnfs}}.yaml + +- template: + src: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-scale-out.yaml + dest: ../samples/vnf_samples/nsut/cgnapt/cgnapt-tg-topology-scale-out-{{ num_vnfs }}.yaml diff --git a/ansible/standalone_ovs_scale_out_ixia_correlated_test.yaml b/ansible/standalone_ovs_scale_out_ixia_correlated_test.yaml new file mode 100644 index 000000000..e3c8c7ca1 --- /dev/null +++ b/ansible/standalone_ovs_scale_out_ixia_correlated_test.yaml @@ -0,0 +1,147 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- +- hosts: localhost + connection: local + vars: + scale_out: + - 1 + - 2 + ovs_properties: + ovs: 2.6.0 + dpdk: 16.07.1 + vpath: "/usr/local" + queues: 4 + pmd_threads: 2 + ram: + socket_0: 2048 + socket_1: 2048 + flavor: + ram: 4096 + image: "/var/lib/libvirt/images/ubuntu.qcow2" + extra_specs: + cpu_sockets: 1 + cpu_cores: 6 + cpu_threads: 2 + flow: + traffic_type: 4 + pkt_size: + uplink: {64B: 100} + downlink: {64B: 100} + count: 10 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf_config: + lb_config: 'SW' + lb_count: 1 + worker_config: '1C/1T' + worker_threads: 1 + # Environment variables + gen: + user: "" + password: "" + key_filename: ~ + tg_config: + ixchassis: "1.1.1.127" #ixia chassis ip + tcl_port: "8009" # tcl server port + lib_path: "/opt/ixia/ixos-api/8.01.0.2/lib/ixTcl1.0" + ""_dir: "/opt/ixia/ixos-api/8.01.0.2/" + py_bin_path: "/opt/ixia/ixload/8.01.106.3/bin/" + py_lib_path: "/opt/ixia/ixnetwork/8.01.1029.14/lib/PythonApi" + dut_result_dir: "/mnt/results" + version: "8.01.106.3" + pcis: + uplink: + - "2:5" #Card:port + - "2:3" #Card:port + downlink: + - "2:6" #Card:port + - "2:5" #Card:port + ip: + mgmt: + - '1.1.1.138/24' # ixia network machine ip + uplink: + - '152.16.100.20/24' + - '172.16.100.20/24' + downlink: + - '152.16.40.20/24' + - '172.16.40.20/24' + mac: + uplink: + - '00:98:10:64:14:00' + - '00:ac:10:64:14:0' + downlink: + - '00:98:10:28:14:00' + - '00:ac:10:28:14:00' + + # Environment variables + gen_1: + user: "" + password: ""! + key_filename: /""/.ssh/id_rsa + pcis: + uplink: + - "0000:05:00.0" + - "0000:05:00.2" + downlink: + - "0000:05:00.1" + - "0000:05:00.3" + ip: + mgmt: + - '1.2.1.6/24' + uplink: + - '152.16.100.20/24' + - '172.16.100.20/24' + downlink: + - '152.16.40.20/24' + - '172.16.40.20/24' + mac: + uplink: + - '00:00:00:9e:00:f8' + - '00:00:00:9e:00:fa' + downlink: + - '00:00:00:9e:00:f9' + - '00:00:00:9e:00:fb' + + host: + ip: "192.168.100.101/24" + user: "" + password: "" + key_filename: ~ + + vnf: + user: "" + password: "" + key_filename: ~ + pcis: + uplink: + - "0000:07:00.0" + - "0000:07:00.2" + downlink: + - "0000:07:00.1" + - "0000:07:00.3" + ip: + mgmt: + - '1.1.1.1/24' + - '1.1.1.7/24' + uplink: + - '152.16.100.10/24' + - '172.16.100.10/24' + downlink: + - '152.16.40.10/24' + - '172.16.40.10/24' + + tasks: + - include: ovs_scale_out_test_ixia_correlated_templates.yml + with_items: "{{ scale_out }}" + diff --git a/ansible/standalone_ovs_scale_out_ixia_test.yaml b/ansible/standalone_ovs_scale_out_ixia_test.yaml new file mode 100644 index 000000000..d8ee224ac --- /dev/null +++ b/ansible/standalone_ovs_scale_out_ixia_test.yaml @@ -0,0 +1,118 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- +- hosts: localhost + connection: local + vars: + scale_out: + - 1 + - 2 + ovs_properties: + ovs: 2.6.0 + dpdk: 16.07.1 + vpath: "/usr/local" + queues: 4 + pmd_threads: 2 + ram: + socket_0: 2048 + socket_1: 2048 + flavor: + ram: 4096 + image: "/var/lib/libvirt/images/ubuntu.qcow2" + extra_specs: + cpu_sockets: 1 + cpu_cores: 6 + cpu_threads: 2 + flow: + traffic_type: 4 + pkt_size: + uplink: {64B: 100} + downlink: {64B: 100} + count: 10 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf_config: + lb_config: 'SW' + lb_count: 1 + worker_config: '1C/1T' + worker_threads: 1 + + # Environment variables + gen: + user: "" + password: "" + key_filename: ~ + tg_config: + ixchassis: "1.1.1.127" #ixia chassis ip + tcl_port: "8009" # tcl server port + lib_path: "/opt/ixia/ixos-api/8.01.0.2/lib/ixTcl1.0" + ""_dir: "/opt/ixia/ixos-api/8.01.0.2/" + py_bin_path: "/opt/ixia/ixload/8.01.106.3/bin/" + py_lib_path: "/opt/ixia/ixnetwork/8.01.1029.14/lib/PythonApi" + dut_result_dir: "/mnt/results" + version: "8.01.106.3" + pcis: + uplink: + - "2:5" #Card:port + - "2:3" #Card:port + downlink: + - "2:6" #Card:port + - "2:5" #Card:port + ip: + mgmt: + - '1.2.1.6/24' + uplink: + - '152.16.100.20/24' + - '172.16.100.20/24' + downlink: + - '152.16.40.20/24' + - '172.16.40.20/24' + mac: + uplink: + - '00:98:10:64:14:00' + - '00:ac:10:64:14:0' + downlink: + - '00:98:10:28:14:00' + - '00:ac:10:28:14:00' + + host: + ip: "192.168.100.101/24" + user: "" + password: "" + key_filename: ~ + + vnf: + user: "" + password: "" + pcis: + uplink: + - "0000:05:00.0" + - "0000:05:00.2" + downlink: + - "0000:05:00.1" + - "0000:05:00.3" + ip: + mgmt: + - '1.2.1.6/24' + - '1.2.1.6/24' + uplink: + - '152.16.100.10/24' + - '172.16.100.10/24' + downlink: + - '152.16.40.10/24' + - '172.16.40.10/24' + + tasks: + - include: ovs_scale_out_test_ixia_templates.yml + with_items: "{{ scale_out }}" + diff --git a/ansible/standalone_ovs_scale_out_test.yaml b/ansible/standalone_ovs_scale_out_test.yaml new file mode 100644 index 000000000..2a0246c2d --- /dev/null +++ b/ansible/standalone_ovs_scale_out_test.yaml @@ -0,0 +1,109 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- +- hosts: localhost + connection: local + vars: + scale_out: + - 1 + - 2 + ovs_properties: + ovs: 2.6.0 + dpdk: 16.07.1 + vpath: "/usr/local" + queues: 4 + pmd_threads: 2 + ram: + socket_0: 2048 + socket_1: 2048 + flavor: + user: root + password: "" + ram: 4096 + image: "/var/lib/libvirt/images/ubuntu.qcow2" + extra_specs: + cpu_sockets: 1 + cpu_cores: 6 + cpu_threads: 2 + flow: + traffic_type: 4 + pkt_size: + uplink: {64B: 100} + downlink: {64B: 100} + count: 10 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf_config: + lb_config: 'SW' + lb_count: 1 + worker_config: '1C/1T' + worker_threads: 1 + + # Environment variables + gen: + user: root + password: "" + key_filename: /root/.ssh/id_rsa + pcis: + uplink: + - "0000:05:00.0" + - "0000:05:00.2" + downlink: + - "0000:05:00.1" + - "0000:05:00.3" + ip: + mgmt: + - '1.2.1.6/24' + uplink: + - '152.16.100.20/24' + - '172.16.100.20/24' + downlink: + - '152.16.40.20/24' + - '172.16.40.20/24' + mac: + uplink: + - '00:00:00:9e:00:f8' + - '00:00:00:9e:00:fa' + downlink: + - '00:00:00:9e:00:f9' + - '00:00:00:9e:00:fb' + + host: + ip: "192.168.100.101/24" + user: root + password: "" + key_filename: /root/.ssh/id_rsa + + vnf: + pcis: + uplink: + - "0000:05:00.0" + - "0000:05:00.2" + downlink: + - "0000:05:00.1" + - "0000:05:00.3" + ip: + mgmt: + - '1.2.1.6/24' + - '1.2.1.6/24' + uplink: + - '152.16.100.10/24' + - '172.16.100.10/24' + downlink: + - '152.16.40.10/24' + - '172.16.40.10/24' + + tasks: + - include: ovs_scale_out_test_templates.yml + with_items: "{{ scale_out }}" + diff --git a/ansible/standalone_sriov_scale_out_ixia_correlated_test.yaml b/ansible/standalone_sriov_scale_out_ixia_correlated_test.yaml new file mode 100644 index 000000000..084dcbf7e --- /dev/null +++ b/ansible/standalone_sriov_scale_out_ixia_correlated_test.yaml @@ -0,0 +1,139 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- +- hosts: localhost + connection: local + vars: + scale_out: + - 1 + - 2 + flavor: + ram: 4096 + image: "/var/lib/libvirt/images/ubuntu.qcow2" + extra_specs: + cpu_sockets: 1 + cpu_cores: 6 + cpu_threads: 2 + flow: + traffic_type: 4 + pkt_size: + uplink: {64B: 100} + downlink: {64B: 100} + count: 10 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf_config: + lb_config: 'SW' + lb_count: 1 + worker_config: '1C/1T' + worker_threads: 1 + + # Environment variables + gen: + user: "" + password: "" + key_filename: ~ + tg_config: + ixchassis: "1.1.1.127" #ixia chassis ip + tcl_port: "8009" # tcl server port + lib_path: "/opt/ixia/ixos-api/8.01.0.2/lib/ixTcl1.0" + ""_dir: "/opt/ixia/ixos-api/8.01.0.2/" + py_bin_path: "/opt/ixia/ixload/8.01.106.3/bin/" + py_lib_path: "/opt/ixia/ixnetwork/8.01.1029.14/lib/PythonApi" + dut_result_dir: "/mnt/results" + version: "8.01.106.3" + pcis: + uplink: + - "2:5" #Card:port + - "2:3" #Card:port + downlink: + - "2:6" #Card:port + - "2:5" #Card:port + ip: + mgmt: + - '1.1.1.138/24' # ixia network machine ip + uplink: + - '152.16.100.20/24' + - '172.16.100.20/24' + downlink: + - '152.16.40.20/24' + - '172.16.40.20/24' + mac: + uplink: + - '00:98:10:64:14:00' + - '00:ac:10:64:14:0' + downlink: + - '00:98:10:28:14:00' + - '00:ac:10:28:14:00' + + # Environment variables + gen_1: + user: "" + password: "" + key_filename: /""/.ssh/id_rsa + pcis: + uplink: + - "0000:05:00.0" + - "0000:05:00.2" + downlink: + - "0000:05:00.1" + - "0000:05:00.3" + ip: + mgmt: + - '1.2.1.6/24' + uplink: + - '152.16.100.20/24' + - '172.16.100.20/24' + downlink: + - '152.16.40.20/24' + - '172.16.40.20/24' + mac: + uplink: + - '00:00:00:9e:00:f8' + - '00:00:00:9e:00:fa' + downlink: + - '00:00:00:9e:00:f9' + - '00:00:00:9e:00:fb' + + host: + ip: "192.168.100.101/24" + user: "" + password: "" + key_filename: ~ + + vnf: + user: "" + password: "" + key_filename: ~ + pcis: + uplink: + - "0000:07:00.0" + - "0000:07:00.2" + downlink: + - "0000:07:00.1" + - "0000:07:00.3" + ip: + mgmt: + - '1.1.1.1/24' + - '1.1.1.7/24' + uplink: + - '152.16.100.10/24' + - '172.16.100.10/24' + downlink: + - '152.16.40.10/24' + - '172.16.40.10/24' + + tasks: + - include: sriov_scale_out_test_ixia_correlated_templates.yml + with_items: "{{ scale_out }}" + diff --git a/ansible/standalone_sriov_scale_out_ixia_test.yaml b/ansible/standalone_sriov_scale_out_ixia_test.yaml new file mode 100644 index 000000000..79ec0e68e --- /dev/null +++ b/ansible/standalone_sriov_scale_out_ixia_test.yaml @@ -0,0 +1,110 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- +- hosts: localhost + connection: local + vars: + scale_out: + - 1 + - 2 + flavor: + ram: 4096 + image: "/var/lib/libvirt/images/ubuntu.qcow2" + extra_specs: + cpu_sockets: 1 + cpu_cores: 6 + cpu_threads: 2 + flow: + traffic_type: 4 + pkt_size: + uplink: {64B: 100} + downlink: {64B: 100} + count: 10 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf_config: + lb_config: 'SW' + lb_count: 1 + worker_config: '1C/1T' + worker_threads: 1 + + # Environment variables + gen: + user: "" + password: "" + key_filename: ~ + tg_config: + ixchassis: "1.1.1.127" #ixia chassis ip + tcl_port: "8009" # tcl server port + lib_path: "/opt/ixia/ixos-api/8.01.0.2/lib/ixTcl1.0" + ""_dir: "/opt/ixia/ixos-api/8.01.0.2/" + py_bin_path: "/opt/ixia/ixload/8.01.106.3/bin/" + py_lib_path: "/opt/ixia/ixnetwork/8.01.1029.14/lib/PythonApi" + dut_result_dir: "/mnt/results" + version: "8.01.106.3" + pcis: + uplink: + - "2:5" #Card:port + - "2:3" #Card:port + downlink: + - "2:6" #Card:port + - "2:5" #Card:port + ip: + mgmt: + - '1.1.1.138/24' # ixia network machine ip + uplink: + - '152.16.100.20/24' + - '172.16.100.20/24' + downlink: + - '152.16.40.20/24' + - '172.16.40.20/24' + mac: + uplink: + - '00:98:10:64:14:00' + - '00:ac:10:64:14:0' + downlink: + - '00:98:10:28:14:00' + - '00:ac:10:28:14:00' + + host: + ip: "192.168.100.101/24" + user: "" + password: "" + key_filename: /""/.ssh/id_rsa + + vnf: + user: "" + password: "" + key_filename: ~ + pcis: + uplink: + - "0000:07:00.0" + - "0000:07:00.2" + downlink: + - "0000:07:00.1" + - "0000:07:00.3" + ip: + mgmt: + - '1.1.1.1/24' + - '1.1.1.7/24' + uplink: + - '152.16.100.10/24' + - '172.16.100.10/24' + downlink: + - '152.16.40.10/24' + - '172.16.40.10/24' + + tasks: + - include: sriov_scale_out_test_ixia_templates.yml + with_items: "{{ scale_out }}" + diff --git a/ansible/standalone_sriov_scale_out_test.yaml b/ansible/standalone_sriov_scale_out_test.yaml new file mode 100644 index 000000000..e51e5617e --- /dev/null +++ b/ansible/standalone_sriov_scale_out_test.yaml @@ -0,0 +1,100 @@ +# Copyright (c) 2017 Intel Corporation. # +# 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. +--- +- hosts: localhost + connection: local + vars: + scale_out: + - 1 + - 2 + flavor: + user: root + password: ""! + ram: 4096 + image: "/var/lib/libvirt/images/ubuntu.qcow2" + extra_specs: + cpu_sockets: 1 + cpu_cores: 6 + cpu_threads: 2 + flow: + traffic_type: 4 + pkt_size: + uplink: {64B: 100} + downlink: {64B: 100} + count: 10 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf_config: + lb_config: 'SW' + lb_count: 1 + worker_config: '1C/1T' + worker_threads: 1 + + # Environment variables + gen: + user: root + password: "" + key_filename: '~' + pcis: + uplink: + - "0000:05:00.0" + - "0000:05:00.2" + downlink: + - "0000:05:00.1" + - "0000:05:00.3" + ip: + mgmt: + - '1.2.1.6/24' + uplink: + - '152.16.100.20/24' + - '172.16.100.20/24' + downlink: + - '152.16.40.20/24' + - '172.16.40.20/24' + mac: + uplink: + - '00:00:00:9e:00:f8' + - '00:00:00:9e:00:fa' + downlink: + - '00:00:00:9e:00:f9' + - '00:00:00:9e:00:fb' + + host: + ip: "192.168.100.101/24" + user: root + password: "" + key_filename: '~' + + vnf: + pcis: + uplink: + - "0000:05:00.0" + - "0000:05:00.2" + downlink: + - "0000:05:00.1" + - "0000:05:00.3" + ip: + mgmt: + - '1.2.1.6/24' + - '1.2.1.6/24' + uplink: + - '152.16.100.10/24' + - '172.16.100.10/24' + downlink: + - '152.16.40.10/24' + - '172.16.40.10/24' + + tasks: + - include: sriov_scale_out_test_templates.yml + with_items: "{{ scale_out }}" + diff --git a/ansible/ubuntu_server_baremetal_deploy_samplevnfs.yml b/ansible/ubuntu_server_baremetal_deploy_samplevnfs.yml index 14bdd7eea..891ccd1dc 100644 --- a/ansible/ubuntu_server_baremetal_deploy_samplevnfs.yml +++ b/ansible/ubuntu_server_baremetal_deploy_samplevnfs.yml @@ -29,6 +29,8 @@ - install_dpdk - download_trex - install_trex + - download_civetweb + - install_civetweb - download_samplevnfs - role: install_samplevnf vnf_name: PROX @@ -40,3 +42,12 @@ vnf_name: FW - role: install_samplevnf vnf_name: CGNATP + # build shared DPDK for collectd only, required DPDK downloaded already + - install_dpdk_shared + - install_rabbitmq + - download_intel_cmt_cat + - install_intel_cmt_cat + - download_pmu_tools + - install_pmu_tools + - download_collectd + - install_collectd diff --git a/ansible/ubuntu_server_cloudimg_modify_samplevnfs.yml b/ansible/ubuntu_server_cloudimg_modify_samplevnfs.yml index 2700b810f..79249dd37 100644 --- a/ansible/ubuntu_server_cloudimg_modify_samplevnfs.yml +++ b/ansible/ubuntu_server_cloudimg_modify_samplevnfs.yml @@ -38,6 +38,8 @@ - install_dpdk - download_trex - install_trex + - download_civetweb + - install_civetweb - download_samplevnfs - role: install_samplevnf vnf_name: PROX @@ -49,4 +51,12 @@ vnf_name: FW - role: install_samplevnf vnf_name: CGNATP - + # build shared DPDK for collectd only, required DPDK downloaded already + - install_dpdk_shared + - install_rabbitmq + - download_intel_cmt_cat + - install_intel_cmt_cat + - download_pmu_tools + - install_pmu_tools + - download_collectd + - install_collectd |