126 lines
4.9 KiB
Python
Executable File
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...!')
|