13
14
from config import SCAN_IN_QUEUE
14
15
from config import SCAN_OUT_QUEUE
15
16
from utils import get_queues
17
from charmworld.models import getfs
18
from charmworld.models import getdb
19
from charmworld.models import CharmFileSet
20
from charmworld.utils import quote_key
21
from charmworld.utils import quote_yaml
24
log = logging.getLogger("charm.scan")
27
def scan_charm(db, charm_data):
29
files = charm_data['files']
30
# Some files have bad characters in them since they are used as mongo
31
# keys. Use their escaped forms instead.
32
metadata_file = quote_key('metadata.yaml')
33
config_file = quote_key('config.yaml')
35
if metadata_file not in files:
36
log.info("Charm has no metadata: %s", charm_data["branch_spec"])
39
cfile = CharmFileSet.get_by_id(fs, files[metadata_file]['fileid'])
41
metadata = quote_yaml(yaml.load(cfile.read()))
42
except Exception, exc:
44
'Invalid charm metadata %s: %s' % (
45
charm_data['branch_spec'],
49
if config_file in files:
50
cfile = CharmFileSet.get_by_id(fs, files[config_file]['fileid'])
51
config_raw = cfile.read()
54
config = quote_yaml(yaml.load(config_raw))
55
except Exception, exc:
57
'Invalid charm config yaml. %s: %s' % (
58
charm_data['branch_spec'],
62
metadata["config"] = config
63
metadata["config_raw"] = config_raw
65
if 'revision' in files:
66
cfile = CharmFileSet.get_by_id(fs, files['revision']['fileid'])
67
rev_raw = cfile.read()
68
rev_id = int(rev_raw.strip())
69
metadata["revision"] = rev_id
70
elif not "revision" in metadata:
71
log.info("Invalid revision %s", charm_data["branch_spec"])
72
metadata["revision"] = 0
75
for filedata in files.values():
76
if filedata['subdir'] == 'hooks':
77
hooks.append(filedata['filename'])
79
metadata["hooks"] = hooks
82
metadata.update(charm_data)
83
metadata["_id"] = metadata["branch_spec"]
84
item = db.charms.find_one({"_id": metadata["_id"]})
88
#log.debug("Updating %s", metadata["branch_spec"])
90
item = process_charm(item)
91
db.charms.update({"_id": item["_id"]}, item, upsert=True)
94
def process_charm(charm):
95
# Enrich charm metadata for webapp.
98
if charm["owner"] == "charmers":
99
charm["short_url"] = "/charms/%s/%s" % (
100
charm["series"], charm["name"])
102
charm["short_url"] = "/~%s/%s/%s" % (charm["owner"],
107
if charm["owner"] == "charmers":
108
charm["label"] = "%s/%s" % (charm["series"], charm["name"])
110
charm["label"] = "~%s:%s/%s" % (charm["owner"],
114
# Flatten the interfaces provided
116
provides = charm.get("provides")
118
for v in provides.values():
119
if not isinstance(v, dict):
121
i = v.get("interface")
125
charm["i_provides"] = i_provides
127
# Flatten the interfaces required
129
requires = charm.get("requires")
131
for v in requires.values():
132
i = v.get("interface")
136
charm["i_requires"] = i_requires
140
def scan_repo(db, root_dir):
141
charms = os.listdir(root_dir)
143
charm_dir = os.path.join(root_dir, c)
144
if not os.path.isdir(charm_dir):
146
#log.info("Processing %s", c)
148
scan_charm(db, c, charm_dir, repo="~charmers/charm/oneiric/%s" % c)
150
log.exception("Unknown scan error")
155
traceback.print_exc()
156
pdb.post_mortem(sys.exc_info()[-1])
160
def scan_charms(db, scan_queue, index_queue):
163
item = scan_queue.next()
167
charm_data = item.payload
168
scan_charm(db, charm_data)
169
# XXX j.c.sackett Jan 31 2013 Bug:1111708 scan_repo is swapped for
170
# scan_charm to reindex what's on disk; we should probably just
171
# have a different job for this that's not part of ingest.
172
#scan_repo(db, CHARM_DIR)
174
log.exception("scan error %s: %s", charm_data, e)
177
index_queue.put(charm_data)
17
from worker import scan_charms
20
if __name__ == '__main__':
181
21
logging.basicConfig(
182
22
level=logging.DEBUG,
183
23
format="%(asctime)s: %(name)s@%(levelname)s: %(message)s")