func()

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