Add script to facilitate project renaming in project-config repo

This takes a list of projects from stdin in the format of
aeromancer
anvil
blazar

and renames stackforge/aeromancer, stackforge/anvil, and stackforge/blazar
to openstack/aeromancer, openstack/anvil, and openstack/blazar respectively
in gerrit/projects.yaml, gerritbot/channels.yaml, zuul/layout.html,
and every file in jenkins/jobs/ , as well as renaming acl files.

A side effect of this process is that comments will be stripped from
gerritbot/channels.yaml ; if you are committing the results of a run of
this script, please re-add the comments manually unless we come up with
a more elegant solution.

This script also has test coverage for verification and documentation.

Also included is a WIP list of renames in data/stackforge-renames, as
per
http://eavesdrop.openstack.org/irclogs/%23openstack-infra/%23openstack-infra.2015-10-13.log.html#t2015-10-13T20:10:17
and a WIP list of retirements in data/stackforge-retirements, which
is not used by the script in this change.

Co-Authored-By: Augustina Ragwitz <aragwitz+lp@pobox.com>
Change-Id: Iaf2a13d8b9b9a840d9fde07ec1ef65d1c9e90e8e
This commit is contained in:
Clint Adams 2015-09-25 14:56:57 -04:00
parent b195a03ecf
commit 246bbfe03b
5 changed files with 986 additions and 0 deletions

246
data/stackforge-renames Normal file
View File

