Skip to content

Commit e76b0d3

Browse files
anton-bAnton Benkevich
andauthored
Support for dev definitions library (#358)
* Support for dev definitions library Co-authored-by: Anton Benkevich <[email protected]>
1 parent 6f69f16 commit e76b0d3

File tree

3 files changed

+55
-5
lines changed

3 files changed

+55
-5
lines changed

.travis.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ jobs:
1919
install:
2020
- pip install ./
2121
script: python scripts/validate_my_definition.py -d alsdkdefs/apis/assets_query/
22+
# TODO test private defs
23+
# - stage: test_private_defs
24+
# name: "Test private definitions"
25+
# install: pip install -U tox-travis
26+
# script: git clone https://[email protected]/alertlogic/alertlogic-sdk-definitions-dev && pip install ./alertlogic-sdk-definitions-dev && tox
2227
# - stage: test_other_os
2328
# language: sh
2429
# python: 3

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ List available service definitions:
2424
```
2525
>>> import alsdkdefs
2626
>>> alsdkdefs.list_services()
27-
['aefr', 'aerta', 'aetag', 'aetuner', 'aims', 'assets_query', 'kelt', 'credentials', 'deployments', 'ingest', 'iris', 'policies', 'search', 'themis']
27+
OrderedDict([('aecontent', ServiceDefinition(aecontent)), ('aefr', ServiceDefinition(aefr)), ('aepublish', ServiceDefinition(aepublish)), ('aerta', ServiceDefinition(aerta)), ('aetag', ServiceDefinition(aetag)), ('aetuner', ServiceDefinition(aetuner)), ('aims', ServiceDefinition(aims)), ('assets_query', ServiceDefinition(assets_query)), ('assets_write', ServiceDefinition(assets_write)), ('connectors', ServiceDefinition(connectors)), ('credentials', ServiceDefinition(credentials)), ('deployments', ServiceDefinition(deployments)), ('herald', ServiceDefinition(herald)), ('ingest', ServiceDefinition(ingest)), ('iris', ServiceDefinition(iris)), ('kalm', ServiceDefinition(kalm)), ('notify', ServiceDefinition(notify)), ('otis', ServiceDefinition(otis)), ('policies', ServiceDefinition(policies)), ('remediations', ServiceDefinition(remediations)), ('responder', ServiceDefinition(responder)), ('search', ServiceDefinition(search)), ('subscriptions', ServiceDefinition(subscriptions)), ('themis', ServiceDefinition(themis))])
2828
```
2929

3030
Get path to a service definitions paths:

alsdkdefs/__init__.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from os.path import join as pjoin
33
import glob
44
import collections
5+
from collections import OrderedDict
56
import jsonschema
67
from urllib.parse import urlparse, urlsplit, urlunsplit
78
from urllib.request import urlopen, url2pathname
@@ -12,10 +13,43 @@
1213
import json
1314
import re
1415

16+
try:
17+
import alsdkdefs_dev
18+
DEV_SDK_DEFS = True
19+
except ImportError:
20+
DEV_SDK_DEFS = False
21+
1522
OPENAPI_SCHEMA_URL = 'https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/schemas/v3.0/schema.json'
1623
URI_SCHEMES = ['file', 'http', 'https']
1724

1825

26+
class ServiceDefinition:
27+
def __init__(self, name, filespath):
28+
self.service_name = name
29+
self.filespath = filespath
30+
31+
def __str__(self):
32+
return self.service_name
33+
34+
def __repr__(self):
35+
return f"ServiceDefinition({self.service_name})"
36+
37+
def __gt__(self, other):
38+
return self.get_service_name() > other.get_service_name()
39+
40+
def __eq__(self, other):
41+
return other.get_service_name() == self.get_service_name()
42+
43+
def __lt__(self, other):
44+
return self.get_service_name() < other.get_service_name()
45+
46+
def get_service_name(self):
47+
return self.service_name
48+
49+
def get_files_path(self):
50+
return self.filespath
51+
52+
1953
class AlertLogicOpenApiValidationException(Exception):
2054
pass
2155

@@ -116,7 +150,11 @@ def get_apis_dir():
116150

117151
def load_service_spec(service_name, apis_dir=None, version=None):
118152
"""Loads a version of service from library apis directory, if version is not specified, latest is loaded"""
119-
service_api_dir = pjoin(apis_dir or get_apis_dir(), service_name)
153+
services = list_services()
154+
servicedef = services.get(service_name)
155+
if not servicedef:
156+
raise FileNotFoundError(f'Service {service_name} definition files has not been found')
157+
service_api_dir = servicedef.get_files_path() or apis_dir
120158
if not version:
121159
# Find the latest version of the service api spes
122160
version = 0
@@ -152,16 +190,23 @@ def get_spec(uri):
152190
return json.loads(stream.read())
153191

154192

193+
@lru_cache()
155194
def list_services():
156195
"""Lists services definitions available"""
157196
base_dir = get_apis_dir()
158-
return sorted(next(os.walk(base_dir))[1])
197+
dev_services = []
198+
if DEV_SDK_DEFS:
199+
dev_dirs = alsdkdefs_dev.get_apis_dir()
200+
dev_services = [ServiceDefinition(s, pjoin(dev_dirs, s)) for s in next(os.walk(dev_dirs))[1]]
201+
pub_services = [ServiceDefinition(s, pjoin(base_dir, s)) for s in next(os.walk(base_dir))[1]]
202+
services_search = OrderedDict(sorted([(str(servicedef), servicedef) for servicedef in pub_services + dev_services]))
203+
return services_search
159204

160205

161206
def get_service_defs(service_name):
162207
"""Lists a service's definitions available"""
163-
service_dir = pjoin(get_apis_dir(), service_name)
164-
return glob.glob(f"{service_dir}/{service_name}.v*.yaml")
208+
service = list_services()[service_name]
209+
return glob.glob(pjoin(service.get_files_path(), f"{service_name}.v*.yaml"))
165210

166211

167212
@lru_cache()

0 commit comments

Comments
 (0)