def create_project()

in source/idea/idea-cluster-manager/src/ideaclustermanager/app/projects/projects_service.py [0:0]


    def create_project(self, request: CreateProjectRequest) -> CreateProjectResult:
        """
        Create a new Project
        validate required fields, add the project to DynamoDB and Cache.
        :param request:
        :return: the created project (with project_id)
        """

        ds_provider = self.context.config().get_string('directoryservice.provider', required=True)

        if Utils.is_empty(request):
            raise exceptions.invalid_params('request is required')

        project = request.project
        if Utils.is_empty(project):
            raise exceptions.invalid_params('project is required')

        if Utils.is_empty(project.name):
            raise exceptions.invalid_params('project.name is required')

        if project.allowed_sessions_per_user is not None and request.project.allowed_sessions_per_user <= 0:
            raise exceptions.invalid_params("Allowed sessions per user must be greater than zero")

        existing = self.projects_dao.get_project_by_name(project.name)
        if existing is not None:
            raise exceptions.invalid_params(f'project with name: {project.name} already exists')

        enable_budgets = Utils.get_as_bool(project.enable_budgets, False)
        if enable_budgets:
            if project.budget is None or Utils.is_empty(project.budget.budget_name):
                raise exceptions.invalid_params('budget.budget_name is required when budgets are enabled')
            budget_name = project.budget.budget_name
            self.context.aws_util().budgets_get_budget(budget_name)

        # ensure project is always disabled during creation
        project.enabled = False

        # Validate scripts
        scripts = project.scripts
        if scripts is not None:
            if not LaunchScriptsHelper.validate_scripts(scripts):
                raise exceptions.invalid_params(constants.SCRIPT_LOCATION_ERROR_MESSAGE)

        # Validate security groups and ensure security group is within VPC
        if project.security_groups:
            vpc_id = self.context.config().get_string('cluster.network.vpc_id')
            for security_group_id in project.security_groups:
                if not self.context.aws_util().is_security_group_available(security_group_id=security_group_id,vpc_id=vpc_id):
                    self.logger.error(f'{security_group_id} is not a valid security group that can be attached')
                    raise exceptions.invalid_params(constants.SECURITY_GROUP_ERROR_MESSAGE)

        # Create VDI role only when policies are provided
        policy_arns = Utils.get_as_string_list(project.policy_arns, [])
        if policy_arns:
            for policy_arn in policy_arns:
                if not self.context.aws_util().is_policy_valid(policy_arn):
                    self.logger.error(f'{policy_arn} is not a valid policy arn that can be attached')
                    raise exceptions.invalid_params(constants.POLICY_ARN_ERROR_MESSAGE)
            self._create_vdi_role_and_instance_profile(project.name, set(policy_arns))

        db_project = self.projects_dao.convert_to_db(project)
        db_created_project = self.projects_dao.create_project(db_project)

        created_project = self.projects_dao.convert_from_db(db_created_project)

        # and then call enable_project() to propagate the status
        self.enable_project(EnableProjectRequest(
                project_id=created_project.project_id
            ))

        enabled_project = self.get_project(
            GetProjectRequest(project_id=created_project.project_id))

        return CreateProjectResult(
            project=enabled_project.project
        )