--- /dev/null
+#!/usr/bin/env bash
+set -eux
+
+THIS_DIR=`pwd`
+DATA_PATH=/root/os-ext-data
+
+# Steps to reinstall:
+# 1) Create new Ubuntu 14.04 server (copy password)
+# 1a) 7.5GB Compute v1 flavor
+# 1b) Enable monitoring and security updates
+# 2) Disable password authentication
+# 2a) ssh-copy-id to copy a key to the server
+# 2b) edit /etc/sshd_config to set "PermitRootLogin without-password"
+# 3) Copy the secret credentials dir (http://hg.uk.xensource.com/openstack/infrastructure.hg/os-ext-data) to /root
+# 4) Clone this repo git:
+# 4a) git clone https://github.com/citrix-openstack/os-ext-testing.git
+# 4b) cd os-ext-testing; git checkout common_ci
+# ?) Follow steps below
+# ?) Set up monitoring checks https://intelligence.rackspace.com/cloud/entities/enWCIYVVnt
+
+# Copied from the following URL Feb 2016
+# http://docs.openstack.org/infra/openstackci/third_party_ci.html
+
+sudo su -
+# Install puppet
+[ -e install_puppet.sh ] && rm install_puppet.sh
+wget https://git.openstack.org/cgit/openstack-infra/system-config/plain/install_puppet.sh
+bash install_puppet.sh
+
+# Install puppet modules to /etc/puppet/modules
+git clone https://git.openstack.org/openstack-infra/system-config
+cd system-config
+./install_modules.sh
+exit
+
+sudo su -
+# Setup the site we're deploying
+cp /etc/puppet/modules/openstackci/contrib/single_node_ci_site.pp /etc/puppet/manifests/site.pp
+
+# And the secret credentials store
+cp /etc/puppet/modules/openstackci/contrib/hiera.yaml /etc/puppet
+
+# Verify that our config file matches the latest template file
+# If this check fails, copy the new template to os-ext-data and create a new secrets file
+diff -q /root/os-ext-data/single_node_ci_data_orig.yaml /etc/puppet/modules/openstackci/contrib/single_node_ci_data.yaml
+# Since the template hasn't changed, just use the existing secrets
+cp /root/os-ext-data/single_node_ci_data.yaml /etc/puppet/environments/common.yaml
+
+# Add 'jenkins' to the hostname so Apache is happy
+sed -i -e 's/^\(127\.0\.0\.1.*\)$/\1 jenkins/' /etc/hosts
+exit
+
+sudo puppet apply --verbose /etc/puppet/manifests/site.pp
--- /dev/null
+- job-template:
+ name: 'dsvm-tempest-xen'
+ node: '{node}'
+
+ wrappers:
+ - timeout:
+ timeout: 185 # Timeout in *minutes*
+ fail: true # A job run that exceeds the timeout will cause a failure
+ - timestamps
+
+ builders:
+ - net-info
+ - devstack-checkout
+ - shell: |
+ #!/bin/bash -xe
+
+ function pre_test_hook {{
+ echo "Install thirdparty libraries"
+
+ # Install libvirt here to ensure it is
+ # not replaced devstack
+ sudo dpkg -i /opt/nodepool-scripts/*.deb
+ sudo apt-get install -y -f --fix-missing
+ }}
+
+ function cleanup_host_hook {{
+ echo "Copying custom logs"
+
+ # Xen logs
+ if [ -d /var/log/xen ]; then
+ sudo cp -r /var/log/xen $BASE/logs/
+ fi
+ }}
+
+ export -f pre_test_hook
+ export -f cleanup_host_hook
+
+ if [ -z $ZUUL_PROJECT ]; then
+ export ZUUL_PROJECT=openstack-dev/sandbox
+ fi
+ if [ -z $ZUUL_BRANCH ]; then
+ export ZUUL_BRANCH=master
+ fi
+ export PYTHONUNBUFFERED=true
+ export DEVSTACK_GATE_TEMPEST=1
+ export DEVSTACK_GATE_VIRT_DRIVER=libvirt
+ export DEVSTACK_GATE_LIBVIRT_TYPE=xen
+ export DEVSTACK_GATE_TIMEOUT=180
+ export DEVSTACK_GATE_TEMPEST_REGEX='(?!.*\[.*\bslow\b.*\]|.*test_volume_boot_pattern)(^tempest\.(api|scenario|thirdparty))'
+ export RE_EXEC=true
+ cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh
+ ./safe-devstack-vm-gate-wrap.sh
+ - link-logs # In macros.yaml from os-ext-testing
+
+ publishers:
+ - osci-swift-upload-logs-with-console:
+ upload_source: 'logs'
ip -6 route show
echo "Network neighbors..."
ip neighbor show
+
+- builder:
+ name: osci-swift-upload-logs-with-console
+ builders:
+ - shell: "/usr/local/jenkins/slave_scripts/grab_console_log.sh"
+ - shell: |
+ #!/bin/sh
+ virtualenv osci-env
+ . osci-env/bin/activate
+ git clone https://github.com/citrix-openstack/openstack-citrix-ci openstack-citrix-ci
+ pip install -r openstack-citrix-ci/requirements.txt
+ pip install -e openstack-citrix-ci
+ # CA bundle in 2.5.2 is broken
+ pip install --upgrade requests>2.5.2
+ sudo mkdir -p /etc/osci/
+ cat | sudo tee /etc/osci/osci.config >/dev/null << EOF
+ SWIFT_API_KEY=<%= @swift_api_key %>
+ SWIFT_USERNAME=<%= @swift_api_user %>
+ SWIFT_REGION=IAD
+ SWIFT_CONTAINER=XenLogs
+ EOF
+ osci-upload /tmp/console.html {upload_source} $LOG_PATH
+
+
+- publisher:
+ name: osci-swift-upload-logs-with-console
+ publishers:
+ - postbuildscript:
+ builders:
+ - osci-swift-upload-logs-with-console:
+ upload_source: '{upload_source}'
+ # These flags really mean only if on * when
+ # checked. When both set to false the post script
+ # should run on every job regardless of status.
+ onfailure: False
+ onsuccess: False
# root@jenkins:~# echo "0 $((RANDOM%23+1)) * * *"
# 0 16 * * *
# This references the hour of the day when images will be built.
- image-update: '0 0 * * *'
+ image-update: '0 11 * * *'
zmq-publishers:
- tcp://localhost:8888
- host: 127.0.0.1
labels:
- - name: d-p-c
- image: dpc
- min-ready: 1
+ - name: ds-xen
+ image: ds-xen
+ min-ready: 2
providers:
- - name: local_01
-
-diskimages:
- - name: dpc
- elements:
- - ubuntu
- - vm
- - openstack-repos
- - puppet
- - nodepool-base
- - node-devstack
- release: trusty
- env-vars:
- TMPDIR: /opt/dib_tmp
- DIB_IMAGE_CACHE: /opt/dib_cache
+ - name: rax-iad
providers:
- - name: local_01
-#TODO: Update the provider username, password, and authurl
+ - name: rax-iad
+ region-name: 'IAD'
+ service-type: 'compute'
+ service-name: 'cloudServersOpenStack'
username: '<%= provider_username %>'
password: '<%= provider_password %>'
- auth-url: 'http://<openstack cloud>:5000/v2.0'
- project-name: 'admin'
- max-servers: 2
+ project-id: '874240'
+ auth-url: 'https://identity.api.rackspacecloud.com/v2.0/'
+ boot-timeout: 600
+ max-servers: 5
+ rate: 10.0
+ keypair: 'xenproject-nodepool'
+ template-hostname: '{image.name}-{timestamp}.template.xen.org'
images:
- - name: dpc
+ - name: ds-xen
+ # This is the image name to use found in this provider's `glance image-list`
+ base-image: 'Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)'
min-ram: 8192
- diskimage: dpc
- username: jenkins
- private-key: '/home/nodepool/.ssh/id_rsa'
+ name-filter: 'Performance'
+ # This is the script that will be used to prepare the image
+ setup: prepare_node_devstack_xen.sh
+ #Set the public key part only of the jenkin's key (no whitespace) to the NODEPOOL_SSH_KEY environment variable in order to
+ #inject it into the image's jenkins user .ssh/authorized_keys
+ #This key will be used to log in and setup jenkins on the target VM
+# private-key: '/home/nodepool/.ssh/id_rsa'
+ config-drive: true
+ meta:
+ xenapi_use_agent: 'false'
+# - name: rax-ord
+# region-name: 'ORD'
+# username: '<%= provider_username %>'
+# password: '<%= provider_password %>'
+# project-id: '874240'
+# auth-url: 'https://identity.api.rackspacecloud.com/v2.0/'
+# boot-timeout: 600
+# max-servers: 5
+# rate: 10.0
+# keypair: 'xenproject-nodepool'
+# template-hostname: '{image.name}-{timestamp}.template.xen.org'
+# images:
+# - name: ds-xen
+# # This is the image name to use found in this provider's `glance image-list`
+# base-image: 'Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)'
+# min-ram: 8192
+# name-filter: 'Performance'
+# # This is the script that will be used to prepare the image
+# setup: prepare_node_devstack_xen.sh
+# #Set the public key part only of the jenkin's key (no whitespace) to the NODEPOOL_SSH_KEY environment variable in order to
+# #inject it into the image's jenkins user .ssh/authorized_keys
+# #This key will be used to log in and setup jenkins on the target VM
+# private-key: '/home/nodepool/.ssh/id_rsa'
+# config-drive: true
+# meta:
+# xenapi_use_agent: 'false'
+
targets:
- name: jenkins1
+# jenkins:
+# url: 'http://localhost:8080/'
+# user: '<%= jenkins_api_user %>'
+# apikey: '<%= jenkins_api_key %>'
+# credentials-id: '<%= jenkins_credentials_id %>'
--- /dev/null
+#!/bin/bash
+set -xe
+
+./prepare_node_devstack.sh
+
+# Install Xen and update the kernel
+sudo apt-get -y install htop vim git pwgen xen-hypervisor-4.4
+
+sudo mv /etc/default/grub{,.bak}
+sudo tee /etc/default/grub << EOC
+GRUB_DEFAULT=0
+GRUB_TIMEOUT=30
+GRUB_DISTRIBUTOR=\`lsb_release -i -s 2> /dev/null || echo Debian\`
+GRUB_CMDLINE_LINUX_DEFAULT="debug loglevel=7"
+GRUB_CMDLINE_LINUX=""
+GRUB_TERMINAL=console
+GRUB_DISABLE_LINUX_UUID="false"
+EOC
+
+sudo mv /etc/default/grub.d/xen.cfg{,.bak}
+sudo tee /etc/default/grub.d/xen.cfg << EOC
+echo "Including Xen overrides from /etc/default/grub.d/xen.cfg"
+GRUB_CMDLINE_XEN="dom0_mem=7680M:max=7680M dom0_max_vcpus=4 max-console=vga"
+GRUB_DEFAULT="Ubuntu GNU/Linux, with Xen hypervisor"
+EOC
+
+sudo update-grub
+
+# Disable cloud-init - it doesn't work in dom0 Xen
+for i in /etc/init/cloud-*; do echo manual | sudo tee ${i%.conf}.override; done
+
+# Install Monty's config drive network setup (from https://review.openstack.org/#/c/154132/5)
+# ./read-vendor-json/install.d/05-read-vendor-json
+sudo cp read-vendor-json.py /usr/local/bin
+sudo cp static-network-config /etc/init.d
+
+# ./read-vendor-json/install.d/10-static-network-config
+sudo tee /etc/init/write-network-interfaces.conf <<EOF
+start on starting networking
+task
+exec /etc/init.d/static-network-config
+EOF
+
+# ./read-vendor-json/install.d/15-write-interfaces
+sudo rm -rf /etc/network/interfaces.d
+sudo tee /etc/network/interfaces <<EOF
+auto lo
+iface lo inet loopback
+EOF
+
+# Create a swap file
+sudo dd if=/dev/zero of=/swapfile bs=1024 count=524288
+sudo chown root:root /swapfile
+sudo chmod 0600 /swapfile
+sudo mkswap /swapfile
+echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
+
+sync
+sleep 5
--- /dev/null
+# Copyright (c) 2015 Hewlett-Packard Development Company, L.P.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+#
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import argparse
+import json
+import platform
+import sys
+
+post_up = " post-up route add -net {net} netmask {mask} gw {gw} || true\n"
+pre_down = " pre-down route del -net {net} netmask {mask} gw {gw} || true\n"
+
+
+def _write_rh_interface(name, interface):
+ files_to_write = dict()
+ results = """# Automatically generated, do not edit
+DEVICE={name}
+BOOTPROTO=static
+HWADDR={hwaddr}
+IPADDR={ip_address}
+NETMASK={netmask}
+ONBOOT=yes
+NM_CONTROLLED=no
+""".format(
+ name=name,
+ hwaddr=interface['mac_address'],
+ ip_address=interface['ip_address'],
+ netmask=interface['netmask'],
+
+ )
+ routes = []
+ for route in interface['routes']:
+ if route['network'] == '0.0.0.0' and route['netmask'] == '0.0.0.0':
+ results += "DEFROUTE=yes\n"
+ results += "GATEWAY={gw}\n".format(gw=route['gateway'])
+ else:
+ routes.append(dict(
+ net=route['network'], mask=route['netmask'],
+ gw=route['gateway']))
+
+ if routes:
+ route_content = ""
+ for x in range(0, len(routes)):
+ route_content += "ADDRESS{x}={net}\n".format(x=x, **routes[x])
+ route_content += "NETMASK{x}={mask}\n".format(x=x, **routes[x])
+ route_content += "GATEWAY{x}={gw}\n".format(x=x, **routes[x])
+ files_to_write['/etc/sysconfig/network-scripts/route-{name}'.format(
+ name=name)] = route_content
+ files_to_write['/etc/sysconfig/network-scripts/ifcfg-{name}'.format(
+ name=name)] = results
+ return files_to_write
+
+
+def write_redhat_interfaces(interfaces):
+ files_to_write = dict()
+ for iname, interface in interfaces.items():
+ if interface['type'] != 'ipv6':
+ interface_name = interface['id'].replace('network', 'eth')
+ files_to_write.update(
+ _write_rh_interface(interface_name, interface))
+ return files_to_write
+
+
+def write_debian_interfaces(interfaces):
+ results = ""
+ for iname, interface in interfaces.items():
+ link_type = "inet"
+ if interface['type'] == 'ipv6':
+ link_type = "inet6"
+ interface_name = interface['id'].replace('network', 'eth')
+ results += "auto {0}\n".format(interface_name)
+ results += "iface {name} {link_type} static\n".format(
+ name=interface_name, link_type=link_type)
+ results += " address {0}\n".format(interface['ip_address'])
+ results += " netmask {0}\n".format(interface['netmask'])
+ for route in interface['routes']:
+ if route['network'] == '0.0.0.0' and route['netmask'] == '0.0.0.0':
+ results += " gateway {0}\n".format(route['gateway'])
+ else:
+ results += post_up.format(
+ net=route['network'], mask=route['netmask'],
+ gw=route['gateway'])
+ results += pre_down.format(
+ net=route['network'], mask=route['netmask'],
+ gw=route['gateway'])
+ return {'/etc/network/interfaces': results}
+
+
+def write_dns_info(dns_servers):
+ results = ""
+ for server in dns_servers:
+ results += "nameserver {0}\n".format(server)
+ return {'/etc/resolv.conf': results}
+
+
+def main():
+ parser = argparse.ArgumentParser(description="Static network config")
+ parser.add_argument(
+ '-n', '--noop', action='store_true', help='Do not write files')
+ parser.add_argument(
+ '--distro', dest='distro', default=None,
+ help='Override detected distro')
+ args = parser.parse_args()
+
+ v = json.load(open('/mnt/config/openstack/latest/vendor_data.json'))
+ net = v['network_info']
+
+ dns_servers = [f['address'] for f in net['services'] if f['type'] == 'dns']
+
+ interfaces = {}
+
+ for network in net['networks']:
+ interfaces[network['link']] = network
+ for link in net['links']:
+ interfaces[link['id']]['mac_address'] = link['ethernet_mac_address']
+
+ distro = args.distro
+ if not distro:
+ distro = platform.dist()[0].lower()
+ if distro in ('debian', 'ubuntu'):
+ files_to_write = write_debian_interfaces(interfaces)
+ elif distro in ('redhat', 'centos', 'fedora', 'suse', 'opensuse'):
+ files_to_write = write_redhat_interfaces(interfaces)
+ files_to_write.update(write_dns_info(dns_servers))
+ for k, v in files_to_write.items():
+ if args.noop:
+ print "### Write {0}".format(k)
+ print v
+ else:
+ with open(k, 'w') as outfile:
+ outfile.write(v)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
--- /dev/null
+# Copyright (c) 2015 Hewlett-Packard Development Company, L.P.
+# chkconfig: 2345 05 95
+#
+# 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.
+
+if [ ! -z $1 -a $1 != start ] ; then
+ exit 0
+fi
+
+# Start by putting down base scripts
+if [ -d /etc/sysconfig/network-scripts ]; then
+ # Bail and don't do anything if we have one - handles reboot
+ if [ -f /etc/sysconfig/network-scripts/ifcfg-eth0 ] ; then
+ exit 0
+ fi
+ for interface in eth0 eth1 ; do
+ cat >/etc/sysconfig/network-scripts/ifcfg-$interface <<EOF
+DEVICE=$interface
+BOOTPROTO=dhcp
+ONBOOT=on
+EOF
+ done
+elif [ -d /etc/network ]; then
+ # Bail and don't do anything if we have one - handles reboot
+ if grep eth0 /etc/network/interfaces >/dev/null 2>&1 ; then
+ exit 0
+ fi
+ for interface in eth0 eth1 ; do
+ cat >>/etc/network/interfaces <<EOF
+auto $interface
+iface $interface inet dhcp
+EOF
+ done
+fi
+
+# Test to see if config-drive exists. If not, skip and assume DHCP networking
+# will work becasue sanity
+if ! blkid -t LABEL="config-2" ; then
+ exit 0
+fi
+
+# Mount config drive- but check to make sure it's Rackspace and not config
+# drive from somewhere else
+mkdir -p /mnt/config
+mount /dev/disk/by-label/config-2 /mnt/config
+grep -i rackspace /mnt/config/openstack/latest/vendor_data.json >/dev/null 2>&1 || exit 0
+
+python /usr/local/bin/read-vendor-json.py
+
+if [ -f /etc/network/interfaces ] ; then
+ ifdown -a ; ifup -a
+else
+ for interface in /etc/sysconfig/network-scripts/ifcfg-eth* ; do
+ name=$(echo $interface | cut -f3 -d-)
+ ifdown $name ; ifup $name
+ done
+fi
pipelines:
- name: check
description: Newly uploaded patchsets enter this pipeline to receive an initial +/-1 Verified vote from Jenkins.
- failure-message: "Build failed. For 3rd party CI contact info: https://wiki.openstack.org/wiki/ThirdPartySystems"
+ failure-message: "Build failed. To recheck use 'xen: recheck'. For 3rd party ci contact info: https://wiki.openstack.org/wiki/ThirdPartySystems"
manager: IndependentPipelineManager
trigger:
gerrit:
gerrit:
verified: 1
smtp:
- #TODO: Update these to real e-mail addresses
- to: third_party_ci@example.com
- from: zuul@example.com
+ to: openstack-ci@xenproject.org
+ from: zuul@zuul.openstack.xenproject.org
subject: 'Silent check of {change.project} {change.number},{change.patchset} passed'
failure:
gerrit:
verified: -1
smtp:
- #TODO: Update these to real e-mail addresses
- to: third_party_ci@example.com
- from: zuul@example.com
+ to: openstack-ci@xenproject.org
+ from: zuul@zuul.openstack.xenproject.org
subject: 'Silent check of {change.project} {change.number},{change.patchset} failed'
merge-failure:
smtp:
- #TODO: Update these to real e-mail addresses
- to: third_party_ci@example.com
- from: zuul@example.com
+ to: openstack-ci@xenproject.org
+ from: zuul@zuul.openstack.xenproject.org
subject: Upstream change {change} has a merge failure
comment: (?i)^(Patch Set [0-9]+:)?( [\w\\+-]*)*(\n\n)?\s*recheck myvendor\s*$
success:
smtp:
- #TODO: Update these to real e-mail addresses
- to: third_party_ci@example.com
- from: zuul@example.com
+ to: openstack-ci@xenproject.org
+ from: zuul@zuul.openstack.xenproject.org
subject: 'Silent check of {change.project} {change.number},{change.patchset} passed'
failure:
smtp:
- #TODO: Update these to real e-mail addresses
- to: third_party_ci@example.com
- from: zuul@example.com
+ to: openstack-ci@xenproject.org
+ from: zuul@zuul.openstack.xenproject.org
subject: 'Silent check of {change.project} {change.number},{change.patchset} failed'
jobs:
- name: ^dsvm-tempest.*$
+ skip-if:
+ - project: ^openstack/nova$
+ branch: ^master$
+ all-files-match-any:
+ - ^.*\.rst$
+ - ^doc/.*$
+ - ^nova/tests/.*$
+ - ^nova/virt/baremetal/.*$
+ - ^nova/virt/hyperv/.*$
+ - ^nova/virt/ironic/.*$
+ - ^nova/virt/vmwareapi/.*$
+ - ^nova/virt/xenapi/.*$
+ - ^tools/.*$
+ - ^tox.ini$
parameter-function: single_use_node
+ branch: ^master.*$
+ swift:
+ - name: logs
+
projects:
- name: openstack-dev/ci-sandbox
check:
- # Remove this after successfully verifying communication with upstream
- # and seeing a posted successful review.
- - noop-check-communication
- silent:
- # Uncomment this job when you have a jenkins slave running and want to
- # test a full Tempest run within devstack.
- - dsvm-tempest-full
+ - dsvm-tempest-xen
+
+ - name: openstack/nova
+# check:
+# - dsvm-tempest-xen