/
import_from_api.py
106 lines (85 loc) · 2.81 KB
/
import_from_api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import requests
from pecan import core
from pecan import conf
from appcatalog.model import models
from sqlalchemy.orm import scoped_session, sessionmaker
from toposort import toposort_flatten
URL = 'http://apps.openstack.org/api/v1/assets'
core.load_app('config.py')
db = scoped_session(sessionmaker(autocommit=False,
autoflush=True,
bind=conf.sqlalchemy.engine))
def sort(data):
deps = {}
output = {}
for app in data['assets']:
if app.get('depends'):
deps[app['name']] = set(d['name'] for d in app['depends'])
else:
deps[app['name']] = set()
output[app['name']] = app
#import pprint
#pprint.pprint(toposort_flatten(deps))
#assert False, 'asdf'
return toposort_flatten(deps), output
def import_data():
order, data = sort(fetch_from_api(URL))
for index in order:
app = data[index]
app_db = models.App(
name=app['name'],
description=app['description'],
attributes=create_attrs(app),
provider_id=get_or_create(models.Provider, **app['provided_by']).id,
license_id=get_or_create(
models.License,
name=app['license'],
url=app.get('license_url')
).id,
service_id=get_or_create(models.Service, **app['service']).id,
)
if 'icon' in app:
app_db.icon_id = get_or_create(models.Icon, **app['icon']).id
for tag in app.get('tags', []):
t = get_or_create(models.Tag, name=tag)
app_db.tags.append(t)
for release in app.get('release', []):
r = get_or_create(models.Release, release=release)
app_db.releases.append(r)
if app.get('depends'):
app_db.dependencies = parse_deps(app)
db.add(app_db)
db.commit()
def parse_deps(app):
result = []
for dep in app['depends']:
obj = db.query(models.App).filter_by(**dep).first()
if not obj:
print "WARNING: Could not find dependency {} for app {}".format(
dep, app['name'])
continue
result.append(obj)
return result
def get_or_create(model, **data):
existing_obj = db.query(model).filter_by(**data).first()
if not existing_obj:
existing_obj = model(**data)
db.add(existing_obj)
db.commit()
return existing_obj
def create_attrs(app):
attrs = []
for key, value in app.get('attributes', {}).items():
attr_db = models.Attribute(
key=key,
value=value
)
db.add(attr_db)
attrs.append(attr_db)
db.commit()
return attrs
def fetch_from_api(url):
resp = requests.get(url)
return resp.json()
if __name__ == "__main__":
import_data()