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
}
}