168 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| from kubernetes import client
 | |
| from odoo.addons.smile_log.tools import SmileDBLogger
 | |
| from odoo.exceptions import UserError, ValidationError
 | |
| import logging
 | |
| _logger = logging.getLogger(__name__)
 | |
| 
 | |
| 
 | |
| def create_deployment(meta_data, specs, namespace="default", self=False):
 | |
|     # Deployment
 | |
|     _logger = SmileDBLogger(self._cr.dbname, self._name, self.id, self._uid)
 | |
| 
 | |
|     deployment = client.V1Deployment(
 | |
|         api_version="apps/v1",
 | |
|         kind="Deployment",
 | |
|         metadata=meta_data,
 | |
|         spec=specs)
 | |
|     k8s_apps_v1 = client.AppsV1Api()
 | |
|     try:
 | |
|         resp = k8s_apps_v1.create_namespaced_deployment(
 | |
|             body=deployment, namespace=namespace)
 | |
|         _logger.info("Deployment created. name='%s'" % resp.metadata.name)
 | |
|     except client.exceptions.ApiException as e:
 | |
|         _logger.error(str(e))
 | |
| 
 | |
| 
 | |
| def create_docker_repo_secret(app_name, namespace="default", self=False):
 | |
|     _logger = SmileDBLogger(self._cr.dbname, self._name, self.id, self._uid)
 | |
|     k8s_apps_v1 = client.CoreV1Api()
 | |
|     secret = client.V1Secret(
 | |
|         metadata=client.V1ObjectMeta(
 | |
|             name=app_name+'-dkr-registry-key',
 | |
|             labels={
 | |
|                 "app": app_name,
 | |
|                 "tier": "backend"
 | |
|             }
 | |
|         ),
 | |
|         data={
 | |
|             '.dockerconfigjson': self.docker_image.b64_dkr_config
 | |
|         },
 | |
|         type='kubernetes.io/dockerconfigjson',
 | |
|     )
 | |
|     try:
 | |
|         resp = k8s_apps_v1.create_namespaced_secret(
 | |
|             body=secret, namespace=namespace)
 | |
|         _logger.info("Secret created. name='%s'" % resp.metadata.name)
 | |
|         return True
 | |
|     except client.exceptions.ApiException as e:
 | |
|         _logger.error(str(e))
 | |
|     return False
 | |
| 
 | |
| 
 | |
| def delete_docker_repo_secret(app_name, namespace="default", self=False):
 | |
|     _logger = SmileDBLogger(self._cr.dbname, self._name, self.id, self._uid)
 | |
|     k8s_apps_v1 = client.CoreV1Api()
 | |
|     try:
 | |
|         resp = k8s_apps_v1.delete_namespaced_secret(app_name+'-dkr-registry-key', namespace=namespace)
 | |
|         _logger.info(str(resp))
 | |
|         return True
 | |
|     except client.exceptions.ApiException as e:
 | |
|         _logger.error(str(e))
 | |
|     return False
 | |
| 
 | |
| 
 | |
| def create_odoo_deployment(app_name, namespace="default", self=False):
 | |
|     image = 'odoo:15.0'
 | |
|     res_limits = {'ephemeral-storage': '1Gi'}
 | |
| 
 | |
|     image_pull_secrets = []
 | |
|     if self.is_custom_image and self.docker_image:
 | |
|         image = "{0}:{1}".format(self.docker_image.name, self.docker_image.tag)
 | |
|         if self.docker_image.is_pvt_dkr_repo and self.docker_image.b64_dkr_config:
 | |
|             if create_docker_repo_secret(app_name, namespace, self):
 | |
|                 sec_name = app_name+"-dkr-registry-key"
 | |
|                 image_pull_secrets.append(client.V1LocalObjectReference(name=sec_name))
 | |
| 
 | |
|     meta_data = client.V1ObjectMeta(name=app_name + "-odoo-deployment",
 | |
|                                     labels={"app": app_name})
 | |
|     args_odoo = ['--database=' + self.sub_domain_name]
 | |
|     # args_odoo = []
 | |
| 
 | |
|     if self.demo_data:
 | |
|         args_odoo.append('--without-demo=False')
 | |
|     else:
 | |
|         args_odoo.append('--without-demo=True')
 | |
| 
 | |
|     if self.module_ids:
 | |
|         module_names = ''
 | |
|         for module in self.module_ids:
 | |
|             module_names = module_names + module.name + ','
 | |
|         args_odoo.append("--init={0}".format(module_names))
 | |
| 
 | |
|     if self.db_server_id:
 | |
