blob: 95e9abb7ed5fcd91df4a45bc04e35b34c5348ab9 [file] [log] [blame]
#!/usr/bin/env python
import ConfigParser as cp
import json
import os
import re
import requests
import yaml
IBM_CLOUD_URL = "https://us-south.iaas.cloud.ibm.com/v1/"
IAM_URL = "https://iam.cloud.ibm.com/identity/token"
IBM_CLOUD_GENERATION = "2"
IBM_CLOUD_VERSION = "2019-08-09"
API_KEY = None
IAM_TOKEN = None
SESS = requests.session()
def tostr(obj):
ret = {}
for k, v in obj.items():
if isinstance(k, unicode):
k = k.encode("utf-8")
if isinstance(v, dict):
ret[k] = tostr(v)
elif isinstance(v, unicode):
ret[k] = v.encode("utf-8")
else:
ret[k] = v
return ret
def load_api_key():
global API_KEY
path = os.path.expanduser("~/.couchdb-infra-cm.cfg")
if not os.path.exists(path):
print "Missing config file: " + path
exit(1)
parser = cp.SafeConfigParser()
parser.read([path])
API_KEY = parser.get("ibmcloud", "api_key")
def load_iam_token():
global IAM_TOKEN
headers = {
"Accept": "application/json"
}
data = {
"grant_type": "urn:ibm:params:oauth:grant-type:apikey",
"apikey": API_KEY
}
resp = SESS.post(IAM_URL, headers=headers, data=data)
resp.raise_for_status()
body = resp.json()
IAM_TOKEN = body["token_type"] + " " + body["access_token"]
SESS.headers["Authorization"] = IAM_TOKEN
def init():
load_api_key()
load_iam_token()
def list_instances():
url = IBM_CLOUD_URL + "/instances"
params = {
"version": IBM_CLOUD_VERSION,
"generation": IBM_CLOUD_GENERATION,
"limit": 100
}
while url:
resp = SESS.get(url, params=params)
body = resp.json()
for instance in body["instances"]:
interface_url = instance["primary_network_interface"]["href"]
resp = SESS.get(interface_url, params=params)
instance["primary_network_interface"] = resp.json()
yield instance
url = body.get("next")
def load_ci_agent(ci_agents, instance):
if instance["status"] != "running":
return
name = instance["name"]
net_iface = instance["primary_network_interface"]
floating_ips = net_iface.get("floating_ips", [])
if not floating_ips:
return
ip_addr = floating_ips[0]["address"]
ci_agents[ip_addr] = {
"instance": {
"id": instance["id"],
"name": instance["name"],
"created_at": instance["created_at"],
"profile": instance["profile"]["name"],
"vpc": instance["vpc"]["name"],
"zone": instance["zone"]["name"],
"subnet": net_iface["subnet"]["name"]
},
"ip_addrs": {
"public": ip_addr,
"private": net_iface["primary_ipv4_address"]
},
"boot_volume": {
"device": instance["boot_volume_attachment"]["device"]["id"],
"name": instance["boot_volume_attachment"]["volume"]["name"]
},
"system": {
"arch": instance["vcpu"]["architecture"],
"num_cpus": instance["vcpu"]["count"],
"ram": instance["memory"]
}
}
def main():
init()
ci_agents = {}
for instance in list_instances():
if instance["name"].startswith("couchdb-ci-worker"):
load_ci_agent(ci_agents, instance)
inventory = {"all": {
"children": {
"ci_agents": {
"hosts": ci_agents
}
}
}}
print yaml.dump(tostr(inventory), default_flow_style=False)
if __name__ == "__main__":
main()