func()

in teamcity/pool_resource.go [82:156]


func (r *poolResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
	// get values from plan
	var plan models.PoolDataModel
	diags := req.Plan.Get(ctx, &plan)
	resp.Diagnostics.Append(diags...)
	if resp.Diagnostics.HasError() {
		return
	}

	// Generate API request
	var pool models.PoolJson
	proj := models.ProjectsJson{Project: make([]models.ProjectJson, 0)}
	var size int64

	pool.Name = plan.Name.ValueString()
	if !plan.Size.IsNull() {
		size = plan.Size.ValueInt64()
		pool.Size = &size
	}

	// Create new agent pool
	result, err := r.client.NewPool(pool)
	if err != nil && errors.Is(err, context.DeadlineExceeded) {
		resp.Diagnostics.AddError(
			"Error creating pool: Timeout",
			err.Error(),
		)
		return
	}

	if err != nil {
		resp.Diagnostics.AddError(
			"Error creating pool",
			"Cannot create pool, unexpected error: "+err.Error(),
		)
		return
	}

	// Populate computed attributes
	plan.Id = types.Int64Value(int64(*(result.Id)))

	// Two way process: setup associated projects now
	// Assing projects from the plan
	elements := make([]types.String, 0, len(plan.Projects.Elements()))
	diags = plan.Projects.ElementsAs(ctx, &elements, false)
	if diags.HasError() {
		return
	}

	for _, project := range elements {
		id := project.ValueString()
		proj.Project = append(proj.Project, models.ProjectJson{Name: "-", Id: &id})
	}

	response, err := r.client.SetPoolProjects(pool.Name, &proj)
	if err != nil {
		resp.Diagnostics.AddError(
			"Error setting agent pool projects, please check projects IDs are correct",
			err.Error(),
		)
		return
	} else {
		plan.Projects, diags = types.SetValue(types.StringType, getProjectsAttrValue(response.Project))
		if diags.HasError() {
			return
		}
	}

	// Set state
	diags = resp.State.Set(ctx, &plan)
	resp.Diagnostics.Append(diags...)
	if resp.Diagnostics.HasError() {
		return
	}
}