Browse Source

Add three more transformations

The os-service-types project generates some internal mappings that are
useful. Generate them here on publication so that others can benefit as
well.

Change-Id: Ib761cf9de875e7b80404797d4aa8d294ca56347a
changes/64/493364/4
Monty Taylor 3 years ago
parent
commit
42338a434c
No known key found for this signature in database GPG Key ID: 7BAE94BC7141A594
4 changed files with 72 additions and 1 deletions
  1. +12
    -0
      doc/source/index.rst
  2. +36
    -0
      published-schema.json
  3. +15
    -0
      transform.py
  4. +9
    -1
      validate.py

+ 12
- 0
doc/source/index.rst View File

@@ -43,6 +43,18 @@ forward
reverse
A mapping of aliases to official service type.

primary_service_by_project
A mapping of project names to the primary service associated with that
project. Every project has only one primary service.

all_types_by_service_type
A mapping of service type to a list containing the official service type
and all of its aliases. Contains an entry for every service.

service_types_by_project
A mapping of project name to a list of all service types associated with
that project.

The published format is described by a
:download:`Service Types Authority Published Schema <published-schema.json>`.



+ 36
- 0
published-schema.json View File

@@ -45,6 +45,42 @@
"description": "Official service-type"
}
}
},
"primary_service_by_project": {
"type": "object",
"description": "Mapping of project name to the service data for the primary service",
"patternProperties": {
"^.*$": {
"$ref": "https://specs.openstack.org/openstack/service-types-authority/_downloads/schema.json#/definitions/service"
}
}
},
"all_types_by_service_type": {
"type": "object",
"description": "Mapping of official service-type to official type and aliases",
"patternProperties": {
"^([a-z][a-z-]*[a-z]+|ec2-api)$": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ordered list of official type and historical aliases."
}
},
"additionalProperties": false
},
"service_types_by_project": {
"type": "object",
"description": "Mapping of project name to list of service-types for the project",
"patternProperties": {
"^([a-z][a-z-]*[a-z]+|ec2-api)$": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of service types associated with a project"
}
}
}
}
}

+ 15
- 0
transform.py View File

@@ -64,14 +64,29 @@ def main():
['git', 'rev-parse', 'HEAD']).decode('utf-8').strip()
mapping['forward'] = {}
mapping['reverse'] = {}
mapping['primary_service_by_project'] = {}
mapping['all_types_by_service_type'] = {}
mapping['service_types_by_project'] = {}

for service in mapping['services']:
service_type = service['service_type']
mapping['all_types_by_service_type'][service_type] = [service_type]
if 'aliases' in service:
aliases = service['aliases']
mapping['forward'][service_type] = aliases
mapping['all_types_by_service_type'][service_type].extend(aliases)
for alias in aliases:
mapping['reverse'][alias] = service_type
for key in ('project', 'api_reference_project'):
name = service.get(key)
if name:
if not service.get('secondary', False):
mapping['primary_service_by_project'][name] = service
project_types = mapping['service_types_by_project'].get(
name, [])
if service_type not in project_types:
project_types.append(service_type)
mapping['service_types_by_project'][name] = project_types

schema = json.load(open('published-schema.json', 'r'))
resolver = LocalResolver.from_schema(schema)


+ 9
- 1
validate.py View File

@@ -27,12 +27,13 @@ def validate_schema(schema, data, resolver=None):


def validate_unique_tokens(data):
"""Ensure service types and aliases are all unique tokens.
"""Ensure service types, aliases and primary projects are all unique.

:return: An iterator over messages for any errors encountered.
"""
service_types = []
aliases = []
projects = []
for service in data['services']:
service_types.append(service['service_type'])
if "aliases" in service:
@@ -40,6 +41,13 @@ def validate_unique_tokens(data):
if alias in aliases:
yield "Alias '{alias}' appears twice".format(alias=alias)
aliases.append(alias)
if service.get('secondary', False):
continue
if service['project'] in projects:
yield "'{service}' is duplicate service from '{project}'".format(
service=service['service_type'],
project=service['project'])
projects.append(service['project'])
for alias in aliases:
if alias in service_types:
yield "Alias '{alias}' conflicts with a service_type".format(


Loading…
Cancel
Save