Skip to content

Commit

Permalink
feat(bulk_user_import): automates import of existing users, groups as…
Browse files Browse the repository at this point in the history
… terraform resources (#2778)
  • Loading branch information
Aashirwadjain authored Nov 26, 2024
1 parent 0e4098d commit 882ec35
Show file tree
Hide file tree
Showing 8 changed files with 437 additions and 0 deletions.
29 changes: 29 additions & 0 deletions examples/bulk_users_import/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
### Overview
The `run_bulk_users_import.sh` script is a Bash script used to run a Go program that imports users in bulk (belonging to the specified group) into your Terraform configuration, to be saved to the state as `newrelic_user` resources (and `newrelic_group`, for the group with the ID specified), so as to facilitate controlling the imported user and group via Terraform, using resources in the New Relic Terraform Provider.

This is specifically useful in cases where a huge number of users were created in the New Relic One UI, added to a group, and would now like to be controlled via the `newrelic_user` and `newrelic_group` resources respectively, along with future users who would be added to the group via these resources in the New Relic Terraform Provider.

The script works as follows -
- Fetch users from the group with the ID specified,
- Get details of all of such users, in alignment with expected arguments of the `newrelic_user` resource,
- Write the attributes and values of each user (and the group specified) to strings in HCL (Terraform format),
- Write the generated Terraform configuration to `generated.tf` in the filepath specified, and
- Run a `terraform import` command in the filepath specified to also import all of these users (and the group) to the current Terraform state.


#### Arguments
--groupId <groupId>: The ID of the group to which the users will be imported. This is a required flag.
--apiKey <apiKey>: The User API key used for authentication. This is an optional flag, and can only be skipped if your environment has a `NEW_RELIC_API_KEY` that can be defaulted to.
--filePath <filePath>: The path to the file containing the user data to be imported. This is a required flag.

#### Example Usage
```sh
bash run_bulk_users_import.sh --groupId XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX --filePath ../../testing
```

```sh
bash run_bulk_users_import.sh --groupId XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX --apiKey XXXX-XXXXXXXXXXXXXXXX --filePath ../../testing
```



67 changes: 67 additions & 0 deletions examples/bulk_users_import/bulk_users_import_constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package main

const GET_GROUPS_AND_USERS_QUERY = `
query(
$groupId: [ID!]
){
actor {
organization {
userManagement {
authenticationDomains {
nextCursor
authenticationDomains {
name
id
groups(id: $groupId) {
groups {
id
displayName
users {
users {
email
id
name
timeZone
}
}
}
}
}
}
}
}
}
}
`

const GET_USER_DETAILS_QUERY = `
query(
$userId: [ID!]
){
actor {
organization {
userManagement {
authenticationDomains {
nextCursor
authenticationDomains {
name
id
users(id: $userId) {
users {
email
id
name
type {
displayName
}
}
}
}
}
}
}
}
}`

const NERDGRAPH_API_ENDPOINT = "https://api.newrelic.com/graphql"
const NERDGRAPH_API_ENDPOINT_EU = "https://api.newrelic.com/graphql"
17 changes: 17 additions & 0 deletions examples/bulk_users_import/bulk_users_import_helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package main

import (
"context"

"github.com/machinebox/graphql"
)

func RunGraphQLRequest(client *graphql.Client, query string, variables map[string]interface{}, apiKey string, response interface{}) error {
request := graphql.NewRequest(query)
for key, value := range variables {
request.Var(key, value)
}
request.Header.Set("Api-Key", apiKey)

return client.Run(context.Background(), request, response)
}
30 changes: 30 additions & 0 deletions examples/bulk_users_import/bulk_users_import_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package main

import (
"github.com/newrelic/newrelic-client-go/v2/pkg/usermanagement"
)

type authenticationDomainsResponse struct {
Actor usermanagement.Actor `json:"actor"`
}

type ResourceUser struct {
id string
name string
email_id string
authentication_domain_id string
user_type string
}

type ResourceGroup struct {
id string
name string
authentication_domain_id string
user_ids []string
}

var userTier = map[string]string{
"Basic": "BASIC_USER_TIER",
"Core": "CORE_USER_TIER",
"Full platform": "FULL_USER_TIER",
}
25 changes: 25 additions & 0 deletions examples/bulk_users_import/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module bulk_users_import

go 1.22.6

require (
github.com/machinebox/graphql v0.2.2
github.com/newrelic/newrelic-client-go/v2 v2.51.3
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.0 // indirect
github.com/matryer/is v1.4.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/stretchr/testify v1.9.0 // indirect
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect
github.com/valyala/fastjson v1.6.4 // indirect
golang.org/x/sys v0.20.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
52 changes: 52 additions & 0 deletions examples/bulk_users_import/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
github.com/hashicorp/go-retryablehttp v0.7.0 h1:eu1EI/mbirUgP5C8hVsTNaGZreBDlYiwC1FZWkvQPQ4=
github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/machinebox/graphql v0.2.2 h1:dWKpJligYKhYKO5A2gvNhkJdQMNZeChZYyBbrZkBZfo=
github.com/machinebox/graphql v0.2.2/go.mod h1:F+kbVMHuwrQ5tYgU9JXlnskM8nOaFxCAEolaQybkjWA=
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/newrelic/newrelic-client-go/v2 v2.51.3 h1:Bu/cUs6nfMjQMPBcxxHt4Xm30tKDT7ttYy/XRDsWP6Y=
github.com/newrelic/newrelic-client-go/v2 v2.51.3/go.mod h1:+RRjI3nDGWT3kLm9Oi3QxpBm70uu8q1upEHBVWCZFpo=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y=
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE=
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo=
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Loading

0 comments on commit 882ec35

Please sign in to comment.