Enable black formatting test (#259)

Enable black formatting test

SUMMARY
Signed-off-by: Abhijeet Kasurde akasurde@redhat.com
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME
plugins/action/k8s_info.py
plugins/connection/kubectl.py
plugins/doc_fragments/helm_common_options.py
plugins/doc_fragments/k8s_auth_options.py
plugins/doc_fragments/k8s_delete_options.py
plugins/doc_fragments/k8s_name_options.py
plugins/doc_fragments/k8s_resource_options.py
plugins/doc_fragments/k8s_scale_options.py
plugins/doc_fragments/k8s_state_options.py
plugins/doc_fragments/k8s_wait_options.py
plugins/filter/k8s.py
plugins/inventory/k8s.py
plugins/lookup/k8s.py
plugins/lookup/kustomize.py
plugins/module_utils/ansiblemodule.py
plugins/module_utils/apply.py
plugins/module_utils/args_common.py
plugins/module_utils/client/discovery.py
plugins/module_utils/client/resource.py
plugins/module_utils/common.py
plugins/module_utils/exceptions.py
plugins/module_utils/hashes.py
plugins/module_utils/helm.py
plugins/module_utils/k8sdynamicclient.py
plugins/module_utils/selector.py
plugins/modules/helm.py
plugins/modules/helm_info.py
plugins/modules/helm_plugin.py
plugins/modules/helm_plugin_info.py
plugins/modules/helm_repository.py
plugins/modules/helm_template.py
plugins/modules/k8s.py
plugins/modules/k8s_cluster_info.py
plugins/modules/k8s_cp.py
plugins/modules/k8s_drain.py
plugins/modules/k8s_exec.py
plugins/modules/k8s_info.py
plugins/modules/k8s_json_patch.py
plugins/modules/k8s_log.py
plugins/modules/k8s_rollback.py
plugins/modules/k8s_scale.py
plugins/modules/k8s_service.py
tests/integration/targets/kubernetes/library/test_tempfile.py
tests/unit/module_utils/test_apply.py
tests/unit/module_utils/test_common.py
tests/unit/module_utils/test_discoverer.py
tests/unit/module_utils/test_hashes.py
tests/unit/module_utils/test_marshal.py
tests/unit/module_utils/test_selector.py
tox.ini

Reviewed-by: None <None>
Reviewed-by: Mike Graves <mgraves@redhat.com>
Reviewed-by: None <None>
This commit is contained in:
Abhijeet Kasurde
2021-10-18 21:02:05 +05:30
committed by GitHub
parent 4010987d1f
commit 91b80b1d1d
50 changed files with 3453 additions and 2175 deletions

View File

@@ -14,408 +14,477 @@
from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible_collections.kubernetes.core.plugins.module_utils.apply import merge, apply_patch
from ansible_collections.kubernetes.core.plugins.module_utils.apply import (
merge,
apply_patch,
)
tests = [
dict(
last_applied=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(one="1", two="2")
kind="ConfigMap", metadata=dict(name="foo"), data=dict(one="1", two="2")
),
desired=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(one="1", two="2")
kind="ConfigMap", metadata=dict(name="foo"), data=dict(one="1", two="2")
),
expected={}
expected={},
),
dict(
last_applied=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(one="1", two="2")
kind="ConfigMap", metadata=dict(name="foo"), data=dict(one="1", two="2")
),
desired=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(one="1", two="2", three="3")
data=dict(one="1", two="2", three="3"),
),
expected=dict(data=dict(three="3"))
expected=dict(data=dict(three="3")),
),
dict(
last_applied=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(one="1", two="2")
kind="ConfigMap", metadata=dict(name="foo"), data=dict(one="1", two="2")
),
desired=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(one="1", three="3")
kind="ConfigMap", metadata=dict(name="foo"), data=dict(one="1", three="3")
),
expected=dict(data=dict(two=None, three="3"))
expected=dict(data=dict(two=None, three="3")),
),
dict(
last_applied=dict(
kind="ConfigMap",
metadata=dict(name="foo", annotations=dict(this="one", hello="world")),
data=dict(one="1", two="2")
data=dict(one="1", two="2"),
),
desired=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(one="1", three="3")
kind="ConfigMap", metadata=dict(name="foo"), data=dict(one="1", three="3")
),
expected=dict(metadata=dict(annotations=None), data=dict(two=None, three="3"))
),
dict(
last_applied=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8080, name="http")])
),
actual=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8080, protocol='TCP', name="http")])
),
desired=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8080, name="http")])
),
expected=dict(spec=dict(ports=[dict(port=8080, protocol='TCP', name="http")]))
expected=dict(metadata=dict(annotations=None), data=dict(two=None, three="3")),
),
dict(
last_applied=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8080, name="http")])
spec=dict(ports=[dict(port=8080, name="http")]),
),
actual=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8080, protocol='TCP', name="http")])
spec=dict(ports=[dict(port=8080, protocol="TCP", name="http")]),
),
desired=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8081, name="http")])
spec=dict(ports=[dict(port=8080, name="http")]),
),
expected=dict(spec=dict(ports=[dict(port=8081, name="http")]))
expected=dict(spec=dict(ports=[dict(port=8080, protocol="TCP", name="http")])),
),
dict(
last_applied=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8080, name="http")])
spec=dict(ports=[dict(port=8080, name="http")]),
),
actual=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8080, protocol='TCP', name="http")])
spec=dict(ports=[dict(port=8080, protocol="TCP", name="http")]),
),
desired=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8443, name="https"), dict(port=8080, name="http")])
spec=dict(ports=[dict(port=8081, name="http")]),
),
expected=dict(spec=dict(ports=[dict(port=8443, name="https"), dict(port=8080, name="http", protocol='TCP')]))
expected=dict(spec=dict(ports=[dict(port=8081, name="http")])),
),
dict(
last_applied=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8443, name="https"), dict(port=8080, name="http")])
spec=dict(ports=[dict(port=8080, name="http")]),
),
actual=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8443, protocol='TCP', name="https"), dict(port=8080, protocol='TCP', name='http')])
spec=dict(ports=[dict(port=8080, protocol="TCP", name="http")]),
),
desired=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8080, name="http")])
spec=dict(
ports=[dict(port=8443, name="https"), dict(port=8080, name="http")]
),
),
expected=dict(
spec=dict(
ports=[
dict(port=8443, name="https"),
dict(port=8080, name="http", protocol="TCP"),
]
)
),
expected=dict(spec=dict(ports=[dict(port=8080, name="http", protocol='TCP')]))
),
dict(
last_applied=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8443, name="https", madeup="xyz"), dict(port=8080, name="http")])
spec=dict(
ports=[dict(port=8443, name="https"), dict(port=8080, name="http")]
),
),
actual=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8443, protocol='TCP', name="https", madeup="xyz"), dict(port=8080, protocol='TCP', name='http')])
spec=dict(
ports=[
dict(port=8443, protocol="TCP", name="https"),
dict(port=8080, protocol="TCP", name="http"),
]
),
),
desired=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8443, name="https")])
spec=dict(ports=[dict(port=8080, name="http")]),
),
expected=dict(spec=dict(ports=[dict(port=8080, name="http", protocol="TCP")])),
),
dict(
last_applied=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(
ports=[
dict(port=8443, name="https", madeup="xyz"),
dict(port=8080, name="http"),
]
),
),
actual=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(
ports=[
dict(port=8443, protocol="TCP", name="https", madeup="xyz"),
dict(port=8080, protocol="TCP", name="http"),
]
),
),
desired=dict(
kind="Service",
metadata=dict(name="foo"),
spec=dict(ports=[dict(port=8443, name="https")]),
),
expected=dict(
spec=dict(
ports=[dict(madeup=None, port=8443, name="https", protocol="TCP")]
)
),
expected=dict(spec=dict(ports=[dict(madeup=None, port=8443, name="https", protocol='TCP')]))
),
dict(
last_applied=dict(
kind="Pod",
metadata=dict(name="foo"),
spec=dict(containers=[dict(name="busybox", image="busybox",
resources=dict(requests=dict(cpu="100m", memory="100Mi"), limits=dict(cpu="100m", memory="100Mi")))])
spec=dict(
containers=[
dict(
name="busybox",
image="busybox",
resources=dict(
requests=dict(cpu="100m", memory="100Mi"),
limits=dict(cpu="100m", memory="100Mi"),
),
)
]
),
),
actual=dict(
kind="Pod",
metadata=dict(name="foo"),
spec=dict(containers=[dict(name="busybox", image="busybox",
resources=dict(requests=dict(cpu="100m", memory="100Mi"), limits=dict(cpu="100m", memory="100Mi")))])
spec=dict(
containers=[
dict(
name="busybox",
image="busybox",
resources=dict(
requests=dict(cpu="100m", memory="100Mi"),
limits=dict(cpu="100m", memory="100Mi"),
),
)
]
),
),
desired=dict(
kind="Pod",
metadata=dict(name="foo"),
spec=dict(containers=[dict(name="busybox", image="busybox",
resources=dict(requests=dict(cpu="50m", memory="50Mi"), limits=dict(memory="50Mi")))])
spec=dict(
containers=[
dict(
name="busybox",
image="busybox",
resources=dict(
requests=dict(cpu="50m", memory="50Mi"),
limits=dict(memory="50Mi"),
),
)
]
),
),
expected=dict(
spec=dict(
containers=[
dict(
name="busybox",
image="busybox",
resources=dict(
requests=dict(cpu="50m", memory="50Mi"),
limits=dict(cpu=None, memory="50Mi"),
),
)
]
)
),
expected=dict(spec=dict(containers=[dict(name="busybox", image="busybox",
resources=dict(requests=dict(cpu="50m", memory="50Mi"), limits=dict(cpu=None, memory="50Mi")))]))
),
dict(
desired=dict(kind='Pod',
spec=dict(containers=[
dict(name='hello',
volumeMounts=[dict(name="test", mountPath="/test")])
],
volumes=[
dict(name="test", configMap=dict(name="test")),
])),
last_applied=dict(kind='Pod',
spec=dict(containers=[
dict(name='hello',
volumeMounts=[dict(name="test", mountPath="/test")])
],
volumes=[
dict(name="test", configMap=dict(name="test"))])),
actual=dict(kind='Pod',
spec=dict(containers=[
dict(name='hello',
volumeMounts=[
dict(name="test", mountPath="/test"),
dict(mountPath="/var/run/secrets/kubernetes.io/serviceaccount", name="default-token-xyz")])
],
volumes=[
dict(name="test", configMap=dict(name="test")),
dict(name="default-token-xyz", secret=dict(secretName="default-token-xyz")),
])),
expected=dict(spec=dict(containers=[dict(name='hello',
volumeMounts=[dict(name="test", mountPath="/test"),
dict(mountPath="/var/run/secrets/kubernetes.io/serviceaccount", name="default-token-xyz")])],
volumes=[dict(name="test", configMap=dict(name="test")),
dict(name="default-token-xyz", secret=dict(secretName="default-token-xyz"))])),
desired=dict(
kind="Pod",
spec=dict(
containers=[
dict(
name="hello",
volumeMounts=[dict(name="test", mountPath="/test")],
)
],
volumes=[dict(name="test", configMap=dict(name="test"))],
),
),
last_applied=dict(
kind="Pod",
spec=dict(
containers=[
dict(
name="hello",
volumeMounts=[dict(name="test", mountPath="/test")],
)
],
volumes=[dict(name="test", configMap=dict(name="test"))],
),
),
actual=dict(
kind="Pod",
spec=dict(
containers=[
dict(
name="hello",
volumeMounts=[
dict(name="test", mountPath="/test"),
dict(
mountPath="/var/run/secrets/kubernetes.io/serviceaccount",
name="default-token-xyz",
),
],
)
],
volumes=[
dict(name="test", configMap=dict(name="test")),
dict(
name="default-token-xyz",
secret=dict(secretName="default-token-xyz"),
),
],
),
),
expected=dict(
spec=dict(
containers=[
dict(
name="hello",
volumeMounts=[
dict(name="test", mountPath="/test"),
dict(
mountPath="/var/run/secrets/kubernetes.io/serviceaccount",
name="default-token-xyz",
),
],
)
],
volumes=[
dict(name="test", configMap=dict(name="test")),
dict(
name="default-token-xyz",
secret=dict(secretName="default-token-xyz"),
),
],
)
),
),
# This next one is based on a real world case where definition was mostly
# str type and everything else was mostly unicode type (don't ask me how)
dict(
last_applied={
u'kind': u'ConfigMap',
u'data': {u'one': '1', 'three': '3', 'two': '2'},
u'apiVersion': u'v1',
u'metadata': {u'namespace': u'apply', u'name': u'apply-configmap'}
u"kind": u"ConfigMap",
u"data": {u"one": "1", "three": "3", "two": "2"},
u"apiVersion": u"v1",
u"metadata": {u"namespace": u"apply", u"name": u"apply-configmap"},
},
actual={
u'kind': u'ConfigMap',
u'data': {u'one': '1', 'three': '3', 'two': '2'},
u'apiVersion': u'v1',
u'metadata': {u'namespace': u'apply', u'name': u'apply-configmap',
u'resourceVersion': '1714994',
u'creationTimestamp': u'2019-08-17T05:08:05Z', u'annotations': {},
u'selfLink': u'/api/v1/namespaces/apply/configmaps/apply-configmap',
u'uid': u'fed45fb0-c0ac-11e9-9d95-025000000001'}
u"kind": u"ConfigMap",
u"data": {u"one": "1", "three": "3", "two": "2"},
u"apiVersion": u"v1",
u"metadata": {
u"namespace": u"apply",
u"name": u"apply-configmap",
u"resourceVersion": "1714994",
u"creationTimestamp": u"2019-08-17T05:08:05Z",
u"annotations": {},
u"selfLink": u"/api/v1/namespaces/apply/configmaps/apply-configmap",
u"uid": u"fed45fb0-c0ac-11e9-9d95-025000000001",
},
},
desired={
'kind': u'ConfigMap',
'data': {'one': '1', 'three': '3', 'two': '2'},
'apiVersion': 'v1',
'metadata': {'namespace': 'apply', 'name': 'apply-configmap'}
"kind": u"ConfigMap",
"data": {"one": "1", "three": "3", "two": "2"},
"apiVersion": "v1",
"metadata": {"namespace": "apply", "name": "apply-configmap"},
},
expected=dict()
expected=dict(),
),
# apply a Deployment, then scale the Deployment (which doesn't affect last-applied)
# then apply the Deployment again. Should un-scale the Deployment
dict(
last_applied={
'kind': u'Deployment',
'spec': {
'replicas': 1,
'template': {
'spec': {
'containers': [
"kind": u"Deployment",
"spec": {
"replicas": 1,
"template": {
"spec": {
"containers": [
{
'name': 'this_must_exist',
'envFrom': [
{
'configMapRef': {
'name': 'config-xyz'
}
},
{
'secretRef': {
'name': 'config-wxy'
}
}
]
"name": "this_must_exist",
"envFrom": [
{"configMapRef": {"name": "config-xyz"}},
{"secretRef": {"name": "config-wxy"}},
],
}
]
}
}
},
},
'metadata': {
'namespace': 'apply',
'name': u'apply-deployment'
}
"metadata": {"namespace": "apply", "name": u"apply-deployment"},
},
actual={
'kind': u'Deployment',
'spec': {
'replicas': 0,
'template': {
'spec': {
'containers': [
"kind": u"Deployment",
"spec": {
"replicas": 0,
"template": {
"spec": {
"containers": [
{
'name': 'this_must_exist',
'envFrom': [
{
'configMapRef': {
'name': 'config-xyz'
}
},
{
'secretRef': {
'name': 'config-wxy'
}
}
]
"name": "this_must_exist",
"envFrom": [
{"configMapRef": {"name": "config-xyz"}},
{"secretRef": {"name": "config-wxy"}},
],
}
]
}
}
},
},
'metadata': {
'namespace': 'apply',
'name': u'apply-deployment'
}
"metadata": {"namespace": "apply", "name": u"apply-deployment"},
},
desired={
'kind': u'Deployment',
'spec': {
'replicas': 1,
'template': {
'spec': {
'containers': [
"kind": u"Deployment",
"spec": {
"replicas": 1,
"template": {
"spec": {
"containers": [
{
'name': 'this_must_exist',
'envFrom': [
{
'configMapRef': {
'name': 'config-abc'
}
}
]
"name": "this_must_exist",
"envFrom": [{"configMapRef": {"name": "config-abc"}}],
}
]
}
}
},
},
'metadata': {
'namespace': 'apply',
'name': u'apply-deployment'
}
"metadata": {"namespace": "apply", "name": u"apply-deployment"},
},
expected={
'spec': {
'replicas': 1,
'template': {
'spec': {
'containers': [
"spec": {
"replicas": 1,
"template": {
"spec": {
"containers": [
{
'name': 'this_must_exist',
'envFrom': [
{
'configMapRef': {
'name': 'config-abc'
}
}
]
"name": "this_must_exist",
"envFrom": [{"configMapRef": {"name": "config-abc"}}],
}
]
}
}
},
}
}
},
),
dict(
last_applied={
'kind': 'MadeUp',
'toplevel': {
'original': 'entry'
}
},
last_applied={"kind": "MadeUp", "toplevel": {"original": "entry"}},
actual={
'kind': 'MadeUp',
'toplevel': {
'original': 'entry',
'another': {
'nested': {
'entry': 'value'
}
}
}
"kind": "MadeUp",
"toplevel": {
"original": "entry",
"another": {"nested": {"entry": "value"}},
},
},
desired={
'kind': 'MadeUp',
'toplevel': {
'original': 'entry',
'another': {
'nested': {
'entry': 'value'
}
}
}
"kind": "MadeUp",
"toplevel": {
"original": "entry",
"another": {"nested": {"entry": "value"}},
},
},
expected={}
)
expected={},
),
]
def test_merges():
for test in tests:
assert(merge(test['last_applied'], test['desired'], test.get('actual', test['last_applied'])) == test['expected'])
assert (
merge(
test["last_applied"],
test["desired"],
test.get("actual", test["last_applied"]),
)
== test["expected"]
)
def test_apply_patch():
actual = dict(
kind="ConfigMap",
metadata=dict(name="foo",
annotations={'kubectl.kubernetes.io/last-applied-configuration':
'{"data":{"one":"1","two":"2"},"kind":"ConfigMap",'
'"metadata":{"annotations":{"hello":"world","this":"one"},"name":"foo"}}',
'this': 'one', 'hello': 'world'}),
data=dict(one="1", two="2")
metadata=dict(
name="foo",
annotations={
"kubectl.kubernetes.io/last-applied-configuration": '{"data":{"one":"1","two":"2"},"kind":"ConfigMap",'
'"metadata":{"annotations":{"hello":"world","this":"one"},"name":"foo"}}',
"this": "one",
"hello": "world",
},
),
data=dict(one="1", two="2"),
)
desired = dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(one="1", three="3")
kind="ConfigMap", metadata=dict(name="foo"), data=dict(one="1", three="3")
)
expected = dict(
metadata=dict(
annotations={'kubectl.kubernetes.io/last-applied-configuration': '{"data":{"one":"1","three":"3"},"kind":"ConfigMap","metadata":{"name":"foo"}}',
'this': None, 'hello': None}),
data=dict(two=None, three="3")
annotations={
"kubectl.kubernetes.io/last-applied-configuration": '{"data":{"one":"1","three":"3"},"kind":"ConfigMap","metadata":{"name":"foo"}}',
"this": None,
"hello": None,
}
),
data=dict(two=None, three="3"),
)
assert(apply_patch(actual, desired) == (actual, expected))
assert apply_patch(actual, desired) == (actual, expected)

View File

@@ -17,9 +17,7 @@ def test_encode_stringdata_modifies_definition():
"apiVersion": "v1",
"kind": "Secret",
"type": "Opaque",
"stringData": {
"mydata": "ansiβle"
}
"stringData": {"mydata": "ansiβle"},
}
res = _encode_stringdata(definition)
assert "stringData" not in res
@@ -31,9 +29,7 @@ def test_encode_stringdata_does_not_modify_data():
"apiVersion": "v1",
"kind": "Secret",
"type": "Opaque",
"data": {
"mydata": "Zm9vYmFy"
}
"data": {"mydata": "Zm9vYmFy"},
}
res = _encode_stringdata(definition)
assert res["data"]["mydata"] == "Zm9vYmFy"

View File

@@ -18,85 +18,101 @@ import pytest
from kubernetes.client import ApiClient
from kubernetes.dynamic import Resource
from ansible_collections.kubernetes.core.plugins.module_utils.k8sdynamicclient import K8SDynamicClient
from ansible_collections.kubernetes.core.plugins.module_utils.client.discovery import LazyDiscoverer
from ansible_collections.kubernetes.core.plugins.module_utils.client.resource import ResourceList
from ansible_collections.kubernetes.core.plugins.module_utils.k8sdynamicclient import (
K8SDynamicClient,
)
from ansible_collections.kubernetes.core.plugins.module_utils.client.discovery import (
LazyDiscoverer,
)
from ansible_collections.kubernetes.core.plugins.module_utils.client.resource import (
ResourceList,
)
@pytest.fixture(scope='module')
@pytest.fixture(scope="module")
def mock_namespace():
return Resource(
api_version='v1',
kind='Namespace',
name='namespaces',
api_version="v1",
kind="Namespace",
name="namespaces",
namespaced=False,
preferred=True,
prefix='api',
shorter_names=['ns'],
shortNames=['ns'],
singularName='namespace',
verbs=['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
prefix="api",
shorter_names=["ns"],
shortNames=["ns"],
singularName="namespace",
verbs=["create", "delete", "get", "list", "patch", "update", "watch"],
)
@pytest.fixture(scope='module')
@pytest.fixture(scope="module")
def mock_templates():
return Resource(
api_version='v1',
kind='Template',
name='templates',
api_version="v1",
kind="Template",
name="templates",
namespaced=True,
preferred=True,
prefix='api',
prefix="api",
shorter_names=[],
shortNames=[],
verbs=['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
verbs=["create", "delete", "get", "list", "patch", "update", "watch"],
)
@pytest.fixture(scope='module')
@pytest.fixture(scope="module")
def mock_processedtemplates():
return Resource(
api_version='v1',
kind='Template',
name='processedtemplates',
api_version="v1",
kind="Template",
name="processedtemplates",
namespaced=True,
preferred=True,
prefix='api',
prefix="api",
shorter_names=[],
shortNames=[],
verbs=['create', 'delete', 'get', 'list', 'patch', 'update', 'watch']
verbs=["create", "delete", "get", "list", "patch", "update", "watch"],
)
@pytest.fixture(scope='module')
@pytest.fixture(scope="module")
def mock_namespace_list(mock_namespace):
ret = ResourceList(mock_namespace.client, mock_namespace.group, mock_namespace.api_version, mock_namespace.kind)
ret = ResourceList(
mock_namespace.client,
mock_namespace.group,
mock_namespace.api_version,
mock_namespace.kind,
)
ret._ResourceList__base_resource = mock_namespace
return ret
@pytest.fixture(scope='function', autouse=True)
def setup_client_monkeypatch(monkeypatch, mock_namespace, mock_namespace_list, mock_templates, mock_processedtemplates):
@pytest.fixture(scope="function", autouse=True)
def setup_client_monkeypatch(
monkeypatch,
mock_namespace,
mock_namespace_list,
mock_templates,
mock_processedtemplates,
):
def mock_load_server_info(self):
self.__version = {'kubernetes': 'mock-k8s-version'}
self.__version = {"kubernetes": "mock-k8s-version"}
def mock_parse_api_groups(self, request_resources=False):
return {
'api': {
'': {
'v1': {
'Namespace': [mock_namespace],
'NamespaceList': [mock_namespace_list],
'Template': [mock_templates, mock_processedtemplates],
"api": {
"": {
"v1": {
"Namespace": [mock_namespace],
"NamespaceList": [mock_namespace_list],
"Template": [mock_templates, mock_processedtemplates],
}
}
}
}
monkeypatch.setattr(LazyDiscoverer, '_load_server_info', mock_load_server_info)
monkeypatch.setattr(LazyDiscoverer, 'parse_api_groups', mock_parse_api_groups)
monkeypatch.setattr(LazyDiscoverer, "_load_server_info", mock_load_server_info)
monkeypatch.setattr(LazyDiscoverer, "parse_api_groups", mock_parse_api_groups)
@pytest.fixture
@@ -104,39 +120,45 @@ def client(request):
return K8SDynamicClient(ApiClient(), discoverer=LazyDiscoverer)
@pytest.mark.parametrize(("attribute", "value"), [
('name', 'namespaces'),
('singular_name', 'namespace'),
('short_names', ['ns'])
])
def test_search_returns_single_and_list(client, mock_namespace, mock_namespace_list, attribute, value):
resources = client.resources.search(**{'api_version': 'v1', attribute: value})
@pytest.mark.parametrize(
("attribute", "value"),
[("name", "namespaces"), ("singular_name", "namespace"), ("short_names", ["ns"])],
)
def test_search_returns_single_and_list(
client, mock_namespace, mock_namespace_list, attribute, value
):
resources = client.resources.search(**{"api_version": "v1", attribute: value})
assert len(resources) == 2
assert mock_namespace in resources
assert mock_namespace_list in resources
@pytest.mark.parametrize(("attribute", "value"), [
('kind', 'Namespace'),
('name', 'namespaces'),
('singular_name', 'namespace'),
('short_names', ['ns'])
])
@pytest.mark.parametrize(
("attribute", "value"),
[
("kind", "Namespace"),
("name", "namespaces"),
("singular_name", "namespace"),
("short_names", ["ns"]),
],
)
def test_get_returns_only_single(client, mock_namespace, attribute, value):
resource = client.resources.get(**{'api_version': 'v1', attribute: value})
resource = client.resources.get(**{"api_version": "v1", attribute: value})
assert resource == mock_namespace
def test_get_namespace_list_kind(client, mock_namespace_list):
resource = client.resources.get(api_version='v1', kind='NamespaceList')
resource = client.resources.get(api_version="v1", kind="NamespaceList")
assert resource == mock_namespace_list
def test_search_multiple_resources_for_template(client, mock_templates, mock_processedtemplates):
resources = client.resources.search(api_version='v1', kind='Template')
def test_search_multiple_resources_for_template(
client, mock_templates, mock_processedtemplates
):
resources = client.resources.search(api_version="v1", kind="Template")
assert len(resources) == 2
assert mock_templates in resources

View File

@@ -15,17 +15,22 @@
# Test ConfigMapHash and SecretHash equivalents
# tests based on https://github.com/kubernetes/kubernetes/pull/49961
from __future__ import (absolute_import, division, print_function)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible_collections.kubernetes.core.plugins.module_utils.hashes import generate_hash
from ansible_collections.kubernetes.core.plugins.module_utils.hashes import (
generate_hash,
)
tests = [
dict(
resource=dict(kind="ConfigMap", metadata=dict(name="foo"), data=dict()),
expected="867km9574f",
),
dict(
resource=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict()
kind="ConfigMap", metadata=dict(name="foo"), type="my-type", data=dict()
),
expected="867km9574f",
),
@@ -33,53 +38,31 @@ tests = [
resource=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
type="my-type",
data=dict()
),
expected="867km9574f",
),
dict(
resource=dict(
kind="ConfigMap",
metadata=dict(name="foo"),
data=dict(
key1="value1",
key2="value2")
data=dict(key1="value1", key2="value2"),
),
expected="gcb75dd9gb",
),
dict(
resource=dict(
kind="Secret",
metadata=dict(name="foo"),
data=dict()
),
resource=dict(kind="Secret", metadata=dict(name="foo"), data=dict()),
expected="949tdgdkgg",
),
dict(
resource=dict(
kind="Secret",
metadata=dict(name="foo"),
type="my-type",
data=dict()
kind="Secret", metadata=dict(name="foo"), type="my-type", data=dict()
),
expected="dg474f9t76",
),
dict(
resource=dict(
kind="Secret",
metadata=dict(name="foo"),
data=dict(
key1="dmFsdWUx",
key2="dmFsdWUy")
data=dict(key1="dmFsdWUx", key2="dmFsdWUy"),
),
expected="tf72c228m4",
)
),
]
def test_hashes():
for test in tests:
assert(generate_hash(test['resource']) == test['expected'])
assert generate_hash(test["resource"]) == test["expected"]

View File

@@ -15,78 +15,55 @@
# Test ConfigMap and Secret marshalling
# tests based on https://github.com/kubernetes/kubernetes/pull/49961
from __future__ import (absolute_import, division, print_function)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible_collections.kubernetes.core.plugins.module_utils.hashes import marshal, sorted_dict
from ansible_collections.kubernetes.core.plugins.module_utils.hashes import (
marshal,
sorted_dict,
)
tests = [
dict(
resource=dict(
kind="ConfigMap",
name="",
data=dict(),
),
expected=b'{"data":{},"kind":"ConfigMap","name":""}'
resource=dict(kind="ConfigMap", name="", data=dict(),),
expected=b'{"data":{},"kind":"ConfigMap","name":""}',
),
dict(
resource=dict(kind="ConfigMap", name="", data=dict(one=""),),
expected=b'{"data":{"one":""},"kind":"ConfigMap","name":""}',
),
dict(
resource=dict(
kind="ConfigMap",
name="",
data=dict(
one=""
),
kind="ConfigMap", name="", data=dict(two="2", one="", three="3",),
),
expected=b'{"data":{"one":""},"kind":"ConfigMap","name":""}'
expected=b'{"data":{"one":"","three":"3","two":"2"},"kind":"ConfigMap","name":""}',
),
dict(
resource=dict(
kind="ConfigMap",
name="",
data=dict(
two="2",
one="",
three="3",
),
),
expected=b'{"data":{"one":"","three":"3","two":"2"},"kind":"ConfigMap","name":""}'
resource=dict(kind="Secret", type="my-type", name="", data=dict(),),
expected=b'{"data":{},"kind":"Secret","name":"","type":"my-type"}',
),
dict(
resource=dict(kind="Secret", type="my-type", name="", data=dict(one=""),),
expected=b'{"data":{"one":""},"kind":"Secret","name":"","type":"my-type"}',
),
dict(
resource=dict(
kind="Secret",
type="my-type",
name="",
data=dict(),
data=dict(two="Mg==", one="", three="Mw==",),
),
expected=b'{"data":{},"kind":"Secret","name":"","type":"my-type"}'
),
dict(
resource=dict(
kind="Secret",
type="my-type",
name="",
data=dict(
one=""
),
),
expected=b'{"data":{"one":""},"kind":"Secret","name":"","type":"my-type"}'
),
dict(
resource=dict(
kind="Secret",
type="my-type",
name="",
data=dict(
two="Mg==",
one="",
three="Mw==",
),
),
expected=b'{"data":{"one":"","three":"Mw==","two":"Mg=="},"kind":"Secret","name":"","type":"my-type"}'
expected=b'{"data":{"one":"","three":"Mw==","two":"Mg=="},"kind":"Secret","name":"","type":"my-type"}',
),
]
def test_marshal():
for test in tests:
assert(marshal(sorted_dict(test['resource']), sorted(list(test['resource'].keys()))) == test['expected'])
assert (
marshal(
sorted_dict(test["resource"]), sorted(list(test["resource"].keys()))
)
== test["expected"]
)

View File

@@ -12,54 +12,57 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from ansible_collections.kubernetes.core.plugins.module_utils.selector import LabelSelectorFilter, Selector
from ansible_collections.kubernetes.core.plugins.module_utils.selector import (
LabelSelectorFilter,
Selector,
)
prod_definition = {
'apiVersion': 'v1',
'kind': 'Pod',
'metadata': {
'name': 'test',
'labels': {
'environment': 'production',
'app': 'nginx',
}
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "test",
"labels": {"environment": "production", "app": "nginx"},
},
'spec': {
'containers': [
{'name': 'nginx', 'image': 'nginx:1.14.2', 'command': ['/bin/sh', '-c', 'sleep 10']}
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx:1.14.2",
"command": ["/bin/sh", "-c", "sleep 10"],
}
]
}
},
}
no_label_definition = {
'apiVersion': 'v1',
'kind': 'Pod',
'metadata': {
'name': 'test',
'labels': {}
},
'spec': {
'containers': [
{'name': 'nginx', 'image': 'nginx:1.14.2', 'command': ['/bin/sh', '-c', 'sleep 10']}
"apiVersion": "v1",
"kind": "Pod",
"metadata": {"name": "test", "labels": {}},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx:1.14.2",
"command": ["/bin/sh", "-c", "sleep 10"],
}
]
}
},
}
test_definition = {
'apiVersion': 'v1',
'kind': 'Pod',
'metadata': {
'name': 'test',
'labels': {
'environment': 'test',
'app': 'nginx',
}
},
'spec': {
'containers': [
{'name': 'nginx', 'image': 'nginx:1.15.2', 'command': ['/bin/sh', '-c', 'sleep 10']}
"apiVersion": "v1",
"kind": "Pod",
"metadata": {"name": "test", "labels": {"environment": "test", "app": "nginx"}},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx:1.15.2",
"command": ["/bin/sh", "-c", "sleep 10"],
}
]
}
},
}
@@ -75,13 +78,27 @@ def test_selector_parser():
assert sel._operator == "in" and sel._data == ["true"] and sel._key == "environment"
f_selector = "environment!=false"
sel = Selector(f_selector)
assert sel._operator == "notin" and sel._data == ["false"] and sel._key == "environment"
assert (
sel._operator == "notin"
and sel._data == ["false"]
and sel._key == "environment"
)
f_selector = "environment notin (true, false)"
sel = Selector(f_selector)
assert sel._operator == "notin" and "true" in sel._data and "false" in sel._data and sel._key == "environment"
assert (
sel._operator == "notin"
and "true" in sel._data
and "false" in sel._data
and sel._key == "environment"
)
f_selector = "environment in (true, false)"
sel = Selector(f_selector)
assert sel._operator == "in" and "true" in sel._data and "false" in sel._data and sel._key == "environment"
assert (
sel._operator == "in"
and "true" in sel._data
and "false" in sel._data
and sel._key == "environment"
)
f_selector = "environmentin(true, false)"
sel = Selector(f_selector)
assert not sel._operator and not sel._data and sel._key == f_selector
@@ -97,91 +114,91 @@ def test_selector_parser():
def test_label_selector_without_operator():
label_selector = ['environment', 'app']
label_selector = ["environment", "app"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert LabelSelectorFilter(label_selector).isMatching(test_definition)
def test_label_selector_equal_operator():
label_selector = ['environment==test']
label_selector = ["environment==test"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment=production']
label_selector = ["environment=production"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment=production', 'app==mongodb']
label_selector = ["environment=production", "app==mongodb"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment=production', 'app==nginx']
label_selector = ["environment=production", "app==nginx"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment', 'app==nginx']
label_selector = ["environment", "app==nginx"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert LabelSelectorFilter(label_selector).isMatching(test_definition)
def test_label_selector_notequal_operator():
label_selector = ['environment!=test']
label_selector = ["environment!=test"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment!=production']
label_selector = ["environment!=production"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment=production', 'app!=mongodb']
label_selector = ["environment=production", "app!=mongodb"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment=production', 'app!=nginx']
label_selector = ["environment=production", "app!=nginx"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment', 'app!=nginx']
label_selector = ["environment", "app!=nginx"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
def test_label_selector_conflicting_definition():
label_selector = ['environment==test', 'environment!=test']
label_selector = ["environment==test", "environment!=test"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment==test', 'environment==production']
label_selector = ["environment==test", "environment==production"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
def test_set_based_requirement():
label_selector = ['environment in (production)']
label_selector = ["environment in (production)"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment in (production, test)']
label_selector = ["environment in (production, test)"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment notin (production)']
label_selector = ["environment notin (production)"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment notin (production, test)']
label_selector = ["environment notin (production, test)"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['environment']
label_selector = ["environment"]
assert LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert not LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert LabelSelectorFilter(label_selector).isMatching(test_definition)
label_selector = ['!environment']
label_selector = ["!environment"]
assert not LabelSelectorFilter(label_selector).isMatching(prod_definition)
assert LabelSelectorFilter(label_selector).isMatching(no_label_definition)
assert not LabelSelectorFilter(label_selector).isMatching(test_definition)