in teamcity/pool_resource.go [217:330]
func (r *poolResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) {
// get values from plan
var plan models.PoolDataModel
diags := req.Plan.Get(ctx, &plan)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
// get state
var state models.PoolDataModel
diags = req.State.Get(ctx, &state)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
var newName string
var newSize string
proj := models.ProjectsJson{Project: make([]models.ProjectJson, 0)}
// 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})
}
// verify plan values
newName = plan.Name.ValueString()
if plan.Size.IsNull() {
newSize = "-1" // unlimited
} else {
size := plan.Size.ValueInt64()
newSize = strconv.FormatInt(size, 10)
}
// verify state id
if state.Id.IsNull() {
resp.Diagnostics.AddAttributeError(
path.Root("id"),
"Agent pool state's id cannot be null",
"The Resource cannot update an Agent Pool since there is an inconsistent state.",
)
return
}
id := state.Id.String()
// call update methods
// Name
result, err := r.client.SetField("agentPools", id, "name", &newName)
if err != nil {
resp.Diagnostics.AddError(
"Error setting agent pool name field",
err.Error(),
)
return
} else {
state.Name = types.StringValue(result)
}
// Size
result, err = r.client.SetField("agentPools", id, "maxAgents", &newSize)
if err != nil {
resp.Diagnostics.AddError(
"Error setting agent pool size field",
err.Error(),
)
return
} else {
if result == "" {
state.Size = basetypes.NewInt64Null()
} else {
i, err := strconv.ParseInt(result, 10, 64)
if err != nil {
resp.Diagnostics.AddError(
"Could not parse field update response to int64",
err.Error(),
)
return
}
state.Size = basetypes.NewInt64Value(i)
}
}
// Projects
response, err := r.client.SetPoolProjects(newName, &proj)
if err != nil {
resp.Diagnostics.AddError(
"Error setting agent pool projects, please check projects IDs are correct",
err.Error(),
)
return
} else {
state.Projects, diags = types.SetValue(types.StringType, getProjectsAttrValue(response.Project))
if diags.HasError() {
return
}
}
diags = resp.State.Set(ctx, state)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
}