From: Anil Belur Date: Tue, 13 Jun 2023 00:35:55 +0000 (+1000) Subject: Feat: Add Openstack devstack template X-Git-Tag: v0.13.0^0 X-Git-Url: https://gerrit.linuxfoundation.org/infra/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F28%2F71828%2F7;p=releng%2Fcommon-packer.git Feat: Add Openstack devstack template Move the Openstack devstack templates to build VM's with devstack installed and ready for testing. ORAN community has requested devstack images to be available on the CI env. The templates and provision files have been tested to build the latest version of the devstack yoga on the CI. ZZCI - CentOS Stream 8 - devstack-yoga - x86_64 - 20230612-132235.763 Issue: RELENG-4760 Change-Id: I60d37d769158f34b22b84111fd5229c616232c27 Signed-off-by: Anil Belur --- diff --git a/provision/devstack-centos.yaml b/provision/devstack-centos.yaml new file mode 100644 index 0000000..4847d2d --- /dev/null +++ b/provision/devstack-centos.yaml @@ -0,0 +1,43 @@ +--- +- import_playbook: ../common-packer/provision/baseline.yaml + +- hosts: all + become_user: root + become_method: sudo + + pre_tasks: + - include_role: name=lfit.system-update + + tasks: + - name: "Install devstack dependencies" + block: + - name: Install xpath dependencies + yum: + name: + - perl-XML-XPath + - crudini + state: present + become: true + - name: Installing non-baseline requirements + yum: + name: + - deltarpm + - libxml2-devel + - libxslt-devel + - libffi-devel + - openssl-devel + - "@development" + state: present + become: true + - name: check if net link setup exists + stat: + path: /etc/udev/rules.d/80-net-setup-link.rules + register: rules_file_exists + - name: Update net link setup + file: + src: /dev/null + dest: /etc/udev/rules.d/80-net-setup-link.rules + state: link + force: yes + become: true + when: rules_file_exists.stat.exists == true diff --git a/provision/devstack-pre-pip-centos.yaml b/provision/devstack-pre-pip-centos.yaml new file mode 100644 index 0000000..fefe564 --- /dev/null +++ b/provision/devstack-pre-pip-centos.yaml @@ -0,0 +1,146 @@ +--- +- import_playbook: ../common-packer/provision/baseline.yaml + +- hosts: all + become_user: root + become_method: sudo + + pre_tasks: + - include_role: name=lfit.system-update + + tasks: + - name: "Install devstack dependencies" + block: + - name: Install xpath dependencies + yum: + name: + - perl-XML-XPath + - crudini + state: present + become: true + - name: Install non-baseline requirements + yum: + name: + - libxml2-devel + - libxslt-devel + - libffi-devel + - openssl-devel + - "@development" + state: present + become: true + - name: check if net link setup exists + stat: + path: /etc/udev/rules.d/80-net-setup-link.rules + register: rules_file_exists + - name: Update net link setup + file: + src: /dev/null + dest: /etc/udev/rules.d/80-net-setup-link.rules + state: link + force: yes + become: true + when: rules_file_exists.stat.exists == true + - name: Install RDMA (InfiniBand/iWARP/RoCE) requirements + yum: + name: + - libibverbs + - libmlx5 + state: present + become: true + - name: "Pre-Install yum and pip packages" + block: + - name: Create /tmp/devstack directory + file: + path: /tmp/devstack + state: directory + mode: 0755 + - name: Fetch openstack devstack-dev repo + git: + repo: https://github.com/openstack-dev/devstack.git + dest: /tmp/devstack + version: "{{ os_branch }}" + - name: "Read openstack devstack dependencies" + shell: "sed -e 's/#.*//' /tmp/devstack/files/rpms/general" + register: sed_output + args: + warn: False + - name: "Install non-baseline requirements for {{ os_branch }}" + yum: + name: "{{ sed_output.stdout_lines }}" + state: present + become: true + - name: git clone openstack core projects + git: repo='https://github.com/openstack/{{ item }}.git' + dest='/tmp/devstack/{{ item }}' + version='{{ os_branch }}' + with_items: + - requirements + - keystone + - glance + - cinder + - neutron + - nova + - horizon + - name: Install pip dependencies + shell: | + cd "{{ item }}" + git branch -a + cd .. + pwd + pip install -c requirements/upper-constraints.txt -e "{{ item }}" + pip install -c requirements/upper-constraints.txt -r "{{ item }}/test-requirements.txt" + # ignore non-zero return code + exit 0 + args: + chdir: /tmp/devstack + warn: False + with_items: + - requirements + - keystone + - glance + - cinder + - neutron + - nova + - horizon + become: true + + - name: "Install openvswitch from relevant openstack branch" + block: + - name: "Install CentOS openstack release {{ rdo_branch }}" + yum: + name: "centos-release-openstack-{{ rdo_branch }}" + state: present + become: true + - name: "Install openvswitch 2.8.2 for stable/queens" + yum: + name: openvswitch-2.8.2-1.el7 + state: present + disable_gpg_check: yes + when: rdo_branch == 'queens' + become: true + - name: "Install openvswitch latest for stable/rocky" + yum: + name: openvswitch + state: present + disable_gpg_check: yes + when: rdo_branch == 'rocky' + become: true + + # Workaround for git deps conflict on rocky + - name: Swap to git + block: + - name: Gather rpm package facts + package_facts: + manager: auto + - name: Replace git2u with git + command: yum replace -y git2u --replace-with git + when: ansible_facts.packages['git2u'] is defined + become: true + + - name: "Cleanup devstack directory" + block: + - name: "Removing /tmp/devstack" + file: + path: /tmp/devstack + state: absent + become: true diff --git a/releasenotes/notes/add-devstack-templates-37498c0c24155f77.yaml b/releasenotes/notes/add-devstack-templates-37498c0c24155f77.yaml new file mode 100644 index 0000000..bb41350 --- /dev/null +++ b/releasenotes/notes/add-devstack-templates-37498c0c24155f77.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Add Openstack devstack templates and provisioner to common-packer. diff --git a/templates/devstack-pre-pip-yoga.json b/templates/devstack-pre-pip-yoga.json new file mode 100644 index 0000000..9b59681 --- /dev/null +++ b/templates/devstack-pre-pip-yoga.json @@ -0,0 +1,75 @@ +{ + "variables": { + "ansible_roles_path": ".galaxy", + "arch": "x86_64", + "base_image": null, + "cloud_network": null, + "cloud_user_data": null, + "cloud_region": "ca-ymq-1", + "vm_use_block_storage": "true", + "vm_volume_size": "20", + "vm_image_disk_format": "", + "distro": null, + "docker_source_image": null, + "flavor": "v3-standard-2", + "ssh_user": null, + "ssh_proxy_host": "" + }, + "builders": [ + { + "name": "openstack", + "image_name": "ZZCI - {{user `distro`}} - devstack-yoga - {{user `arch`}} - {{isotime \"20060102-150405.000\"}}", + "instance_name": "{{user `distro`}}-devstack-yoga-{{uuid}}", + "source_image_name": "{{user `base_image`}}", + "type": "openstack", + "region": "{{user `cloud_region`}}", + "networks": ["{{user `cloud_network`}}"], + "user_data_file": "{{user `cloud_user_data`}}", + "ssh_username": "{{user `ssh_user`}}", + "ssh_proxy_host": "{{user `ssh_proxy_host`}}", + "flavor": "{{user `flavor`}}", + "metadata": { + "ci_managed": "yes" + }, + "use_blockstorage_volume": "{{user `vm_use_block_storage`}}", + "volume_size": "{{user `vm_volume_size`}}", + "image_disk_format": "{{user `vm_image_disk_format`}}" + }, + { + "name": "docker", + "type": "docker", + "image": "{{ user `docker_source_image` }}", + "commit": true, + "changes": ["ENTRYPOINT [\"\"]", "CMD [\"\"]"] + } + ], + "provisioners": [ + { + "type": "shell", + "scripts": ["common-packer/provision/install-python.sh"], + "execute_command": "chmod +x {{ .Path }}; if [ \"$UID\" == \"0\" ]; then {{ .Vars }} '{{ .Path }}'; else {{ .Vars }} sudo -E '{{ .Path }}'; fi" + }, + { + "type": "shell-local", + "command": "./common-packer/ansible-galaxy.sh {{user `ansible_roles_path`}}" + }, + { + "type": "ansible", + "playbook_file": "provision/devstack-pre-pip-centos.yaml", + "command": "./common-packer/ansible-playbook.sh", + "skip_version_check": true, + "ansible_env_vars": [ + "ANSIBLE_DEBUG=False", + "ANSIBLE_NOCOWS=1", + "ANSIBLE_PIPELINING=True", + "ANSIBLE_ROLES_PATH={{user `ansible_roles_path`}}", + "ANSIBLE_CALLBACK_WHITELIST=profile_tasks", + "ANSIBLE_STDOUT_CALLBACK=debug" + ], + "extra_arguments": [ + "--extra-vars", + "os_branch=stable/yoga rdo_branch=yoga" + ] + } + ] +} diff --git a/templates/devstack.json b/templates/devstack.json new file mode 100644 index 0000000..ba0668e --- /dev/null +++ b/templates/devstack.json @@ -0,0 +1,70 @@ +{ + "variables": { + "ansible_roles_path": ".galaxy", + "arch": "x86_64", + "base_image": null, + "cloud_network": null, + "cloud_user_data": null, + "cloud_region": "ca-ymq-1", + "vm_use_block_storage": "true", + "vm_volume_size": "20", + "vm_image_disk_format": "", + "distro": null, + "docker_source_image": null, + "flavor": "v3-standard-2", + "ssh_user": null, + "ssh_proxy_host": "" + }, + "builders": [ + { + "name": "openstack", + "image_name": "ZZCI - {{user `distro`}} - devstack - {{user `arch`}} - {{isotime \"20060102-150405.000\"}}", + "instance_name": "{{user `distro`}}-devstack-{{uuid}}", + "source_image_name": "{{user `base_image`}}", + "type": "openstack", + "region": "{{user `cloud_region`}}", + "networks": ["{{user `cloud_network`}}"], + "user_data_file": "{{user `cloud_user_data`}}", + "ssh_username": "{{user `ssh_user`}}", + "ssh_proxy_host": "{{user `ssh_proxy_host`}}", + "flavor": "{{user `flavor`}}", + "metadata": { + "ci_managed": "yes" + }, + "use_blockstorage_volume": "{{user `vm_use_block_storage`}}", + "volume_size": "{{user `vm_volume_size`}}", + "image_disk_format": "{{user `vm_image_disk_format`}}" + }, + { + "name": "docker", + "type": "docker", + "image": "{{ user `docker_source_image` }}", + "commit": true, + "changes": ["ENTRYPOINT [\"\"]", "CMD [\"\"]"] + } + ], + "provisioners": [ + { + "type": "shell", + "scripts": ["common-packer/provision/install-python.sh"], + "execute_command": "chmod +x {{ .Path }}; if [ \"$UID\" == \"0\" ]; then {{ .Vars }} '{{ .Path }}'; else {{ .Vars }} sudo -E '{{ .Path }}'; fi" + }, + { + "type": "shell-local", + "command": "./common-packer/ansible-galaxy.sh {{user `ansible_roles_path`}}" + }, + { + "type": "ansible", + "playbook_file": "provision/devstack-centos.yaml", + "command": "./common-packer/ansible-playbook.sh", + "skip_version_check": true, + "ansible_env_vars": [ + "ANSIBLE_NOCOWS=1", + "ANSIBLE_PIPELINING=True", + "ANSIBLE_ROLES_PATH={{user `ansible_roles_path`}}", + "ANSIBLE_CALLBACK_WHITELIST=profile_tasks", + "ANSIBLE_STDOUT_CALLBACK=debug" + ] + } + ] +}