@ -0,0 +1,246 @@
aeromancer
akanda
akanda-appliance
akanda-appliance-builder
akanda-horizon
akanda-neutron
akanda-rug
anvil
bansho
blazar
blazar-nova
cathead
ceilometer-powervm
ceilometer-zvm
cerberus
cerberus-dashboard
cl-openstack-client
cloud-init
cloudbase-init
cloudcafe
clouddocs-maven-plugin
cloudkitty
cloudkitty-dashboard
cloudpulse
cloudroast
cloudv-ostf-adapter
cognitive
compass-adapters
compass-core
compass-specs
compass-web
compute-hyperv
designate-msdnsagent
devstack-plugin-glusterfs
devstack-plugin-sheepdog
distil
doc8
dox
drbd-devstack
driverlog
ec2-api
ec2-driver
entropy
faafo
flame
freezer
freezer-api
freezer-web-ui
fuel-agent
fuel-astute
fuel-dev-tools
fuel-devops
fuel-docs
fuel-library
fuel-main
fuel-mirror
fuel-nailgun-agent
fuel-octane
fuel-ostf
fuel-plugin-availability-zones
fuel-plugin-calamari
fuel-plugin-calico
fuel-plugin-ceilometer-redis
fuel-plugin-cinder-netapp
fuel-plugin-cisco-aci
fuel-plugin-contrail
fuel-plugin-dbaas-trove
fuel-plugin-detach-database
fuel-plugin-detach-keystone
fuel-plugin-detach-rabbitmq
fuel-plugin-elasticsearch-kibana
fuel-plugin-external-emc
fuel-plugin-external-glusterfs
fuel-plugin-external-zabbix
fuel-plugin-glance-nfs
fuel-plugin-ha-fencing
fuel-plugin-influxdb-grafana
fuel-plugin-ironic
fuel-plugin-ldap
fuel-plugin-lma-collector
fuel-plugin-lma-infrastructure-alerting
fuel-plugin-mellanox
fuel-plugin-midonet
fuel-plugin-neutron-fwaas
fuel-plugin-neutron-lbaas
fuel-plugin-neutron-vpnaas
fuel-plugin-nova-nfs
fuel-plugin-nsxv
fuel-plugin-opendaylight
fuel-plugin-saltstack
fuel-plugin-solidfire-cinder
fuel-plugin-swiftstack
fuel-plugin-tintri-cinder
fuel-plugin-tls
fuel-plugin-vmware-dvs
fuel-plugin-vxlan
fuel-plugin-zabbix-monitoring-emc
fuel-plugin-zabbix-monitoring-extreme-networks
fuel-plugin-zabbix-snmptrapd
fuel-plugins
fuel-qa
fuel-specs
fuel-stats
fuel-upgrade
fuel-web
gce-api
gerrit-dash-creator
gertty
git-upstream
golang-client
group-based-policy
group-based-policy-automation
group-based-policy-specs
group-based-policy-ui
inception
intel-nfv-ci-tests
kwapi
merlin
monasca-agent
monasca-api
monasca-ceilometer
monasca-common
monasca-log-api
monasca-notification
monasca-persister
monasca-statsd
monasca-thresh
monasca-ui
monasca-vagrant
monitoring-for-openstack
namos
nerd-reviewer
networking-6wind
networking-bagpipe-l2
networking-brocade
networking-edge-vpn
networking-hyperv
networking-mlnx
networking-nec
networking-ovs-dpdk
networking-zvm
nova-docker
nova-powervm
nova-solver-scheduler
nova-zvm-virt-driver
ooi
opencafe
ops-tags-team
osprofiler
ospurge
packstack
poppy
powervc-driver
proliantutils
puppet-autossh
puppet-ceph
puppet-n1k-vsm
puppet-setproxy
puppet-surveil
pyghmi
python-blazarclient
python-cerberusclient
python-cloudkittyclient
python-cloudpulseclient
python-cognitiveclient
python-fuelclient
python-group-based-policy-client
python-jenkins
python-monascaclient
python-openstacksdk
python-opentsdbclient
python-rackclient
python-senlinclient
python-sticksclient
python-surveilclient
python-tackerclient
python-watcherclient
rack
radar
requests-mock
sahara-ci-config
senlin
senlin-dashboard
shaker
sqlalchemy-migrate
stackalytics
stacktach
stacktach-klugman
stacktach-notification-utils
stacktach-notigen
stacktach-quince
stacktach-quincy
stacktach-sandbox
stacktach-shoebox
stacktach-simport
stacktach-stackdistiller
stacktach-timex
stacktach-winchester
sticks
sticks-dashboard
surveil
surveil-specs
swift-ceph-backend
swift3
swiftonfile
tacker
tacker-horizon
tacker-specs
tap-as-a-service
telcowg-usecases
terracotta
third-party-ci-tools
tricircle
turbo-hipster
vmtp
watcher
wsme
xenapi-os-testing
xstatic-angular
xstatic-angular-bootstrap
xstatic-angular-cookies
xstatic-angular-fileupload
xstatic-angular-gettext
xstatic-angular-lrdragndrop
xstatic-angular-mock
xstatic-angular-sanitize
xstatic-angular-smart-table
xstatic-bootstrap-datepicker
xstatic-bootstrap-scss
xstatic-bootswatch
xstatic-d3
xstatic-font-awesome
xstatic-hogan
xstatic-jasmine
xstatic-jquery-migrate
xstatic-jquery.bootstrap.wizard
xstatic-jquery.quicksearch
xstatic-jquery.tablesorter
xstatic-jsencrypt
xstatic-magic-search
xstatic-mdi
xstatic-qunit
xstatic-rickshaw
xstatic-roboto-fontface
xstatic-spin
yaql

View File

