diff --git a/playbooks/restart_jenkins_masters.yaml b/playbooks/restart_jenkins_masters.yaml
deleted file mode 100644
index 1d52ad195a..0000000000
--- a/playbooks/restart_jenkins_masters.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
----
-- hosts: 'jenkins0*.openstack.org'
- # Do the entire play completely for one host at a time
- serial: 1
- # Treat any errors as fatal so that we don't stop all the jenkins
- # masters.
- any_errors_fatal: true
- tasks:
- - shell: '/usr/local/jenkins/bin/safe_jenkins_shutdown --user {{ user }} --password {{ password }}'
- - service: name=jenkins state=stopped
- # This is necessary because stopping Jenkins is not reliable.
- # We allow return code 1 which means no processes found.
- - shell: 'pkill -9 -U jenkins || [ $? -eq "1" ]'
- - service: name=jenkins state=restarted
diff --git a/tools/test-jenkins-api.py b/tools/test-jenkins-api.py
deleted file mode 100755
index 2f3118a40a..0000000000
--- a/tools/test-jenkins-api.py
+++ /dev/null
@@ -1,185 +0,0 @@
-#!/usr/bin/env python
-#
-# Test all of the Jenkins API features used by the
-# OpenStack Infrastructure project
-#
-# Copyright (C) 2013 OpenStack Foundation
-#
-# 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 urllib2
-import urlparse
-from pprint import pprint
-import time
-from uuid import uuid4
-import ConfigParser
-import os
-import re
-
-import sys
-sys.path.insert(0, '../../zuul/zuul')
-from launcher.jenkins import ExtendedJenkins
-
-sys.path.insert(0, '../../devstack-gate/')
-from myjenkins import Jenkins as DGJenkins
-
-JOB_NAME = 'test-job'
-NODE_NAME = 'test-node'
-
-
-class JenkinsTest(object):
- def __init__(self):
- self.config = ConfigParser.ConfigParser()
- if len(sys.argv) < 2:
- print "Usage: %s zuul.conf" % sys.argv[0]
- sys.exit(1)
- fp = sys.argv[1]
- if os.path.exists(os.path.expanduser(fp)):
- self.config.read(os.path.expanduser(fp))
-
- server = self.config.get('jenkins', 'server')
- user = self.config.get('jenkins', 'user')
- apikey = self.config.get('jenkins', 'apikey')
-
- self.jenkins = ExtendedJenkins(server, user, apikey)
- self.dgjenkins = DGJenkins(server, user, apikey)
-
- def nodeExists(self):
- return self.dgjenkins.node_exists(NODE_NAME)
-
- def createNode(self):
- assert not self.nodeExists()
- priv_key = '/var/lib/jenkins/.ssh/id_rsa'
- self.dgjenkins.create_node(
- NODE_NAME, numExecutors=1,
- nodeDescription='Test node',
- remoteFS='/home/jenkins',
- labels='testnode',
- exclusive=True,
- launcher='hudson.plugins.sshslaves.SSHLauncher',
- launcher_params={'port': 22,
- 'username': 'jenkins',
- 'privatekey': priv_key,
- 'host': 'nowhere.example.com'})
- assert self.nodeExists()
-
- def reconfigNode(self):
- LABEL_RE = re.compile(r'')
- config = self.dgjenkins.get_node_config(NODE_NAME)
- assert '' in config
- config = LABEL_RE.sub('', config)
- self.dgjenkins.reconfig_node(NODE_NAME, config)
- config = self.dgjenkins.get_node_config(NODE_NAME)
- assert '' in config
-
- def deleteNode(self):
- assert self.nodeExists()
- self.dgjenkins.delete_node(NODE_NAME)
- assert not self.nodeExists()
-
- def findBuildInQueue(self, build):
- for item in self.jenkins.get_queue_info():
- if 'actions' not in item:
- continue
- for action in item['actions']:
- if 'parameters' not in action:
- continue
- parameters = action['parameters']
- for param in parameters:
- # UUID is deprecated in favor of ZUUL_UUID
- if ((param['name'] in ['ZUUL_UUID', 'UUID'])
- and build == param['value']):
- return item
- return False
-
- def addJob(self, quiet_period):
- assert not self.jobExists()
- xml = open('jenkins-job.xml').read()
- xml = xml % quiet_period
-
- self.jenkins.create_job(JOB_NAME, xml)
- assert self.jobExists()
-
- def reconfigJob(self, quiet_period):
- assert self.jobExists()
- xml = open('jenkins-job.xml').read()
- xml = xml % quiet_period
-
- self.jenkins.reconfig_job(JOB_NAME, xml)
- xml2 = self.jenkins.get_job_config(JOB_NAME)
- s = '%s' % quiet_period
- assert s in xml2
-
- def jobExists(self):
- return self.jenkins.job_exists(JOB_NAME)
-
- def deleteJob(self):
- assert self.jobExists()
- self.jenkins.delete_job(JOB_NAME)
- assert not self.jobExists()
-
- def getJobs(self):
- pprint(self.jenkins.get_jobs())
-
- def testCancelQueue(self):
- uuid = str(uuid4().hex)
- self.jenkins.build_job(JOB_NAME, parameters=dict(UUID=uuid))
-
- item = self.findBuildInQueue(uuid)
- assert item
- self.jenkins.cancel_queue(item['id'])
- assert not self.findBuildInQueue(uuid)
-
- def testCancelBuild(self):
- uuid = str(uuid4().hex)
- self.jenkins.build_job(JOB_NAME, parameters=dict(UUID=uuid))
-
- assert self.findBuildInQueue(uuid)
- for x in range(60):
- if not self.findBuildInQueue(uuid):
- break
- assert not self.findBuildInQueue(uuid)
- time.sleep(1)
-
- buildno = self.jenkins.get_job_info(JOB_NAME)['lastBuild']['number']
- info = self.jenkins.get_build_info(JOB_NAME, buildno)
- assert info['building']
- self.jenkins.stop_build(JOB_NAME, buildno)
- time.sleep(1)
- info = self.jenkins.get_build_info(JOB_NAME, buildno)
- assert not info['building']
-
- console_url = urlparse.urljoin(info['url'], 'consoleFull')
- self.jenkins.jenkins_open(urllib2.Request(console_url))
-
- self.jenkins.set_build_description(JOB_NAME, buildno,
- "test description")
-
- info = self.jenkins.get_build_info(JOB_NAME, buildno)
- assert info['description'] == 'test description'
-
-j = JenkinsTest()
-if j.nodeExists():
- j.deleteNode()
-j.createNode()
-j.reconfigNode()
-j.deleteNode()
-if j.jobExists():
- j.deleteJob()
-j.addJob(5)
-j.reconfigJob(10)
-j.testCancelQueue()
-j.testCancelBuild()
-j.deleteJob()