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
)