9
9
log = logging.getLogger("charm.scan")
12
def scan_charm(db, name, charm_dir, **md):
13
revision_path = os.path.join(charm_dir, "revision")
14
metadata_path = os.path.join(charm_dir, "metadata.yaml")
15
config_path = os.path.join(charm_dir, "config.yaml")
12
def scan_charm(db, charm_data):
13
revision_path = os.path.join(
14
charm_data["branch_dir"], "revision")
15
metadata_path = os.path.join(
16
charm_data["branch_dir"], "metadata.yaml")
17
config_path = os.path.join(
18
charm_data["branch_dir"], "config.yaml")
17
20
if not os.path.exists(metadata_path):
18
log.info("Charm has no metadata: %s", name)
21
log.info("Charm has no metadata: %s", charm_data["branch_spec"])
21
24
with open(metadata_path) as fh:
23
26
metadata = yaml.load(fh.read())
24
27
except Exception, e:
25
log.info("Invalid charm metadata %s: %s", name, e)
29
"Invalid charm metadata %s: %s", charm_data["branch_spec"], e)
28
32
if os.path.exists(config_path):
30
34
config_raw = open(config_path).read()
31
35
config = yaml.load(config_raw)
33
log.info("Invalid config metadata %s", name)
37
log.info("Invalid config metadata %s", charm_data["branch_spec"])
36
39
metadata["config"] = config
37
40
metadata["config_raw"] = config_raw
41
44
rev_id = int(open(revision_path).read().strip())
43
log.info("Invalid revision %s", name)
46
log.info("Invalid revision %s", charm_data["branch_spec"])
44
47
metadata["revision"] = rev_id
48
elif not "revision" in metadata:
49
log.info("Invalid revision %s", charm_data["branch_spec"])
50
metadata["revision"] = 0
46
hook_dir = os.path.join(charm_dir, "hooks")
52
hook_dir = os.path.join(charm_data["branch_dir"], "hooks")
48
54
if os.path.exists(hook_dir):
49
55
hooks = os.listdir(hook_dir)
51
57
metadata["hooks"] = hooks
53
59
# Stuff into the db
55
metadata["_id"] = metadata["repo"]
60
metadata.update(charm_data)
61
metadata["_id"] = metadata["branch_spec"]
56
62
item = db.find_one({"_id": metadata["_id"]})
60
log.debug("Updating %s", name)
66
log.debug("Updating %s", metadata["branch_spec"])
61
67
item.update(metadata)
62
68
item = process_charm(item)
63
69
db.update({"_id": item["_id"]}, item, upsert=True)
66
72
def process_charm(charm):
67
owner, _ = charm["repo"].split("/", 1)
69
charm["owner"] = owner
73
# Enrich charm metadata for webapp.
76
if charm["owner"] == "charmers":
77
charm["short_url"] = "/charms/%s/%s" % (
78
charm["series"], charm["name"])
80
charm["short_url"] = "/~%s/%s/%s" % (charm["owner"],
85
if charm["owner"] == "charmers":
86
charm["label"] = "%s/%s" % (charm["series"], charm["name"])
88
charm["label"] = "~%s:%s/%s" % (charm["owner"],
71
92
# Flatten the interfaces provided
120
repo, commit, series = json.loads(item)
121
name = repo.rsplit("/", 2)[1]
122
charm_dir = os.path.join(root_dir, name)
123
log.info("Processing %s", name)
124
scan_charm(db, name, charm_dir,
125
commit=commit, series=series, repo=repo)
140
charm_data = json.loads(item)
141
log.info("Processing %s", charm_data["branch_spec"])
142
scan_charm(db, charm_data)
127
143
except Exception, e:
128
144
log.exception("scan error %s: %s", item, e)
147
server.lpush(index_queue, item)
136
155
conn = pymongo.Connection()
137
156
db = conn.juju.charms
138
#server = redis.Redis()
139
#scan_charms(db, server, root_dir)
140
scan_repo(db, root_dir)
157
server = redis.Redis()
158
scan_charms(db, server, root_dir)
159
#scan_repo(db, root_dir)
142
161
if __name__ == '__main__':