def get(group, version, kind, namespace, resource): db = get_db() table = db.table('resources') record = table.get(gvk_query(group, version, kind, namespace, resource)) if record: return record['definition'] return None
def get(group, version): db = get_db() table = db.table('apis') result = table.get(gv_query(group, version)) if result: return result['definition'] result = get_crd_api(group, version) return result
def create(group, version, kind, namespace, resource, definition): definition['metadata']['resourceVersion'] = str(next_resource_version()) definition['metadata']['creationTimestamp'] = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") definition['metadata']['uid'] = str(uuid.uuid4()) params = dict(group=group, version=version, kind=kind, resource=resource, definition=definition) if namespace: params['namespace'] = namespace db = get_db() table = db.table('resources') table.insert(params) return definition
def listapis(): db = get_db() table = db.table('apis') query = Query() group_versions = table.search(query) result = dict() for item in group_versions: if item['group'] not in result: result[item['group']] = list() result[item['group']].append(item['version']) result.update(list_crd_apis()) return result
def replace(group, version, kind, namespace, resource, definition): before = get(group, version, kind, namespace, resource) before['metadata'].update(definition['metadata']) if before != definition: definition['metadata']['resourceVersion'] = str(next_resource_version()) params = dict(group=group, version=version, kind=kind, resource=resource, definition=definition) if namespace: params['namespace'] = namespace db = get_db() table = db.table('resources') table.update(params, gvk_query(group, version, kind, namespace, resource)) return definition
def delete(group, version, kind, namespace, resource): before = get(group, version, kind, namespace, resource) db = get_db() table = db.table('resources') table.remove(gvk_query(group, version, kind, namespace, resource)) # before['status']['phase'] = 'Terminating' if kind == 'namespaces': query = Query() cascade = table.search(query.namespace == namespace) for item in cascade: # we could delete directly here but delete will later modify # the watch record delete(cascade['group'], cascade['version'], "%ss" % cascade['kind'].lower(), namespace, cascade['resource']) return before
def list_crd_apis(): db = get_db() query = Query() table = db.table('resources') crds = table.search((query.group == 'apiextensions.k8s.io') & (query.kind == 'customresourcedefinitions')) result = dict() for crd in crds: spec = crd['definition']['spec'] if spec['group'] not in result: result[spec['group']] = list() if spec['version'] not in result[spec['group']]: result[spec['group']].append(spec['version']) return result
def get(group, version, kind, namespace, link, label_selectors): db = get_db() table = db.table('resources') results = [ item['definition'] for item in table.search( gvk_query(group, version, kind, namespace, label_selectors)) ] return { "kind": "%sList" % kind.capitalize()[:-1], "apiVersion": "v1", "metadata": { "selfLink": link, "resourceVersion": str(next_resource_version()) }, "items": results }
def get_crd_api(group, version): db = get_db() query = Query() table = db.table('resources') crds = table.search((query.group == 'apiextensions.k8s.io') & (query.kind == 'customresourcedefinitions') & (query.definition.spec.group == group) & (query.definition.spec.version == version)) if not crds: return None return { "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "%s/%s" % (group, version), "resources": [crd_to_resource(crd['definition']) for crd in crds] }
def upsert(group, version, definition): db = get_db() table = db.table('apis') table.upsert(dict(group=group, version=version, definition=definition), gv_query(group, version)) return definition