-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add checking available resources (#114)
* Added checking the availability of resources inside kubernetes * Fix problem with newlines at end of files * Fix problem with imports packages and other flake8 errors * Fixed problems described in comments from PR * Fixed issues described in PR
- Loading branch information
Andrey Kazakov
committed
Jan 31, 2020
1 parent
97e3a42
commit 678304c
Showing
13 changed files
with
270 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
from .checker import ResourceAvailabilityChecker | ||
from .resource_getters import make_resource_getters_list | ||
|
||
__all__ = ['ResourceAvailabilityChecker', 'make_resource_getters_list'] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
from typing import List | ||
|
||
from k8s_handle.templating import get_template_contexts | ||
from k8s_handle.exceptions import ResourceNotAvailableError | ||
|
||
from .resource_getters import AbstractResourceGetter | ||
|
||
|
||
class ResourceAvailabilityChecker(object): | ||
|
||
def __init__(self, resources_getters: List[AbstractResourceGetter]): | ||
self.resources = resources_getters | ||
self.versions = {} | ||
|
||
def _is_available_kind(self, api_group: str, kind: str) -> bool: | ||
kinds = [] | ||
for api in self.resources: | ||
if api.is_processable_version(api_group): | ||
kinds = api.get_resources_by_version(api_group) | ||
|
||
return kind in kinds | ||
|
||
def run(self, file_path: str): | ||
for template_body in get_template_contexts(file_path): | ||
if not self._is_available_kind(template_body.get('apiVersion'), template_body.get('kind')): | ||
raise ResourceNotAvailableError( | ||
"The resource with kind {} is not supported with version {}. File: {}".format( | ||
template_body.get('kind'), template_body.get('apiVersion'), file_path | ||
) | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
class MockResource(object): | ||
def __init__(self, kind): | ||
self.kind = kind |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
import re | ||
from typing import List, Set | ||
|
||
from k8s_handle.k8s.api_extensions import ResourcesAPI, CoreResourcesAPI | ||
|
||
core_pattern = re.compile(r'^([^/]+)$') | ||
regular_pattern = re.compile(r'^([^/]+)/([^/]+)$') | ||
|
||
|
||
class AbstractResourceGetter(object): | ||
def is_processable_version(self, api_group: str) -> bool: | ||
raise NotImplementedError | ||
|
||
def get_resources_by_version(self, api_group: str) -> Set[str]: | ||
raise NotImplementedError | ||
|
||
|
||
class CoreResourceGetter(AbstractResourceGetter): | ||
|
||
def __init__(self, resource_api: CoreResourcesAPI): | ||
self.api = resource_api | ||
self.versions = {} | ||
|
||
def is_processable_version(self, api_group: str) -> bool: | ||
return core_pattern.match(api_group) is not None | ||
|
||
def get_resources_by_version(self, api_group: str) -> Set[str]: | ||
if api_group in self.versions: | ||
return self.versions[api_group] | ||
|
||
resp = self.api.list_api_resources(api_group) | ||
|
||
if not resp: | ||
return set() | ||
|
||
kinds = {r.kind for r in resp.resources} | ||
self.versions[api_group] = kinds | ||
|
||
return kinds | ||
|
||
|
||
class RegularResourceGetter(AbstractResourceGetter): | ||
|
||
def __init__(self, resource_api: ResourcesAPI): | ||
self.api = resource_api | ||
self.versions = {} | ||
|
||
def is_processable_version(self, api_group: str) -> bool: | ||
return regular_pattern.match(api_group) is not None | ||
|
||
def get_resources_by_version(self, api_group: str) -> Set[str]: | ||
if api_group in self.versions: | ||
return self.versions[api_group] | ||
|
||
group, version = regular_pattern.findall(api_group).pop() | ||
resp = self.api.list_api_resource_arbitrary(group, version) | ||
|
||
if not resp: | ||
return set() | ||
|
||
kinds = {r.kind for r in resp.resources} | ||
self.versions[api_group] = kinds | ||
|
||
return kinds | ||
|
||
|
||
def make_resource_getters_list() -> List[AbstractResourceGetter]: | ||
return [ | ||
CoreResourceGetter(CoreResourcesAPI()), | ||
RegularResourceGetter(ResourcesAPI()) | ||
] |
39 changes: 39 additions & 0 deletions
39
k8s_handle/k8s/availability_checker/test_availability_checker.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
from unittest import TestCase | ||
|
||
from .checker import ResourceAvailabilityChecker | ||
from .resource_getters import CoreResourceGetter, RegularResourceGetter | ||
from .mocks import MockResource | ||
|
||
from k8s_handle.k8s.mocks import ResourcesAPIMock | ||
from k8s_handle.exceptions import ResourceNotAvailableError | ||
|
||
|
||
class TestAvailabilityChecker(TestCase): | ||
|
||
def setUp(self): | ||
core_getter = CoreResourceGetter( | ||
ResourcesAPIMock(group_version="v1", resources=[MockResource("Pod"), MockResource("CronJob")]) | ||
) | ||
|
||
regular_getter = RegularResourceGetter( | ||
ResourcesAPIMock(group_version="app/v1", resources=[MockResource("Deployment"), MockResource("Service")]) | ||
) | ||
|
||
self.checker = ResourceAvailabilityChecker([core_getter, regular_getter]) | ||
|
||
def test_is_available_kind(self): | ||
self.assertTrue(self.checker._is_available_kind("v1", "Pod")) | ||
self.assertTrue(self.checker._is_available_kind("app/v1", "Service")) | ||
self.assertFalse(self.checker._is_available_kind("v1", "Deployment")) | ||
self.assertFalse(self.checker._is_available_kind("app/v1", "CronJob")) | ||
|
||
def test_run_with_valid_version(self): | ||
self.checker.run('k8s_handle/k8s/fixtures/valid_version.yaml') | ||
|
||
def test_run_with_invalid_version(self): | ||
with self.assertRaises(ResourceNotAvailableError): | ||
self.checker.run('k8s_handle/k8s/fixtures/invalid_version.yaml') | ||
|
||
def test_run_with_unsupported_version(self): | ||
with self.assertRaises(ResourceNotAvailableError): | ||
self.checker.run('k8s_handle/k8s/fixtures/unsupported_version.yaml') |
43 changes: 43 additions & 0 deletions
43
k8s_handle/k8s/availability_checker/test_resource_getters.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
from unittest import TestCase | ||
|
||
from k8s_handle.k8s.mocks import ResourcesAPIMock | ||
|
||
from .resource_getters import CoreResourceGetter, RegularResourceGetter | ||
from .mocks import MockResource | ||
|
||
|
||
class TestCoreResourceGetter(TestCase): | ||
|
||
def setUp(self): | ||
self.getter = CoreResourceGetter( | ||
ResourcesAPIMock(group_version="v1", resources=[MockResource("Pod"), MockResource("CronJob")]) | ||
) | ||
|
||
def test_is_processable_version(self): | ||
self.assertTrue(self.getter.is_processable_version("v1")) | ||
self.assertFalse(self.getter.is_processable_version("app/v1")) | ||
self.assertFalse(self.getter.is_processable_version("/")) | ||
self.assertFalse(self.getter.is_processable_version("")) | ||
|
||
def test_get_resources_by_version(self): | ||
self.assertSetEqual({"Pod", "CronJob"}, self.getter.get_resources_by_version("v1")) | ||
self.assertSetEqual(set(), self.getter.get_resources_by_version("v2")) | ||
|
||
|
||
class TestRegularResourceGetter(TestCase): | ||
|
||
def setUp(self): | ||
self.getter = RegularResourceGetter( | ||
ResourcesAPIMock(group_version="app/v1", resources=[MockResource("Pod"), MockResource("CronJob")]) | ||
) | ||
|
||
def test_is_processable_version(self): | ||
self.assertFalse(self.getter.is_processable_version("v1")) | ||
self.assertTrue(self.getter.is_processable_version("app/betav1")) | ||
self.assertTrue(self.getter.is_processable_version("app/v1")) | ||
self.assertFalse(self.getter.is_processable_version("/")) | ||
self.assertFalse(self.getter.is_processable_version("")) | ||
|
||
def test_get_resources_by_version(self): | ||
self.assertSetEqual({"Pod", "CronJob"}, self.getter.get_resources_by_version("app/v1")) | ||
self.assertSetEqual(set(), self.getter.get_resources_by_version("app/betav1")) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
--- | ||
apiVersion: extra/v1 | ||
kind: Service | ||
metadata: | ||
name: my-service | ||
spec: | ||
ports: | ||
- name: HTTP | ||
port: 80 | ||
protocol: TCP | ||
targetPort: 80 | ||
selector: | ||
app: my-app | ||
type: ClusterIP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
apiVersion: v1 | ||
kind: Deployment | ||
metadata: | ||
name: my-service |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
--- | ||
apiVersion: app/v1 | ||
kind: Service | ||
metadata: | ||
name: my-service | ||
spec: | ||
ports: | ||
- name: HTTP | ||
port: 80 | ||
protocol: TCP | ||
targetPort: 80 | ||
selector: | ||
app: my-app | ||
type: ClusterIP |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters