Skip to content

[FEAT] Add support for Enterprise Cost Centers#3000

Open
vmvarela wants to merge 10 commits intointegrations:mainfrom
vmvarela:cost-centers
Open

[FEAT] Add support for Enterprise Cost Centers#3000
vmvarela wants to merge 10 commits intointegrations:mainfrom
vmvarela:cost-centers

Conversation

@vmvarela
Copy link

@vmvarela vmvarela commented Dec 15, 2025

Resolves #2739


Before the change?

  • No support for enterprise cost centers resources or data

After the change?

  • Two new resources and data sources (github_enterprise_cost_center and github_enterprise_cost_centers)

NOTE: This API (billing) has no support for APP or fine-grained tokens.

Pull request checklist

  • Schema migrations have been created if needed (example)
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been reviewed and added / updated if needed (for bug fixes / features)

Does this introduce a breaking change?

Please see our docs on breaking changes to help!

  • Yes
  • No

@github-actions
Copy link

👋 Hi! Thank you for this contribution! Just to let you know, our GitHub SDK team does a round of issue and PR reviews twice a week, every Monday and Friday! We have a process in place for prioritizing and responding to your input. Because you are a part of this community please feel free to comment, add to, or pick up any issues/PRs that are labeled with Status: Up for grabs. You & others like you are the reason all of this works! So thank you & happy coding! 🚀

@deiga
Copy link
Collaborator

deiga commented Dec 19, 2025

We're trying to move towards using Context-aware provider functions, could you update all schemas to use those? So ReadContext etc

@vmvarela vmvarela force-pushed the cost-centers branch 2 times, most recently from 13dcd40 to 1ab2c0f Compare December 22, 2025 06:32
Copilot AI review requested due to automatic review settings December 26, 2025 09:00
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds comprehensive support for GitHub Enterprise Cost Centers, enabling Terraform management of cost center resources and their assignments. The implementation addresses issue #2739 by leveraging the newly public GitHub Enterprise billing API.

Key changes:

  • Introduces github_enterprise_cost_center resource for creating, updating, and archiving cost centers with authoritative management of user, organization, and repository assignments
  • Adds github_enterprise_cost_center and github_enterprise_cost_centers data sources for querying cost center information
  • Implements robust resource assignment synchronization with batching (50 resources per request) and retry logic for transient failures

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
website/github.erb Adds navigation links for the new data sources and resource
website/docs/r/enterprise_cost_center.html.markdown Documents the cost center resource with examples, arguments, attributes, and import instructions
website/docs/d/enterprise_cost_center.html.markdown Documents the single cost center data source for retrieving by ID
website/docs/d/enterprise_cost_centers.html.markdown Documents the data source for listing cost centers with optional state filtering
github/util_cost_centers.go Provides utility functions for API interactions including CRUD operations and resource assignment management
github/resource_github_enterprise_cost_center.go Implements the cost center resource with full lifecycle management and authoritative assignment synchronization
github/provider.go Registers the new resource and data sources with the provider
github/resource_github_enterprise_cost_center_test.go Provides acceptance tests covering create, update, assignment changes, and import scenarios
github/data_source_github_enterprise_cost_centers_test.go Tests the list data source with state filtering
github/data_source_github_enterprise_cost_centers.go Implements the data source for listing cost centers
github/data_source_github_enterprise_cost_center_test.go Tests the single cost center data source retrieval
github/data_source_github_enterprise_cost_center.go Implements the data source for retrieving a specific cost center by ID
examples/cost_centers/main.tf Provides a comprehensive example demonstrating resource and data source usage

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@joraff
Copy link

joraff commented Jan 6, 2026

I built and tested your branch @vmvarela and it works great! I was able to read, import, and create cost centers and resources using your examples and a few of my own. Thank you for the work.

@vmvarela vmvarela force-pushed the cost-centers branch 3 times, most recently from a3e128c to 0bdad0f Compare January 8, 2026 16:35
@vmvarela vmvarela changed the title feat: Add support for Enterprise Cost Centers [FEAT] Add support for Enterprise Cost Centers Jan 8, 2026
@vmvarela vmvarela force-pushed the cost-centers branch 2 times, most recently from 3314826 to 1d13386 Compare January 10, 2026 11:11
Copy link
Collaborator

@deiga deiga left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Half-way through. Please consider if my comments could apply to other places in your changes as well, I wasn't able to comment on every duplicate thing

