def start_application_kubernetes(self, deployment: dict): deployment_id = Deployment.id(deployment) connector = initialize_connector(kubernetes_cli_connector, self.job, deployment) module_content = Deployment.module_content(deployment) deployment_owner = Deployment.owner(deployment) docker_compose = module_content['docker-compose'] registries_auth = self.private_registries_auth(deployment) result, services = connector.start( docker_compose=docker_compose, stack_name=Deployment.uuid(deployment), env=get_env(deployment), files=module_content.get('files'), registries_auth=registries_auth) self.job.set_status_message(result) self.create_deployment_parameter( deployment_id=deployment_id, user_id=deployment_owner, param_name=DeploymentParameter.HOSTNAME['name'], param_value=self.get_hostname(), param_description=DeploymentParameter.HOSTNAME['description']) application_params_update(self.api_dpl, deployment, services)
def create_user_output_params(self, deployment): module_content = Deployment.module_content(deployment) for output_param in module_content.get('output-parameters', []): self.create_deployment_parameter( deployment_id=Deployment.id(deployment), user_id=Deployment.owner(deployment), param_name=output_param['name'], param_description=output_param.get('description'))
def push_state(deployment): try: if Deployment.is_component(nuvla_deployment): ds.get_component_state(nuvla_deployment) elif Deployment.is_application(nuvla_deployment): ds.get_application_state(nuvla_deployment) elif Deployment.is_application_kubernetes(nuvla_deployment): ds.get_application_kubernetes_state(nuvla_deployment) except Exception as ex: logging.exception('Failed to get deployment state for {}: {}'.format(Deployment.id(deployment), ex)) pass
def application_params_update(api_dpl, deployment, services): if services: for service in services: node_id = service['node-id'] for key, value in service.items(): api_dpl.set_parameter_create_if_needed( Deployment.id(deployment), Deployment.owner(deployment), f'{node_id}.{key}', param_value=value, node_id=node_id)
def stop_component(self): deployment_id = Deployment.id(self.deployment) connector = initialize_connector(docker_connector, self.job, self.deployment) filter_params = 'parent="{}" and name="service-id"'.format( deployment_id) deployment_params = self.api.search( 'deployment-parameter', filter=filter_params, select='node-id,name,value').resources if len(deployment_params) > 0: service_id = deployment_params[0].data.get('value') if service_id is not None: connector.stop(service_id=service_id) else: self.job.set_status_message( "Deployment parameter {} doesn't have a value!".format( deployment_params[0].data.get('id'))) else: self.job.set_status_message( 'No deployment parameters with service ID found!')
def get_component_state(self): connector = initialize_connector(docker_connector, self.job, self.deployment) did = Deployment.id(self.deployment) # FIXME: at the moment deployment UUID is the service name. sname = self.api_dpl.uuid(self.deployment) desired = connector.service_replicas_desired(sname) tasks = sorted(connector.service_tasks(filters={'service': sname}), key=lambda x: x['CreatedAt'], reverse=True) if len(tasks) > 0: current_task = tasks[0] current_desired = current_task.get('DesiredState') current_state = None current_error = None current_status = current_task.get('Status') if current_status is not None: current_state = current_status.get('State') current_error = current_status.get('Err', "no error") if current_desired is not None: self.api_dpl.set_parameter_ignoring_errors( did, sname, DeploymentParameter.CURRENT_DESIRED['name'], current_desired) if current_state is not None: self.api_dpl.set_parameter_ignoring_errors( did, sname, DeploymentParameter.CURRENT_STATE['name'], current_state) if current_error is not None: self.api_dpl.set_parameter_ignoring_errors( did, sname, DeploymentParameter.CURRENT_ERROR['name'], current_error) t_running = list(filter(lambda x: x['DesiredState'] == 'running' and x['Status']['State'] == 'running', tasks)) t_failed = list(filter(lambda x: x['DesiredState'] == 'shutdown' and x['Status']['State'] == 'failed', tasks)) t_rejected = list(filter(lambda x: x['DesiredState'] == 'shutdown' and x['Status']['State'] == 'rejected', tasks)) self.api_dpl.set_parameter(did, sname, DeploymentParameter.CHECK_TIMESTAMP['name'], utcnow()) self.api_dpl.set_parameter(did, sname, DeploymentParameter.REPLICAS_DESIRED['name'], str(desired)) self.api_dpl.set_parameter(did, sname, DeploymentParameter.REPLICAS_RUNNING['name'], str(len(t_running))) if len(t_failed) > 0: self.api_dpl.set_parameter(did, sname, DeploymentParameter.RESTART_NUMBER['name'], str(len(t_failed))) self.api_dpl.set_parameter(did, sname, DeploymentParameter.RESTART_TIMESTAMP['name'], t_failed[0].get('CreatedAt', '')) self.api_dpl.set_parameter(did, sname, DeploymentParameter.RESTART_ERR_MSG['name'], t_failed[0].get('Status', {}).get('Err', '')) exit_code = str( t_failed[0].get('Status', {}).get('ContainerStatus', {}).get('ExitCode', '')) self.api_dpl.set_parameter(did, sname, DeploymentParameter.RESTART_EXIT_CODE['name'], exit_code) elif len(t_rejected) > 0: self.api_dpl.set_parameter(did, sname, DeploymentParameter.RESTART_NUMBER['name'], str(len(t_rejected))) self.api_dpl.set_parameter(did, sname, DeploymentParameter.RESTART_TIMESTAMP['name'], t_rejected[0].get('CreatedAt', '')) self.api_dpl.set_parameter(did, sname, DeploymentParameter.RESTART_ERR_MSG['name'], t_rejected[0].get('Status', {}).get('Err', '')) # update any port mappings that are available services = connector.list(filters={"name": sname}) if services: ports_mapping = connector.extract_vm_ports_mapping(services[0]) self.api_dpl.update_port_parameters(self.deployment, ports_mapping)
def start_component(self, deployment: dict): connector = initialize_connector(docker_connector, self.job, deployment) deployment_id = Deployment.id(deployment) node_instance_name = Deployment.uuid(deployment) deployment_owner = Deployment.owner(deployment) module_content = Deployment.module_content(deployment) restart_policy = module_content.get('restart-policy', {}) # create deployment parameters (with empty values) for all port mappings module_ports = module_content.get('ports') for port in (module_ports or []): target_port = port.get('target-port') protocol = port.get('protocol', 'tcp') if target_port is not None: self.create_deployment_parameter( deployment_id=deployment_id, user_id=deployment_owner, param_name="{}.{}".format(protocol, str(target_port)), param_description="mapping for {} port {}".format( protocol, str(target_port)), node_id=node_instance_name) registries_auth = self.private_registries_auth(deployment) _, service = connector.start( service_name=node_instance_name, image=module_content['image'], env=get_env(deployment), mounts_opt=module_content.get('mounts'), ports_opt=module_ports, cpu_ratio=module_content.get('cpus'), memory=module_content.get('memory'), restart_policy_condition=restart_policy.get('condition'), restart_policy_delay=restart_policy.get('delay'), restart_policy_max_attempts=restart_policy.get('max-attempts'), restart_policy_window=restart_policy.get('window'), registry_auth=registries_auth[0] if registries_auth else None) # FIXME: get number of desired replicas of Replicated service from deployment. 1 for now. desired = 1 deployment_parameters = ( (DeploymentParameter.SERVICE_ID, connector.extract_vm_id(service)), (DeploymentParameter.HOSTNAME, self.get_hostname()), (DeploymentParameter.REPLICAS_DESIRED, str(desired)), (DeploymentParameter.REPLICAS_RUNNING, '0'), (DeploymentParameter.CURRENT_DESIRED, ''), (DeploymentParameter.CURRENT_STATE, ''), (DeploymentParameter.CURRENT_ERROR, ''), (DeploymentParameter.RESTART_EXIT_CODE, ''), (DeploymentParameter.RESTART_ERR_MSG, ''), (DeploymentParameter.RESTART_TIMESTAMP, ''), (DeploymentParameter.RESTART_NUMBER, ''), (DeploymentParameter.CHECK_TIMESTAMP, ''), ) for deployment_parameter, value in deployment_parameters: self.create_deployment_parameter( param_name=deployment_parameter['name'], param_value=value, param_description=deployment_parameter['description'], deployment_id=deployment_id, node_id=node_instance_name, user_id=deployment_owner) # immediately update any port mappings that are already available ports_mapping = connector.extract_vm_ports_mapping(service) self.api_dpl.update_port_parameters(deployment, ports_mapping)