def get_varnish_status(self, request, env_name, deploy_stage): if deploy_stage == NgappDeployStep.PRE_DEPLOY: page = 'ngapp2/ngapp2_pre_deploy.html' status_file = settings.NGAPP_PRE_DEPLOY_STATUS_NODE elif deploy_stage == NgappDeployStep.POST_DEPLOY: page = 'ngapp2/ngapp2_post_deploy.html' status_file = settings.NGAPP_POST_DEPLOY_STATUS_NODE else: page = 'ngapp2/ngapp2_rollback.html' status_file = settings.NGAPP_ROLLBACK_STATUS_NODE recorder = Recorder(status_file) state, total, correct = recorder.read_varish_info() total = int(total) correct = int(correct) progress = correct * 100 / total if deploy_stage in self.ENDING_STATE and state == "DONE": Ngapp2DeployUtils().set_status_to_zk("SERVING_BUILD") return state, render( request, page, { "current_status": state, "correct_node": correct, "total_node": total, "progress": progress, "env_name": env_name })
def post(self, request): try: params = request.POST action = params.get("action", "deploy") stage = params.get("current_stage") ngapp2_deploy_utils = Ngapp2DeployUtils() if action == "cancel": if stage == "deploy_to_canary": ngapp2_deploy_utils.rollback_canary() elif stage == "deploy_to_prod": ngapp2_deploy_utils.rollback_prod() ngapp2_deploy_utils.set_status_to_zk("SERVING_BUILD") else: if stage == 'pre_deploy': self.start_pre_deploy(request) elif stage == 'post_deploy': self.start_post_deploy(request) elif stage == 'rollback': self.start_roll_back() ngapp2_deploy_utils.set_status_to_zk(stage) except: logger.error(traceback.format_exc()) logger.warning(traceback.format_exc()) finally: return redirect("/ngapp2/deploy/")
def update_env_priority(request, env_name): try: if env_name == NGAPP_A: curr_env = NGAPP_A prev_env = NGAPP_B else: curr_env = NGAPP_B prev_env = NGAPP_A # we only update env priority once if Ngapp2DeployUtils().get_finish_message_flag("prod") != "True": return curr_data = {"priority": "HIGH"} prev_data = {"priority": "NORMAL"} environs_helper.update_env_basic_config(request, curr_env, "prod", data=curr_data) environs_helper.update_env_basic_config(request, prev_env, "prod", data=prev_data) except: logger.error("Failed change ngapp2 deploy priority") # send message to the auto scaling channel message = "Failed to switch ngapp2 deploy priority after deploy. This may lead to health check failure. Please take actions." systems_helper.send_chat_message(request, "system", "autoscaling", message)
def deploy_to_canary(request, name): params = request.POST build = params.get('commit7', None) ngapp2_deploy_utils = Ngapp2DeployUtils() ngapp2_deploy_utils.deploy_to_canary(build) common.deploy(request, name, "canary") user = request.teletraan_user_id sendStartMessage(request, user, name, "canary", notifyAuthor=True) return redirect("/ngapp2/deploy/")
def promote_to_prod(request, deploy_id, build): params = request.POST description = params.get("description", None) ngapp2_deploy_utils = Ngapp2DeployUtils() ngapp2_deploy_utils.deploy_to_prod(build) user = request.teletraan_user_id env_name = ngapp2_deploy_utils.get_deploying_env_from_zk() deploys_helper.promote(request, env_name, "prod", deploy_id, description) sendStartMessage(request, user, env_name, "prod", notifyAuthor=False) return redirect("/ngapp2/deploy/")
def get(self, request): ngapp2_deploy_utils = Ngapp2DeployUtils() ok_to_serve = ngapp2_deploy_utils.get_ok_to_serve() curr_build = ok_to_serve.get('default') ok_to_serve_version = ok_to_serve.get('versions') prev_build = ngapp2_deploy_utils.get_previous_build() env_stage_a = environs_helper.get_env_by_stage(request, NGAPP_A, "prod") env_stage_b = environs_helper.get_env_by_stage(request, NGAPP_B, "prod") deploy_a = None build_a = None deploy_b = None if env_stage_a.get('deployId'): deploy_a = deploys_helper.get(request, env_stage_a['deployId']) build_a = builds_helper.get_build(request, deploy_a['buildId']) if env_stage_b.get('deployId'): deploy_b = deploys_helper.get(request, env_stage_b['deployId']) stage = getattr(NgappDeployStep, ngapp2_deploy_utils.get_status_from_zk().upper()) if stage != NgappDeployStep.SERVING_BUILD: deploying_env = ngapp2_deploy_utils.get_deploying_env_from_zk() else: if build_a and build_a['commit'][:7] == curr_build[:7]: deploying_env = env_stage_b['envName'] else: deploying_env = env_stage_a['envName'] ngapp2_deploy_utils.set_deploying_env_to_zk(deploying_env) if deploying_env == env_stage_a['envName']: curr_env = EnvStatus(env_stage_b, deploy_b, curr_build) prev_env = EnvStatus(env_stage_a, deploy_a, prev_build) else: curr_env = EnvStatus(env_stage_a, deploy_a, curr_build) prev_env = EnvStatus(env_stage_b, deploy_b, prev_build) return render( request, 'ngapp2/ngapp2_deploy.html', { "prev_env": prev_env, "curr_env": curr_env, "deploy_stage": stage, "deploying_env": deploying_env, "serve_version_count": len(ok_to_serve_version) })
def sendStartMessage(request, user, envName, stageName, notifyAuthor): env = environs_helper.get_env_by_stage(request, envName, stageName) deploy = deploys_helper.get(request, env['deployId']) build = builds_helper.get_build(request, deploy['buildId']) branch = build['branch'] Ngapp2DeployUtils().reset_finish_message_flag(stageName) message = "{}/{}: deploy of {}/{} started. See details <{}|here>.".format( envName, stageName, branch, build['commitShort'], get_deploy_url(envName, stageName)) systems_helper.send_chat_message(request, user.name, get_slack_channel(), message) if not notifyAuthor: return author_msg = get_notify_authors_message(request, env, build) if author_msg and is_prod(): systems_helper.send_chat_message(request, user.name, get_slack_channel(), author_msg) elif author_msg: logger.info("get author list message:{}".format(author_msg))
def update_env_priority(request, env_name): if env_name == NGAPP_A: curr_env = NGAPP_A prev_env = NGAPP_B else: curr_env = NGAPP_B prev_env = NGAPP_A # we only update env priority once if Ngapp2DeployUtils().get_finish_message_flag("prod") == "True": return curr_data = {"priority": "HIGH"} prev_data = {"priority": "NORMAL"} environs_helper.update_env_basic_config(request, curr_env, "prod", data=curr_data) environs_helper.update_env_basic_config(request, prev_env, "prod", data=prev_data)
def sendFinishMessage(request, user, envName, stageName, state): ngapp2DeployUtils = Ngapp2DeployUtils() # if we've already sent the message if ngapp2DeployUtils.get_finish_message_flag(stageName) == "True": return ngapp2DeployUtils.set_finish_message_flag(stageName) env = environs_helper.get_env_by_stage(request, envName, stageName) deploy = deploys_helper.get(request, env['deployId']) build = builds_helper.get_build(request, deploy['buildId']) branch = build['branch'] commit = build['commit'] weblink = get_deploy_url(envName, stageName) state = state.lower() if state == "succeeding" or state == "done": template = "{}/{}: deploy of {}/{} completed successfully. See details <{}|here>" else: template = "{}/{}: deploy of {}/{} failed. See details <{}|here>" message = template.format(envName, stageName, branch, commit[:7], weblink) systems_helper.send_chat_message(request, deploy['operator'], get_slack_channel(), message)