def scheduler()

in installer/resources/src/cdk_construct.py [0:0]


    def scheduler(self):
        """
        Create the Scheduler EC2 instance, configure user data and assign EIP
        """

        # Create Lambda to reset AD DS password when using AD
        if install_props.Config.directoryservice.provider == "activedirectory":
            self.soca_resources["reset_ds_lambda"] = aws_lambda.Function(self, f"{user_specified_variables.cluster_id}-ResetDsLambdaFunction",
                                                  function_name=f"{user_specified_variables.cluster_id}-ResetDsLambdaFunction-{''.join(random.choice(string.ascii_lowercase + string.digits) for i in range(20))}",
                                                  description="Lambda to reset AD DS password",
                                                  memory_size=128, role=self.soca_resources["reset_ds_password_lambda_role"],
                                                  timeout=core.Duration.minutes(3),
                                                  runtime=aws_lambda.Runtime.PYTHON_3_7,
                                                  log_retention=logs.RetentionDays.INFINITE,
                                                  handler="ResetDSPassword.lambda_handler",
                                                  code=aws_lambda.Code.asset("../functions/ResetDSPassword"))

        # Generate EC2 User Data
        user_data_substitutes = {"%%AWS_ACCOUNT_ID%%": core.Aws.ACCOUNT_ID,
                                 "%%AWS_PARTITION%%": core.Aws.PARTITION,
                                 "%%CLUSTER_ID%%": user_specified_variables.cluster_id,
                                 "%%S3_BUCKET%%": user_specified_variables.bucket,
                                 "%%AWS_REGION%%": core.Aws.REGION,
                                 "%%SOCA_VERSION%%": "2.7.0",
                                 "%%COMPUTE_NODE_ARN%%": self.soca_resources["compute_node_role"].role_arn,
                                 "%%FS_DATA_PROVIDER%%": install_props.Config.storage.data.provider if not user_specified_variables.fs_data_provider else user_specified_variables.fs_data_provider,
                                 "%%FS_APPS_PROVIDER%%": install_props.Config.storage.apps.provider if not user_specified_variables.fs_apps_provider else user_specified_variables.fs_apps_provider,
                                 "%%FS_DATA_DNS%%": f"{self.soca_resources['fs_data'].ref}.{endpoints_suffix[install_props.Config.storage.data.provider]}" if not user_specified_variables.fs_data else f"{user_specified_variables.fs_data}.{endpoints_suffix[install_props.Config.storage.data.provider]}",
                                 "%%FS_APPS_DNS%%": f"{self.soca_resources['fs_apps'].ref}.{endpoints_suffix[install_props.Config.storage.apps.provider]}" if not user_specified_variables.fs_apps else f"{user_specified_variables.fs_apps}.{endpoints_suffix[install_props.Config.storage.apps.provider]}",
                                 "%%VPC_ID%%": self.soca_resources["vpc"].vpc_id,
                                 "%%BASE_OS%%": user_specified_variables.base_os,
                                 "%%LDAP_USERNAME%%": user_specified_variables.ldap_user,
                                 "%%LDAP_PASSWORD%%": user_specified_variables.ldap_password,
                                 "%%SOCA_INSTALL_AMI%%": self.soca_resources["ami_id"],
                                 "%%RESET_PASSWORD_DS_LAMBDA%%": "false" if not self.soca_resources["reset_ds_lambda"] else self.soca_resources["reset_ds_lambda"].function_arn,
                                 "%%SOCA_AUTH_PROVIDER%%": install_props.Config.directoryservice.provider,
                                 "%%SOCA_LDAP_BASE%%": "false" if install_props.Config.directoryservice.provider == "activedirectory" else f"dc={',dc='.join(install_props.Config.directoryservice.openldap.name.split('.'))}".lower()}

        with open("../user_data/Scheduler.sh") as plain_user_data:
            user_data = plain_user_data.read()

        for k, v in user_data_substitutes.items():
            user_data = user_data.replace(k, v)

        # Choose subnet where to deploy the scheduler
        if not user_specified_variables.vpc_id:
            if install_props.Config.entry_points_subnets.lower() == "public":
                vpc_subnets = ec2.SubnetSelection(subnets=[self.soca_resources["vpc"].public_subnets[0]])
            else:
                vpc_subnets = ec2.SubnetSelection(subnets=[self.soca_resources["vpc"].private_subnets[0]])
        else:
            if install_props.Config.entry_points_subnets.lower() == "public":
                subnet_info = user_specified_variables.public_subnets[0].split(",")
            else:
                subnet_info = user_specified_variables.private_subnets[0].split(",")
            launch_subnet = ec2.Subnet.from_subnet_attributes(self, "SubnetToUse",
                                                              availability_zone=subnet_info[1],
                                                              subnet_id=subnet_info[0])
            vpc_subnets = ec2.SubnetSelection(subnets=[launch_subnet])

        # Create the Scheduler Instance
        self.soca_resources["scheduler_instance"] = ec2.Instance(self, "SchedulerInstance",
                                                                 availability_zone=vpc_subnets.availability_zones,
                                                                 machine_image=ec2.MachineImage.generic_linux({
                                                                       user_specified_variables.region: self.soca_resources["ami_id"]}),
                                                                 instance_type=ec2.InstanceType(str(install_props.Config.scheduler.instance_type)),
                                                                 key_name=user_specified_variables.ssh_keypair,
                                                                 vpc=self.soca_resources["vpc"],
                                                                 block_devices=[ec2.BlockDevice(
                                                                       device_name="/dev/xvda" if user_specified_variables.base_os == "amazonlinux2" else "/dev/sda1",
                                                                       volume=ec2.BlockDeviceVolume(
                                                                           ebs_device=ec2.EbsDeviceProps(
                                                                               volume_size=int(install_props.Config.scheduler.volume_size),
                                                                               volume_type=ec2.EbsDeviceVolumeType.GP3))
                                                                 )],
                                                                 role=self.soca_resources["scheduler_role"],
                                                                 security_group=self.soca_resources["scheduler_sg"],
                                                                 vpc_subnets=vpc_subnets,
                                                                 user_data=ec2.UserData.custom(user_data))

        core.Tags.of(self.soca_resources["scheduler_instance"]).add("Name", f"{user_specified_variables.cluster_id}-Scheduler")
        core.Tags.of(self.soca_resources["scheduler_instance"]).add("soca:BackupPlan", f"{user_specified_variables.cluster_id}")

        # Ensure Filesystem are already up and running before creating the scheduler instance
        if not user_specified_variables.fs_apps:
            self.soca_resources["scheduler_instance"].node.add_dependency(self.soca_resources["fs_apps"])
        if not user_specified_variables.fs_data:
            self.soca_resources["scheduler_instance"].node.add_dependency(self.soca_resources["fs_data"])

        ssh_user = "centos" if user_specified_variables.base_os == "centos7" else "ec2-user"

        if install_props.Config.entry_points_subnets.lower() == "public":
            # Associate the EIP to the scheduler instance
            ec2.CfnEIPAssociation(self, "AssignEIPToScheduler",
                                  eip=self.soca_resources["scheduler_eip"].ref,
                                  instance_id=self.soca_resources["scheduler_instance"].instance_id)
            core.CfnOutput(self, "SchedulerIP", value=self.soca_resources["scheduler_eip"].ref)
            core.CfnOutput(self, "ConnectionString", value=f"ssh -i {user_specified_variables.ssh_keypair} {ssh_user}@{self.soca_resources['scheduler_eip'].ref}")

        else:
            core.CfnOutput(self, "SchedulerIP", value=self.soca_resources["scheduler_instance"].instance_private_ip)
            core.CfnOutput(self, "ConnectionString", value=f"ssh -i {user_specified_variables.ssh_keypair} {ssh_user}@{self.soca_resources['scheduler_instance'].instance_private_ip}")