@ -0,0 +1,68 @@
MRaaS
aviator
billingstack
bufunfa
cachemonkey
cinder-salt-formula
cloud-pydashie
cloudv-sdn-validation
compass-install
compass-monit
congressmiddleware
cookbook-pacemaker
fuel-ostf-plugin
fuel-provision
fuel-tasklib
glance-salt-formula
graffiti
haos
healthnmon
heat-coe-templates
horizon-salt-formula
i18n-test
keystone-salt-formula
kickstack
libra
logaas
mercador-pub
mercador-sub
milk
networking-bigswitch
networking-ibm
networking-portforwarding
neutron-salt-formula
nova-salt-formula
novaimagebuilder
occi-os
openstack-cli-powershell
openstack-salt-formula
openstack-sdk-dotnet
openstack-sdk-php
openstackdroid
openvz-nova-driver
packstack-vagrant
pecan
prep-source-repos
puppet-nslcd
puppet-openstack
puppet-openstack-cloud
puppet-openstack_dev_env
puppet_openstack_builder
python-cloudfoundryclient
python-libraclient
python-mercadorclient
python-rallyclient
rubick
sahara-guestagent
saml-generator
satori
sphinxcontrib-docbookrestapi
staccato
striker
swiftpolicy
swiftsync
tomograph
tripleo-ansible
warm
windows-diskimage-builder
xstatic-angular-animate

197
tools/mass_rename_projects.py Executable file
View File

@ -0,0 +1,197 @@
#! /usr/bin/env python
#
# 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.
# This takes a list of projects from stdin in the format of
# aeromancer
# anvil
# blazar
#
# and renames stackforge/aeromancer, stackforge/anvil, and stackforge/blazar
# to openstack/aeromancer, openstack/anvil, and openstack/blazar respectively
# in
# gerrit/projects.yaml
# gerritbot/channels.yaml
# zuul/layout.yaml
# jenkins/jobs/*
# , as well as invoking a series of `git mv` and `git add` commands for
# renaming acl files and otherwise staging a single commit
import functools
import locale
import os
import subprocess
import sys
import tempfile
import yaml
from collections import OrderedDict
import projectconfig_yamllib as pcy
def build_list(prefix, renamelist):
return map(lambda x: "%s/%s" % (prefix, x), renamelist)
def load_yaml_data(filename):
data = yaml.load(open(filename)) # TODO raise error if open fails
return data
class ProjectData:
def __init__(self, data, gitmoves):
self.data = data
self.gitmoves = gitmoves
def build_project_data(stacklist, data):
gitmoves = {}
for project in data:
sproject = project['project']
oproject = sproject.replace('stackforge','openstack',1)
if sproject in stacklist:
project['project'] = oproject
try:
old = project['acl-config']
new = old.replace('stackforge','openstack',1)
project['acl-config'] = new
gitmoves[old.replace('/home/gerrit2','gerrit')] = new.replace('/home/gerrit2','gerrit')
except KeyError:
aclfile = "gerrit/acls/%s.config" % sproject
if os.path.isfile(aclfile):
gitmoves[aclfile] = aclfile.replace('stackforge','openstack',1)
# this is mildly disgusting
sorteddata = sorted(data, key=lambda t: locale.strxfrm(t['project'].lower().replace("_", "}")))
return ProjectData(sorteddata, gitmoves)
def rename_in_projects_yaml(stacklist, data):
errors = False # TODO add error checking
newdata = build_project_data(stacklist,data).data
with open('gerrit/projects.yaml', 'w') as out: # TODO raise error if open fails
out.write(yaml.dump(newdata, default_flow_style=False,
Dumper=pcy.IndentedDumper, width=80))
return True
def load_channel_data(filename):
data = yaml.load(open(filename)) # TODO raise error if open fails
return data
def build_channel_data(stacklist, data):
for k,v in data.items():
newprojects = []
for i in v['projects']:
if i in stacklist:
newprojects.append(i.replace('stackforge','openstack',1))
else:
newprojects.append(i)
v['projects'] = sorted(newprojects)
return data
def rename_in_channels_yaml(stacklist, ydata):
errors = False # TODO add error handling
data = build_channel_data(stacklist, ydata)
with open('gerritbot/channels.yaml', 'w') as out:
out.write('# This file is sorted alphabetically by channel name.\n')
first = True
for k, v in data.items():
if not first:
out.write('\n')
first = False
out.write(yaml.dump({k: v}, default_flow_style=False,
Dumper=pcy.IndentedDumper, width=80, indent=2))
return True
def rename_with_sed(zuullayout, targetfile, stacklist, openlist):
errors = False #TODO add error handling
h, fn = tempfile.mkstemp()
with os.fdopen(h, 'w') as out:
for f,t in zip(stacklist,openlist):
if zuullayout:
out.write("s#name: %s[[:space:]]*$#name: %s#;\n" % (f,t))
else:
out.write("s#%s\\([ /]\\)#%s\\1#;\n" % (f,t))
out.write("s#%s$#%s#;\n" % (f,t))
out.flush()
subprocess.call(['sed', '-f', fn, '-i', targetfile])
os.unlink(fn)
return True
filesToChange = {
'gerrit/projects.yaml' : { 'data': False,
'func': rename_in_projects_yaml
},
'gerritbot/channels.yaml': { 'data': False,
'func': rename_in_channels_yaml
},
'zuul/layout.yaml' : { 'data': False,
'func': functools.partial(rename_with_sed, True, 'zuul/layout.yaml')
}
}
def main():
locale.setlocale(locale.LC_COLLATE, 'C')
yaml.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
pcy.construct_yaml_map)
yaml.add_representer(OrderedDict, pcy.project_representer,
Dumper=pcy.IndentedDumper)
if os.isatty(0):
sys.stderr.write('You appear to be typing in the list of projects by hand rather than\n')
sys.stderr.write('using file redirection or a pipe. If this is your intent, send an\n')
sys.stderr.write('EOF by typing Ctrl-D on a blank line after the complete list has\n')
sys.stderr.write('been entered.\n\n')
renamelist = [x.rstrip('\n') for x in sys.stdin.readlines()]
stacklist = build_list('stackforge', renamelist)
openlist = build_list('openstack', renamelist)
pdata = build_project_data(stacklist, load_yaml_data('gerrit/projects.yaml'))
filesToChange['zuul/layout.yaml']['data'] = openlist
# because Python isn't lazy
filesToChange['gerrit/projects.yaml']['data'] = pdata.data
filesToChange['gerritbot/channels.yaml']['data'] = load_yaml_data('gerritbot/channels.yaml')
for f in filesToChange:
sys.stderr.write("working on %s\n" % f)
filesToChange[f]['func'](stacklist, filesToChange[f]['data'])
subprocess.call(['git', 'add', f])
sys.stderr.write("updated %s\n" % f)
for t in os.listdir('jenkins/jobs'):
f = os.path.join('jenkins/jobs', t)
sys.stderr.write("working on %s\n" % f)
rename_with_sed(False, f, stacklist, openlist)
subprocess.call(['git', 'add', f])
sys.stderr.write("updated %s\n" % f)
for s,o in pdata.gitmoves.items():
sys.stderr.write("renaming %s to %s\n" % (s, o))
subprocess.call(['git', 'mv', s, o])
if __name__ == '__main__':
main()