|         _logger.critical('Cant deploy app, PG username or password cant find')
 | |
|         UserError("Cant deploy app, PG username or password cant find")
 | |
| 
 | |
|     limits = client.V1ResourceRequirements(limits=res_limits)
 | |
| 
 | |
|     tolerations = []
 | |
|     node_selector = {}
 | |
|     if self and self.is_dedicated_node and self.node_id:
 | |
|         # tolerations = [client.V1Toleration(effect='NoSchedule', key=self.node_key, value=self.node_value, operator='Equal')]
 | |
|         # specific for aws clusters
 | |
|         node_selector['kubernetes.io/hostname'] = self.node_id.name
 | |
| 
 | |
|     odoo_container = client.V1Container(
 | |
|         name="odoo",
 | |
|         image=image,
 | |
|         env=[
 | |
|             client.V1EnvVar(name="HOST", value=self.db_server_id.server_url),
 | |
|             client.V1EnvVar(name="USER", value=self.db_server_id.master_username),
 | |
|             client.V1EnvVar(name="PASSWORD", value=self.db_server_id.master_pass),
 | |
|             client.V1EnvVar(name="PORT", value=self.db_server_id.server_port),
 | |
|             client.V1EnvVar(name="ODOO_HTTP_SOCKET_TIMEOUT", value="100"),
 | |
|              ],
 | |
|         ports=[client.V1ContainerPort(container_port=8069, name="odoo-port"),
 | |
|                client.V1ContainerPort(container_port=8072, name="longpolling")],
 | |
|         args=args_odoo,
 | |
|         image_pull_policy='Always',
 | |
|         # command=['chown', '-R', '101:101', '/mnt/extra-addons'],
 | |
|         resources=limits,
 | |
|         # comment following line, if you want to run as odoo user
 | |
|         # security_context=client.V1SecurityContext(run_as_user=0, run_as_group=0),
 | |
|         volume_mounts=[client.V1VolumeMount(name=app_name + "-odoo-web-pv-storage", mount_path="/var/lib/odoo/")]
 | |
|     )
 | |
|     # pod Volume Claim
 | |
|     volume_claim = client.V1PersistentVolumeClaimVolumeSource(claim_name=app_name + "-odoo-web-pv-claim")
 | |
|     # pod volume
 | |
|     volume = client.V1Volume(name=app_name + "-odoo-web-pv-storage", persistent_volume_claim=volume_claim)
 | |
|     # Strategy
 | |
|     strategy = client.V1DeploymentStrategy(type="Recreate")
 | |
|     # Template
 | |
|     # for  running as a odoo user changes instead of stash
 | |
|     spec = client.V1PodSpec(containers=[odoo_container], volumes=[volume], image_pull_secrets=image_pull_secrets,
 | |
|                             security_context=client.V1PodSecurityContext(run_as_group=101, run_as_user=101,
 | |
|                                                                          fs_group=101, fs_group_change_policy='Always'),
 | |
|                             node_selector=node_selector)
 | |
| 
 | |
|     template = client.V1PodTemplateSpec(
 | |
|         metadata=client.V1ObjectMeta(labels={"app": app_name, "tier": "backend"}),
 | |
|         spec=spec
 | |
|     )
 | |
|     selector = client.V1LabelSelector(match_labels={"app": app_name, "tier": "backend"})
 | |
| 
 | |
|     # Spec
 | |
|     specs = client.V1DeploymentSpec(
 | |
|         replicas=1,
 | |
|         strategy=strategy,
 | |
|         selector=selector,
 | |
|         template=template,
 | |
|     )
 | |
|     create_deployment(meta_data, specs, namespace, self=self)
 | |
| 
 | |
| 
 | |
| def delete_odoo_deployment(app_name, namespace="default", self=False):
 | |
|     _logger = SmileDBLogger(self._cr.dbname, self._name, self.id, self._uid)
 | |
|     dep_name = app_name + "-odoo-deployment"
 | |
|     core_v1_api = client.AppsV1Api()
 | |
| 
 | |
|     try:
 | |
|         deployment = core_v1_api.delete_namespaced_deployment(name=dep_name, namespace=namespace)
 | |
|         if self.is_custom_image and self.docker_image:
 | |
|             if self.docker_image.is_pvt_dkr_repo and self.docker_image.b64_dkr_config:
 | |
|                 delete_docker_repo_secret(app_name, namespace, self)
 | |
|         _logger.info(str(deployment))
 | |
| 
 | |
|     except client.exceptions.ApiException as e:
 | |
|         _logger.error(str(e))
 |