@Override
    protected void doExecute(WorkflowContext context) throws HyscaleException {
        if (context == null || context.isFailed()) {
            return;
        }
        DeploymentContext deploymentContext = deploymentContextBuilder.build(context);

        ServiceSpec serviceSpec = context.getServiceSpec();
        if (serviceSpec == null) {
            context.setFailed(true);
            logger.error("Service Spec is required for deployment");
            throw new HyscaleException(ServiceSpecErrorCodes.SERVICE_SPEC_REQUIRED);
        }

        List<Manifest> mainfestList = deploymentContext.getManifests();
        if (mainfestList == null || mainfestList.isEmpty()) {
            context.setFailed(true);
            logger.error("Manifest is required for deployment");
            throw new HyscaleException(ControllerErrorCodes.MANIFEST_REQUIRED);
        }

        String serviceName = deploymentContext.getServiceName();

        /*
         * Deploys and waits for the deployment completion
         */

        try {
            deployer.deploy(deploymentContext);
            deployer.waitForDeployment(deploymentContext);

        } catch (HyscaleException e) {
            logger.error("Deployment failed with error: {}, running troubleshoot", e.toString());
            String troubleshootMessage = TroubleshootUtil.getTroubleshootMessage(troubleshoot(deploymentContext));
            context.addAttribute(WorkflowConstants.TROUBLESHOOT_MESSAGE, troubleshootMessage);
            throw e;
        } finally {
            writeDeployLogs(context, deploymentContext);
        }
        context.addAttribute(WorkflowConstants.OUTPUT, true);

        boolean external = BooleanUtils.toBoolean(serviceSpec.get(HyscaleSpecFields.external, Boolean.class));
        logger.debug("Checking whether service {} is external {}", serviceName, external);
        if (external) {
            TypeReference<List<Port>> typeReference = new TypeReference<List<Port>>() {
            };
            List<Port> servicePorts = serviceSpec.get(HyscaleSpecFields.ports, typeReference);
            if (servicePorts != null) {
                try {
                    ServiceAddress serviceAddress = deployer.getServiceAddress(deploymentContext);
                    if (serviceAddress != null) {
                        context.addAttribute(WorkflowConstants.SERVICE_IP, serviceAddress.toString());
                        context.addAttribute(WorkflowConstants.SERVICE_URL, serviceAddress.getServiceURL());
                    }
                } catch (HyscaleException e) {
                    logger.error("Error while getting service IP address {}, running troubleshoot", e.getMessage());
                    String troubleshootMessage = TroubleshootUtil.getTroubleshootMessage(troubleshoot(deploymentContext));
                    context.addAttribute(WorkflowConstants.TROUBLESHOOT_MESSAGE, troubleshootMessage);
                    throw e;
                }
            }
        }
    }
Deploys the service to the kubernetes cluster
<p>
1. Deploying the service to the cluster
2. Wait for deployment completion
3. Get service address from the cluster if externalized
workflow-controller/controller-service/src/main/java/io/hyscale/controller/invoker/DeployComponentInvoker.java