View File

@ -0,0 +1,469 @@
#! /usr/bin/env python
#
# 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 unittest
import sys
import yaml
import six
sys.path.append('tools/')
import mass_rename_projects
class TestMassRenameProjects(unittest.TestCase):
# Verify the files we're including in this change process
def test_filesToChange(self):
gotFilenames = mass_rename_projects.filesToChange.keys()
expectedFilenames = [
'gerrit/projects.yaml',
'gerritbot/channels.yaml',
'zuul/layout.yaml'
]
six.assertCountEqual(self, gotFilenames, expectedFilenames, "Check that we're modifying the expected files")
# TODO check projects yaml
def test_projects_yaml(self):
renamelist = [
'glance', # openstack project that doesn't need to be renamed
'fuel', # fake project but this text exists in places in the projects.yaml file
'fuel-tasklib', # stackforge project with groups and other nested attributes
'xstatic-jquery.tablesorter', # stackforge project with acl attribute
'anvil', # stackforge project, minimal attributes
'fake-project', # project name doesn't exist
'anvil-fake' # non-existant project with similar prefix
]
projectYaml = """
- project: stackforge/anvil
description: A set of python scripts and utilities to forge raw OpenStack into a productive tool!
- project: openstack/glance
docimpact-group: openstack-manuals
description: OpenStack Image Management (Glance)
options:
- translate
- project: stackforge/fuel-stats
groups:
- fuel
description: Fuel anonymous statistics collector
docimpact-group: fuel
- project: stackforge/fuel-tasklib
description: Fuel tasks library.
docimpact-group: fuel
groups:
- fuel
- project: stackforge/xstatic-jquery.tablesorter
description: Tablesorter jQuery plugin packaged as XStatic.
acl-config: /home/gerrit2/acls/stackforge/xstatic.config
- project: stackforge/yaql
description: Yet another query language
"""
data = yaml.load(projectYaml)
stacklist = mass_rename_projects.build_list("stackforge", renamelist)
result = mass_rename_projects.build_project_data(stacklist, data)
gotData = result.data
gotGitmoves = result.gitmoves
# check result
expectedData = [
{
'project': 'openstack/anvil',
'description': 'A set of python scripts and utilities to forge raw OpenStack into a productive tool!'
},
{
'project': 'openstack/fuel-tasklib',
'docimpact-group': 'fuel',
'description': 'Fuel tasks library.',
'groups': ['fuel']
},
{
'project': 'openstack/glance',
'docimpact-group': 'openstack-manuals',
'description': 'OpenStack Image Management (Glance)',
'options': ['translate']},
{
'project': 'stackforge/fuel-stats',
'docimpact-group': 'fuel',
'description': 'Fuel anonymous statistics collector',
'groups': ['fuel']
},
{
'project': 'openstack/xstatic-jquery.tablesorter',
'acl-config': '/home/gerrit2/acls/openstack/xstatic.config',
'description': 'Tablesorter jQuery plugin packaged as XStatic.'},
{
'project': 'stackforge/yaql',
'description': 'Yet another query language'
}
]
six.assertCountEqual(self, gotData, expectedData, "Check results of projects.yaml renames")
# check gitmoves, should only be stackforge projects
expectedGitmoves = {
'gerrit/acls/stackforge/anvil.config' : 'gerrit/acls/openstack/anvil.config',
'gerrit/acls/stackforge/xstatic.config' : 'gerrit/acls/openstack/xstatic.config',
'gerrit/acls/stackforge/fuel-tasklib.config': 'gerrit/acls/openstack/fuel-tasklib.config'
}
six.assertCountEqual(self, gotGitmoves, expectedGitmoves, "Check git command output for projects.yaml renames")
def test_channels_yaml(self):
channelsYaml = """
fuel-tracker:
events:
- patchset-created
- change-merged
- x-vrif-minus-2
projects:
- openstack/fuel-plugin-bigswitch
- openstack/fuel-plugin-block-device
- openstack/fuel-plugin-openbook
- openstack/fuel-plugin-purestorage-cinder
- openstack/fuel-plugin-scaleio
- openstack/fuel-plugin-wstunnel
- openstack/fuel-plugin-xenserver
- openstack/fuel-plugin-zabbix-agents
- stackforge/fuel-agent
- stackforge/fuel-astute
- stackforge/fuel-dev-tools
- stackforge/fuel-devops
- stackforge/fuel-docs
- stackforge/fuel-library
- stackforge/fuel-main
- stackforge/fuel-mirror
- stackforge/fuel-nailgun-agent
- stackforge/fuel-octane
- stackforge/fuel-ostf
- stackforge/fuel-plugin-availability-zones
- stackforge/fuel-plugin-calamari
- stackforge/fuel-plugin-calico
- stackforge/fuel-plugin-ceilometer-redis
- stackforge/fuel-plugin-cinder-netapp
- stackforge/fuel-plugin-cisco-aci
- stackforge/fuel-plugin-contrail
- stackforge/fuel-plugin-dbaas-trove
- stackforge/fuel-plugin-detach-database
- stackforge/fuel-plugin-detach-keystone
- stackforge/fuel-plugin-detach-rabbitmq
- stackforge/fuel-plugin-elasticsearch-kibana
- stackforge/fuel-plugin-external-emc
- stackforge/fuel-plugin-external-glusterfs
- stackforge/fuel-plugin-external-zabbix
- stackforge/fuel-plugin-glance-nfs
- stackforge/fuel-plugin-ha-fencing
- stackforge/fuel-plugin-influxdb-grafana
- stackforge/fuel-plugin-ironic
- stackforge/fuel-plugin-ldap
- stackforge/fuel-plugin-lma-collector
- stackforge/fuel-plugin-lma-infrastructure-alerting
- stackforge/fuel-plugin-mellanox
- stackforge/fuel-plugin-midonet
- stackforge/fuel-plugin-neutron-fwaas
- stackforge/fuel-plugin-neutron-lbaas
- stackforge/fuel-plugin-neutron-vpnaas
- stackforge/fuel-plugin-nova-nfs
- stackforge/fuel-plugin-nsxv
- stackforge/fuel-plugin-opendaylight
- stackforge/fuel-plugin-saltstack
- stackforge/fuel-plugin-solidfire-cinder
- stackforge/fuel-plugin-swiftstack
- stackforge/fuel-plugin-tintri-cinder
- stackforge/fuel-plugin-tls
- stackforge/fuel-plugin-vmware-dvs
- stackforge/fuel-plugin-vxlan
- stackforge/fuel-plugin-zabbix-monitoring-emc
- stackforge/fuel-plugin-zabbix-monitoring-extreme-networks
- stackforge/fuel-plugin-zabbix-snmptrapd
- stackforge/fuel-plugins
- stackforge/fuel-provision
- stackforge/fuel-qa
- stackforge/fuel-specs
- stackforge/fuel-stats
- stackforge/fuel-tasklib
- stackforge/fuel-upgrade
- stackforge/fuel-web
- stackforge/python-fuelclient
branches:
- master
openstack-anvil:
events:
- patchset-created
- change-merged
- x-vrif-minus-2
projects:
- stackforge/anvil
branches:
- master
openstack-glance:
events:
- patchset-created
- change-merged
- x-vrif-minus-2
projects:
- openstack/glance
- openstack/glance-specs
- openstack/glance_store
- openstack/python-glanceclient
branches:
- master
openstack-horizon:
events:
- patchset-created
- change-merged
- x-vrif-minus-2
projects:
- openstack/django-openstack-auth-kerberos
- openstack/django_openstack_auth
- openstack/horizon
- openstack/manila-ui
- openstack/tuskar-ui
- stackforge/xstatic-angular
- stackforge/xstatic-angular-animate
- stackforge/xstatic-angular-bootstrap
- stackforge/xstatic-angular-cookies
- stackforge/xstatic-angular-fileupload
- stackforge/xstatic-angular-lrdragndrop
- stackforge/xstatic-angular-mock
- stackforge/xstatic-angular-sanitize
- stackforge/xstatic-angular-smart-table
- stackforge/xstatic-bootstrap-datepicker
- stackforge/xstatic-bootstrap-scss
- stackforge/xstatic-d3
- stackforge/xstatic-font-awesome
- stackforge/xstatic-hogan
- stackforge/xstatic-jasmine
- stackforge/xstatic-jquery-migrate
- stackforge/xstatic-jquery.bootstrap.wizard
- stackforge/xstatic-jquery.quicksearch
- stackforge/xstatic-jquery.tablesorter
- stackforge/xstatic-jsencrypt
- stackforge/xstatic-magic-search
- stackforge/xstatic-qunit
- stackforge/xstatic-rickshaw
- stackforge/xstatic-spin
branches:
- master
"""
renamelist = [
'glance', # openstack project that doesn't need to be renamed
'fuel', # fake project but this text exists in places in the projects.yaml file
'fuel-tasklib', # stackforge project with groups and other nested attributes
'xstatic-jquery.tablesorter', # stackforge project with acl attribute
'anvil', # stackforge project, minimal attributes
'fake-project', # project name doesn't exist
'anvil-fake' # non-existant project with similar prefix
]
data = yaml.load(channelsYaml)
stacklist = mass_rename_projects.build_list("stackforge", renamelist)
gotData = mass_rename_projects.build_channel_data(stacklist, data)
# check result
expectedData = {
'fuel-tracker': {
'branches': [
'master'
],
'events': [
'patchset-created',
'change-merged',
'x-vrif-minus-2'
],
'projects': [
'openstack/fuel-plugin-bigswitch',
'openstack/fuel-plugin-block-device',
'openstack/fuel-plugin-openbook',
'openstack/fuel-plugin-purestorage-cinder',
'openstack/fuel-plugin-scaleio',
'openstack/fuel-plugin-wstunnel',
'openstack/fuel-plugin-xenserver',
'openstack/fuel-plugin-zabbix-agents',
'openstack/fuel-tasklib',
'stackforge/fuel-agent',
'stackforge/fuel-astute',
'stackforge/fuel-dev-tools',
'stackforge/fuel-devops',
'stackforge/fuel-docs',
'stackforge/fuel-library',
'stackforge/fuel-main',
'stackforge/fuel-mirror',
'stackforge/fuel-nailgun-agent',
'stackforge/fuel-octane',
'stackforge/fuel-ostf',
'stackforge/fuel-plugin-availability-zones',
'stackforge/fuel-plugin-calamari',
'stackforge/fuel-plugin-calico',
'stackforge/fuel-plugin-ceilometer-redis',
'stackforge/fuel-plugin-cinder-netapp',
'stackforge/fuel-plugin-cisco-aci',
'stackforge/fuel-plugin-contrail',
'stackforge/fuel-plugin-dbaas-trove',
'stackforge/fuel-plugin-detach-database',
'stackforge/fuel-plugin-detach-keystone',
'stackforge/fuel-plugin-detach-rabbitmq',
'stackforge/fuel-plugin-elasticsearch-kibana',
'stackforge/fuel-plugin-external-emc',
'stackforge/fuel-plugin-external-glusterfs',
'stackforge/fuel-plugin-external-zabbix',
'stackforge/fuel-plugin-glance-nfs',
'stackforge/fuel-plugin-ha-fencing',
'stackforge/fuel-plugin-influxdb-grafana',
'stackforge/fuel-plugin-ironic',
'stackforge/fuel-plugin-ldap',
'stackforge/fuel-plugin-lma-collector',
'stackforge/fuel-plugin-lma-infrastructure-alerting',
'stackforge/fuel-plugin-mellanox',
'stackforge/fuel-plugin-midonet',
'stackforge/fuel-plugin-neutron-fwaas',
'stackforge/fuel-plugin-neutron-lbaas',
'stackforge/fuel-plugin-neutron-vpnaas',
'stackforge/fuel-plugin-nova-nfs',
'stackforge/fuel-plugin-nsxv',
'stackforge/fuel-plugin-opendaylight',
'stackforge/fuel-plugin-saltstack',
'stackforge/fuel-plugin-solidfire-cinder',
'stackforge/fuel-plugin-swiftstack',
'stackforge/fuel-plugin-tintri-cinder',
'stackforge/fuel-plugin-tls',
'stackforge/fuel-plugin-vmware-dvs',
'stackforge/fuel-plugin-vxlan',
'stackforge/fuel-plugin-zabbix-monitoring-emc',
'stackforge/fuel-plugin-zabbix-monitoring-extreme-networks',
'stackforge/fuel-plugin-zabbix-snmptrapd',
'stackforge/fuel-plugins',
'stackforge/fuel-provision',
'stackforge/fuel-qa',
'stackforge/fuel-specs',
'stackforge/fuel-stats',
'stackforge/fuel-upgrade',
'stackforge/fuel-web',
'stackforge/python-fuelclient'
]
},
'openstack-glance': {
'branches': [
'master'
],
'events': [
'patchset-created',
'change-merged',
'x-vrif-minus-2'
],
'projects': [
'openstack/glance',
'openstack/glance-specs',
'openstack/glance_store',
'openstack/python-glanceclient'
]
},
'openstack-anvil': {
'branches': [
'master'
],
'events': [
'patchset-created',
'change-merged',
'x-vrif-minus-2'
],
'projects': [
'openstack/anvil'
]
},
'openstack-horizon': {
'branches': [
'master'
],
'events': [
'patchset-created',
'change-merged',
'x-vrif-minus-2'
],
'projects': [
'openstack/django-openstack-auth-kerberos',
'openstack/django_openstack_auth',
'openstack/horizon',
'openstack/manila-ui',
'openstack/tuskar-ui',
'openstack/xstatic-jquery.tablesorter',
'stackforge/xstatic-angular',
'stackforge/xstatic-angular-animate',
'stackforge/xstatic-angular-bootstrap',
'stackforge/xstatic-angular-cookies',
'stackforge/xstatic-angular-fileupload',
'stackforge/xstatic-angular-lrdragndrop',
'stackforge/xstatic-angular-mock',
'stackforge/xstatic-angular-sanitize',
'stackforge/xstatic-angular-smart-table',
'stackforge/xstatic-bootstrap-datepicker',
'stackforge/xstatic-bootstrap-scss',
'stackforge/xstatic-d3',
'stackforge/xstatic-font-awesome',
'stackforge/xstatic-hogan',
'stackforge/xstatic-jasmine',
'stackforge/xstatic-jquery-migrate',
'stackforge/xstatic-jquery.bootstrap.wizard',
'stackforge/xstatic-jquery.quicksearch',
'stackforge/xstatic-jsencrypt',
'stackforge/xstatic-magic-search',
'stackforge/xstatic-qunit',
'stackforge/xstatic-rickshaw',
'stackforge/xstatic-spin'
]
}
}
six.assertCountEqual(self, gotData, expectedData, "Check result for channels.yaml renames")
# TODO check zuul layout
def test_zuul_layout(self):
renamelist = [
'glance', # openstack project that doesn't need to be renamed
'fuel', # fake project but this text exists in places in the projects.yaml file
'fuel-tasklib', # stackforge project with groups and other nested attributes
'xstatic-jquery.tablesorter', # stackforge project with acl attribute
'anvil', # stackforge project, minimal attributes
'fake-project', # project name doesn't exist
'anvil-fake' # non-existant project with similar prefix
]
# not currently needed because the actual script shells out to sed
layoutYaml = """
"""
openlist = mass_rename_projects.build_list('openstack', renamelist) # zuul layout just uses the openlist as its data
expectedOpenlist = [
'openstack/glance',
'openstack/fuel',
'openstack/fuel-tasklib',
'openstack/xstatic-jquery.tablesorter',
'openstack/anvil',
'openstack/fake-project',
'openstack/anvil-fake'
]
six.assertCountEqual(self, openlist, expectedOpenlist, "Check zuul layout data")
if __name__ == '__main__':
unittest.main(verbosity=2)

View File

@ -87,3 +87,9 @@ deps =
flake8
changedir = {toxinidir}/nodepool
commands = dib-lint
[testenv:renames]
deps = PyYAML
six
commands =
{toxinidir}/tools/tests/mass_rename_projects_unit_test.py