odoo-saas-kubernetes/kk_odoo_saas/models/k8s_config.py

126 lines
4.9 KiB
Python
Executable File

import psycopg2
from odoo import models, fields, api
from kubernetes import config, client
from odoo.exceptions import UserError
import yaml
import logging
_logger = logging.getLogger(__name__)
class SaaSAppK8sConfig(models.Model):
_name = 'kk_odoo_saas.k8s.config'
_description = 'Kubernetes Cluster Configuration'
name = fields.Char()
config_file = fields.Text('Yaml Configuration File')
cluster_name = fields.Char('')
namespaces = fields.Text('Namespaces in Cluster')
domain_name = fields.Char('Domain Name')
def check_connectivity(self):
if self.config_file:
try:
data2 = yaml.safe_load(self.config_file)
config.load_kube_config_from_dict(data2)
v1 = client.CoreV1Api()
response = v1.list_namespace()
nss = []
for namespace in response.items:
nss.append(namespace.metadata.name)
nl = '\n'
self.namespaces = nl.join(nss)
except config.config_exception.ConfigException as e:
raise UserError("Unable to Connect K8s Cluster")
else:
raise UserError("Please Add config file")
def validate_domain_name(self):
if self.domain_name:
pass
def get_default_config(self):
for conf in self.search([], limit=1):
return conf
def update_cluster_nodes(self):
if self.config_file:
try:
data2 = yaml.safe_load(self.config_file)
config.load_kube_config_from_dict(data2)
v1 = client.CoreV1Api()
response = v1.list_node()
node_env = self.env['kk_odoo_saas.k8s.node']
if response:
node_env.search([]).unlink()
for node in response.items:
node_env.create({'name': node.metadata.name, 'labels': str(node.metadata.labels), 'annotations': str(node.metadata.annotations), 'taints': str(node.spec.taints), 'yaml_info': str(node)})
except config.config_exception.ConfigException as e:
_logger.error(e)
raise UserError("Unable to Connect K8s Cluster")
else:
raise UserError("Please Add config file")
class DockerImages(models.Model):
_name = 'kk_odoo_saas.k8s.docker.images'
name = fields.Char('Image Name', required=True)
tag = fields.Char('Tag Name', required=True, default='latest')
description = fields.Char('Description')
is_pvt_dkr_repo = fields.Boolean('Using Private Docker Repository')
b64_dkr_config = fields.Text('base64 docker config json file')
repo_link = fields.Char('Related Repository')
base_version = fields.Selection([('14.0', '14.0'), ('15.0', '15.0'), ('16.0', '16.0')], required=True)
# base_version is for pulling git code in folder e.g /var/lib/odoo/addons/14.0 etc.
@api.depends('name', 'tag')
def name_get(self):
res = []
for record in self:
name = record.name
if record.tag:
name = name + ':' + record.tag
res.append((record.id, name))
return res
class Node(models.Model):
_name = 'kk_odoo_saas.k8s.node'
name = fields.Char('Node Name')
labels = fields.Text('Labels')
annotations = fields.Text()
taints = fields.Text()
yaml_info = fields.Text("Yaml Description")
class MasterDbCreds(models.Model):
_name = 'kk_odoo_saas.k8s.master_db_creds'
name = fields.Char('DB Server Name')
master_username = fields.Char('Master Username', default='postgres', required=True)
master_pass = fields.Char('Master Password', required=True)
server_url = fields.Char('Server URL', required=True)
server_port = fields.Char('Server Port', default='5432', required=True)
status = fields.Selection([('connected', 'Connected'), ('not_connected', 'Not Connected')], default='not_connected')
def check_connectivity(self):
for rec in self:
if rec.master_username and rec.master_pass and rec.server_url:
try:
conn = psycopg2.connect(database='postgres',
user=rec.master_username,
password=rec.master_pass,
host=rec.server_url,
port=rec.server_port or 5432)
if conn:
_logger.info("Connected to PG DB server")
self.status = 'connected'
return conn
except Exception as e:
_logger.exception(e)
self.status = 'not_connected'
raise UserError('Unable to Connect Postgres.\nPlease Check Postgres Credentials...!')
else:
self.status = 'not_connected'
raise UserError('Please Enter Postgres Credentials...!')