nuvolaris/user_handlers.py (129 lines of code) (raw):

# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # # Provides extra kopf handlers to manage nuvolaris users import logging from datetime import datetime import kopf import nuvolaris.config as cfg import nuvolaris.couchdb as cdb import nuvolaris.endpoint as endpoint import nuvolaris.ferretdb as mdb import nuvolaris.kube as kube import nuvolaris.milvus_standalone as milvus import nuvolaris.minio_deploy as minio_deploy import nuvolaris.postgres_operator as postgres import nuvolaris.redis as redis import nuvolaris.storage_static as static import nuvolaris.user_patcher as user_patcher import nuvolaris.userdb_util as userdb from nuvolaris.quota_checker import REDIS_DB_QUOTA_ANNOTATION from nuvolaris.user_config import UserConfig from nuvolaris.user_metadata import UserMetadata def get_ucfg(spec): ucfg = UserConfig(spec) ucfg.dump_config() return ucfg @kopf.on.create('nuvolaris.org', 'v1', 'whisksusers') def whisk_user_create(spec, name, patch, **kwargs): logging.info(f"*** whisk_user_create {name}") conditions = [] state = { } conditions.append({ "lastTransitionTime": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "status": "True", "type": "Initialized"}) ucfg = get_ucfg(spec) user_metadata = UserMetadata(ucfg) owner = kube.get(f"wsku/{name}") if(ucfg.get("namespace") and ucfg.get("auth")): res = cdb.create_ow_user(ucfg,user_metadata) logging.info(f"OpenWhisk subject {ucfg.get('namespace')} added = {res}") state['couchdb']= res res = endpoint.create_ow_api_endpoint(ucfg,user_metadata) logging.info(f"OpenWhisk api endpoints {ucfg.get('namespace')} added = {res}") state['api']= res if(cfg.get('components.minio') and (ucfg.get('object-storage.data.enabled') or ucfg.get('object-storage.route.enabled'))): minio_deploy.create_ow_storage(state, ucfg, user_metadata, owner) if(cfg.get('components.minio') and ucfg.get('object-storage.route.enabled') and cfg.get('components.static')): res = static.create_ow_static_endpoint(ucfg,user_metadata, owner) logging.info("OpenWhisk static endpoint for %s added = %s", ucfg.get('namespace'), res) state['static']= res if(cfg.get('components.mongodb') and ucfg.get('mongodb.enabled')): res = mdb.create_db_user(ucfg,user_metadata) logging.info(f"Mongodb setup for {ucfg.get('namespace')} added = {res}") state['mongodb']= res if(cfg.get('components.redis') and ucfg.get('redis.enabled')): res = redis.create_db_user(ucfg, user_metadata) logging.info(f"Redis setup for {ucfg.get('namespace')} added = {res}") state['redis']= res if(cfg.get('components.postgres') and ucfg.get('postgres.enabled')): res = postgres.create_db_user(ucfg, user_metadata) logging.info(f"Postgres setup for {ucfg.get('namespace')} added = {res}") state['postgres']= res if(cfg.get('components.milvus') and ucfg.get('milvus.enabled')): res = milvus.create_ow_milvus(ucfg, user_metadata) logging.info(f"Milvus setup for {ucfg.get('namespace')} added = {res}") state['milvus']= res # finally persists user metadata into the internal couchdb database user_metadata.dump() res = userdb.save_user_metadata(user_metadata) state['user_metadata']= res conditions.append({ "lastTransitionTime": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "status": "True", "type": "Ready"}) patch.status['conditions']=conditions return state @kopf.on.delete('nuvolaris.org', 'v1', 'whisksusers') def whisk_user_delete(spec, name, **kwargs): logging.info(f"*** whisk_user_delete {name}") ucfg = get_ucfg(spec) if(ucfg.get("namespace")): res = endpoint.delete_ow_api_endpoint(ucfg) logging.info(f"OpenWhisk subject {ucfg.get('namespace')} api removed = {res}") res = cdb.delete_ow_user(ucfg.get("namespace")) logging.info(f"OpenWhisk subject {ucfg.get('namespace')} removed = {res}") if(cfg.get('components.minio') and (ucfg.get('object-storage.data.enabled') or ucfg.get('object-storage.route.enabled'))): res = minio_deploy.delete_ow_storage(ucfg) logging.info(f"OpenWhisk namespace {ucfg.get('namespace')} MINIO storage removed = {res}") if(cfg.get('components.minio') and ucfg.get('object-storage.route.enabled') and cfg.get('components.static')): res = static.delete_ow_static_endpoint(ucfg) logging.info(f"OpenWhisk static endpoint for {ucfg.get('namespace')} removed = {res}") if(cfg.get('components.mongodb') and ucfg.get('mongodb.enabled')): res = mdb.delete_db_user(ucfg.get('namespace'),ucfg.get('mongodb.database')) logging.info(f"Mongodb setup for {ucfg.get('namespace')} removed = {res}") if(cfg.get('components.redis') and ucfg.get('redis.enabled')): res = redis.delete_db_user(ucfg.get('namespace')) logging.info(f"Redis setup for {ucfg.get('namespace')} removed = {res}") if(cfg.get('components.postgres') and ucfg.get('postgres.enabled')): res = postgres.delete_db_user(ucfg.get('namespace'),ucfg.get('postgres.database')) logging.info(f"Postgres setup for {ucfg.get('namespace')} removed = {res}") if(cfg.get('components.milvus') and ucfg.get('milvus.enabled')): res = milvus.delete_ow_milvus(ucfg) logging.info(f"Milvus setup for {ucfg.get('namespace')} removed = {res}") res = userdb.delete_user_metadata(ucfg.get('namespace')) @kopf.on.update('nuvolaris.org', 'v1', 'whisksusers') def whisk_user_update(spec, status, namespace, diff, name, **kwargs): logging.info(f"*** detected an update of wsku/{name} under namespace {namespace}") owner = kube.get(f"wsku/{name}") ucfg = get_ucfg(spec) user_metadata = UserMetadata(ucfg) user_patcher.patch(ucfg,user_metadata,diff, status, owner, name) @kopf.on.resume('nuvolaris.org', 'v1', 'whisksusers') def whisk_user_resume(spec, name, namespace,annotations, **kwargs): logging.info(f"*** detected an update of wsku/{name} under namespace {namespace}") ucfg = get_ucfg(spec) user_metadata = UserMetadata(ucfg) state = {} if(cfg.get('components.redis') and ucfg.get('redis.enabled')): read_only_mode = False if annotations and REDIS_DB_QUOTA_ANNOTATION in annotations: read_only_mode = annotations[REDIS_DB_QUOTA_ANNOTATION] in ["true"] res = redis.create_db_user(ucfg,user_metadata,read_only_mode) logging.info(f"Redis setup for {ucfg.get('namespace')} resumed = {res}") state['redis']= res if(cfg.get('components.minio') and ucfg.get('object-storage.route.enabled') and cfg.get('components.static')): state['static']= True if(cfg.get('components.mongodb') and ucfg.get('mongodb.enabled')): state['mongodb']= True if(cfg.get('components.milvus') and ucfg.get('milvus.enabled')): state['milvus']= True if(cfg.get('components.postgres') and ucfg.get('postgres.enabled')): state['postgres']= True