8d91a6d72e
* Use correct pip version in ansible-test.
* Add git fallback for validate-modules.
* Run sanity tests in a docker container.
* Use correct python version for sanity tests.
* Pin docker completion images and add default.
* Split pylint execution into multiple contexts.
* Only test .py files in use-argspec-type-path test.
* Accept identical python interpeter name or binary.
* Switch cloud tests to default container.
* Remove unused extras from pip install.
* Filter out empty pip commands.
* Don't force running of pip list.
* Support delegation for windows and network tests.
* Fix ansible-test python version usage.
* Fix ansible-test python version skipping.
* Use absolute path for log in ansible-test.
* Run vyos_command test on python 3.
* Fix windows/network instance persistence.
* Add `test/cache` dir to classification.
* Enable more python versions for network tests.
* Fix cs_router test.
(cherry picked from commit cf1337ca9a
)
96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
"""Test metadata for passing data to delegated tests."""
|
|
from __future__ import absolute_import, print_function
|
|
|
|
import json
|
|
|
|
from lib.util import (
|
|
display,
|
|
is_shippable,
|
|
)
|
|
|
|
from lib.diff import (
|
|
parse_diff,
|
|
FileDiff,
|
|
)
|
|
|
|
|
|
class Metadata(object):
|
|
"""Metadata object for passing data to delegated tests."""
|
|
def __init__(self):
|
|
"""Initialize metadata."""
|
|
self.changes = {} # type: dict [str, tuple[tuple[int, int]]
|
|
self.cloud_config = None # type: dict [str, str]
|
|
self.instance_config = None # type: list[dict[str, str]]
|
|
|
|
if is_shippable():
|
|
self.ci_provider = 'shippable'
|
|
else:
|
|
self.ci_provider = ''
|
|
|
|
def populate_changes(self, diff):
|
|
"""
|
|
:type diff: list[str] | None
|
|
"""
|
|
patches = parse_diff(diff)
|
|
patches = sorted(patches, key=lambda k: k.new.path) # type: list [FileDiff]
|
|
|
|
self.changes = dict((patch.new.path, tuple(patch.new.ranges)) for patch in patches)
|
|
|
|
renames = [patch.old.path for patch in patches if patch.old.path != patch.new.path and patch.old.exists and patch.new.exists]
|
|
deletes = [patch.old.path for patch in patches if not patch.new.exists]
|
|
|
|
# make sure old paths which were renamed or deleted are registered in changes
|
|
for path in renames + deletes:
|
|
if path in self.changes:
|
|
# old path was replaced with another file
|
|
continue
|
|
|
|
# failed tests involving deleted files should be using line 0 since there is no content remaining
|
|
self.changes[path] = ((0, 0),)
|
|
|
|
def to_dict(self):
|
|
"""
|
|
:rtype: dict[str, any]
|
|
"""
|
|
return dict(
|
|
changes=self.changes,
|
|
cloud_config=self.cloud_config,
|
|
instance_config=self.instance_config,
|
|
ci_provider=self.ci_provider,
|
|
)
|
|
|
|
def to_file(self, path):
|
|
"""
|
|
:type path: path
|
|
"""
|
|
data = self.to_dict()
|
|
|
|
display.info('>>> Metadata: %s\n%s' % (path, data), verbosity=3)
|
|
|
|
with open(path, 'w') as data_fd:
|
|
json.dump(data, data_fd, sort_keys=True, indent=4)
|
|
|
|
@staticmethod
|
|
def from_file(path):
|
|
"""
|
|
:type path: str
|
|
:rtype: Metadata
|
|
"""
|
|
with open(path, 'r') as data_fd:
|
|
data = json.load(data_fd)
|
|
|
|
return Metadata.from_dict(data)
|
|
|
|
@staticmethod
|
|
def from_dict(data):
|
|
"""
|
|
:type data: dict[str, any]
|
|
:rtype: Metadata
|
|
"""
|
|
metadata = Metadata()
|
|
metadata.changes = data['changes']
|
|
metadata.cloud_config = data['cloud_config']
|
|
metadata.instance_config = data['instance_config']
|
|
metadata.ci_provider = data['ci_provider']
|
|
|
|
return metadata
|