Copy link
Author

@vmvarela vmvarela left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the thorough review @deiga! I've addressed all the feedback. Here's a summary of the changes:

Implemented:

  • ✅ Added top-level Description attribute to all resources and data sources
  • ✅ Removed ctx = context.WithValue(ctx, ctxId, ...) pattern from all files
  • ✅ Replaced log.Printf with tflog.Info and added tflog.Warn for 404 removals
  • ✅ Used diag.Errorf instead of diag.FromErr(fmt.Errorf(...))
  • ✅ Create and Update no longer call Read - computed fields are set directly
  • ✅ Extracted anonymous retry functions to named functions (retryCostCenterAddResources, retryCostCenterRemoveResources)
  • ✅ Changed import ID separator from / to : and using parseTwoPartID
  • ✅ Replaced stringSliceToAnySlice with existing flattenStringList
  • ✅ Used http.StatusNotFound and other constants instead of magic numbers
  • ✅ Moved is404 to util.go
  • ✅ Updated tests to use providerFactories and skipUnlessEnterprise(t)
  • ✅ Added owner = var.enterprise_slug to example provider config
  • ✅ Used buildTwoPartID in data source
  • ✅ Inlined check variables in tests

Regarding questions:

  • The resources attribute provides the raw API view while users, organizations, repositories are filtered convenience attributes. I kept both for flexibility and debugging purposes.
  • diffStringSlices differs from setChanges - it compares string slices directly while setChanges works with Terraform state changes. They serve different purposes.
  • In Create, we only fetch from API after assignments are configured to populate computed fields, since we're not calling Read anymore.

All tests pass and the code compiles without errors.

@vmvarela vmvarela force-pushed the cost-centers branch 5 times, most recently from b66a9c0 to 2763ff4 Compare January 20, 2026 18:58
@vmvarela vmvarela requested a review from deiga January 20, 2026 19:15
Copy link
Collaborator

@deiga deiga left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please pay attention to what I'm asking form you and make sure to make similar changes in other places where they might apply.

Consider these also for your other PRs

@vmvarela vmvarela force-pushed the cost-centers branch 3 times, most recently from 52a3d8a to 5e58a8c Compare January 21, 2026 09:28
@vmvarela vmvarela requested a review from deiga January 21, 2026 10:08
@deiga
Copy link
Collaborator

deiga commented Jan 22, 2026

Have you gotten all the tests to pass locally? Can you share a screenshot of the test results?

@vmvarela
Copy link
Author

Yes, I've confirmed that the tests pass locally. I ran the acceptance tests specifically for the Enterprise Cost Center resources (TestAccGithubEnterpriseCostCenter). Here is the screenshot of the results:

image

@deiga deiga requested a review from stevehipwell January 22, 2026 20:38
Copy link
Collaborator

@deiga deiga left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, still need review from other maintainers

Copy link
Collaborator

@stevehipwell stevehipwell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR @vmvarela, I've added some general comments.

But my main review comment is that the pattern you're attempting to use for github_enterprise_cost_center is mixing concerns. Could you please separate out the assignments from the github_enterprise_cost_center resource. You could create a github_enterprise_cost_center_assignment resource to keep the authoritative pattern if it needs to span all types; but github_enterprise_cost_center_users, github_enterprise_cost_center_organizations & github_enterprise_cost_center_repositories would be the preferred pattern. This way the provider logic is more consistent and we could support non-authoritative patterns in the future.

vmvarela pushed a commit to vmvarela/terraform-provider-github that referenced this pull request Jan 27, 2026
…sources

Add support for GitHub Enterprise Cost Centers with a clean separation between
the cost center entity and resource assignments:

Resources:
- github_enterprise_cost_center: manages cost center entity (name, state)
- github_enterprise_cost_center_users: authoritative user assignments
- github_enterprise_cost_center_organizations: authoritative org assignments
- github_enterprise_cost_center_repositories: authoritative repo assignments

Data sources:
- github_enterprise_cost_center: retrieve a single cost center with assignments
- github_enterprise_cost_centers: list cost centers filtered by state

Features:
- Retry logic for transient API errors (409, 5xx)
- Batching for large assignment operations (max 50 per request)
- Import support for all resources

Closes integrations#3000
@vmvarela
Copy link
Author

Hi @stevehipwell,

Done! I've separated the cost center entity from assignments into independent resources:

  • github_enterprise_cost_center - entity only
  • github_enterprise_cost_center_users
  • github_enterprise_cost_center_organizations
  • github_enterprise_cost_center_repositories

Shared retry logic and batching in util_enterprise_cost_center.go. All tests passing.

@vmvarela vmvarela requested a review from stevehipwell January 27, 2026 17:51
vmvarela pushed a commit to vmvarela/terraform-provider-github that referenced this pull request Jan 30, 2026
…sources

Add support for GitHub Enterprise Cost Centers with a clean separation between
the cost center entity and resource assignments:

Resources:
- github_enterprise_cost_center: manages cost center entity (name, state)
- github_enterprise_cost_center_users: authoritative user assignments
- github_enterprise_cost_center_organizations: authoritative org assignments
- github_enterprise_cost_center_repositories: authoritative repo assignments

Data sources:
- github_enterprise_cost_center: retrieve a single cost center with assignments
- github_enterprise_cost_centers: list cost centers filtered by state

Features:
- Retry logic for transient API errors (409, 5xx)
- Batching for large assignment operations (max 50 per request)
- Import support for all resources

Closes integrations#3000
vmvarela pushed a commit to vmvarela/terraform-provider-github that referenced this pull request Feb 3, 2026
…sources

Add support for GitHub Enterprise Cost Centers with a clean separation between
the cost center entity and resource assignments:

Resources:
- github_enterprise_cost_center: manages cost center entity (name, state)
- github_enterprise_cost_center_users: authoritative user assignments
- github_enterprise_cost_center_organizations: authoritative org assignments
- github_enterprise_cost_center_repositories: authoritative repo assignments

Data sources:
- github_enterprise_cost_center: retrieve a single cost center with assignments
- github_enterprise_cost_centers: list cost centers filtered by state

Features:
- Retry logic for transient API errors (409, 5xx)
- Batching for large assignment operations (max 50 per request)
- Import support for all resources

Closes integrations#3000
@vmvarela vmvarela force-pushed the cost-centers branch 2 times, most recently from 6893efd to 7d36b30 Compare February 3, 2026 09:31
@deiga
Copy link
Collaborator

deiga commented Feb 3, 2026

@vmvarela Please stop using amend commits to address review comments. Rebasing is still strongly encouraged, but try add every new change into a new commit. Let us worry about what the git history looks like when merging a PR.

It's frustratingly hard to review the changes you made after change requests and one of the major factors why I haven't been able to review your PR's in a timely manner.

Edit: actually, could you rewrite the commit history to be more granular, so that we can more easily review this. Same applies to your other PRs

Add utility functions needed for enterprise cost center resources:
- errIs404(): check if error is a GitHub 404 Not Found response
- errIsRetryable(): check if error is retryable (409, 5xx)
- expandStringSet(): convert schema.Set to []string
- chunkStringSlice(): split slice into chunks for batching
Add util_enterprise_cost_center.go with helper functions for managing
cost center assignments with proper retry logic and batching support.
Manages GitHub Enterprise cost center entities (create, read, update, archive).

Includes:
- Resource implementation with CRUD operations
- Acceptance tests
- Documentation
Authoritative management of user assignments to cost centers.

Includes:
- Resource implementation with batched add/remove operations
- Acceptance tests
- Documentation
…esource

Authoritative management of organization assignments to cost centers.

Includes:
- Resource implementation with batched add/remove operations
- Acceptance tests
- Documentation
…source

Authoritative management of repository assignments to cost centers.

Includes:
- Resource implementation with batched add/remove operations
- Acceptance tests
- Documentation
Add two data sources:
- github_enterprise_cost_center: retrieve a cost center by ID
- github_enterprise_cost_centers: list cost centers with optional state filter

Includes:
- Data source implementations
- Acceptance tests
- Documentation
- Register 4 resources in provider.go:
  - github_enterprise_cost_center
  - github_enterprise_cost_center_users
  - github_enterprise_cost_center_organizations
  - github_enterprise_cost_center_repositories
- Register 2 data sources in provider.go:
  - github_enterprise_cost_center
  - github_enterprise_cost_centers
- Add navigation links in website/github.erb

T_EDITOR=true git rebase --continue
t status
Add example Terraform configuration demonstrating how to:
- Create a cost center
- Assign users, organizations, and repositories
- Use data sources to query cost centers
Update import paths from go-github/v81 to go-github/v82 to match
the current version in upstream/main.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT]: Add support for Enterprise billing resources

4 participants