From 12fb18236decb622dcda624b80a2f64e5e9f7acc Mon Sep 17 00:00:00 2001 From: "roshan.r" Date: Tue, 16 Aug 2022 15:23:30 +0530 Subject: [PATCH 01/73] feat: Added user resource to squadcast provider --- .gitignore | 4 +- .terraform.lock.hcl | 24 ++++++++ cmd/provider_cmd_squadcast.go | 44 +++++++++++++++ cmd/root.go | 1 + providers/squadcast/squadcast_provider.go | 68 +++++++++++++++++++++++ providers/squadcast/squadcast_service.go | 36 ++++++++++++ providers/squadcast/user.go | 53 ++++++++++++++++++ 7 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 .terraform.lock.hcl create mode 100644 cmd/provider_cmd_squadcast.go create mode 100644 providers/squadcast/squadcast_provider.go create mode 100644 providers/squadcast/squadcast_service.go create mode 100644 providers/squadcast/user.go diff --git a/.gitignore b/.gitignore index f910abf842..904f641dbe 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ cmd/tmp terraform.tfstate terraform.tfstate.backup init.tf -vendor/ \ No newline at end of file +vendor/ +.env +*.tf \ No newline at end of file diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl new file mode 100644 index 0000000000..3a6ba4c99e --- /dev/null +++ b/.terraform.lock.hcl @@ -0,0 +1,24 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/squadcasthub/squadcast" { + version = "1.0.4" + constraints = "1.0.4" + hashes = [ + "h1:EWLsWeZpI4OftTttQrpn9KEKabdIQhm8mWnp9Xljxvg=", + "zh:352693bcacd608230372f1adb108fe57680e453f4acedbb297ba0c2907806175", + "zh:3dad9049e863b84f010927550e54c674ef367b6fa30326decbe15ca3785fada5", + "zh:4de04117c1b14102839550e8610ea112c7e1b527b16f7fe31e0a40f43573cd58", + "zh:5786b0df49f42bc22577c676f43efc087153009b5b03a005c6777c6a1ed180bd", + "zh:58fe837206083d171c8b4225a06a3a017005fad39397893d202666f0e8e23657", + "zh:6645804c94298ff0b8e7e57bb7fa782feb454cec6e0789e89c3394d74393fe34", + "zh:84e801e1c391bf436259a1e7671a8ca2d20ebbe7db2b2e0af08892cb1d5c9370", + "zh:a8f8926432512c5f1d806b6134855c76149d7544076dd63ac4dd4568a5a61b61", + "zh:cb3a47f91ecf7f5958584ae6174095749f0eeac0082d18e5413e4e756f349d9c", + "zh:d5f72213408bc159becbc00a9031c1e8f7821585b12a9a8bd1b29051c528952b", + "zh:e13d435f71db674b847e055d92ca59db2818d8de45234bf7bcd4af5ca1aa9e23", + "zh:e3faf132b256b63a69a2802ff72d98de48c4f685a9b986d02c03d84621258e8e", + "zh:e84c0bde50d0a8a7c6f19595cd9717bf7cabaede135936bbdc57d51a9f00b0b5", + "zh:ffd120cf1aafb1ab1035833bef3d371fcf2ce50403ae9bdaeb389ab224e96938", + ] +} diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go new file mode 100644 index 0000000000..dde250ce1f --- /dev/null +++ b/cmd/provider_cmd_squadcast.go @@ -0,0 +1,44 @@ +package cmd + +import ( + "os" + + squadcast_terraforming "github.com/GoogleCloudPlatform/terraformer/providers/squadcast" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "github.com/spf13/cobra" +) + +const ( + defaultSquadcastEndpoint = "http://api.squadcast.com/v3/" +) + +func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { + var accessToken string + // accessToken := "" + cmd := &cobra.Command{ + Use: "squadcast", + Short: "Import current state to Terraform configuration from SquadCast", + Long: "Import current state to Terraform configuration from SquadCast", + RunE: func(cmd *cobra.Command, args []string) error { + endpoint := os.Getenv("SQUADCAST_SERVER_URL") + if len(endpoint) == 0 { + endpoint = defaultSquadcastEndpoint + } + provider := newSquadcastProvider() + err := Import(provider, options, []string{accessToken}) + if err != nil { + return err + } + return nil + }, + } + cmd.AddCommand(listCmd(newSquadcastProvider())) + baseProviderFlags(cmd.PersistentFlags(), &options, "user", "") + cmd.PersistentFlags().StringVarP(&accessToken, "access-token", "", "", "YOUR_SQUADCAST_ACCESS_TOKEN or env param SQUADCAST_ACCESS_TOKEN") + return cmd +} + +func newSquadcastProvider() terraformutils.ProviderGenerator { + return &squadcast_terraforming.SquadcastProvider{} +} diff --git a/cmd/root.go b/cmd/root.go index 60a73082cc..62563f9c57 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -75,6 +75,7 @@ func providerImporterSubcommands() []func(options ImportOptions) *cobra.Command newCmdGrafanaImporter, newCmdPagerDutyImporter, newCmdOpsgenieImporter, + newCmdSquadcastImporter, // Community newCmdKeycloakImporter, newCmdLogzioImporter, diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go new file mode 100644 index 0000000000..f6db95b20b --- /dev/null +++ b/providers/squadcast/squadcast_provider.go @@ -0,0 +1,68 @@ +package squadcast + +import ( + "errors" + "os" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type SquadcastProvider struct { + terraformutils.Provider + accesstoken string + refreshtoken string +} + +func (p *SquadcastProvider) Init(args []string) error { + + if accessToken := os.Getenv("SQUADCAST_ACCESS_TOKEN"); accessToken != "" { + p.accesstoken = os.Getenv("SQUADCAST_ACCESS_TOKEN") + } + if p.accesstoken == "" { + return errors.New("requred Access Token missing") + } + + if refreshToken := os.Getenv("SQUADCAST_REFRESH_TOKEN"); refreshToken != "" { + p.refreshtoken = os.Getenv("SQUADCAST_REFRESH_TOKEN") + } + if p.refreshtoken == "" { + return errors.New("requred refresh Token missing") + } + + return nil +} + +func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error { + var isSupported bool + if _, isSupported = p.GetSupportedService()[serviceName]; !isSupported { + return errors.New(p.GetName() + ": " + serviceName + " not supported service") + } + p.Service = p.GetSupportedService()[serviceName] + p.Service.SetName(serviceName) + p.Service.SetVerbose(verbose) + p.Service.SetProviderName(p.GetName()) + p.Service.SetArgs(map[string]interface{}{ + "access_token": p.accesstoken, + "refresh_token": p.refreshtoken, + }) + + return nil +} + +func (p *SquadcastProvider) GetProviderData(arg ...string) map[string]interface{} { + return map[string]interface{}{} +} + +func (p *SquadcastProvider) GetResourceConnections() map[string]map[string][]string { + return map[string]map[string][]string{} +} + +func (p *SquadcastProvider) GetName() string { + return "squadcast" +} + +func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { + return map[string]terraformutils.ServiceGenerator{ + "user": &UserGenerator{}, + } +} diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go new file mode 100644 index 0000000000..bf14afb2f5 --- /dev/null +++ b/providers/squadcast/squadcast_service.go @@ -0,0 +1,36 @@ +package squadcast + +import ( + "fmt" + "io/ioutil" + "net/http" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type SquadcastService struct { + terraformutils.Service +} + +func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { + tr := &http.Transport{} + client := &http.Client{Transport: tr} + req, err := http.NewRequest("GET", uri, nil) + if err != nil { + return nil, err + } + // req.Header.Set("Authorization", "Bearer "+s.Args["access_token"].(string)) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.Args["access_token"])) + + resp, err := client.Do(req) + + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + return body, nil +} diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go new file mode 100644 index 0000000000..5b72a9c25d --- /dev/null +++ b/providers/squadcast/user.go @@ -0,0 +1,53 @@ +package squadcast + +import ( + "encoding/json" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type UserGenerator struct { + SquadcastService +} + +type User struct { + ID string `json:"id" tf:"id"` +} + +var response struct { + Data *[]User `json:"data"` +} + +type Users []User + +var UserAllowEmptyValues = []string{} + +func (g UserGenerator) createResources(users Users) []terraformutils.Resource { + var resources []terraformutils.Resource + for _, user := range users { + resources = append(resources, terraformutils.NewSimpleResource( + user.ID, + "user_"+(user.ID), + "squadcast_user", + "squadcast", + []string{}, + )) + } + return resources +} + +func (g *UserGenerator) InitResources() error { + // body, err := g.generateRequest("https://api.squadcast.com/v3/organizations/5a4262733c36823b3ed91fb9/users") + body, err := g.generateRequest("https://api.squadcast.com/v3/users") + if err != nil { + return err + } + + err = json.Unmarshal(body, &response) + if err != nil { + return err + } + + g.Resources = g.createResources(*response.Data) + return nil +} From 6e7d36932620cf2480f600a956adb8a473463d61 Mon Sep 17 00:00:00 2001 From: "roshan.r" Date: Tue, 16 Aug 2022 16:53:09 +0530 Subject: [PATCH 02/73] fix: Api url --- providers/squadcast/squadcast_provider.go | 80 +++++++++++++++++++++-- providers/squadcast/squadcast_service.go | 20 +++--- 2 files changed, 85 insertions(+), 15 deletions(-) diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index f6db95b20b..c2d555a272 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -1,7 +1,12 @@ package squadcast import ( + "context" + "encoding/json" "errors" + "io" + "log" + "net/http" "os" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -13,14 +18,38 @@ type SquadcastProvider struct { refreshtoken string } -func (p *SquadcastProvider) Init(args []string) error { +type AccessToken struct { + Type string `json:"type"` + AccessToken string `json:"access_token"` + IssuedAt int64 `json:"issued_at"` + ExpiresAt int64 `json:"expires_at"` + RefreshToken string `json:"refresh_token"` +} - if accessToken := os.Getenv("SQUADCAST_ACCESS_TOKEN"); accessToken != "" { - p.accesstoken = os.Getenv("SQUADCAST_ACCESS_TOKEN") - } - if p.accesstoken == "" { - return errors.New("requred Access Token missing") - } +// Meta holds the status of the request informations +type Meta struct { + Meta AppError `json:"meta,omitempty"` +} + +type AppError struct { + Status int `json:"status"` + Message string `json:"error_message,omitempty"` + ConflictData *any `json:"conflict_data,omitempty"` + ErrorDetails *ErrorDetails `json:"error_details,omitempty"` +} + +type ErrorDetails struct { + Code string `json:"code"` + Description string `json:"description,omitempty"` + Link string `json:"link,omitempty"` + Errors any `json:"errors,omitempty"` +} + +const ( + UserAgent = "terraform-provider-squadcast" +) + +func (p *SquadcastProvider) Init(args []string) error { if refreshToken := os.Getenv("SQUADCAST_REFRESH_TOKEN"); refreshToken != "" { p.refreshtoken = os.Getenv("SQUADCAST_REFRESH_TOKEN") @@ -29,6 +58,7 @@ func (p *SquadcastProvider) Init(args []string) error { return errors.New("requred refresh Token missing") } + p.GetAccessToken() return nil } @@ -66,3 +96,39 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv "user": &UserGenerator{}, } } + +func (p *SquadcastProvider) GetAccessToken() { + ctx := context.Background() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://auth.squadcast.com/oauth/access-token", nil) + if err != nil { + log.Fatal(err) + } + req.Header.Set("X-Refresh-Token", p.refreshtoken) + req.Header.Set("User-Agent", UserAgent) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + log.Fatal(err) + } + + var response struct { + Data AccessToken `json:"data"` + *Meta + } + + defer resp.Body.Close() + bytes, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatal(err) + } + + if err := json.Unmarshal(bytes, &response); err != nil { + log.Fatal(err) + } + + if resp.StatusCode > 299 { + log.Fatal(err) + } + + p.accesstoken = response.Data.AccessToken +} diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index bf14afb2f5..fb685ca028 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -1,8 +1,10 @@ package squadcast import ( + "context" "fmt" "io/ioutil" + "log" "net/http" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -13,24 +15,26 @@ type SquadcastService struct { } func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { - tr := &http.Transport{} - client := &http.Client{Transport: tr} - req, err := http.NewRequest("GET", uri, nil) + + ctx := context.Background() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) if err != nil { - return nil, err + log.Fatal(err) } - // req.Header.Set("Authorization", "Bearer "+s.Args["access_token"].(string)) - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.Args["access_token"])) - resp, err := client.Do(req) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.Args["access_token"])) + req.Header.Set("User-Agent", UserAgent) + resp, err := http.DefaultClient.Do(req) if err != nil { - return nil, err + log.Fatal(err) } defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } + return body, nil } From 7af74aedffad22b24dd5ec23b945276153135cdb Mon Sep 17 00:00:00 2001 From: "roshan.r" Date: Tue, 16 Aug 2022 17:14:23 +0530 Subject: [PATCH 03/73] refactor --- providers/squadcast/squadcast_provider.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index c2d555a272..cf48b2c10d 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -32,17 +32,8 @@ type Meta struct { } type AppError struct { - Status int `json:"status"` - Message string `json:"error_message,omitempty"` - ConflictData *any `json:"conflict_data,omitempty"` - ErrorDetails *ErrorDetails `json:"error_details,omitempty"` -} - -type ErrorDetails struct { - Code string `json:"code"` - Description string `json:"description,omitempty"` - Link string `json:"link,omitempty"` - Errors any `json:"errors,omitempty"` + Status int `json:"status"` + Message string `json:"error_message,omitempty"` } const ( From 467b4ccb4f34ce3bad3d885a0fceee0fbe140d4b Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Wed, 17 Aug 2022 16:37:53 +0530 Subject: [PATCH 04/73] add refresh-token, region, team-name flag --- cmd/provider_cmd_squadcast.go | 12 ++++-- providers/squadcast/service.go | 52 +++++++++++++++++++++++ providers/squadcast/squadcast_provider.go | 31 ++++++++++++-- providers/squadcast/squadcast_service.go | 8 +++- providers/squadcast/user.go | 27 +++++++++--- 5 files changed, 115 insertions(+), 15 deletions(-) create mode 100644 providers/squadcast/service.go diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index dde250ce1f..bc1ab36b58 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -14,8 +14,10 @@ const ( ) func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { - var accessToken string - // accessToken := "" + var refreshToken string + var region string + var teamName string + cmd := &cobra.Command{ Use: "squadcast", Short: "Import current state to Terraform configuration from SquadCast", @@ -26,7 +28,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { endpoint = defaultSquadcastEndpoint } provider := newSquadcastProvider() - err := Import(provider, options, []string{accessToken}) + err := Import(provider, options, []string{refreshToken, region, teamName}) if err != nil { return err } @@ -35,7 +37,9 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { } cmd.AddCommand(listCmd(newSquadcastProvider())) baseProviderFlags(cmd.PersistentFlags(), &options, "user", "") - cmd.PersistentFlags().StringVarP(&accessToken, "access-token", "", "", "YOUR_SQUADCAST_ACCESS_TOKEN or env param SQUADCAST_ACCESS_TOKEN") + cmd.PersistentFlags().StringVarP(&refreshToken, "refresh-token", "", "", "YOUR_SQUADCAST_REFRESH_TOKEN or env param SQUADCAST_REFRESH_TOKEN") + cmd.PersistentFlags().StringVarP(®ion, "region", "", "", "") + cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "") return cmd } diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go new file mode 100644 index 0000000000..20a097d197 --- /dev/null +++ b/providers/squadcast/service.go @@ -0,0 +1,52 @@ +// service resource is yet to be implemented + +package squadcast + +import ( + "encoding/json" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type ServiceGenerator struct { + SquadcastService +} + +type Service struct { + ID string `json:"id" tf:"id"` + Name string `json:"name" tf:"name"` +} + +var responseService struct { + Data *[]Service `json:"data"` +} + +type Services []Service + +func (g *ServiceGenerator) createResources(services Services) []terraformutils.Resource { + var serviceList []terraformutils.Resource + for _, service := range services { + serviceList = append(serviceList, terraformutils.NewSimpleResource( + service.ID, + "service_"+(service.Name), + "squadcast_service", + "squadcast", + []string{}, + )) + } + return serviceList +} + +func (g *ServiceGenerator) InitResources() error { + body, err := g.generateRequest("https://api.squadcast.com/v3/services") + if err != nil { + return err + } + + err = json.Unmarshal(body, &responseService) + if err != nil { + return err + } + + g.Resources = g.createResources(*responseService.Data) + return nil +} diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index cf48b2c10d..bd3f56d91a 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -16,6 +16,8 @@ type SquadcastProvider struct { terraformutils.Provider accesstoken string refreshtoken string + region string + teamName string } type AccessToken struct { @@ -45,8 +47,20 @@ func (p *SquadcastProvider) Init(args []string) error { if refreshToken := os.Getenv("SQUADCAST_REFRESH_TOKEN"); refreshToken != "" { p.refreshtoken = os.Getenv("SQUADCAST_REFRESH_TOKEN") } + if args[0] != "" { + p.refreshtoken = args[0] + } if p.refreshtoken == "" { - return errors.New("requred refresh Token missing") + return errors.New("required refresh Token missing") + } + + if args[1] == "" { + return errors.New("required region missing") + } + p.region = args[1] + + if args[2] != "" { + p.teamName = args[2] } p.GetAccessToken() @@ -65,12 +79,14 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetArgs(map[string]interface{}{ "access_token": p.accesstoken, "refresh_token": p.refreshtoken, + "region": p.region, + "team_name": p.teamName, }) return nil } -func (p *SquadcastProvider) GetProviderData(arg ...string) map[string]interface{} { +func (p *SquadcastProvider) GetProviderData(...string) map[string]interface{} { return map[string]interface{}{} } @@ -84,7 +100,8 @@ func (p *SquadcastProvider) GetName() string { func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ - "user": &UserGenerator{}, + "user": &UserGenerator{}, + "service": &ServiceGenerator{}, } } @@ -107,7 +124,13 @@ func (p *SquadcastProvider) GetAccessToken() { *Meta } - defer resp.Body.Close() + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Fatal(err) + } + }(resp.Body) + bytes, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index fb685ca028..7ca78bbca3 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -3,6 +3,7 @@ package squadcast import ( "context" "fmt" + "io" "io/ioutil" "log" "net/http" @@ -29,7 +30,12 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { if err != nil { log.Fatal(err) } - defer resp.Body.Close() + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Fatal(err) + } + }(resp.Body) body, err := ioutil.ReadAll(resp.Body) if err != nil { diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 5b72a9c25d..1333e64c99 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -2,7 +2,8 @@ package squadcast import ( "encoding/json" - + "errors" + "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -20,9 +21,7 @@ var response struct { type Users []User -var UserAllowEmptyValues = []string{} - -func (g UserGenerator) createResources(users Users) []terraformutils.Resource { +func (g *UserGenerator) createResources(users Users) []terraformutils.Resource { var resources []terraformutils.Resource for _, user := range users { resources = append(resources, terraformutils.NewSimpleResource( @@ -37,8 +36,24 @@ func (g UserGenerator) createResources(users Users) []terraformutils.Resource { } func (g *UserGenerator) InitResources() error { - // body, err := g.generateRequest("https://api.squadcast.com/v3/organizations/5a4262733c36823b3ed91fb9/users") - body, err := g.generateRequest("https://api.squadcast.com/v3/users") + + var host string + switch g.Args["region"] { + case "us": + host = "squadcast.com" + case "eu": + host = "eu.squadcast.com" + case "internal": + host = "squadcast.xyz" + case "staging": + host = "squadcast.tech" + case "dev": + host = "localhost" + default: + return errors.New("unknown region") + } + + body, err := g.generateRequest(fmt.Sprintf("https://api.%s/v3/users", host)) if err != nil { return err } From 68e0d339faada2bfdf398038b3c91cb33bb78269 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Wed, 17 Aug 2022 17:48:08 +0530 Subject: [PATCH 05/73] fix: updated logic to get host --- .terraform.lock.hcl | 24 ------------------------ providers/squadcast/squadcast_service.go | 18 +++++++++++++++++- providers/squadcast/user.go | 22 ++-------------------- 3 files changed, 19 insertions(+), 45 deletions(-) delete mode 100644 .terraform.lock.hcl diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl deleted file mode 100644 index 3a6ba4c99e..0000000000 --- a/.terraform.lock.hcl +++ /dev/null @@ -1,24 +0,0 @@ -# This file is maintained automatically by "terraform init". -# Manual edits may be lost in future updates. - -provider "registry.terraform.io/squadcasthub/squadcast" { - version = "1.0.4" - constraints = "1.0.4" - hashes = [ - "h1:EWLsWeZpI4OftTttQrpn9KEKabdIQhm8mWnp9Xljxvg=", - "zh:352693bcacd608230372f1adb108fe57680e453f4acedbb297ba0c2907806175", - "zh:3dad9049e863b84f010927550e54c674ef367b6fa30326decbe15ca3785fada5", - "zh:4de04117c1b14102839550e8610ea112c7e1b527b16f7fe31e0a40f43573cd58", - "zh:5786b0df49f42bc22577c676f43efc087153009b5b03a005c6777c6a1ed180bd", - "zh:58fe837206083d171c8b4225a06a3a017005fad39397893d202666f0e8e23657", - "zh:6645804c94298ff0b8e7e57bb7fa782feb454cec6e0789e89c3394d74393fe34", - "zh:84e801e1c391bf436259a1e7671a8ca2d20ebbe7db2b2e0af08892cb1d5c9370", - "zh:a8f8926432512c5f1d806b6134855c76149d7544076dd63ac4dd4568a5a61b61", - "zh:cb3a47f91ecf7f5958584ae6174095749f0eeac0082d18e5413e4e756f349d9c", - "zh:d5f72213408bc159becbc00a9031c1e8f7821585b12a9a8bd1b29051c528952b", - "zh:e13d435f71db674b847e055d92ca59db2818d8de45234bf7bcd4af5ca1aa9e23", - "zh:e3faf132b256b63a69a2802ff72d98de48c4f685a9b986d02c03d84621258e8e", - "zh:e84c0bde50d0a8a7c6f19595cd9717bf7cabaede135936bbdc57d51a9f00b0b5", - "zh:ffd120cf1aafb1ab1035833bef3d371fcf2ce50403ae9bdaeb389ab224e96938", - ] -} diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 7ca78bbca3..0b436df3d3 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -2,6 +2,7 @@ package squadcast import ( "context" + "errors" "fmt" "io" "io/ioutil" @@ -16,9 +17,24 @@ type SquadcastService struct { } func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { + var host string + switch s.Args["region"] { + case "us": + host = "squadcast.com" + case "eu": + host = "eu.squadcast.com" + case "internal": + host = "squadcast.xyz" + case "staging": + host = "squadcast.tech" + case "dev": + host = "localhost" + default: + return nil, errors.New("unknown region") + } ctx := context.Background() - req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://api.%s%s",host,uri), nil) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 1333e64c99..f782b692ea 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -2,8 +2,7 @@ package squadcast import ( "encoding/json" - "errors" - "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -36,24 +35,7 @@ func (g *UserGenerator) createResources(users Users) []terraformutils.Resource { } func (g *UserGenerator) InitResources() error { - - var host string - switch g.Args["region"] { - case "us": - host = "squadcast.com" - case "eu": - host = "eu.squadcast.com" - case "internal": - host = "squadcast.xyz" - case "staging": - host = "squadcast.tech" - case "dev": - host = "localhost" - default: - return errors.New("unknown region") - } - - body, err := g.generateRequest(fmt.Sprintf("https://api.%s/v3/users", host)) + body, err := g.generateRequest("/v3/users") if err != nil { return err } From d1e65785f031e7928c1b765f737726bb8d4b2ba5 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Wed, 17 Aug 2022 18:45:44 +0530 Subject: [PATCH 06/73] feat: added team resource to squadcast provider --- providers/squadcast/squadcast_provider.go | 1 + providers/squadcast/team.go | 51 +++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 providers/squadcast/team.go diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index bd3f56d91a..89f5ef4a2b 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -102,6 +102,7 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv return map[string]terraformutils.ServiceGenerator{ "user": &UserGenerator{}, "service": &ServiceGenerator{}, + "team": &TeamGenerator{}, } } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go new file mode 100644 index 0000000000..bc071753a8 --- /dev/null +++ b/providers/squadcast/team.go @@ -0,0 +1,51 @@ +package squadcast + +import ( + "encoding/json" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type TeamGenerator struct { + SquadcastService +} + +type Team struct { + ID string `json:"id" tf:"id"` + Name string `json:"name" tf:"name"` +} + +var responseTeam struct { + Data *[]Team `json:"data"` +} + +type Teams []Team + +func (g *TeamGenerator) createResources(teams Teams) []terraformutils.Resource { + var teamList []terraformutils.Resource + for _, team := range teams { + teamList = append(teamList, terraformutils.NewSimpleResource( + team.ID, + (team.Name), + "squadcast_team", + "squadcast", + []string{}, + )) + } + return teamList +} + +func (g *TeamGenerator) InitResources() error { + body, err := g.generateRequest("/v3/teams") + if err != nil { + return err + } + + err = json.Unmarshal(body, &responseTeam) + if err != nil { + return err + } + + g.Resources = g.createResources(*responseTeam.Data) + + return nil +} From aa9a7f3b98f6b371fdc3ac8524a552f3ee156fe0 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Thu, 18 Aug 2022 11:34:50 +0530 Subject: [PATCH 07/73] fix: added logic for different region --- providers/squadcast/squadcast_provider.go | 12 ++- providers/squadcast/squadcast_service.go | 26 +++--- providers/squadcast/team.go | 28 ++++-- providers/squadcast/team_member.go | 101 ++++++++++++++++++++++ 4 files changed, 146 insertions(+), 21 deletions(-) create mode 100644 providers/squadcast/team_member.go diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 89f5ef4a2b..bb7fa4c40c 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "errors" + "fmt" "io" "log" "net/http" @@ -100,15 +101,18 @@ func (p *SquadcastProvider) GetName() string { func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ - "user": &UserGenerator{}, - "service": &ServiceGenerator{}, - "team": &TeamGenerator{}, + "user": &UserGenerator{}, + "service": &ServiceGenerator{}, + "team": &TeamGenerator{}, + "team_member": &TeamMemberGenerator{}, } } func (p *SquadcastProvider) GetAccessToken() { + host := GetHost(p.region) ctx := context.Background() - req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://auth.squadcast.com/oauth/access-token", nil) + //req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://auth.squadcast.com/oauth/access-token", nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://auth.%s/oauth/access-token", host), nil) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 0b436df3d3..572a724d75 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -2,7 +2,6 @@ package squadcast import ( "context" - "errors" "fmt" "io" "io/ioutil" @@ -16,25 +15,30 @@ type SquadcastService struct { terraformutils.Service } -func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { - var host string - switch s.Args["region"] { +func GetHost(region string) string { + switch region { case "us": - host = "squadcast.com" + return "squadcast.com" case "eu": - host = "eu.squadcast.com" + return "eu.squadcast.com" case "internal": - host = "squadcast.xyz" + return "squadcast.xyz" case "staging": - host = "squadcast.tech" + return "squadcast.tech" case "dev": - host = "localhost" + return "localhost" default: - return nil, errors.New("unknown region") + return "" } +} +func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { + host := GetHost(s.Args["region"].(string)) + if host == "" { + log.Fatal("unknown region") + } ctx := context.Background() - req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://api.%s%s",host,uri), nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://api.%s%s", host, uri), nil) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index bc071753a8..bf2b42e2a8 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -10,11 +10,27 @@ type TeamGenerator struct { } type Team struct { - ID string `json:"id" tf:"id"` - Name string `json:"name" tf:"name"` + ID string `json:"id" tf:"id"` + Name string `json:"name" tf:"name"` + Description string `json:"description" tf:"description"` + Default bool `json:"default" tf:"default"` + Members []*DataTeamMember `json:"members" tf:"-"` + Roles []*TeamRole `json:"roles" tf:"-"` } -var responseTeam struct { +type DataTeamMember struct { + UserID string `json:"user_id" tf:"user_id"` + RoleIDs []string `json:"role_ids" tf:"role_ids"` +} + +type TeamRole struct { + ID string `json:"id" tf:"id"` + Name string `json:"name" tf:"name"` + Slug string `json:"slug" tf:"-"` + Default bool `json:"default" tf:"default"` +} + +var responseTeams struct { Data *[]Team `json:"data"` } @@ -25,7 +41,7 @@ func (g *TeamGenerator) createResources(teams Teams) []terraformutils.Resource { for _, team := range teams { teamList = append(teamList, terraformutils.NewSimpleResource( team.ID, - (team.Name), + team.Name, "squadcast_team", "squadcast", []string{}, @@ -40,12 +56,12 @@ func (g *TeamGenerator) InitResources() error { return err } - err = json.Unmarshal(body, &responseTeam) + err = json.Unmarshal(body, &responseTeams) if err != nil { return err } - g.Resources = g.createResources(*responseTeam.Data) + g.Resources = g.createResources(*responseTeams.Data) return nil } diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go new file mode 100644 index 0000000000..f2c1d8a159 --- /dev/null +++ b/providers/squadcast/team_member.go @@ -0,0 +1,101 @@ +package squadcast + +import ( + "encoding/json" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type TeamMemberGenerator struct { + SquadcastService +} + +var responseTeam struct { + Data *Team `json:"data"` +} + +func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resource { + var teamMemberList []terraformutils.Resource + for _, member := range team.Members { + teamMemberList = append(teamMemberList, terraformutils.NewSimpleResource( + member.UserID, + "squadcast_team_member_"+(member.UserID), + "squadcast_team", + "squadcast", + []string{}, + )) + } + return teamMemberList +} + +func (g *TeamMemberGenerator) InitResources() error { + body, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + + err = json.Unmarshal(body, &responseTeam) + if err != nil { + return err + } + + g.Resources = g.createResources(*responseTeam.Data) + + return nil +} + +//type TeamMemberGenerator struct { +// SquadcastService +// team Team +//} +// +//type TeamMember struct { +// ID string `json:"id" tf:"id"` +// UserID string `json:"user_id" tf:"user_id"` +// RoleIDs []string `json:"role_ids" tf:"role_ids"` +//} +// +//type TeamMembers []TeamMember +// +//func (g *TeamMemberGenerator) filterTeam(teams Teams) { +// for _, team := range teams { +// if team.Name == g.Args["team_name"] { +// g.team = team +// return +// } +// } +// +// log.Fatal("team not found") +//} +// +//func (g *TeamMemberGenerator) createResources() []terraformutils.Resource { +// var teamMemberList []terraformutils.Resource +// for _, member := range g.team.Members { +// teamMemberList = append(teamMemberList, terraformutils.NewSimpleResource( +// member.UserID, +// "team_member_"+(member.UserID), +// "squadcast_team_member", +// "squadcast", +// []string{}, +// )) +// } +// return teamMemberList +//} +// +//func (g *TeamMemberGenerator) InitResources() error { +// body, err := g.generateRequest("/v3/teams") +// if err != nil { +// return err +// } +// +// err = json.Unmarshal(body, &ResponseTeam) +// if err != nil { +// return err +// } +// +// g.filterTeam(*ResponseTeam.Data) +// g.Resources = g.createResources() +// +// return nil +//} From 658ea6b7e77c7f5f6801e588c288b40464bfa246 Mon Sep 17 00:00:00 2001 From: "roshan.r" Date: Thu, 18 Aug 2022 16:19:00 +0530 Subject: [PATCH 08/73] fix: Pass region env variable to terraform provider --- providers/squadcast/squadcast_provider.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index bb7fa4c40c..bb60255cd1 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -55,10 +55,17 @@ func (p *SquadcastProvider) Init(args []string) error { return errors.New("required refresh Token missing") } - if args[1] == "" { + if region := os.Getenv("SQUADCAST_REGION"); region != "" { + p.region = os.Getenv("SQUADCAST_REGION") + } + if p.region == "" { return errors.New("required region missing") } - p.region = args[1] + + // if args[1] == "" { + // return errors.New("required region missing") + // } + // p.region = args[1] if args[2] != "" { p.teamName = args[2] From 5a2da867b8ac0f8fae140f9e2fd1968013edf1e5 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Thu, 18 Aug 2022 17:56:10 +0530 Subject: [PATCH 09/73] fix: user service for eu is fixed --- cmd/provider_cmd_squadcast.go | 19 ++++++++++++------ providers/squadcast/squadcast_provider.go | 24 +++++++++++++++-------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index bc1ab36b58..796dfef079 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -1,6 +1,7 @@ package cmd import ( + "log" "os" squadcast_terraforming "github.com/GoogleCloudPlatform/terraformer/providers/squadcast" @@ -15,7 +16,6 @@ const ( func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { var refreshToken string - var region string var teamName string cmd := &cobra.Command{ @@ -27,10 +27,17 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { if len(endpoint) == 0 { endpoint = defaultSquadcastEndpoint } - provider := newSquadcastProvider() - err := Import(provider, options, []string{refreshToken, region, teamName}) - if err != nil { - return err + + originalPathPattern := options.PathPattern + for _, region := range options.Regions { + provider := newSquadcastProvider() + options.PathPattern = originalPathPattern + options.PathPattern += region + "/" + log.Println(provider.GetName() + " importing region " + region) + err := Import(provider, options, []string{refreshToken, region, teamName}) + if err != nil { + return err + } } return nil }, @@ -38,7 +45,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { cmd.AddCommand(listCmd(newSquadcastProvider())) baseProviderFlags(cmd.PersistentFlags(), &options, "user", "") cmd.PersistentFlags().StringVarP(&refreshToken, "refresh-token", "", "", "YOUR_SQUADCAST_REFRESH_TOKEN or env param SQUADCAST_REFRESH_TOKEN") - cmd.PersistentFlags().StringVarP(®ion, "region", "", "", "") + cmd.PersistentFlags().StringSliceVarP(&options.Regions, "region", "", []string{}, "") cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "") return cmd } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index bb60255cd1..4db7c419be 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/zclconf/go-cty/cty" "io" "log" "net/http" @@ -58,14 +59,10 @@ func (p *SquadcastProvider) Init(args []string) error { if region := os.Getenv("SQUADCAST_REGION"); region != "" { p.region = os.Getenv("SQUADCAST_REGION") } - if p.region == "" { + if args[1] == "" { return errors.New("required region missing") } - - // if args[1] == "" { - // return errors.New("required region missing") - // } - // p.region = args[1] + p.region = args[1] if args[2] != "" { p.teamName = args[2] @@ -90,12 +87,23 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error "region": p.region, "team_name": p.teamName, }) - return nil } +func (p *SquadcastProvider) GetConfig() cty.Value { + return cty.ObjectVal(map[string]cty.Value{ + "region": cty.StringVal(p.region), + }) +} + func (p *SquadcastProvider) GetProviderData(...string) map[string]interface{} { - return map[string]interface{}{} + return map[string]interface{}{ + "provider": map[string]interface{}{ + "squadcast": map[string]interface{}{ + "region": p.region, + }, + }, + } } func (p *SquadcastProvider) GetResourceConnections() map[string]map[string][]string { From e18869dfba0900bc39421fdf0ce12f07e49ee619 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Fri, 19 Aug 2022 14:08:16 +0530 Subject: [PATCH 10/73] feat: added team roles and escalation policy to squadcast provider --- providers/squadcast/escalation_policy.go | 72 ++++++++++++++++++++++ providers/squadcast/squadcast_provider.go | 10 ++-- providers/squadcast/team.go | 7 --- providers/squadcast/team_member.go | 73 ++++------------------- providers/squadcast/team_roles.go | 73 +++++++++++++++++++++++ 5 files changed, 163 insertions(+), 72 deletions(-) create mode 100644 providers/squadcast/escalation_policy.go create mode 100644 providers/squadcast/team_roles.go diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go new file mode 100644 index 0000000000..473357d575 --- /dev/null +++ b/providers/squadcast/escalation_policy.go @@ -0,0 +1,72 @@ +package squadcast + +import ( + "encoding/json" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "log" + "net/url" +) + +type EscalationPolicyGenerator struct { + SquadcastService + teamID string +} + +var responseEscalationPolicy struct { + Data *[]EscalationPolicy `json:"data"` +} + +type EscalationPolicy struct { + ID string `json:"id"` + Name string `json:"name"` +} + +type EscalationPolicies []EscalationPolicy + +func (g *EscalationPolicyGenerator) createResources(policies EscalationPolicies) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, policy := range policies { + resourceList = append(resourceList, terraformutils.NewResource( + policy.ID, + "policy_"+(policy.ID), + "squadcast_escalation_policy", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *EscalationPolicyGenerator) InitResources() error { + if len(g.Args["team_name"].(string)) == 0 { + log.Fatal("--team-name is required") + } + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &ResponseTeam) + if err != nil { + return err + } + g.teamID = ResponseTeam.Data.ID + + body, err := g.generateRequest(fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.teamID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &responseEscalationPolicy) + if err != nil { + return err + } + + g.Resources = g.createResources(*responseEscalationPolicy.Data) + + return nil +} diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 4db7c419be..49983e2362 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -116,10 +116,12 @@ func (p *SquadcastProvider) GetName() string { func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ - "user": &UserGenerator{}, - "service": &ServiceGenerator{}, - "team": &TeamGenerator{}, - "team_member": &TeamMemberGenerator{}, + "user": &UserGenerator{}, + "service": &ServiceGenerator{}, + "team": &TeamGenerator{}, + "team_member": &TeamMemberGenerator{}, + "team_roles": &TeamRolesGenerator{}, + "escalation_policy": &EscalationPolicyGenerator{}, } } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index bf2b42e2a8..4b54869e14 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -23,13 +23,6 @@ type DataTeamMember struct { RoleIDs []string `json:"role_ids" tf:"role_ids"` } -type TeamRole struct { - ID string `json:"id" tf:"id"` - Name string `json:"name" tf:"name"` - Slug string `json:"slug" tf:"-"` - Default bool `json:"default" tf:"default"` -} - var responseTeams struct { Data *[]Team `json:"data"` } diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index f2c1d8a159..e950ced906 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -9,21 +9,27 @@ import ( type TeamMemberGenerator struct { SquadcastService + teamID string } -var responseTeam struct { +var ResponseTeam struct { Data *Team `json:"data"` } func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resource { var teamMemberList []terraformutils.Resource + g.teamID = team.ID for _, member := range team.Members { - teamMemberList = append(teamMemberList, terraformutils.NewSimpleResource( + teamMemberList = append(teamMemberList, terraformutils.NewResource( member.UserID, "squadcast_team_member_"+(member.UserID), - "squadcast_team", - "squadcast", + "squadcast_team_member", + g.ProviderName, + map[string]string{ + "team_id": g.teamID, + }, []string{}, + map[string]interface{}{}, )) } return teamMemberList @@ -35,67 +41,12 @@ func (g *TeamMemberGenerator) InitResources() error { return err } - err = json.Unmarshal(body, &responseTeam) + err = json.Unmarshal(body, &ResponseTeam) if err != nil { return err } - g.Resources = g.createResources(*responseTeam.Data) + g.Resources = g.createResources(*ResponseTeam.Data) return nil } - -//type TeamMemberGenerator struct { -// SquadcastService -// team Team -//} -// -//type TeamMember struct { -// ID string `json:"id" tf:"id"` -// UserID string `json:"user_id" tf:"user_id"` -// RoleIDs []string `json:"role_ids" tf:"role_ids"` -//} -// -//type TeamMembers []TeamMember -// -//func (g *TeamMemberGenerator) filterTeam(teams Teams) { -// for _, team := range teams { -// if team.Name == g.Args["team_name"] { -// g.team = team -// return -// } -// } -// -// log.Fatal("team not found") -//} -// -//func (g *TeamMemberGenerator) createResources() []terraformutils.Resource { -// var teamMemberList []terraformutils.Resource -// for _, member := range g.team.Members { -// teamMemberList = append(teamMemberList, terraformutils.NewSimpleResource( -// member.UserID, -// "team_member_"+(member.UserID), -// "squadcast_team_member", -// "squadcast", -// []string{}, -// )) -// } -// return teamMemberList -//} -// -//func (g *TeamMemberGenerator) InitResources() error { -// body, err := g.generateRequest("/v3/teams") -// if err != nil { -// return err -// } -// -// err = json.Unmarshal(body, &ResponseTeam) -// if err != nil { -// return err -// } -// -// g.filterTeam(*ResponseTeam.Data) -// g.Resources = g.createResources() -// -// return nil -//} diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go new file mode 100644 index 0000000000..2b2d6dfba4 --- /dev/null +++ b/providers/squadcast/team_roles.go @@ -0,0 +1,73 @@ +package squadcast + +import ( + "encoding/json" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "log" + "net/url" +) + +type TeamRolesGenerator struct { + SquadcastService + teamID string +} + +type TeamRole struct { + ID string `json:"id" tf:"id"` + Name string `json:"name" tf:"name"` + Slug string `json:"slug" tf:"-"` + Default bool `json:"default" tf:"default"` +} + +type TeamRoles []TeamRole + +var responseTeamRoles struct { + Data *[]TeamRole `json:"data"` +} + +func (g *TeamRolesGenerator) createResources(teamRoles TeamRoles) []terraformutils.Resource { + var teamRolesList []terraformutils.Resource + for _, role := range teamRoles { + teamRolesList = append(teamRolesList, terraformutils.NewResource( + role.ID, + "team_role_"+(role.ID), + "squadcast_team_role", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return teamRolesList +} + +func (g *TeamRolesGenerator) InitResources() error { + if len(g.Args["team_name"].(string)) == 0 { + log.Fatal("team_name is required") + } + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &ResponseTeam) + if err != nil { + return err + } + g.teamID = ResponseTeam.Data.ID + + body, err := g.generateRequest(fmt.Sprintf("/v3/teams/%s/roles", g.teamID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &responseTeamRoles) + if err != nil { + return err + } + g.Resources = g.createResources(*responseTeamRoles.Data) + + return nil +} From 621efc6a4b7a0725f729d6234a2b6243f2bcf93f Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Fri, 19 Aug 2022 14:50:55 +0530 Subject: [PATCH 11/73] feat: added team member resource to squadcast provider --- providers/squadcast/escalation_policy.go | 4 ++-- providers/squadcast/team_member.go | 4 ++++ providers/squadcast/team_roles.go | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 473357d575..01aaaa480e 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -2,9 +2,9 @@ package squadcast import ( "encoding/json" + "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "log" "net/url" ) @@ -45,7 +45,7 @@ func (g *EscalationPolicyGenerator) createResources(policies EscalationPolicies) func (g *EscalationPolicyGenerator) InitResources() error { if len(g.Args["team_name"].(string)) == 0 { - log.Fatal("--team-name is required") + return errors.New("--team-name is required") } team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) if err != nil { diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index e950ced906..a565aa6fa4 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -2,6 +2,7 @@ package squadcast import ( "encoding/json" + "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" "net/url" @@ -36,6 +37,9 @@ func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resour } func (g *TeamMemberGenerator) InitResources() error { + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } body, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) if err != nil { return err diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 2b2d6dfba4..e0cae0d461 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -2,9 +2,9 @@ package squadcast import ( "encoding/json" + "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "log" "net/url" ) @@ -47,7 +47,7 @@ func (g *TeamRolesGenerator) createResources(teamRoles TeamRoles) []terraformuti func (g *TeamRolesGenerator) InitResources() error { if len(g.Args["team_name"].(string)) == 0 { - log.Fatal("team_name is required") + return errors.New("--team-name is required") } team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) if err != nil { From 0715a895c533170f3297e757ef55f056b8211318 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Fri, 19 Aug 2022 15:27:29 +0530 Subject: [PATCH 12/73] feat: added service resource to squadcast provider --- providers/squadcast/service.go | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index 20a097d197..657ca14061 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -4,11 +4,15 @@ package squadcast import ( "encoding/json" + "errors" + "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" ) type ServiceGenerator struct { SquadcastService + teamID string } type Service struct { @@ -25,23 +29,39 @@ type Services []Service func (g *ServiceGenerator) createResources(services Services) []terraformutils.Resource { var serviceList []terraformutils.Resource for _, service := range services { - serviceList = append(serviceList, terraformutils.NewSimpleResource( + serviceList = append(serviceList, terraformutils.NewResource( service.ID, "service_"+(service.Name), "squadcast_service", - "squadcast", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + }, []string{}, + map[string]interface{}{}, )) } return serviceList } func (g *ServiceGenerator) InitResources() error { - body, err := g.generateRequest("https://api.squadcast.com/v3/services") + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &ResponseTeam) if err != nil { return err } + g.teamID = ResponseTeam.Data.ID + body, err := g.generateRequest("/v3/services") + if err != nil { + return err + } err = json.Unmarshal(body, &responseService) if err != nil { return err From e9b9b10893f6c019f70bc0ef72310fc32e3d9236 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Fri, 19 Aug 2022 16:36:50 +0530 Subject: [PATCH 13/73] fix: overriding refresh token through cli --- providers/squadcast/squadcast_provider.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 49983e2362..245ef919de 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -92,7 +92,8 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error func (p *SquadcastProvider) GetConfig() cty.Value { return cty.ObjectVal(map[string]cty.Value{ - "region": cty.StringVal(p.region), + "region": cty.StringVal(p.region), + "refresh_token": cty.StringVal(p.refreshtoken), }) } From 9056a67997343b1751a653ce63e9f42a2f790cf7 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Fri, 19 Aug 2022 18:39:06 +0530 Subject: [PATCH 14/73] feat: Added all resources and refactored code --- cmd/provider_cmd_squadcast.go | 1 - providers/squadcast/escalation_policy.go | 34 ++++++---- providers/squadcast/service.go | 30 ++++++--- providers/squadcast/squad.go | 81 +++++++++++++++++++++++ providers/squadcast/squadcast_provider.go | 9 ++- providers/squadcast/squadcast_service.go | 4 +- providers/squadcast/team.go | 10 +-- providers/squadcast/team_member.go | 18 +++-- providers/squadcast/team_roles.go | 28 +++++--- providers/squadcast/user.go | 9 +-- 10 files changed, 173 insertions(+), 51 deletions(-) create mode 100644 providers/squadcast/squad.go diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index 796dfef079..d80690a79e 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -27,7 +27,6 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { if len(endpoint) == 0 { endpoint = defaultSquadcastEndpoint } - originalPathPattern := options.PathPattern for _, region := range options.Regions { provider := newSquadcastProvider() diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 01aaaa480e..029bbadd1e 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -4,8 +4,9 @@ import ( "encoding/json" "errors" "fmt" - "github.com/GoogleCloudPlatform/terraformer/terraformutils" "net/url" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type EscalationPolicyGenerator struct { @@ -13,10 +14,6 @@ type EscalationPolicyGenerator struct { teamID string } -var responseEscalationPolicy struct { - Data *[]EscalationPolicy `json:"data"` -} - type EscalationPolicy struct { ID string `json:"id"` Name string `json:"name"` @@ -24,6 +21,10 @@ type EscalationPolicy struct { type EscalationPolicies []EscalationPolicy +var getEscalationPolicyResponse struct { + Data *[]EscalationPolicy `json:"data"` +} + func (g *EscalationPolicyGenerator) createResources(policies EscalationPolicies) []terraformutils.Resource { var resourceList []terraformutils.Resource for _, policy := range policies { @@ -44,29 +45,38 @@ func (g *EscalationPolicyGenerator) createResources(policies EscalationPolicies) } func (g *EscalationPolicyGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { + teamName := g.Args["team_name"].(string) + if len(teamName) == 0 { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + + escapedTeamName := url.QueryEscape(teamName) + getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) + + team, err := g.generateRequest(getTeamURL) if err != nil { return err } - err = json.Unmarshal(team, &ResponseTeam) + + err = json.Unmarshal(team, &getTeamResponse) if err != nil { return err } - g.teamID = ResponseTeam.Data.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.teamID)) + g.teamID = getTeamResponse.Data.ID + + getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.teamID) + body, err := g.generateRequest(getEscalationPolicyURL) if err != nil { return err } - err = json.Unmarshal(body, &responseEscalationPolicy) + + err = json.Unmarshal(body, &getEscalationPolicyResponse) if err != nil { return err } - g.Resources = g.createResources(*responseEscalationPolicy.Data) + g.Resources = g.createResources(*getEscalationPolicyResponse.Data) return nil } diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index 657ca14061..22180c508c 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -6,8 +6,9 @@ import ( "encoding/json" "errors" "fmt" - "github.com/GoogleCloudPlatform/terraformer/terraformutils" "net/url" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type ServiceGenerator struct { @@ -20,12 +21,12 @@ type Service struct { Name string `json:"name" tf:"name"` } -var responseService struct { +type Services []Service + +var getServicesResponse struct { Data *[]Service `json:"data"` } -type Services []Service - func (g *ServiceGenerator) createResources(services Services) []terraformutils.Resource { var serviceList []terraformutils.Resource for _, service := range services { @@ -45,28 +46,35 @@ func (g *ServiceGenerator) createResources(services Services) []terraformutils.R } func (g *ServiceGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { + teamName := g.Args["team_name"].(string) + if len(teamName) == 0 { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + + escapedTeamName := url.QueryEscape(teamName) + getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) + team, err := g.generateRequest(getTeamURL) if err != nil { return err } - err = json.Unmarshal(team, &ResponseTeam) + + err = json.Unmarshal(team, &getTeamResponse) if err != nil { return err } - g.teamID = ResponseTeam.Data.ID + g.teamID = getTeamResponse.Data.ID - body, err := g.generateRequest("/v3/services") + getServicesURL := "/v3/services" + body, err := g.generateRequest(getServicesURL) if err != nil { return err } - err = json.Unmarshal(body, &responseService) + + err = json.Unmarshal(body, &getServicesResponse) if err != nil { return err } - g.Resources = g.createResources(*responseService.Data) + g.Resources = g.createResources(*getServicesResponse.Data) return nil } diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go new file mode 100644 index 0000000000..82c81ec8c3 --- /dev/null +++ b/providers/squadcast/squad.go @@ -0,0 +1,81 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "net/url" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type SquadGenerator struct { + SquadcastService + teamID string +} + +type Squad struct { + ID string `json:"id" tf:"id"` + Name string `json:"name" tf:"name"` +} + +var getSquadsResponse struct { + Data *[]Squad `json:"data"` +} + +type Squads []Squad + +func (g *SquadGenerator) createResources(squads Squads) []terraformutils.Resource { + var resources []terraformutils.Resource + for _, squad := range squads { + resources = append(resources, terraformutils.NewResource( + squad.ID, + squad.Name, + "squadcast_squad", + "squadcast", + map[string]string{ + "team_id": g.teamID, + "name": squad.Name, + }, + []string{}, + map[string]interface{}{}, + )) + } + return resources +} + +func (g *SquadGenerator) InitResources() error { + teamName := g.Args["team_name"].(string) + if(teamName == "") { + return errors.New("--team-name is required") + } + + escapedTeamName := url.QueryEscape(teamName) + getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s",escapedTeamName) + + team, err := g.generateRequest(getTeamURL) + if err != nil { + return err + } + + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + + g.teamID = getTeamResponse.Data.ID + + getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", g.teamID); + body, err := g.generateRequest(getSquadsURL) + if err != nil { + return err + } + + err = json.Unmarshal(body, &getSquadsResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getSquadsResponse.Data) + return nil +} diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 245ef919de..5dd614c333 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -5,12 +5,13 @@ import ( "encoding/json" "errors" "fmt" - "github.com/zclconf/go-cty/cty" "io" "log" "net/http" "os" + "github.com/zclconf/go-cty/cty" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -30,7 +31,7 @@ type AccessToken struct { RefreshToken string `json:"refresh_token"` } -// Meta holds the status of the request informations +// Meta holds the status of the request information type Meta struct { Meta AppError `json:"meta,omitempty"` } @@ -119,6 +120,7 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv return map[string]terraformutils.ServiceGenerator{ "user": &UserGenerator{}, "service": &ServiceGenerator{}, + "squad": &SquadGenerator{}, "team": &TeamGenerator{}, "team_member": &TeamMemberGenerator{}, "team_roles": &TeamRolesGenerator{}, @@ -129,11 +131,12 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv func (p *SquadcastProvider) GetAccessToken() { host := GetHost(p.region) ctx := context.Background() - //req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://auth.squadcast.com/oauth/access-token", nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://auth.%s/oauth/access-token", host), nil) if err != nil { log.Fatal(err) } + req.Header.Set("X-Refresh-Token", p.refreshtoken) req.Header.Set("User-Agent", UserAgent) diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 572a724d75..263f893bad 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -43,7 +43,9 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { log.Fatal(err) } - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.Args["access_token"])) + AccessToken := fmt.Sprintf("Bearer %s", s.Args["access_token"]) + + req.Header.Set("Authorization", AccessToken) req.Header.Set("User-Agent", UserAgent) resp, err := http.DefaultClient.Do(req) diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index 4b54869e14..d875dc88e9 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -2,6 +2,7 @@ package squadcast import ( "encoding/json" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -23,7 +24,7 @@ type DataTeamMember struct { RoleIDs []string `json:"role_ids" tf:"role_ids"` } -var responseTeams struct { +var getTeamsResponse struct { Data *[]Team `json:"data"` } @@ -44,17 +45,18 @@ func (g *TeamGenerator) createResources(teams Teams) []terraformutils.Resource { } func (g *TeamGenerator) InitResources() error { - body, err := g.generateRequest("/v3/teams") + getTeamsURL := "/v3/teams" + body, err := g.generateRequest(getTeamsURL) if err != nil { return err } - err = json.Unmarshal(body, &responseTeams) + err = json.Unmarshal(body, &getTeamsResponse) if err != nil { return err } - g.Resources = g.createResources(*responseTeams.Data) + g.Resources = g.createResources(*getTeamsResponse.Data) return nil } diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index a565aa6fa4..a4a60db744 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -4,8 +4,9 @@ import ( "encoding/json" "errors" "fmt" - "github.com/GoogleCloudPlatform/terraformer/terraformutils" "net/url" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type TeamMemberGenerator struct { @@ -13,7 +14,7 @@ type TeamMemberGenerator struct { teamID string } -var ResponseTeam struct { +var getTeamResponse struct { Data *Team `json:"data"` } @@ -37,20 +38,25 @@ func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resour } func (g *TeamMemberGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { + teamName := g.Args["team_name"].(string) + if len(teamName) == 0 { return errors.New("--team-name is required") } - body, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + + escapedTeamName := url.QueryEscape(teamName) + getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) + + body, err := g.generateRequest(getTeamURL) if err != nil { return err } - err = json.Unmarshal(body, &ResponseTeam) + err = json.Unmarshal(body, &getTeamResponse) if err != nil { return err } - g.Resources = g.createResources(*ResponseTeam.Data) + g.Resources = g.createResources(*getTeamResponse.Data) return nil } diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index e0cae0d461..6273b3dc22 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -4,8 +4,9 @@ import ( "encoding/json" "errors" "fmt" - "github.com/GoogleCloudPlatform/terraformer/terraformutils" "net/url" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type TeamRolesGenerator struct { @@ -22,7 +23,7 @@ type TeamRole struct { type TeamRoles []TeamRole -var responseTeamRoles struct { +var getTeamRolesResponse struct { Data *[]TeamRole `json:"data"` } @@ -46,28 +47,37 @@ func (g *TeamRolesGenerator) createResources(teamRoles TeamRoles) []terraformuti } func (g *TeamRolesGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { + teamName := g.Args["team_name"].(string) + if(teamName == "") { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + + escapedTeamName := url.QueryEscape(teamName) + getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s",escapedTeamName) + + team, err := g.generateRequest(getTeamURL) if err != nil { return err } - err = json.Unmarshal(team, &ResponseTeam) + + err = json.Unmarshal(team, &getTeamResponse) if err != nil { return err } - g.teamID = ResponseTeam.Data.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/teams/%s/roles", g.teamID)) + g.teamID = getTeamResponse.Data.ID + getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", g.teamID) + + body, err := g.generateRequest(getTeamRolesURL) if err != nil { return err } - err = json.Unmarshal(body, &responseTeamRoles) + + err = json.Unmarshal(body, &getTeamRolesResponse) if err != nil { return err } - g.Resources = g.createResources(*responseTeamRoles.Data) + g.Resources = g.createResources(*getTeamRolesResponse.Data) return nil } diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index f782b692ea..6314e2446b 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -14,7 +14,7 @@ type User struct { ID string `json:"id" tf:"id"` } -var response struct { +var getUsersResponse struct { Data *[]User `json:"data"` } @@ -35,16 +35,17 @@ func (g *UserGenerator) createResources(users Users) []terraformutils.Resource { } func (g *UserGenerator) InitResources() error { - body, err := g.generateRequest("/v3/users") + getUsersURL := "/v3/users" + body, err := g.generateRequest(getUsersURL) if err != nil { return err } - err = json.Unmarshal(body, &response) + err = json.Unmarshal(body, &getUsersResponse) if err != nil { return err } - g.Resources = g.createResources(*response.Data) + g.Resources = g.createResources(*getUsersResponse.Data) return nil } From bb066eed1fe7d7ce863e6ffd69d551f2022f06fc Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Mon, 22 Aug 2022 11:36:27 +0530 Subject: [PATCH 15/73] Added Squadcast docs --- docs/squadcast.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 docs/squadcast.md diff --git a/docs/squadcast.md b/docs/squadcast.md new file mode 100644 index 0000000000..5b998e2682 --- /dev/null +++ b/docs/squadcast.md @@ -0,0 +1,58 @@ +# Use with Squadcast + +Syntax: + +`export SQUADCAST_REFRESH_TOKEN=` + +OR set SQUADCAST_REFRESH_TOKEN in env + +``` +terraformer import squadcast --resources= --region=SQUADCAST_REGION +``` + +Examples: + +- `Import User Resource` + +``` +terraformer import squadcast --resources=user --region=us +``` + +- `Import Squad Resource` + +``` +terraformer import squadcast --resources=team --region=us --team-name="Default Team" +``` + +### Flags: + +- `--team-name` + + - Required for the following resources: + - squad + - service + - escalation_policy + - team_member + - team_roles + +- `--region` + - Supported Values: + - `us` + - `eu` + +### Supported services: + +- `user` + - [squadcast_user](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/user) +- `team` + - [squadcast_team](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team) +- `team_member` + - [squadcast_team_member](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team_member) +- `team_roles` + - [squadcast_team_roles](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team_roles) +- `squad` + - [squadcast_squad](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/squad) +- `service` + - [squadcast_service](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/service) +- `escalation_policy` + - [squadcast_escalation_policy](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/escalation_policy) From e8f0f8865c267a38300b259ec03c50d41fa79e0f Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Mon, 22 Aug 2022 11:43:06 +0530 Subject: [PATCH 16/73] Added Squadcast to README --- README.md | 246 +++++++++++++++++++++++++++++------------------------- 1 file changed, 132 insertions(+), 114 deletions(-) diff --git a/README.md b/README.md index 1fe260956e..9daf069471 100644 --- a/README.md +++ b/README.md @@ -9,70 +9,73 @@ A CLI tool that generates `tf`/`json` and `tfstate` files based on existing infrastructure (reverse Terraform). -* Disclaimer: This is not an official Google product -* Created by: Waze SRE +- Disclaimer: This is not an official Google product +- Created by: Waze SRE ![Waze SRE logo](assets/waze-sre-logo.png) # Table of Contents + - [Demo GCP](#demo-gcp) - [Capabilities](#capabilities) - [Installation](#installation) - [Supported Providers](/docs) - * Major Cloud - * [Google Cloud](/docs/gcp.md) - * [AWS](/docs/aws.md) - * [Azure](/docs/azure.md) - * [AliCloud](/docs/alicloud.md) - * [IBM Cloud](/docs/ibmcloud.md) - * Cloud - * [DigitalOcean](/docs/digitalocean.md) - * [Equinix Metal](/docs/equinixmetal.md) - * [Fastly](/docs/fastly.md) - * [Heroku](/docs/heroku.md) - * [LaunchDarkly](/docs/launchdarkly.md) - * [Linode](/docs/linode.md) - * [NS1](/docs/ns1.md) - * [OpenStack](/docs/openstack.md) - * [TencentCloud](/docs/tencentcloud.md) - * [Vultr](/docs/vultr.md) - * [Yandex Cloud](/docs/yandex.md) - * Infrastructure Software - * [Kubernetes](/docs/kubernetes.md) - * [OctopusDeploy](/docs/octopus.md) - * [RabbitMQ](/docs/rabbitmq.md) - * Network - * [Cloudflare](/docs/cloudflare.md) - * [PAN-OS](/docs/panos.md) - * VCS - * [Azure DevOps](/docs/azuredevops.md) - * [GitHub](/docs/github.md) - * [Gitlab](/docs/gitlab.md) - * Monitoring & System Management - * [Datadog](/docs/datadog.md) - * [New Relic](/docs/relic.md) - * [Mackerel](/docs/mackerel.md) - * [PagerDuty](/docs/pagerduty.md) - * [Opsgenie](/docs/opsgenie.md) - * Community - * [Keycloak](/docs/keycloak.md) - * [Logz.io](/docs/logz.md) - * [Commercetools](/docs/commercetools.md) - * [Mikrotik](/docs/mikrotik.md) - * [Xen Orchestra](/docs/xen.md) - * [GmailFilter](/docs/gmailfilter.md) - * [Grafana](/docs/grafana.md) - * [Vault](/docs/vault.md) - * Identity - * [Okta](/docs/okta.md) - * [Auth0](/docs/auth0.md) - * [AzureAD](/docs/azuread.md) + - Major Cloud + - [Google Cloud](/docs/gcp.md) + - [AWS](/docs/aws.md) + - [Azure](/docs/azure.md) + - [AliCloud](/docs/alicloud.md) + - [IBM Cloud](/docs/ibmcloud.md) + - Cloud + - [DigitalOcean](/docs/digitalocean.md) + - [Equinix Metal](/docs/equinixmetal.md) + - [Fastly](/docs/fastly.md) + - [Heroku](/docs/heroku.md) + - [LaunchDarkly](/docs/launchdarkly.md) + - [Linode](/docs/linode.md) + - [NS1](/docs/ns1.md) + - [OpenStack](/docs/openstack.md) + - [TencentCloud](/docs/tencentcloud.md) + - [Vultr](/docs/vultr.md) + - [Yandex Cloud](/docs/yandex.md) + - Infrastructure Software + - [Kubernetes](/docs/kubernetes.md) + - [OctopusDeploy](/docs/octopus.md) + - [RabbitMQ](/docs/rabbitmq.md) + - Network + - [Cloudflare](/docs/cloudflare.md) + - [PAN-OS](/docs/panos.md) + - VCS + - [Azure DevOps](/docs/azuredevops.md) + - [GitHub](/docs/github.md) + - [Gitlab](/docs/gitlab.md) + - Monitoring & System Management + - [Datadog](/docs/datadog.md) + - [New Relic](/docs/relic.md) + - [Mackerel](/docs/mackerel.md) + - [PagerDuty](/docs/pagerduty.md) + - [Opsgenie](/docs/opsgenie.md) + - [Squadcast](/docs/squadcast.md) + - Community + - [Keycloak](/docs/keycloak.md) + - [Logz.io](/docs/logz.md) + - [Commercetools](/docs/commercetools.md) + - [Mikrotik](/docs/mikrotik.md) + - [Xen Orchestra](/docs/xen.md) + - [GmailFilter](/docs/gmailfilter.md) + - [Grafana](/docs/grafana.md) + - [Vault](/docs/vault.md) + - Identity + - [Okta](/docs/okta.md) + - [Auth0](/docs/auth0.md) + - [AzureAD](/docs/azuread.md) - [Contributing](#contributing) - [Developing](#developing) - [Infrastructure](#infrastructure) - [Stargazers over time](#stargazers-over-time) ## Demo GCP + [![asciicast](https://asciinema.org/a/243961.svg)](https://asciinema.org/a/243961) ## Capabilities @@ -87,6 +90,7 @@ A CLI tool that generates `tf`/`json` and `tfstate` files based on existing infr Terraformer uses Terraform providers and is designed to easily support newly added resources. To upgrade resources with new fields, all you need to do is upgrade the relevant Terraform providers. + ``` Import current state to Terraform configuration from a provider @@ -117,6 +121,7 @@ Flags: Use " import [provider] [command] --help" for more information about a command. ``` + #### Permissions The tool requires read-only permissions to list service resources. @@ -132,15 +137,19 @@ To import resources from all services, use `--resources="*"` . If you want to ex Filters are a way to choose which resources `terraformer` imports. It's possible to filter resources by its identifiers or attributes. Multiple filtering values are separated by `:`. If an identifier contains this symbol, value should be wrapped in `'` e.g. `--filter=resource=id1:'project:dataset_id'`. Identifier based filters will be executed before Terraformer will try to refresh remote state. Use `Type` when you need to filter only one of several types of resources. Multiple filters can be combined when importing different resource types. An example would be importing all AWS security groups from a specific AWS VPC: + ``` terraformer import aws -r sg,vpc --filter Type=sg;Name=vpc_id;Value=VPC_ID --filter Type=vpc;Name=id;Value=VPC_ID ``` + Notice how the `Name` is different for `sg` than it is for `vpc`. ##### Migration state version + For terraform >= 0.13, you can use `replace-provider` to migrate state from previous versions. Example usage: + ``` terraform state replace-provider -auto-approve "registry.terraform.io/-/aws" "hashicorp/aws" ``` @@ -156,6 +165,7 @@ Example usage: ``` terraformer import aws --resources=vpc,subnet --filter=vpc=myvpcid --regions=eu-west-1 ``` + Will only import the vpc with id `myvpcid`. This form of filters can help when it's necessary to select resources by its identifiers. ##### Field name only @@ -167,6 +177,7 @@ Example usage: ``` terraformer import aws --resources=s3 --filter="Name=tags.Abc" --regions=eu-west-1 ``` + Will only import the s3 resources that have tag `Abc`. This form of filters can help when the field values are not important from filtering perspective. ##### Field with dots @@ -178,6 +189,7 @@ Example usage: ``` terraformer import aws --resources=s3 --filter="Name=tags.Abc.def" --regions=eu-west-1 ``` + Will only import the s3 resources that have tag `Abc.def`. #### Planning @@ -206,6 +218,7 @@ Terraformer by default separates each resource into a file, which is put into a The default path for resource files is `{output}/{provider}/{service}/{resource}.tf` and can vary for each provider. It's possible to adjust the generated structure by: + 1. Using `--compact` parameter to group resource files within a single service into one `resources.tf` file 2. Adjusting the `--path-pattern` parameter and passing e.g. `--path-pattern {output}/{provider}/` to generate resources for all services in one directory @@ -214,11 +227,12 @@ It's possible to combine `--compact` `--path-pattern` parameters together. ### Installation From source: + 1. Run `git clone && cd terraformer/` 2. Run `go mod download` 3. Run `go build -v` for all providers OR build with one provider -`go run build/main.go {google,aws,azure,kubernetes,etc}` -4. Run ```terraform init``` against a ```versions.tf``` file to install the plugins required for your platform. For example, if you need plugins for the google provider, ```versions.tf``` should contain: + `go run build/main.go {google,aws,azure,kubernetes,etc}` +4. Run `terraform init` against a `versions.tf` file to install the plugins required for your platform. For example, if you need plugins for the google provider, `versions.tf` should contain: ``` terraform { @@ -230,14 +244,15 @@ terraform { required_version = ">= 0.13" } ``` + Or alternatively -* Copy your Terraform provider's plugin(s) to folder - `~/.terraform.d/plugins/{darwin,linux}_amd64/`, as appropriate. +- Copy your Terraform provider's plugin(s) to folder + `~/.terraform.d/plugins/{darwin,linux}_amd64/`, as appropriate. From Releases: -* Linux +- Linux ``` export PROVIDER={all,google,aws,kubernetes} @@ -245,7 +260,8 @@ curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$( chmod +x terraformer-${PROVIDER}-linux-amd64 sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer ``` -* MacOS + +- MacOS ``` export PROVIDER={all,google,aws,kubernetes} @@ -253,14 +269,14 @@ curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$( chmod +x terraformer-${PROVIDER}-darwin-amd64 sudo mv terraformer-${PROVIDER}-darwin-amd64 /usr/local/bin/terraformer ``` -* Windows + +- Windows + 1. Install Terraform - https://www.terraform.io/downloads 2. Download exe file for required provider from here - https://github.com/GoogleCloudPlatform/terraformer/releases 3. Add the exe file path to path variable 4. Create a folder and initialize the terraform provider and run terraformer commands from there - * For AWS - refer https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started - - + - For AWS - refer https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started #### Using a package manager @@ -271,59 +287,61 @@ If you want to use a package manager: - [Chocolatey](https://chocolatey.org/) users can use `choco install terraformer`. Links to download Terraform Providers: -* Major Cloud - * Google Cloud provider >2.11.0 - [here](https://releases.hashicorp.com/terraform-provider-google/) - * AWS provider >2.25.0 - [here](https://releases.hashicorp.com/terraform-provider-aws/) - * Azure provider >1.35.0 - [here](https://releases.hashicorp.com/terraform-provider-azurerm/) - * Alicloud provider >1.57.1 - [here](https://releases.hashicorp.com/terraform-provider-alicloud/) -* Cloud - * DigitalOcean provider >1.9.1 - [here](https://releases.hashicorp.com/terraform-provider-digitalocean/) - * Heroku provider >2.2.1 - [here](https://releases.hashicorp.com/terraform-provider-heroku/) - * LaunchDarkly provider >=2.1.1 - [here](https://releases.hashicorp.com/terraform-provider-launchdarkly/) - * Linode provider >1.8.0 - [here](https://releases.hashicorp.com/terraform-provider-linode/) - * OpenStack provider >1.21.1 - [here](https://releases.hashicorp.com/terraform-provider-openstack/) - * TencentCloud provider >1.50.0 - [here](https://releases.hashicorp.com/terraform-provider-tencentcloud/) - * Vultr provider >1.0.5 - [here](https://releases.hashicorp.com/terraform-provider-vultr/) - * Yandex provider >0.42.0 - [here](https://releases.hashicorp.com/terraform-provider-yandex/) -* Infrastructure Software - * Kubernetes provider >=1.9.0 - [here](https://releases.hashicorp.com/terraform-provider-kubernetes/) - * RabbitMQ provider >=1.1.0 - [here](https://releases.hashicorp.com/terraform-provider-rabbitmq/) -* Network - * Cloudflare provider >1.16 - [here](https://releases.hashicorp.com/terraform-provider-cloudflare/) - * Fastly provider >0.16.1 - [here](https://releases.hashicorp.com/terraform-provider-fastly/) - * NS1 provider >1.8.3 - [here](https://releases.hashicorp.com/terraform-provider-ns1/) - * PAN-OS provider >= 1.8.3 - [here](https://github.com/PaloAltoNetworks/terraform-provider-panos) -* VCS - * GitHub provider >=2.2.1 - [here](https://releases.hashicorp.com/terraform-provider-github/) -* Monitoring & System Management - * Datadog provider >2.1.0 - [here](https://releases.hashicorp.com/terraform-provider-datadog/) - * New Relic provider >2.0.0 - [here](https://releases.hashicorp.com/terraform-provider-newrelic/) - * Mackerel provider > 0.0.6 - [here](https://github.com/mackerelio-labs/terraform-provider-mackerel) - * Pagerduty >=1.9 - [here](https://releases.hashicorp.com/terraform-provider-pagerduty/) - * Opsgenie >= 0.6.0 [here](https://releases.hashicorp.com/terraform-provider-opsgenie/) -* Community - * Keycloak provider >=1.19.0 - [here](https://github.com/mrparkers/terraform-provider-keycloak/) - * Logz.io provider >=1.1.1 - [here](https://github.com/jonboydell/logzio_terraform_provider/) - * Commercetools provider >= 0.21.0 - [here](https://github.com/labd/terraform-provider-commercetools) - * Mikrotik provider >= 0.2.2 - [here](https://github.com/ddelnano/terraform-provider-mikrotik) - * Xen Orchestra provider >= 0.18.0 - [here](https://github.com/ddelnano/terraform-provider-xenorchestra) - * GmailFilter provider >= 1.0.1 - [here](https://github.com/yamamoto-febc/terraform-provider-gmailfilter) - * Vault provider - [here](https://github.com/hashicorp/terraform-provider-vault) - * Auth0 provider - [here](https://github.com/alexkappa/terraform-provider-auth0) - * AzureAD provider - [here](https://github.com/hashicorp/terraform-provider-azuread) + +- Major Cloud + - Google Cloud provider >2.11.0 - [here](https://releases.hashicorp.com/terraform-provider-google/) + - AWS provider >2.25.0 - [here](https://releases.hashicorp.com/terraform-provider-aws/) + - Azure provider >1.35.0 - [here](https://releases.hashicorp.com/terraform-provider-azurerm/) + - Alicloud provider >1.57.1 - [here](https://releases.hashicorp.com/terraform-provider-alicloud/) +- Cloud + - DigitalOcean provider >1.9.1 - [here](https://releases.hashicorp.com/terraform-provider-digitalocean/) + - Heroku provider >2.2.1 - [here](https://releases.hashicorp.com/terraform-provider-heroku/) + - LaunchDarkly provider >=2.1.1 - [here](https://releases.hashicorp.com/terraform-provider-launchdarkly/) + - Linode provider >1.8.0 - [here](https://releases.hashicorp.com/terraform-provider-linode/) + - OpenStack provider >1.21.1 - [here](https://releases.hashicorp.com/terraform-provider-openstack/) + - TencentCloud provider >1.50.0 - [here](https://releases.hashicorp.com/terraform-provider-tencentcloud/) + - Vultr provider >1.0.5 - [here](https://releases.hashicorp.com/terraform-provider-vultr/) + - Yandex provider >0.42.0 - [here](https://releases.hashicorp.com/terraform-provider-yandex/) +- Infrastructure Software + - Kubernetes provider >=1.9.0 - [here](https://releases.hashicorp.com/terraform-provider-kubernetes/) + - RabbitMQ provider >=1.1.0 - [here](https://releases.hashicorp.com/terraform-provider-rabbitmq/) +- Network + - Cloudflare provider >1.16 - [here](https://releases.hashicorp.com/terraform-provider-cloudflare/) + - Fastly provider >0.16.1 - [here](https://releases.hashicorp.com/terraform-provider-fastly/) + - NS1 provider >1.8.3 - [here](https://releases.hashicorp.com/terraform-provider-ns1/) + - PAN-OS provider >= 1.8.3 - [here](https://github.com/PaloAltoNetworks/terraform-provider-panos) +- VCS + - GitHub provider >=2.2.1 - [here](https://releases.hashicorp.com/terraform-provider-github/) +- Monitoring & System Management + - Datadog provider >2.1.0 - [here](https://releases.hashicorp.com/terraform-provider-datadog/) + - New Relic provider >2.0.0 - [here](https://releases.hashicorp.com/terraform-provider-newrelic/) + - Mackerel provider > 0.0.6 - [here](https://github.com/mackerelio-labs/terraform-provider-mackerel) + - Pagerduty >=1.9 - [here](https://releases.hashicorp.com/terraform-provider-pagerduty/) + - Opsgenie >= 0.6.0 [here](https://releases.hashicorp.com/terraform-provider-opsgenie/) + - Squadcast >= 1.0.4 [here](https://github.com/SquadcastHub/terraform-provider-squadcast) +- Community + - Keycloak provider >=1.19.0 - [here](https://github.com/mrparkers/terraform-provider-keycloak/) + - Logz.io provider >=1.1.1 - [here](https://github.com/jonboydell/logzio_terraform_provider/) + - Commercetools provider >= 0.21.0 - [here](https://github.com/labd/terraform-provider-commercetools) + - Mikrotik provider >= 0.2.2 - [here](https://github.com/ddelnano/terraform-provider-mikrotik) + - Xen Orchestra provider >= 0.18.0 - [here](https://github.com/ddelnano/terraform-provider-xenorchestra) + - GmailFilter provider >= 1.0.1 - [here](https://github.com/yamamoto-febc/terraform-provider-gmailfilter) + - Vault provider - [here](https://github.com/hashicorp/terraform-provider-vault) + - Auth0 provider - [here](https://github.com/alexkappa/terraform-provider-auth0) + - AzureAD provider - [here](https://github.com/hashicorp/terraform-provider-azuread) Information on provider plugins: https://www.terraform.io/docs/configuration/providers.html - ## High-Level steps to add new provider - * Initialize provider details in cmd/root.go and create a provider initialization file in the terraformer/cmd folder - * Create a folder under terraformer/providers/ for your provider - * Create two files under this folder - * _provider.go - * _service.go -* Initialize all provider's supported services in _provider.go file -* Create script for each supported service in same folder + +- Initialize provider details in cmd/root.go and create a provider initialization file in the terraformer/cmd folder +- Create a folder under terraformer/providers/ for your provider +- Create two files under this folder + - \_provider.go + - \_service.go +- Initialize all provider's supported services in \_provider.go file +- Create script for each supported service in same folder ## Contributing @@ -369,10 +387,10 @@ go run providers/gcp/gcp_compute_code_generator/*.go ##### Terraformer Benefits -* Simpler to add new providers and resources - already supports AWS, GCP, GitHub, Kubernetes, and Openstack. Terraforming supports only AWS. -* Better support for HCL + tfstate, including updates for Terraform 0.12. -* If a provider adds new attributes to a resource, there is no need change Terraformer code - just update the Terraform provider on your laptop. -* Automatically supports connections between resources in HCL files. +- Simpler to add new providers and resources - already supports AWS, GCP, GitHub, Kubernetes, and Openstack. Terraforming supports only AWS. +- Better support for HCL + tfstate, including updates for Terraform 0.12. +- If a provider adds new attributes to a resource, there is no need change Terraformer code - just update the Terraform provider on your laptop. +- Automatically supports connections between resources in HCL files. ##### Comparison @@ -383,8 +401,8 @@ Terraformer instead uses Terraform provider files for mapping attributes, HCL li Look for S3 support in terraforming here and official S3 support Terraforming lacks full coverage for resources - as an example you can see that 70% of S3 options are not supported: -* terraforming - https://github.com/dtan4/terraforming/blob/master/lib/terraforming/template/tf/s3.erb -* official S3 support - https://www.terraform.io/docs/providers/aws/r/s3_bucket +- terraforming - https://github.com/dtan4/terraforming/blob/master/lib/terraforming/template/tf/s3.erb +- official S3 support - https://www.terraform.io/docs/providers/aws/r/s3_bucket ## Stargazers over time From bc8dceb87d47a3d14c2ab2a03b1d64da17378b59 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Mon, 22 Aug 2022 11:46:31 +0530 Subject: [PATCH 17/73] Added Squadcast docs --- docs/squadcast.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/squadcast.md b/docs/squadcast.md index 5b998e2682..c63cf3839e 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -4,7 +4,7 @@ Syntax: `export SQUADCAST_REFRESH_TOKEN=` -OR set SQUADCAST_REFRESH_TOKEN in env +OR set `SQUADCAST_REFRESH_TOKEN` in env ``` terraformer import squadcast --resources= --region=SQUADCAST_REGION From 0d45478be071dfff5ff33b29623ac3facdf7b746 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Mon, 22 Aug 2022 11:48:17 +0530 Subject: [PATCH 18/73] Added Squadcast docs --- docs/squadcast.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/squadcast.md b/docs/squadcast.md index c63cf3839e..39b963970e 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -4,8 +4,6 @@ Syntax: `export SQUADCAST_REFRESH_TOKEN=` -OR set `SQUADCAST_REFRESH_TOKEN` in env - ``` terraformer import squadcast --resources= --region=SQUADCAST_REGION ``` From 00f14ddf14e7c3d105cd0b613a790f11f4db6ee2 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Mon, 22 Aug 2022 11:51:58 +0530 Subject: [PATCH 19/73] updated Squadcast docs --- docs/squadcast.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/squadcast.md b/docs/squadcast.md index 39b963970e..2323de735a 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -22,6 +22,12 @@ terraformer import squadcast --resources=user --region=us terraformer import squadcast --resources=team --region=us --team-name="Default Team" ``` +- `Import Resource by providing refresh-token as a flag` + +``` +terraformer import squadcast --resources=team --region=us --team-name="Default Team" --refresh-token=YOUR_REFRESH_TOKEN +``` + ### Flags: - `--team-name` From dcbd371b42e5dddf918bc4355c6666e83b9ef9a0 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Tue, 23 Aug 2022 13:26:39 +0530 Subject: [PATCH 20/73] Added squadcast provider --- .gitignore | 4 +- cmd/provider_cmd_squadcast.go | 21 ++---- docs/squadcast.md | 6 ++ providers/squadcast/escalation_policy.go | 4 +- providers/squadcast/runbook.go | 79 +++++++++++++++++++++++ providers/squadcast/service.go | 8 +-- providers/squadcast/slo.go | 79 +++++++++++++++++++++++ providers/squadcast/squad.go | 8 +-- providers/squadcast/squadcast_provider.go | 8 +++ providers/squadcast/squadcast_service.go | 18 ++++-- providers/squadcast/team.go | 19 +++--- providers/squadcast/team_roles.go | 14 ++-- providers/squadcast/user.go | 8 +-- 13 files changed, 217 insertions(+), 59 deletions(-) create mode 100644 providers/squadcast/runbook.go create mode 100644 providers/squadcast/slo.go diff --git a/.gitignore b/.gitignore index 904f641dbe..f910abf842 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,4 @@ cmd/tmp terraform.tfstate terraform.tfstate.backup init.tf -vendor/ -.env -*.tf \ No newline at end of file +vendor/ \ No newline at end of file diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index d80690a79e..23a7b2fd29 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -2,7 +2,6 @@ package cmd import ( "log" - "os" squadcast_terraforming "github.com/GoogleCloudPlatform/terraformer/providers/squadcast" @@ -10,30 +9,23 @@ import ( "github.com/spf13/cobra" ) -const ( - defaultSquadcastEndpoint = "http://api.squadcast.com/v3/" -) - func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { var refreshToken string var teamName string + var apiEndpoint string cmd := &cobra.Command{ Use: "squadcast", - Short: "Import current state to Terraform configuration from SquadCast", - Long: "Import current state to Terraform configuration from SquadCast", + Short: "Import current state to Terraform configuration from Squadcast", + Long: "Import current state to Terraform configuration from Squadcast", RunE: func(cmd *cobra.Command, args []string) error { - endpoint := os.Getenv("SQUADCAST_SERVER_URL") - if len(endpoint) == 0 { - endpoint = defaultSquadcastEndpoint - } originalPathPattern := options.PathPattern for _, region := range options.Regions { provider := newSquadcastProvider() options.PathPattern = originalPathPattern options.PathPattern += region + "/" log.Println(provider.GetName() + " importing region " + region) - err := Import(provider, options, []string{refreshToken, region, teamName}) + err := Import(provider, options, []string{refreshToken, region, teamName, apiEndpoint}) if err != nil { return err } @@ -44,8 +36,9 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { cmd.AddCommand(listCmd(newSquadcastProvider())) baseProviderFlags(cmd.PersistentFlags(), &options, "user", "") cmd.PersistentFlags().StringVarP(&refreshToken, "refresh-token", "", "", "YOUR_SQUADCAST_REFRESH_TOKEN or env param SQUADCAST_REFRESH_TOKEN") - cmd.PersistentFlags().StringSliceVarP(&options.Regions, "region", "", []string{}, "") - cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "") + cmd.PersistentFlags().StringSliceVarP(&options.Regions, "region", "", []string{}, "eu or us") + cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "Squadcast team name") + cmd.PersistentFlags().StringVarP(&apiEndpoint, "api-endpoint", "", "", "Custom Squadcast API endpoint") return cmd } diff --git a/docs/squadcast.md b/docs/squadcast.md index 2323de735a..f99e9177e0 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -38,6 +38,8 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - escalation_policy - team_member - team_roles + - slo + - runbook - `--region` - Supported Values: @@ -60,3 +62,7 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - [squadcast_service](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/service) - `escalation_policy` - [squadcast_escalation_policy](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/escalation_policy) +- `runbook` + - [squadcast_runbook](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/runbook) +- `slo` + - [squadcast_slo](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/slo) diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 029bbadd1e..5bb2165e94 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -19,13 +19,11 @@ type EscalationPolicy struct { Name string `json:"name"` } -type EscalationPolicies []EscalationPolicy - var getEscalationPolicyResponse struct { Data *[]EscalationPolicy `json:"data"` } -func (g *EscalationPolicyGenerator) createResources(policies EscalationPolicies) []terraformutils.Resource { +func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) []terraformutils.Resource { var resourceList []terraformutils.Resource for _, policy := range policies { resourceList = append(resourceList, terraformutils.NewResource( diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go new file mode 100644 index 0000000000..0db53a89c8 --- /dev/null +++ b/providers/squadcast/runbook.go @@ -0,0 +1,79 @@ +// service resource is yet to be implemented + +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "net/url" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type RunbookGenerator struct { + SquadcastService + teamID string +} + +type Runbook struct { + ID string `json:"id"` + Name string `json:"name"` +} + + +var getRunbooksResponse struct { + Data *[]Runbook `json:"data"` +} + +func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils.Resource { + var runbookList []terraformutils.Resource + for _, runbook := range runbooks { + runbookList = append(runbookList, terraformutils.NewResource( + runbook.ID, + "runbook_"+(runbook.Name), + "squadcast_runbook", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + }, + []string{}, + map[string]interface{}{}, + )) + } + return runbookList +} + +func (g *RunbookGenerator) InitResources() error { + teamName := g.Args["team_name"].(string) + if len(teamName) == 0 { + return errors.New("--team-name is required") + } + + escapedTeamName := url.QueryEscape(teamName) + getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) + team, err := g.generateRequest(getTeamURL) + if err != nil { + return err + } + + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + + getRunbooksURL := "/v3/runbooks" + body, err := g.generateRequest(getRunbooksURL) + if err != nil { + return err + } + + err = json.Unmarshal(body, &getRunbooksResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getRunbooksResponse.Data) + return nil +} diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index 22180c508c..c7f87805b5 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -17,17 +17,15 @@ type ServiceGenerator struct { } type Service struct { - ID string `json:"id" tf:"id"` - Name string `json:"name" tf:"name"` + ID string `json:"id"` + Name string `json:"name"` } -type Services []Service - var getServicesResponse struct { Data *[]Service `json:"data"` } -func (g *ServiceGenerator) createResources(services Services) []terraformutils.Resource { +func (g *ServiceGenerator) createResources(services []Service) []terraformutils.Resource { var serviceList []terraformutils.Resource for _, service := range services { serviceList = append(serviceList, terraformutils.NewResource( diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go new file mode 100644 index 0000000000..120a8f9dc6 --- /dev/null +++ b/providers/squadcast/slo.go @@ -0,0 +1,79 @@ +// service resource is yet to be implemented + +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "net/url" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type SLOGenerator struct { + SquadcastService + teamID string +} + +type SLO struct { + ID int `json:"id"` + Name string `json:"name"` +} + +var getSLOsResponse struct { + Data struct { + SLOs *[]SLO `json:"slos"` + } `json:"data"` +} + +func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { + var SLOList []terraformutils.Resource + for _, s := range slo { + SLOList = append(SLOList, terraformutils.NewResource( + fmt.Sprintf("%d", s.ID), + "slo_"+(s.Name), + "squadcast_slo", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + }, + []string{}, + map[string]interface{}{}, + )) + } + return SLOList +} + +func (g *SLOGenerator) InitResources() error { + teamName := g.Args["team_name"].(string) + if len(teamName) == 0 { + return errors.New("--team-name is required") + } + + escapedTeamName := url.QueryEscape(teamName) + getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) + team, err := g.generateRequest(getTeamURL) + if err != nil { + return err + } + + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + + getSLOsURL := "/v3/slo?owner_id=" + g.teamID + body, err := g.generateRequest(getSLOsURL) + if err != nil { + return err + } + + err = json.Unmarshal(body, &getSLOsResponse) + if err != nil { + return err + } + g.Resources = g.createResources(*getSLOsResponse.Data.SLOs) + return nil +} diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index 82c81ec8c3..0f068f4b3b 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -15,17 +15,15 @@ type SquadGenerator struct { } type Squad struct { - ID string `json:"id" tf:"id"` - Name string `json:"name" tf:"name"` + ID string `json:"id"` + Name string `json:"name"` } var getSquadsResponse struct { Data *[]Squad `json:"data"` } -type Squads []Squad - -func (g *SquadGenerator) createResources(squads Squads) []terraformutils.Resource { +func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resource { var resources []terraformutils.Resource for _, squad := range squads { resources = append(resources, terraformutils.NewResource( diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 5dd614c333..a3bdd643fb 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -17,6 +17,7 @@ import ( type SquadcastProvider struct { terraformutils.Provider + apiEndpoint string accesstoken string refreshtoken string region string @@ -69,6 +70,10 @@ func (p *SquadcastProvider) Init(args []string) error { p.teamName = args[2] } + if args[3] != "" { + p.apiEndpoint = args[3] + } + p.GetAccessToken() return nil } @@ -83,6 +88,7 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetVerbose(verbose) p.Service.SetProviderName(p.GetName()) p.Service.SetArgs(map[string]interface{}{ + "apiendpoint": p.apiEndpoint, "access_token": p.accesstoken, "refresh_token": p.refreshtoken, "region": p.region, @@ -125,6 +131,8 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv "team_member": &TeamMemberGenerator{}, "team_roles": &TeamRolesGenerator{}, "escalation_policy": &EscalationPolicyGenerator{}, + "runbook": &RunbookGenerator{}, + "slo": &SLOGenerator{}, } } diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 263f893bad..297d5bd6a7 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -21,12 +21,6 @@ func GetHost(region string) string { return "squadcast.com" case "eu": return "eu.squadcast.com" - case "internal": - return "squadcast.xyz" - case "staging": - return "squadcast.tech" - case "dev": - return "localhost" default: return "" } @@ -38,7 +32,17 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { log.Fatal("unknown region") } ctx := context.Background() - req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://api.%s%s", host, uri), nil) + + var url string + + api_endpoint := GetHost(s.Args["api_endpoint"].(string)) + if api_endpoint == "" { + url = fmt.Sprintf("https://api.%s%s", host, uri) + } else { + url = fmt.Sprintf("%s%s", api_endpoint, uri) + } + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index d875dc88e9..87899500e1 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -11,26 +11,25 @@ type TeamGenerator struct { } type Team struct { - ID string `json:"id" tf:"id"` - Name string `json:"name" tf:"name"` - Description string `json:"description" tf:"description"` - Default bool `json:"default" tf:"default"` - Members []*DataTeamMember `json:"members" tf:"-"` - Roles []*TeamRole `json:"roles" tf:"-"` + ID string `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Default bool `json:"default"` + Members []*DataTeamMember `json:"members"` + Roles []*TeamRole `json:"roles"` } type DataTeamMember struct { - UserID string `json:"user_id" tf:"user_id"` - RoleIDs []string `json:"role_ids" tf:"role_ids"` + UserID string `json:"user_id"` + RoleIDs []string `json:"role_ids"` } var getTeamsResponse struct { Data *[]Team `json:"data"` } -type Teams []Team -func (g *TeamGenerator) createResources(teams Teams) []terraformutils.Resource { +func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource { var teamList []terraformutils.Resource for _, team := range teams { teamList = append(teamList, terraformutils.NewSimpleResource( diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 6273b3dc22..97cb84578f 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -15,24 +15,22 @@ type TeamRolesGenerator struct { } type TeamRole struct { - ID string `json:"id" tf:"id"` - Name string `json:"name" tf:"name"` - Slug string `json:"slug" tf:"-"` - Default bool `json:"default" tf:"default"` + ID string `json:"id"` + Name string `json:"name"` + Slug string `json:"slug"` + Default bool `json:"default"` } -type TeamRoles []TeamRole - var getTeamRolesResponse struct { Data *[]TeamRole `json:"data"` } -func (g *TeamRolesGenerator) createResources(teamRoles TeamRoles) []terraformutils.Resource { +func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformutils.Resource { var teamRolesList []terraformutils.Resource for _, role := range teamRoles { teamRolesList = append(teamRolesList, terraformutils.NewResource( role.ID, - "team_role_"+(role.ID), + fmt.Sprintf("team_role_%s", role.ID), "squadcast_team_role", g.GetProviderName(), map[string]string{ diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 6314e2446b..7378c70e5f 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -2,6 +2,7 @@ package squadcast import ( "encoding/json" + "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -11,21 +12,20 @@ type UserGenerator struct { } type User struct { - ID string `json:"id" tf:"id"` + ID string `json:"id"` } var getUsersResponse struct { Data *[]User `json:"data"` } -type Users []User -func (g *UserGenerator) createResources(users Users) []terraformutils.Resource { +func (g *UserGenerator) createResources(users []User) []terraformutils.Resource { var resources []terraformutils.Resource for _, user := range users { resources = append(resources, terraformutils.NewSimpleResource( user.ID, - "user_"+(user.ID), + fmt.Sprintf("user_%s", user.ID), "squadcast_user", "squadcast", []string{}, From fcf100ced383ee784c6eacd9324e3aee6e254540 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Tue, 23 Aug 2022 13:48:08 +0530 Subject: [PATCH 21/73] added new branch --- README.md | 246 +++++++++++++++++++++++++----------------------------- 1 file changed, 114 insertions(+), 132 deletions(-) diff --git a/README.md b/README.md index 9daf069471..1fe260956e 100644 --- a/README.md +++ b/README.md @@ -9,73 +9,70 @@ A CLI tool that generates `tf`/`json` and `tfstate` files based on existing infrastructure (reverse Terraform). -- Disclaimer: This is not an official Google product -- Created by: Waze SRE +* Disclaimer: This is not an official Google product +* Created by: Waze SRE ![Waze SRE logo](assets/waze-sre-logo.png) # Table of Contents - - [Demo GCP](#demo-gcp) - [Capabilities](#capabilities) - [Installation](#installation) - [Supported Providers](/docs) - - Major Cloud - - [Google Cloud](/docs/gcp.md) - - [AWS](/docs/aws.md) - - [Azure](/docs/azure.md) - - [AliCloud](/docs/alicloud.md) - - [IBM Cloud](/docs/ibmcloud.md) - - Cloud - - [DigitalOcean](/docs/digitalocean.md) - - [Equinix Metal](/docs/equinixmetal.md) - - [Fastly](/docs/fastly.md) - - [Heroku](/docs/heroku.md) - - [LaunchDarkly](/docs/launchdarkly.md) - - [Linode](/docs/linode.md) - - [NS1](/docs/ns1.md) - - [OpenStack](/docs/openstack.md) - - [TencentCloud](/docs/tencentcloud.md) - - [Vultr](/docs/vultr.md) - - [Yandex Cloud](/docs/yandex.md) - - Infrastructure Software - - [Kubernetes](/docs/kubernetes.md) - - [OctopusDeploy](/docs/octopus.md) - - [RabbitMQ](/docs/rabbitmq.md) - - Network - - [Cloudflare](/docs/cloudflare.md) - - [PAN-OS](/docs/panos.md) - - VCS - - [Azure DevOps](/docs/azuredevops.md) - - [GitHub](/docs/github.md) - - [Gitlab](/docs/gitlab.md) - - Monitoring & System Management - - [Datadog](/docs/datadog.md) - - [New Relic](/docs/relic.md) - - [Mackerel](/docs/mackerel.md) - - [PagerDuty](/docs/pagerduty.md) - - [Opsgenie](/docs/opsgenie.md) - - [Squadcast](/docs/squadcast.md) - - Community - - [Keycloak](/docs/keycloak.md) - - [Logz.io](/docs/logz.md) - - [Commercetools](/docs/commercetools.md) - - [Mikrotik](/docs/mikrotik.md) - - [Xen Orchestra](/docs/xen.md) - - [GmailFilter](/docs/gmailfilter.md) - - [Grafana](/docs/grafana.md) - - [Vault](/docs/vault.md) - - Identity - - [Okta](/docs/okta.md) - - [Auth0](/docs/auth0.md) - - [AzureAD](/docs/azuread.md) + * Major Cloud + * [Google Cloud](/docs/gcp.md) + * [AWS](/docs/aws.md) + * [Azure](/docs/azure.md) + * [AliCloud](/docs/alicloud.md) + * [IBM Cloud](/docs/ibmcloud.md) + * Cloud + * [DigitalOcean](/docs/digitalocean.md) + * [Equinix Metal](/docs/equinixmetal.md) + * [Fastly](/docs/fastly.md) + * [Heroku](/docs/heroku.md) + * [LaunchDarkly](/docs/launchdarkly.md) + * [Linode](/docs/linode.md) + * [NS1](/docs/ns1.md) + * [OpenStack](/docs/openstack.md) + * [TencentCloud](/docs/tencentcloud.md) + * [Vultr](/docs/vultr.md) + * [Yandex Cloud](/docs/yandex.md) + * Infrastructure Software + * [Kubernetes](/docs/kubernetes.md) + * [OctopusDeploy](/docs/octopus.md) + * [RabbitMQ](/docs/rabbitmq.md) + * Network + * [Cloudflare](/docs/cloudflare.md) + * [PAN-OS](/docs/panos.md) + * VCS + * [Azure DevOps](/docs/azuredevops.md) + * [GitHub](/docs/github.md) + * [Gitlab](/docs/gitlab.md) + * Monitoring & System Management + * [Datadog](/docs/datadog.md) + * [New Relic](/docs/relic.md) + * [Mackerel](/docs/mackerel.md) + * [PagerDuty](/docs/pagerduty.md) + * [Opsgenie](/docs/opsgenie.md) + * Community + * [Keycloak](/docs/keycloak.md) + * [Logz.io](/docs/logz.md) + * [Commercetools](/docs/commercetools.md) + * [Mikrotik](/docs/mikrotik.md) + * [Xen Orchestra](/docs/xen.md) + * [GmailFilter](/docs/gmailfilter.md) + * [Grafana](/docs/grafana.md) + * [Vault](/docs/vault.md) + * Identity + * [Okta](/docs/okta.md) + * [Auth0](/docs/auth0.md) + * [AzureAD](/docs/azuread.md) - [Contributing](#contributing) - [Developing](#developing) - [Infrastructure](#infrastructure) - [Stargazers over time](#stargazers-over-time) ## Demo GCP - [![asciicast](https://asciinema.org/a/243961.svg)](https://asciinema.org/a/243961) ## Capabilities @@ -90,7 +87,6 @@ A CLI tool that generates `tf`/`json` and `tfstate` files based on existing infr Terraformer uses Terraform providers and is designed to easily support newly added resources. To upgrade resources with new fields, all you need to do is upgrade the relevant Terraform providers. - ``` Import current state to Terraform configuration from a provider @@ -121,7 +117,6 @@ Flags: Use " import [provider] [command] --help" for more information about a command. ``` - #### Permissions The tool requires read-only permissions to list service resources. @@ -137,19 +132,15 @@ To import resources from all services, use `--resources="*"` . If you want to ex Filters are a way to choose which resources `terraformer` imports. It's possible to filter resources by its identifiers or attributes. Multiple filtering values are separated by `:`. If an identifier contains this symbol, value should be wrapped in `'` e.g. `--filter=resource=id1:'project:dataset_id'`. Identifier based filters will be executed before Terraformer will try to refresh remote state. Use `Type` when you need to filter only one of several types of resources. Multiple filters can be combined when importing different resource types. An example would be importing all AWS security groups from a specific AWS VPC: - ``` terraformer import aws -r sg,vpc --filter Type=sg;Name=vpc_id;Value=VPC_ID --filter Type=vpc;Name=id;Value=VPC_ID ``` - Notice how the `Name` is different for `sg` than it is for `vpc`. ##### Migration state version - For terraform >= 0.13, you can use `replace-provider` to migrate state from previous versions. Example usage: - ``` terraform state replace-provider -auto-approve "registry.terraform.io/-/aws" "hashicorp/aws" ``` @@ -165,7 +156,6 @@ Example usage: ``` terraformer import aws --resources=vpc,subnet --filter=vpc=myvpcid --regions=eu-west-1 ``` - Will only import the vpc with id `myvpcid`. This form of filters can help when it's necessary to select resources by its identifiers. ##### Field name only @@ -177,7 +167,6 @@ Example usage: ``` terraformer import aws --resources=s3 --filter="Name=tags.Abc" --regions=eu-west-1 ``` - Will only import the s3 resources that have tag `Abc`. This form of filters can help when the field values are not important from filtering perspective. ##### Field with dots @@ -189,7 +178,6 @@ Example usage: ``` terraformer import aws --resources=s3 --filter="Name=tags.Abc.def" --regions=eu-west-1 ``` - Will only import the s3 resources that have tag `Abc.def`. #### Planning @@ -218,7 +206,6 @@ Terraformer by default separates each resource into a file, which is put into a The default path for resource files is `{output}/{provider}/{service}/{resource}.tf` and can vary for each provider. It's possible to adjust the generated structure by: - 1. Using `--compact` parameter to group resource files within a single service into one `resources.tf` file 2. Adjusting the `--path-pattern` parameter and passing e.g. `--path-pattern {output}/{provider}/` to generate resources for all services in one directory @@ -227,12 +214,11 @@ It's possible to combine `--compact` `--path-pattern` parameters together. ### Installation From source: - 1. Run `git clone && cd terraformer/` 2. Run `go mod download` 3. Run `go build -v` for all providers OR build with one provider - `go run build/main.go {google,aws,azure,kubernetes,etc}` -4. Run `terraform init` against a `versions.tf` file to install the plugins required for your platform. For example, if you need plugins for the google provider, `versions.tf` should contain: +`go run build/main.go {google,aws,azure,kubernetes,etc}` +4. Run ```terraform init``` against a ```versions.tf``` file to install the plugins required for your platform. For example, if you need plugins for the google provider, ```versions.tf``` should contain: ``` terraform { @@ -244,15 +230,14 @@ terraform { required_version = ">= 0.13" } ``` - Or alternatively -- Copy your Terraform provider's plugin(s) to folder - `~/.terraform.d/plugins/{darwin,linux}_amd64/`, as appropriate. +* Copy your Terraform provider's plugin(s) to folder + `~/.terraform.d/plugins/{darwin,linux}_amd64/`, as appropriate. From Releases: -- Linux +* Linux ``` export PROVIDER={all,google,aws,kubernetes} @@ -260,8 +245,7 @@ curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$( chmod +x terraformer-${PROVIDER}-linux-amd64 sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer ``` - -- MacOS +* MacOS ``` export PROVIDER={all,google,aws,kubernetes} @@ -269,14 +253,14 @@ curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$( chmod +x terraformer-${PROVIDER}-darwin-amd64 sudo mv terraformer-${PROVIDER}-darwin-amd64 /usr/local/bin/terraformer ``` - -- Windows - +* Windows 1. Install Terraform - https://www.terraform.io/downloads 2. Download exe file for required provider from here - https://github.com/GoogleCloudPlatform/terraformer/releases 3. Add the exe file path to path variable 4. Create a folder and initialize the terraform provider and run terraformer commands from there - - For AWS - refer https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started + * For AWS - refer https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started + + #### Using a package manager @@ -287,61 +271,59 @@ If you want to use a package manager: - [Chocolatey](https://chocolatey.org/) users can use `choco install terraformer`. Links to download Terraform Providers: - -- Major Cloud - - Google Cloud provider >2.11.0 - [here](https://releases.hashicorp.com/terraform-provider-google/) - - AWS provider >2.25.0 - [here](https://releases.hashicorp.com/terraform-provider-aws/) - - Azure provider >1.35.0 - [here](https://releases.hashicorp.com/terraform-provider-azurerm/) - - Alicloud provider >1.57.1 - [here](https://releases.hashicorp.com/terraform-provider-alicloud/) -- Cloud - - DigitalOcean provider >1.9.1 - [here](https://releases.hashicorp.com/terraform-provider-digitalocean/) - - Heroku provider >2.2.1 - [here](https://releases.hashicorp.com/terraform-provider-heroku/) - - LaunchDarkly provider >=2.1.1 - [here](https://releases.hashicorp.com/terraform-provider-launchdarkly/) - - Linode provider >1.8.0 - [here](https://releases.hashicorp.com/terraform-provider-linode/) - - OpenStack provider >1.21.1 - [here](https://releases.hashicorp.com/terraform-provider-openstack/) - - TencentCloud provider >1.50.0 - [here](https://releases.hashicorp.com/terraform-provider-tencentcloud/) - - Vultr provider >1.0.5 - [here](https://releases.hashicorp.com/terraform-provider-vultr/) - - Yandex provider >0.42.0 - [here](https://releases.hashicorp.com/terraform-provider-yandex/) -- Infrastructure Software - - Kubernetes provider >=1.9.0 - [here](https://releases.hashicorp.com/terraform-provider-kubernetes/) - - RabbitMQ provider >=1.1.0 - [here](https://releases.hashicorp.com/terraform-provider-rabbitmq/) -- Network - - Cloudflare provider >1.16 - [here](https://releases.hashicorp.com/terraform-provider-cloudflare/) - - Fastly provider >0.16.1 - [here](https://releases.hashicorp.com/terraform-provider-fastly/) - - NS1 provider >1.8.3 - [here](https://releases.hashicorp.com/terraform-provider-ns1/) - - PAN-OS provider >= 1.8.3 - [here](https://github.com/PaloAltoNetworks/terraform-provider-panos) -- VCS - - GitHub provider >=2.2.1 - [here](https://releases.hashicorp.com/terraform-provider-github/) -- Monitoring & System Management - - Datadog provider >2.1.0 - [here](https://releases.hashicorp.com/terraform-provider-datadog/) - - New Relic provider >2.0.0 - [here](https://releases.hashicorp.com/terraform-provider-newrelic/) - - Mackerel provider > 0.0.6 - [here](https://github.com/mackerelio-labs/terraform-provider-mackerel) - - Pagerduty >=1.9 - [here](https://releases.hashicorp.com/terraform-provider-pagerduty/) - - Opsgenie >= 0.6.0 [here](https://releases.hashicorp.com/terraform-provider-opsgenie/) - - Squadcast >= 1.0.4 [here](https://github.com/SquadcastHub/terraform-provider-squadcast) -- Community - - Keycloak provider >=1.19.0 - [here](https://github.com/mrparkers/terraform-provider-keycloak/) - - Logz.io provider >=1.1.1 - [here](https://github.com/jonboydell/logzio_terraform_provider/) - - Commercetools provider >= 0.21.0 - [here](https://github.com/labd/terraform-provider-commercetools) - - Mikrotik provider >= 0.2.2 - [here](https://github.com/ddelnano/terraform-provider-mikrotik) - - Xen Orchestra provider >= 0.18.0 - [here](https://github.com/ddelnano/terraform-provider-xenorchestra) - - GmailFilter provider >= 1.0.1 - [here](https://github.com/yamamoto-febc/terraform-provider-gmailfilter) - - Vault provider - [here](https://github.com/hashicorp/terraform-provider-vault) - - Auth0 provider - [here](https://github.com/alexkappa/terraform-provider-auth0) - - AzureAD provider - [here](https://github.com/hashicorp/terraform-provider-azuread) +* Major Cloud + * Google Cloud provider >2.11.0 - [here](https://releases.hashicorp.com/terraform-provider-google/) + * AWS provider >2.25.0 - [here](https://releases.hashicorp.com/terraform-provider-aws/) + * Azure provider >1.35.0 - [here](https://releases.hashicorp.com/terraform-provider-azurerm/) + * Alicloud provider >1.57.1 - [here](https://releases.hashicorp.com/terraform-provider-alicloud/) +* Cloud + * DigitalOcean provider >1.9.1 - [here](https://releases.hashicorp.com/terraform-provider-digitalocean/) + * Heroku provider >2.2.1 - [here](https://releases.hashicorp.com/terraform-provider-heroku/) + * LaunchDarkly provider >=2.1.1 - [here](https://releases.hashicorp.com/terraform-provider-launchdarkly/) + * Linode provider >1.8.0 - [here](https://releases.hashicorp.com/terraform-provider-linode/) + * OpenStack provider >1.21.1 - [here](https://releases.hashicorp.com/terraform-provider-openstack/) + * TencentCloud provider >1.50.0 - [here](https://releases.hashicorp.com/terraform-provider-tencentcloud/) + * Vultr provider >1.0.5 - [here](https://releases.hashicorp.com/terraform-provider-vultr/) + * Yandex provider >0.42.0 - [here](https://releases.hashicorp.com/terraform-provider-yandex/) +* Infrastructure Software + * Kubernetes provider >=1.9.0 - [here](https://releases.hashicorp.com/terraform-provider-kubernetes/) + * RabbitMQ provider >=1.1.0 - [here](https://releases.hashicorp.com/terraform-provider-rabbitmq/) +* Network + * Cloudflare provider >1.16 - [here](https://releases.hashicorp.com/terraform-provider-cloudflare/) + * Fastly provider >0.16.1 - [here](https://releases.hashicorp.com/terraform-provider-fastly/) + * NS1 provider >1.8.3 - [here](https://releases.hashicorp.com/terraform-provider-ns1/) + * PAN-OS provider >= 1.8.3 - [here](https://github.com/PaloAltoNetworks/terraform-provider-panos) +* VCS + * GitHub provider >=2.2.1 - [here](https://releases.hashicorp.com/terraform-provider-github/) +* Monitoring & System Management + * Datadog provider >2.1.0 - [here](https://releases.hashicorp.com/terraform-provider-datadog/) + * New Relic provider >2.0.0 - [here](https://releases.hashicorp.com/terraform-provider-newrelic/) + * Mackerel provider > 0.0.6 - [here](https://github.com/mackerelio-labs/terraform-provider-mackerel) + * Pagerduty >=1.9 - [here](https://releases.hashicorp.com/terraform-provider-pagerduty/) + * Opsgenie >= 0.6.0 [here](https://releases.hashicorp.com/terraform-provider-opsgenie/) +* Community + * Keycloak provider >=1.19.0 - [here](https://github.com/mrparkers/terraform-provider-keycloak/) + * Logz.io provider >=1.1.1 - [here](https://github.com/jonboydell/logzio_terraform_provider/) + * Commercetools provider >= 0.21.0 - [here](https://github.com/labd/terraform-provider-commercetools) + * Mikrotik provider >= 0.2.2 - [here](https://github.com/ddelnano/terraform-provider-mikrotik) + * Xen Orchestra provider >= 0.18.0 - [here](https://github.com/ddelnano/terraform-provider-xenorchestra) + * GmailFilter provider >= 1.0.1 - [here](https://github.com/yamamoto-febc/terraform-provider-gmailfilter) + * Vault provider - [here](https://github.com/hashicorp/terraform-provider-vault) + * Auth0 provider - [here](https://github.com/alexkappa/terraform-provider-auth0) + * AzureAD provider - [here](https://github.com/hashicorp/terraform-provider-azuread) Information on provider plugins: https://www.terraform.io/docs/configuration/providers.html -## High-Level steps to add new provider -- Initialize provider details in cmd/root.go and create a provider initialization file in the terraformer/cmd folder -- Create a folder under terraformer/providers/ for your provider -- Create two files under this folder - - \_provider.go - - \_service.go -- Initialize all provider's supported services in \_provider.go file -- Create script for each supported service in same folder +## High-Level steps to add new provider + * Initialize provider details in cmd/root.go and create a provider initialization file in the terraformer/cmd folder + * Create a folder under terraformer/providers/ for your provider + * Create two files under this folder + * _provider.go + * _service.go +* Initialize all provider's supported services in _provider.go file +* Create script for each supported service in same folder ## Contributing @@ -387,10 +369,10 @@ go run providers/gcp/gcp_compute_code_generator/*.go ##### Terraformer Benefits -- Simpler to add new providers and resources - already supports AWS, GCP, GitHub, Kubernetes, and Openstack. Terraforming supports only AWS. -- Better support for HCL + tfstate, including updates for Terraform 0.12. -- If a provider adds new attributes to a resource, there is no need change Terraformer code - just update the Terraform provider on your laptop. -- Automatically supports connections between resources in HCL files. +* Simpler to add new providers and resources - already supports AWS, GCP, GitHub, Kubernetes, and Openstack. Terraforming supports only AWS. +* Better support for HCL + tfstate, including updates for Terraform 0.12. +* If a provider adds new attributes to a resource, there is no need change Terraformer code - just update the Terraform provider on your laptop. +* Automatically supports connections between resources in HCL files. ##### Comparison @@ -401,8 +383,8 @@ Terraformer instead uses Terraform provider files for mapping attributes, HCL li Look for S3 support in terraforming here and official S3 support Terraforming lacks full coverage for resources - as an example you can see that 70% of S3 options are not supported: -- terraforming - https://github.com/dtan4/terraforming/blob/master/lib/terraforming/template/tf/s3.erb -- official S3 support - https://www.terraform.io/docs/providers/aws/r/s3_bucket +* terraforming - https://github.com/dtan4/terraforming/blob/master/lib/terraforming/template/tf/s3.erb +* official S3 support - https://www.terraform.io/docs/providers/aws/r/s3_bucket ## Stargazers over time From 882e1a6e4e527418102b07f371c6492f5cf28d26 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Wed, 24 Aug 2022 11:36:16 +0530 Subject: [PATCH 22/73] Added support for custom server url --- docs/squadcast.md | 2 +- providers/squadcast/squadcast_provider.go | 2 +- providers/squadcast/squadcast_service.go | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/squadcast.md b/docs/squadcast.md index f99e9177e0..22a321df65 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -46,7 +46,7 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - `us` - `eu` -### Supported services: +### Supported resources: - `user` - [squadcast_user](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/user) diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index a3bdd643fb..8e2bb7270a 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -88,7 +88,7 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetVerbose(verbose) p.Service.SetProviderName(p.GetName()) p.Service.SetArgs(map[string]interface{}{ - "apiendpoint": p.apiEndpoint, + "api_endpoint": p.apiEndpoint, "access_token": p.accesstoken, "refresh_token": p.refreshtoken, "region": p.region, diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 297d5bd6a7..20ac065722 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -35,13 +35,15 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { var url string - api_endpoint := GetHost(s.Args["api_endpoint"].(string)) + api_endpoint := s.Args["api_endpoint"].(string) if api_endpoint == "" { url = fmt.Sprintf("https://api.%s%s", host, uri) } else { url = fmt.Sprintf("%s%s", api_endpoint, uri) } + fmt.Println(api_endpoint) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { log.Fatal(err) From 2ba0193023955e3dfe93f692b12c7e261346de38 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Wed, 24 Aug 2022 21:34:03 +0530 Subject: [PATCH 23/73] fix: removed api-endpoint for now --- cmd/provider_cmd_squadcast.go | 4 +--- providers/squadcast/squadcast_provider.go | 11 ++++------- providers/squadcast/squadcast_service.go | 13 ++----------- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index 23a7b2fd29..a5aab9208d 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -12,7 +12,6 @@ import ( func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { var refreshToken string var teamName string - var apiEndpoint string cmd := &cobra.Command{ Use: "squadcast", @@ -25,7 +24,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { options.PathPattern = originalPathPattern options.PathPattern += region + "/" log.Println(provider.GetName() + " importing region " + region) - err := Import(provider, options, []string{refreshToken, region, teamName, apiEndpoint}) + err := Import(provider, options, []string{refreshToken, region, teamName}) if err != nil { return err } @@ -38,7 +37,6 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { cmd.PersistentFlags().StringVarP(&refreshToken, "refresh-token", "", "", "YOUR_SQUADCAST_REFRESH_TOKEN or env param SQUADCAST_REFRESH_TOKEN") cmd.PersistentFlags().StringSliceVarP(&options.Regions, "region", "", []string{}, "eu or us") cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "Squadcast team name") - cmd.PersistentFlags().StringVarP(&apiEndpoint, "api-endpoint", "", "", "Custom Squadcast API endpoint") return cmd } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 8e2bb7270a..978c5716cb 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -17,7 +17,6 @@ import ( type SquadcastProvider struct { terraformutils.Provider - apiEndpoint string accesstoken string refreshtoken string region string @@ -70,10 +69,6 @@ func (p *SquadcastProvider) Init(args []string) error { p.teamName = args[2] } - if args[3] != "" { - p.apiEndpoint = args[3] - } - p.GetAccessToken() return nil } @@ -88,7 +83,6 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetVerbose(verbose) p.Service.SetProviderName(p.GetName()) p.Service.SetArgs(map[string]interface{}{ - "api_endpoint": p.apiEndpoint, "access_token": p.accesstoken, "refresh_token": p.refreshtoken, "region": p.region, @@ -136,11 +130,14 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv } } + func (p *SquadcastProvider) GetAccessToken() { host := GetHost(p.region) ctx := context.Background() - req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://auth.%s/oauth/access-token", host), nil) + url := fmt.Sprintf("https://auth.%s/oauth/access-token", host) + + req, err := http.NewRequestWithContext(ctx, http.MethodGet,url , nil) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 20ac065722..cb5e3570a5 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -31,18 +31,9 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { if host == "" { log.Fatal("unknown region") } - ctx := context.Background() - - var url string - api_endpoint := s.Args["api_endpoint"].(string) - if api_endpoint == "" { - url = fmt.Sprintf("https://api.%s%s", host, uri) - } else { - url = fmt.Sprintf("%s%s", api_endpoint, uri) - } - - fmt.Println(api_endpoint) + ctx := context.Background() + url := fmt.Sprintf("https://api.%s%s", host, uri) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { From 47d6ef0e555cadfe62ca71ffbf264c61f06a1f28 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 13:06:25 +0530 Subject: [PATCH 24/73] feat: added tagging rules to squadcast --- cmd/provider_cmd_squadcast.go | 4 +- providers/squadcast/squadcast_provider.go | 10 ++- providers/squadcast/squadcast_service.go | 19 +++++ providers/squadcast/tagging_rules.go | 84 +++++++++++++++++++++++ 4 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 providers/squadcast/tagging_rules.go diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index a5aab9208d..8921087bd1 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -12,6 +12,7 @@ import ( func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { var refreshToken string var teamName string + var serviceName string cmd := &cobra.Command{ Use: "squadcast", @@ -24,7 +25,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { options.PathPattern = originalPathPattern options.PathPattern += region + "/" log.Println(provider.GetName() + " importing region " + region) - err := Import(provider, options, []string{refreshToken, region, teamName}) + err := Import(provider, options, []string{refreshToken, region, teamName, serviceName}) if err != nil { return err } @@ -37,6 +38,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { cmd.PersistentFlags().StringVarP(&refreshToken, "refresh-token", "", "", "YOUR_SQUADCAST_REFRESH_TOKEN or env param SQUADCAST_REFRESH_TOKEN") cmd.PersistentFlags().StringSliceVarP(&options.Regions, "region", "", []string{}, "eu or us") cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "Squadcast team name") + cmd.PersistentFlags().StringVarP(&serviceName, "service-name", "", "", "Squadcast service name") return cmd } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 978c5716cb..62d570efc2 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -21,6 +21,7 @@ type SquadcastProvider struct { refreshtoken string region string teamName string + serviceName string } type AccessToken struct { @@ -69,6 +70,10 @@ func (p *SquadcastProvider) Init(args []string) error { p.teamName = args[2] } + if args[3] != "" { + p.serviceName = args[3] + } + p.GetAccessToken() return nil } @@ -87,6 +92,7 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error "refresh_token": p.refreshtoken, "region": p.region, "team_name": p.teamName, + "service_name": p.serviceName, }) return nil } @@ -127,17 +133,17 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv "escalation_policy": &EscalationPolicyGenerator{}, "runbook": &RunbookGenerator{}, "slo": &SLOGenerator{}, + "tagging_rules": &TaggingRulesGenerator{}, } } - func (p *SquadcastProvider) GetAccessToken() { host := GetHost(p.region) ctx := context.Background() url := fmt.Sprintf("https://auth.%s/oauth/access-token", host) - req, err := http.NewRequestWithContext(ctx, http.MethodGet,url , nil) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index cb5e3570a5..08d7d3e4d5 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -2,11 +2,13 @@ package squadcast import ( "context" + "encoding/json" "fmt" "io" "io/ioutil" "log" "net/http" + "net/url" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -15,6 +17,10 @@ type SquadcastService struct { terraformutils.Service } +var ResponseService struct { + Data *Service `json:"data"` +} + func GetHost(region string) string { switch region { case "us": @@ -63,3 +69,16 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { return body, nil } + +func (s *SquadcastService) getServiceByName(teamID string, name string) (Service, error) { + body, err := s.generateRequest(fmt.Sprintf("/v3/services/by-name?name=%s&owner_id=%s", url.QueryEscape(name), teamID)) + if err != nil { + log.Fatal(err) + } + err = json.Unmarshal(body, &ResponseService) + if err != nil { + log.Fatal(err) + } + + return *ResponseService.Data, nil +} diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go new file mode 100644 index 0000000000..2d8b07da77 --- /dev/null +++ b/providers/squadcast/tagging_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type TaggingRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type TaggingRules struct { + ID string `json:"id"` + ServiceID string `json:"service_id"` + Rules []*TaggingRule `json:"rules"` +} +type TaggingRule struct { + IsBasic bool `json:"is_basic"` + Expression string `json:"expression"` +} + +var responseTaggingRule struct { + Data *TaggingRules `json:"data"` +} + +func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range taggingRule.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + g.teamID+"_"+rule.Expression, + "tagging_rule_"+(rule.Expression), + "squadcast_tagging_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *TaggingRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.serviceID)) + if err != nil { + return nil + } + err = json.Unmarshal(body, &responseTaggingRule) + if err != nil { + return err + } + + g.Resources = g.createResources(*responseTaggingRule.Data) + + return nil +} From 0b9617d47956c702a514a0cbc7009513ed324690 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 14:18:40 +0530 Subject: [PATCH 25/73] fix: fixed invalid service ID --- providers/squadcast/tagging_rules.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index 2d8b07da77..f94327ac8b 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -37,7 +37,8 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr "squadcast_tagging_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, + "team_id": g.teamID, + "service_id": g.serviceID, }, []string{}, map[string]interface{}{}, From d77b44cbc90b653ba370aaa72098c3083b05fa72 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:21:18 +0530 Subject: [PATCH 26/73] feat: added routing rules to squadcast provider --- providers/squadcast/routing_rule.go | 84 +++++++++++++++++++++++ providers/squadcast/squadcast_provider.go | 1 + providers/squadcast/tagging_rules.go | 8 +-- 3 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 providers/squadcast/routing_rule.go diff --git a/providers/squadcast/routing_rule.go b/providers/squadcast/routing_rule.go new file mode 100644 index 0000000000..9f785bb4d9 --- /dev/null +++ b/providers/squadcast/routing_rule.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type RoutingRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type RoutingRules struct { + ID string `json:"id"` + Rules []*RoutingRule `json:"rules"` +} + +type RoutingRule struct { + ID string `json:"rule_id"` +} + +var getRoutingRuleResponse struct { + Data *RoutingRules `json:"data"` +} + +func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range routingRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "routing_rule_"+(rule.ID), + "squadcast_routing_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *RoutingRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getRoutingRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getRoutingRuleResponse.Data) + + return nil +} diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 62d570efc2..7172de06fa 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -134,6 +134,7 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv "runbook": &RunbookGenerator{}, "slo": &SLOGenerator{}, "tagging_rules": &TaggingRulesGenerator{}, + "routing_rules": &RoutingRulesGenerator{}, } } diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index f94327ac8b..12fec20e70 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -24,7 +24,7 @@ type TaggingRule struct { Expression string `json:"expression"` } -var responseTaggingRule struct { +var getTaggingRuleResponse struct { Data *TaggingRules `json:"data"` } @@ -72,14 +72,14 @@ func (g *TaggingRulesGenerator) InitResources() error { g.serviceID = service.ID body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.serviceID)) if err != nil { - return nil + return err } - err = json.Unmarshal(body, &responseTaggingRule) + err = json.Unmarshal(body, &getTaggingRuleResponse) if err != nil { return err } - g.Resources = g.createResources(*responseTaggingRule.Data) + g.Resources = g.createResources(*getTaggingRuleResponse.Data) return nil } From 1291d0e10b9faacb644210adf3067185c4275318 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:45:53 +0530 Subject: [PATCH 27/73] feat: deduplication rules resource added to squadcast provider --- providers/squadcast/deduplication_rules.go | 84 ++++++++++++++++++++++ providers/squadcast/squadcast_provider.go | 23 +++--- 2 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 providers/squadcast/deduplication_rules.go diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go new file mode 100644 index 0000000000..44e17a89f8 --- /dev/null +++ b/providers/squadcast/deduplication_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type DeduplicationRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type DeduplicationRules struct { + ID string `json:"id"` + Rules []*DeduplicationRule `json:"rules"` +} + +type DeduplicationRule struct { + ID string `json:"rule_id"` +} + +var getDeduplicationRuleResponse struct { + Data *DeduplicationRules `json:"data"` +} + +func (g *DeduplicationRulesGenerator) createResources(deduplicationRules DeduplicationRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range deduplicationRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "deduplication_rule_"+(rule.ID), + "squadcast_deduplication_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *DeduplicationRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getDeduplicationRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getDeduplicationRuleResponse.Data) + + return nil +} diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 7172de06fa..e3008f9a47 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -124,17 +124,18 @@ func (p *SquadcastProvider) GetName() string { func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ - "user": &UserGenerator{}, - "service": &ServiceGenerator{}, - "squad": &SquadGenerator{}, - "team": &TeamGenerator{}, - "team_member": &TeamMemberGenerator{}, - "team_roles": &TeamRolesGenerator{}, - "escalation_policy": &EscalationPolicyGenerator{}, - "runbook": &RunbookGenerator{}, - "slo": &SLOGenerator{}, - "tagging_rules": &TaggingRulesGenerator{}, - "routing_rules": &RoutingRulesGenerator{}, + "user": &UserGenerator{}, + "service": &ServiceGenerator{}, + "squad": &SquadGenerator{}, + "team": &TeamGenerator{}, + "team_member": &TeamMemberGenerator{}, + "team_roles": &TeamRolesGenerator{}, + "escalation_policy": &EscalationPolicyGenerator{}, + "runbook": &RunbookGenerator{}, + "slo": &SLOGenerator{}, + "tagging_rules": &TaggingRulesGenerator{}, + "routing_rules": &RoutingRulesGenerator{}, + "deduplication_rules": &DeduplicationRulesGenerator{}, } } From d883b04275d95de736d35fc4a1d5c14f247facb6 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 17:23:13 +0530 Subject: [PATCH 28/73] fixed routing rules file name --- providers/squadcast/{routing_rule.go => routing_rules.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename providers/squadcast/{routing_rule.go => routing_rules.go} (100%) diff --git a/providers/squadcast/routing_rule.go b/providers/squadcast/routing_rules.go similarity index 100% rename from providers/squadcast/routing_rule.go rename to providers/squadcast/routing_rules.go From 99174d4d3fb3c9c4a7f96f7fcf32f40a11924750 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 17:43:27 +0530 Subject: [PATCH 29/73] feat: added suppression rules resource to squadcast provider --- providers/squadcast/squadcast_provider.go | 1 + providers/squadcast/suppression_rules.go | 84 +++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 providers/squadcast/suppression_rules.go diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index e3008f9a47..6b67c90ede 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -136,6 +136,7 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv "tagging_rules": &TaggingRulesGenerator{}, "routing_rules": &RoutingRulesGenerator{}, "deduplication_rules": &DeduplicationRulesGenerator{}, + "suppression_rules": &SuppressionRulesGenerator{}, } } diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go new file mode 100644 index 0000000000..c5218434d5 --- /dev/null +++ b/providers/squadcast/suppression_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type SuppressionRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type SuppressionRules struct { + ID string `json:"id"` + Rules []*SuppressionRule `json:"rules"` +} + +type SuppressionRule struct { + ID string `json:"rule_id"` +} + +var getSuppressionRuleResponse struct { + Data *SuppressionRules `json:"data"` +} + +func (g *SuppressionRulesGenerator) createResources(suppressionRules SuppressionRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range suppressionRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "suppression_rule_"+(rule.ID), + "squadcast_suppression_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *SuppressionRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/suppression-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getSuppressionRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getSuppressionRuleResponse.Data) + + return nil +} From 572bb41d77777afe03b7d444f09abd6d2676a716 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Tue, 30 Aug 2022 14:25:45 +0530 Subject: [PATCH 30/73] fix: fixed all suggested changes --- cmd/provider_cmd_squadcast.go | 22 +++----- docs/squadcast.md | 16 ++++-- providers/squadcast/escalation_policy.go | 26 ++-------- providers/squadcast/runbook.go | 22 +------- providers/squadcast/service.go | 22 +------- providers/squadcast/slo.go | 24 ++------- providers/squadcast/squad.go | 26 ++-------- providers/squadcast/squadcast_provider.go | 63 +++++++++++++++++++++-- providers/squadcast/squadcast_service.go | 6 ++- providers/squadcast/team_member.go | 4 +- providers/squadcast/team_roles.go | 25 ++------- 11 files changed, 103 insertions(+), 153 deletions(-) diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index a5aab9208d..72bf5d2531 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -1,8 +1,6 @@ package cmd import ( - "log" - squadcast_terraforming "github.com/GoogleCloudPlatform/terraformer/providers/squadcast" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -10,24 +8,18 @@ import ( ) func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { - var refreshToken string - var teamName string + var refreshToken, teamName, region string cmd := &cobra.Command{ Use: "squadcast", Short: "Import current state to Terraform configuration from Squadcast", Long: "Import current state to Terraform configuration from Squadcast", RunE: func(cmd *cobra.Command, args []string) error { - originalPathPattern := options.PathPattern - for _, region := range options.Regions { - provider := newSquadcastProvider() - options.PathPattern = originalPathPattern - options.PathPattern += region + "/" - log.Println(provider.GetName() + " importing region " + region) - err := Import(provider, options, []string{refreshToken, region, teamName}) - if err != nil { - return err - } + provider := newSquadcastProvider() + options.PathPattern += region + "/" + err := Import(provider, options, []string{refreshToken, region, teamName}) + if err != nil { + return err } return nil }, @@ -35,7 +27,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { cmd.AddCommand(listCmd(newSquadcastProvider())) baseProviderFlags(cmd.PersistentFlags(), &options, "user", "") cmd.PersistentFlags().StringVarP(&refreshToken, "refresh-token", "", "", "YOUR_SQUADCAST_REFRESH_TOKEN or env param SQUADCAST_REFRESH_TOKEN") - cmd.PersistentFlags().StringSliceVarP(&options.Regions, "region", "", []string{}, "eu or us") + cmd.PersistentFlags().StringVarP(®ion, "region", "", "", "eu or us") cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "Squadcast team name") return cmd } diff --git a/docs/squadcast.md b/docs/squadcast.md index 22a321df65..54a8cd4e87 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -4,12 +4,23 @@ Syntax: `export SQUADCAST_REFRESH_TOKEN=` +OR + +Add `--refresh-token` flag in cmd + + ``` terraformer import squadcast --resources= --region=SQUADCAST_REGION ``` Examples: +- `Import Resource by providing refresh-token as a flag` + +``` +terraformer import squadcast --resources=team --region=us --team-name="Default Team" --refresh-token=YOUR_REFRESH_TOKEN +``` + - `Import User Resource` ``` @@ -22,11 +33,7 @@ terraformer import squadcast --resources=user --region=us terraformer import squadcast --resources=team --region=us --team-name="Default Team" ``` -- `Import Resource by providing refresh-token as a flag` -``` -terraformer import squadcast --resources=team --region=us --team-name="Default Team" --refresh-token=YOUR_REFRESH_TOKEN -``` ### Flags: @@ -42,6 +49,7 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - runbook - `--region` + - Supported Values: - `us` - `eu` diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 5bb2165e94..1dd03f77fc 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -4,14 +4,12 @@ import ( "encoding/json" "errors" "fmt" - "net/url" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type EscalationPolicyGenerator struct { SquadcastService - teamID string } type EscalationPolicy struct { @@ -32,7 +30,7 @@ func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) "squadcast_escalation_policy", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, + "team_id": g.Args["team_id"].(string), }, []string{}, map[string]interface{}{}, @@ -43,27 +41,11 @@ func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) } func (g *EscalationPolicyGenerator) InitResources() error { - teamName := g.Args["team_name"].(string) - if len(teamName) == 0 { + teamID := g.Args["team_id"].(string) + if teamID == "" { return errors.New("--team-name is required") } - - escapedTeamName := url.QueryEscape(teamName) - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) - - team, err := g.generateRequest(getTeamURL) - if err != nil { - return err - } - - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - - g.teamID = getTeamResponse.Data.ID - - getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.teamID) + getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", teamID) body, err := g.generateRequest(getEscalationPolicyURL) if err != nil { return err diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index 0db53a89c8..13d2a29413 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -5,15 +5,12 @@ package squadcast import ( "encoding/json" "errors" - "fmt" - "net/url" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type RunbookGenerator struct { SquadcastService - teamID string } type Runbook struct { @@ -35,7 +32,7 @@ func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils. "squadcast_runbook", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, + "team_id": g.Args["team_id"].(string), }, []string{}, map[string]interface{}{}, @@ -45,24 +42,9 @@ func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils. } func (g *RunbookGenerator) InitResources() error { - teamName := g.Args["team_name"].(string) - if len(teamName) == 0 { + if g.Args["team_id"].(string) == "" { return errors.New("--team-name is required") } - - escapedTeamName := url.QueryEscape(teamName) - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) - team, err := g.generateRequest(getTeamURL) - if err != nil { - return err - } - - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - getRunbooksURL := "/v3/runbooks" body, err := g.generateRequest(getRunbooksURL) if err != nil { diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index c7f87805b5..b04df45d85 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -5,15 +5,12 @@ package squadcast import ( "encoding/json" "errors" - "fmt" - "net/url" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type ServiceGenerator struct { SquadcastService - teamID string } type Service struct { @@ -34,7 +31,7 @@ func (g *ServiceGenerator) createResources(services []Service) []terraformutils. "squadcast_service", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, + "team_id": g.Args["team_id"].(string), }, []string{}, map[string]interface{}{}, @@ -44,24 +41,9 @@ func (g *ServiceGenerator) createResources(services []Service) []terraformutils. } func (g *ServiceGenerator) InitResources() error { - teamName := g.Args["team_name"].(string) - if len(teamName) == 0 { + if g.Args["team_id"].(string) == "" { return errors.New("--team-name is required") } - - escapedTeamName := url.QueryEscape(teamName) - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) - team, err := g.generateRequest(getTeamURL) - if err != nil { - return err - } - - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - getServicesURL := "/v3/services" body, err := g.generateRequest(getServicesURL) if err != nil { diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go index 120a8f9dc6..37fb3cafa3 100644 --- a/providers/squadcast/slo.go +++ b/providers/squadcast/slo.go @@ -6,14 +6,12 @@ import ( "encoding/json" "errors" "fmt" - "net/url" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type SLOGenerator struct { SquadcastService - teamID string } type SLO struct { @@ -36,7 +34,7 @@ func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { "squadcast_slo", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, + "team_id": g.Args["team_id"].(string), }, []string{}, map[string]interface{}{}, @@ -46,25 +44,11 @@ func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { } func (g *SLOGenerator) InitResources() error { - teamName := g.Args["team_name"].(string) - if len(teamName) == 0 { + teamID := g.Args["team_id"].(string) + if teamID == "" { return errors.New("--team-name is required") } - - escapedTeamName := url.QueryEscape(teamName) - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) - team, err := g.generateRequest(getTeamURL) - if err != nil { - return err - } - - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - - getSLOsURL := "/v3/slo?owner_id=" + g.teamID + getSLOsURL := fmt.Sprintf("/v3/slo?owner_id=%s", teamID) body, err := g.generateRequest(getSLOsURL) if err != nil { return err diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index 0f068f4b3b..e35f67e1de 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -4,14 +4,12 @@ import ( "encoding/json" "errors" "fmt" - "net/url" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type SquadGenerator struct { SquadcastService - teamID string } type Squad struct { @@ -32,7 +30,7 @@ func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resour "squadcast_squad", "squadcast", map[string]string{ - "team_id": g.teamID, + "team_id": g.Args["team_id"].(string), "name": squad.Name, }, []string{}, @@ -43,27 +41,11 @@ func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resour } func (g *SquadGenerator) InitResources() error { - teamName := g.Args["team_name"].(string) - if(teamName == "") { + teamID := g.Args["team_id"].(string) + if teamID == "" { return errors.New("--team-name is required") } - - escapedTeamName := url.QueryEscape(teamName) - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s",escapedTeamName) - - team, err := g.generateRequest(getTeamURL) - if err != nil { - return err - } - - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - - g.teamID = getTeamResponse.Data.ID - - getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", g.teamID); + getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", teamID); body, err := g.generateRequest(getSquadsURL) if err != nil { return err diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 978c5716cb..844c33cd33 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -8,6 +8,7 @@ import ( "io" "log" "net/http" + "net/url" "os" "github.com/zclconf/go-cty/cty" @@ -20,7 +21,8 @@ type SquadcastProvider struct { accesstoken string refreshtoken string region string - teamName string + teamID string + teamName string } type AccessToken struct { @@ -42,7 +44,7 @@ type AppError struct { } const ( - UserAgent = "terraform-provider-squadcast" + UserAgent = "terraformer-squadcast" ) func (p *SquadcastProvider) Init(args []string) error { @@ -64,12 +66,13 @@ func (p *SquadcastProvider) Init(args []string) error { return errors.New("required region missing") } p.region = args[1] + p.GetAccessToken() if args[2] != "" { p.teamName = args[2] + p.GetTeamID() } - p.GetAccessToken() return nil } @@ -82,15 +85,18 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetName(serviceName) p.Service.SetVerbose(verbose) p.Service.SetProviderName(p.GetName()) + // SetArgs are used for fetching details within other files in the terraformer code. p.Service.SetArgs(map[string]interface{}{ "access_token": p.accesstoken, - "refresh_token": p.refreshtoken, "region": p.region, + "team_id": p.teamID, "team_name": p.teamName, }) return nil } +// @desc GetConfig is used to send details to provider block of terraform-provider-squadcast + func (p *SquadcastProvider) GetConfig() cty.Value { return cty.ObjectVal(map[string]cty.Value{ "region": cty.StringVal(p.region), @@ -177,3 +183,52 @@ func (p *SquadcastProvider) GetAccessToken() { p.accesstoken = response.Data.AccessToken } + +func (p *SquadcastProvider) GetTeamID() { + host := GetHost(p.region) + ctx := context.Background() + + url := fmt.Sprintf("https://api.%s/v3/teams/by-name?name=%s", host, url.QueryEscape(p.teamName)) + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + log.Fatal(err) + } + + accessToken := fmt.Sprintf("Bearer %s", p.accesstoken) + + req.Header.Set("Authorization", accessToken) + req.Header.Set("User-Agent", UserAgent) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + log.Fatal(err) + } + + var response struct { + Data Team `json:"data"` + *Meta + } + + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Fatal(err) + } + }(resp.Body) + + bytes, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatal(err) + } + + if err := json.Unmarshal(bytes, &response); err != nil { + log.Fatal(err) + } + + if resp.StatusCode > 299 { + log.Fatal(err) + } + + p.teamID = response.Data.ID +} \ No newline at end of file diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index cb5e3570a5..1ab87de601 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -26,6 +26,8 @@ func GetHost(region string) string { } } + + func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { host := GetHost(s.Args["region"].(string)) if host == "" { @@ -40,9 +42,9 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { log.Fatal(err) } - AccessToken := fmt.Sprintf("Bearer %s", s.Args["access_token"]) + accessToken := fmt.Sprintf("Bearer %s", s.Args["access_token"]) - req.Header.Set("Authorization", AccessToken) + req.Header.Set("Authorization", accessToken) req.Header.Set("User-Agent", UserAgent) resp, err := http.DefaultClient.Do(req) diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index a4a60db744..eb826539cc 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -11,7 +11,6 @@ import ( type TeamMemberGenerator struct { SquadcastService - teamID string } var getTeamResponse struct { @@ -20,7 +19,6 @@ var getTeamResponse struct { func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resource { var teamMemberList []terraformutils.Resource - g.teamID = team.ID for _, member := range team.Members { teamMemberList = append(teamMemberList, terraformutils.NewResource( member.UserID, @@ -28,7 +26,7 @@ func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resour "squadcast_team_member", g.ProviderName, map[string]string{ - "team_id": g.teamID, + "team_id": team.ID, }, []string{}, map[string]interface{}{}, diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 97cb84578f..897f4bb930 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -4,14 +4,12 @@ import ( "encoding/json" "errors" "fmt" - "net/url" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type TeamRolesGenerator struct { SquadcastService - teamID string } type TeamRole struct { @@ -34,7 +32,7 @@ func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformut "squadcast_team_role", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, + "team_id": g.Args["team_id"].(string), }, []string{}, map[string]interface{}{}, @@ -45,26 +43,11 @@ func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformut } func (g *TeamRolesGenerator) InitResources() error { - teamName := g.Args["team_name"].(string) - if(teamName == "") { + teamID := g.Args["team_id"].(string) + if teamID == "" { return errors.New("--team-name is required") } - - escapedTeamName := url.QueryEscape(teamName) - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s",escapedTeamName) - - team, err := g.generateRequest(getTeamURL) - if err != nil { - return err - } - - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - - g.teamID = getTeamResponse.Data.ID - getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", g.teamID) + getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", teamID) body, err := g.generateRequest(getTeamRolesURL) if err != nil { From 29decc001cf591955f93d26ae8e74e1b2cfc5fe3 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 13:06:25 +0530 Subject: [PATCH 31/73] feat: added tagging rules to squadcast --- providers/squadcast/squadcast_service.go | 19 ++++++ providers/squadcast/tagging_rules.go | 84 ++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 providers/squadcast/tagging_rules.go diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 1ab87de601..926b17cec1 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -2,11 +2,13 @@ package squadcast import ( "context" + "encoding/json" "fmt" "io" "io/ioutil" "log" "net/http" + "net/url" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -15,6 +17,10 @@ type SquadcastService struct { terraformutils.Service } +var ResponseService struct { + Data *Service `json:"data"` +} + func GetHost(region string) string { switch region { case "us": @@ -65,3 +71,16 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { return body, nil } + +func (s *SquadcastService) getServiceByName(teamID string, name string) (Service, error) { + body, err := s.generateRequest(fmt.Sprintf("/v3/services/by-name?name=%s&owner_id=%s", url.QueryEscape(name), teamID)) + if err != nil { + log.Fatal(err) + } + err = json.Unmarshal(body, &ResponseService) + if err != nil { + log.Fatal(err) + } + + return *ResponseService.Data, nil +} diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go new file mode 100644 index 0000000000..2d8b07da77 --- /dev/null +++ b/providers/squadcast/tagging_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type TaggingRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type TaggingRules struct { + ID string `json:"id"` + ServiceID string `json:"service_id"` + Rules []*TaggingRule `json:"rules"` +} +type TaggingRule struct { + IsBasic bool `json:"is_basic"` + Expression string `json:"expression"` +} + +var responseTaggingRule struct { + Data *TaggingRules `json:"data"` +} + +func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range taggingRule.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + g.teamID+"_"+rule.Expression, + "tagging_rule_"+(rule.Expression), + "squadcast_tagging_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *TaggingRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.serviceID)) + if err != nil { + return nil + } + err = json.Unmarshal(body, &responseTaggingRule) + if err != nil { + return err + } + + g.Resources = g.createResources(*responseTaggingRule.Data) + + return nil +} From 4dd3f6d7e44956786c4aeaa0b9b1b805ea43645c Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 14:18:40 +0530 Subject: [PATCH 32/73] fix: fixed invalid service ID --- providers/squadcast/tagging_rules.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index 2d8b07da77..f94327ac8b 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -37,7 +37,8 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr "squadcast_tagging_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, + "team_id": g.teamID, + "service_id": g.serviceID, }, []string{}, map[string]interface{}{}, From 42dfa3de18231ebdfa2bb7cbc3960094652018bf Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:21:18 +0530 Subject: [PATCH 33/73] feat: added routing rules to squadcast provider --- providers/squadcast/routing_rule.go | 84 ++++++++++++++++++++++++++++ providers/squadcast/tagging_rules.go | 8 +-- 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 providers/squadcast/routing_rule.go diff --git a/providers/squadcast/routing_rule.go b/providers/squadcast/routing_rule.go new file mode 100644 index 0000000000..9f785bb4d9 --- /dev/null +++ b/providers/squadcast/routing_rule.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type RoutingRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type RoutingRules struct { + ID string `json:"id"` + Rules []*RoutingRule `json:"rules"` +} + +type RoutingRule struct { + ID string `json:"rule_id"` +} + +var getRoutingRuleResponse struct { + Data *RoutingRules `json:"data"` +} + +func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range routingRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "routing_rule_"+(rule.ID), + "squadcast_routing_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *RoutingRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getRoutingRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getRoutingRuleResponse.Data) + + return nil +} diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index f94327ac8b..12fec20e70 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -24,7 +24,7 @@ type TaggingRule struct { Expression string `json:"expression"` } -var responseTaggingRule struct { +var getTaggingRuleResponse struct { Data *TaggingRules `json:"data"` } @@ -72,14 +72,14 @@ func (g *TaggingRulesGenerator) InitResources() error { g.serviceID = service.ID body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.serviceID)) if err != nil { - return nil + return err } - err = json.Unmarshal(body, &responseTaggingRule) + err = json.Unmarshal(body, &getTaggingRuleResponse) if err != nil { return err } - g.Resources = g.createResources(*responseTaggingRule.Data) + g.Resources = g.createResources(*getTaggingRuleResponse.Data) return nil } From afaff9478476c293df2ea7888f9072b521e3a524 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:45:53 +0530 Subject: [PATCH 34/73] feat: deduplication rules resource added to squadcast provider --- providers/squadcast/deduplication_rules.go | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 providers/squadcast/deduplication_rules.go diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go new file mode 100644 index 0000000000..44e17a89f8 --- /dev/null +++ b/providers/squadcast/deduplication_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type DeduplicationRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type DeduplicationRules struct { + ID string `json:"id"` + Rules []*DeduplicationRule `json:"rules"` +} + +type DeduplicationRule struct { + ID string `json:"rule_id"` +} + +var getDeduplicationRuleResponse struct { + Data *DeduplicationRules `json:"data"` +} + +func (g *DeduplicationRulesGenerator) createResources(deduplicationRules DeduplicationRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range deduplicationRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "deduplication_rule_"+(rule.ID), + "squadcast_deduplication_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *DeduplicationRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getDeduplicationRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getDeduplicationRuleResponse.Data) + + return nil +} From ad1a502df7601fb7e9d9971b449729f08f99f0e2 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 17:23:13 +0530 Subject: [PATCH 35/73] fixed routing rules file name --- providers/squadcast/{routing_rule.go => routing_rules.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename providers/squadcast/{routing_rule.go => routing_rules.go} (100%) diff --git a/providers/squadcast/routing_rule.go b/providers/squadcast/routing_rules.go similarity index 100% rename from providers/squadcast/routing_rule.go rename to providers/squadcast/routing_rules.go From 467ff9f7cb1b5a60874d25866ec4040fd4d97e45 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 17:43:27 +0530 Subject: [PATCH 36/73] feat: added suppression rules resource to squadcast provider --- providers/squadcast/suppression_rules.go | 84 ++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 providers/squadcast/suppression_rules.go diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go new file mode 100644 index 0000000000..c5218434d5 --- /dev/null +++ b/providers/squadcast/suppression_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type SuppressionRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type SuppressionRules struct { + ID string `json:"id"` + Rules []*SuppressionRule `json:"rules"` +} + +type SuppressionRule struct { + ID string `json:"rule_id"` +} + +var getSuppressionRuleResponse struct { + Data *SuppressionRules `json:"data"` +} + +func (g *SuppressionRulesGenerator) createResources(suppressionRules SuppressionRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range suppressionRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "suppression_rule_"+(rule.ID), + "squadcast_suppression_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *SuppressionRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/suppression-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getSuppressionRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getSuppressionRuleResponse.Data) + + return nil +} From c5ed56a542321ab9675d93e7e3184b25b0631514 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:20:04 +0530 Subject: [PATCH 37/73] refactored the code --- cmd/provider_cmd_squadcast.go | 4 +- providers/squadcast/deduplication_rules.go | 23 ++-------- providers/squadcast/routing_rules.go | 23 ++-------- providers/squadcast/squadcast_provider.go | 51 ++++++++++++++++++++++ providers/squadcast/squadcast_service.go | 20 +-------- providers/squadcast/suppression_rules.go | 23 ++-------- providers/squadcast/tagging_rules.go | 30 +++---------- 7 files changed, 69 insertions(+), 105 deletions(-) diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index b07785cb99..6880e339ca 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -8,7 +8,7 @@ import ( ) func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { - var refreshToken, teamName, region string + var refreshToken, teamName, region, serviceName string cmd := &cobra.Command{ Use: "squadcast", @@ -17,7 +17,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { provider := newSquadcastProvider() options.PathPattern += region + "/" - err := Import(provider, options, []string{refreshToken, region, teamName}) + err := Import(provider, options, []string{refreshToken, region, teamName, serviceName}) if err != nil { return err } diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index 44e17a89f8..93a09d5b18 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -5,13 +5,10 @@ import ( "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" ) type DeduplicationRulesGenerator struct { SquadcastService - serviceID string - teamID string } type DeduplicationRules struct { @@ -36,8 +33,8 @@ func (g *DeduplicationRulesGenerator) createResources(deduplicationRules Dedupli "squadcast_deduplication_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, + "team_id": g.Args["team_id"].(string), + "service_id": g.Args["service_id"].(string), }, []string{}, map[string]interface{}{}, @@ -55,21 +52,7 @@ func (g *DeduplicationRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.serviceID)) + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"])) if err != nil { return err } diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index 9f785bb4d9..a556db9cdf 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -5,13 +5,10 @@ import ( "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" ) type RoutingRulesGenerator struct { SquadcastService - serviceID string - teamID string } type RoutingRules struct { @@ -36,8 +33,8 @@ func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []ter "squadcast_routing_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, + "team_id": g.Args["team_id"].(string), + "service_id": g.Args["service_id"].(string), }, []string{}, map[string]interface{}{}, @@ -55,21 +52,7 @@ func (g *RoutingRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.serviceID)) + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"])) if err != nil { return err } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index dac7182148..d989ada544 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -24,6 +24,7 @@ type SquadcastProvider struct { teamID string teamName string serviceName string + serviceID string } type AccessToken struct { @@ -76,6 +77,7 @@ func (p *SquadcastProvider) Init(args []string) error { if args[3] != "" { p.serviceName = args[3] + p.GetServiceID() } return nil @@ -97,6 +99,7 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error "team_id": p.teamID, "team_name": p.teamName, "service_name": p.serviceName, + "service_id": p.serviceID, }) return nil } @@ -241,3 +244,51 @@ func (p *SquadcastProvider) GetTeamID() { p.teamID = response.Data.ID } + +func (p *SquadcastProvider) GetServiceID() { + host := GetHost(p.region) + ctx := context.Background() + + url := fmt.Sprintf("https://api.%s/v3/services/by-name?name=%s&owner_id=%s", host, url.QueryEscape(p.serviceName), p.teamID) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + log.Fatal(err) + } + + accessToken := fmt.Sprintf("Bearer %s", p.accesstoken) + + req.Header.Set("Authorization", accessToken) + req.Header.Set("User-Agent", UserAgent) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + log.Fatal(err) + } + + var response struct { + Data Service `json:"data"` + *Meta + } + + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Fatal(err) + } + }(resp.Body) + + bytes, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatal(err) + } + + if err := json.Unmarshal(bytes, &response); err != nil { + log.Fatal(err) + } + + if resp.StatusCode > 299 { + log.Fatal(err) + } + + p.serviceID = response.Data.ID +} diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 926b17cec1..9d2cc103da 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -2,15 +2,12 @@ package squadcast import ( "context" - "encoding/json" "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" "io" "io/ioutil" "log" "net/http" - "net/url" - - "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type SquadcastService struct { @@ -32,8 +29,6 @@ func GetHost(region string) string { } } - - func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { host := GetHost(s.Args["region"].(string)) if host == "" { @@ -71,16 +66,3 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { return body, nil } - -func (s *SquadcastService) getServiceByName(teamID string, name string) (Service, error) { - body, err := s.generateRequest(fmt.Sprintf("/v3/services/by-name?name=%s&owner_id=%s", url.QueryEscape(name), teamID)) - if err != nil { - log.Fatal(err) - } - err = json.Unmarshal(body, &ResponseService) - if err != nil { - log.Fatal(err) - } - - return *ResponseService.Data, nil -} diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index c5218434d5..f566ea4712 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -5,13 +5,10 @@ import ( "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" ) type SuppressionRulesGenerator struct { SquadcastService - serviceID string - teamID string } type SuppressionRules struct { @@ -36,8 +33,8 @@ func (g *SuppressionRulesGenerator) createResources(suppressionRules Suppression "squadcast_suppression_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, + "team_id": g.Args["team_id"].(string), + "service_id": g.Args["service_id"].(string), }, []string{}, map[string]interface{}{}, @@ -55,21 +52,7 @@ func (g *SuppressionRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/suppression-rules", g.serviceID)) + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"])) if err != nil { return err } diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index 12fec20e70..93da88743c 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -5,13 +5,10 @@ import ( "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" ) type TaggingRulesGenerator struct { SquadcastService - serviceID string - teamID string } type TaggingRules struct { @@ -20,8 +17,7 @@ type TaggingRules struct { Rules []*TaggingRule `json:"rules"` } type TaggingRule struct { - IsBasic bool `json:"is_basic"` - Expression string `json:"expression"` + ID string `json:"rule_id"` } var getTaggingRuleResponse struct { @@ -32,13 +28,13 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr var resourceList []terraformutils.Resource for _, rule := range taggingRule.Rules { resourceList = append(resourceList, terraformutils.NewResource( - g.teamID+"_"+rule.Expression, - "tagging_rule_"+(rule.Expression), + g.Args["team_id"].(string)+"_"+rule.ID, + "tagging_rule_"+(rule.ID), "squadcast_tagging_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, + "team_id": g.Args["team_id"].(string), + "service_id": g.Args["service_id"].(string), }, []string{}, map[string]interface{}{}, @@ -56,21 +52,7 @@ func (g *TaggingRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.serviceID)) + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"])) if err != nil { return err } From bfca59c95ae3baa1bafed8dc545a53e73c023226 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Thu, 1 Sep 2022 15:43:42 +0530 Subject: [PATCH 38/73] fix: refactored code --- cmd/provider_cmd_squadcast.go | 5 +- providers/squadcast/deduplication_rules.go | 10 +- providers/squadcast/squadcast_provider.go | 140 +++------------------ providers/squadcast/squadcast_schedule.go | 56 +++++++++ providers/squadcast/squadcast_service.go | 46 ++++++- 5 files changed, 128 insertions(+), 129 deletions(-) create mode 100644 providers/squadcast/squadcast_schedule.go diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index 6880e339ca..13c98c975e 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -8,7 +8,7 @@ import ( ) func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { - var refreshToken, teamName, region, serviceName string + var refreshToken, teamName, region, serviceName, scheduleName string cmd := &cobra.Command{ Use: "squadcast", @@ -17,7 +17,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { provider := newSquadcastProvider() options.PathPattern += region + "/" - err := Import(provider, options, []string{refreshToken, region, teamName, serviceName}) + err := Import(provider, options, []string{refreshToken, region, teamName, serviceName, scheduleName}) if err != nil { return err } @@ -30,6 +30,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { cmd.PersistentFlags().StringVarP(®ion, "region", "", "", "eu or us") cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "Squadcast team name") cmd.PersistentFlags().StringVarP(&serviceName, "service-name", "", "", "Squadcast service name") + cmd.PersistentFlags().StringVarP(&scheduleName, "schedule-name", "", "", "Squadcast schedule name") return cmd } diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index 93a09d5b18..a5269a6ae0 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -20,7 +21,7 @@ type DeduplicationRule struct { ID string `json:"rule_id"` } -var getDeduplicationRuleResponse struct { +var getDeduplicationRulesResponse struct { Data *DeduplicationRules `json:"data"` } @@ -52,16 +53,17 @@ func (g *DeduplicationRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"])) + getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]) + body, err := g.generateRequest(getDeduplicationRulesURL) if err != nil { return err } - err = json.Unmarshal(body, &getDeduplicationRuleResponse) + err = json.Unmarshal(body, &getDeduplicationRulesResponse) if err != nil { return err } - g.Resources = g.createResources(*getDeduplicationRuleResponse.Data) + g.Resources = g.createResources(*getDeduplicationRulesResponse.Data) return nil } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index d989ada544..b6f9c2fafc 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -1,13 +1,9 @@ package squadcast import ( - "context" - "encoding/json" "errors" "fmt" - "io" "log" - "net/http" "net/url" "os" @@ -25,6 +21,7 @@ type SquadcastProvider struct { teamName string serviceName string serviceID string + scheduleName string } type AccessToken struct { @@ -80,6 +77,10 @@ func (p *SquadcastProvider) Init(args []string) error { p.GetServiceID() } + if args[4] != "" { + p.scheduleName = args[4] + } + return nil } @@ -100,11 +101,12 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error "team_name": p.teamName, "service_name": p.serviceName, "service_id": p.serviceID, + "schedule_name": p.scheduleName, }) return nil } -// @desc GetConfig is used to send details to provider block of terraform-provider-squadcast +// @desc: GetConfig is used to send details to provider block of terraform-provider-squadcast func (p *SquadcastProvider) GetConfig() cty.Value { return cty.ObjectVal(map[string]cty.Value{ @@ -146,149 +148,43 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv "routing_rules": &RoutingRulesGenerator{}, "deduplication_rules": &DeduplicationRulesGenerator{}, "suppression_rules": &SuppressionRulesGenerator{}, + "schedule": &SchedulesGenerator{}, } } func (p *SquadcastProvider) GetAccessToken() { host := GetHost(p.region) - ctx := context.Background() - url := fmt.Sprintf("https://auth.%s/oauth/access-token", host) + header := map[string]string{"X-Refresh-Token": p.refreshtoken} + response, err := Request[AccessToken](url, header) - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) - if err != nil { - log.Fatal(err) - } - - req.Header.Set("X-Refresh-Token", p.refreshtoken) - req.Header.Set("User-Agent", UserAgent) - - resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } - - var response struct { - Data AccessToken `json:"data"` - *Meta - } - - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - log.Fatal(err) - } - }(resp.Body) - - bytes, err := io.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - - if err := json.Unmarshal(bytes, &response); err != nil { - log.Fatal(err) - } - - if resp.StatusCode > 299 { - log.Fatal(err) - } - - p.accesstoken = response.Data.AccessToken + p.accesstoken = response.AccessToken } func (p *SquadcastProvider) GetTeamID() { host := GetHost(p.region) - ctx := context.Background() - url := fmt.Sprintf("https://api.%s/v3/teams/by-name?name=%s", host, url.QueryEscape(p.teamName)) - - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + header := map[string]string{"Authorization": fmt.Sprintf("Bearer %s", p.accesstoken)} + + response, err := Request[Team](url, header) if err != nil { log.Fatal(err) } - - accessToken := fmt.Sprintf("Bearer %s", p.accesstoken) - - req.Header.Set("Authorization", accessToken) - req.Header.Set("User-Agent", UserAgent) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - log.Fatal(err) - } - - var response struct { - Data Team `json:"data"` - *Meta - } - - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - log.Fatal(err) - } - }(resp.Body) - - bytes, err := io.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - - if err := json.Unmarshal(bytes, &response); err != nil { - log.Fatal(err) - } - - if resp.StatusCode > 299 { - log.Fatal(err) - } - - p.teamID = response.Data.ID + p.teamID = response.ID } func (p *SquadcastProvider) GetServiceID() { host := GetHost(p.region) - ctx := context.Background() url := fmt.Sprintf("https://api.%s/v3/services/by-name?name=%s&owner_id=%s", host, url.QueryEscape(p.serviceName), p.teamID) - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) - if err != nil { - log.Fatal(err) - } - - accessToken := fmt.Sprintf("Bearer %s", p.accesstoken) + header := map[string]string{"Authorization": fmt.Sprintf("Bearer %s", p.accesstoken)} + response, err := Request[Service](url, header) - req.Header.Set("Authorization", accessToken) - req.Header.Set("User-Agent", UserAgent) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - log.Fatal(err) - } - - var response struct { - Data Service `json:"data"` - *Meta - } - - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - log.Fatal(err) - } - }(resp.Body) - - bytes, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } - - if err := json.Unmarshal(bytes, &response); err != nil { - log.Fatal(err) - } - - if resp.StatusCode > 299 { - log.Fatal(err) - } - - p.serviceID = response.Data.ID + p.serviceID = response.ID } diff --git a/providers/squadcast/squadcast_schedule.go b/providers/squadcast/squadcast_schedule.go new file mode 100644 index 0000000000..4648003122 --- /dev/null +++ b/providers/squadcast/squadcast_schedule.go @@ -0,0 +1,56 @@ +package squadcast + +import ( + "encoding/json" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type SchedulesGenerator struct { + SquadcastService +} + +type Schedule struct { + ID string `json:"id"` + Name string `json:"name"` +} + +var getSchedulesResponse struct { + Data *[]Schedule `json:"data"` +} + +func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, schedule := range schedules { + resourceList = append(resourceList, terraformutils.NewResource( + schedule.ID, + schedule.Name, + "squadcast_schedule", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + "name": g.Args["schedule_name"].(string), + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *SchedulesGenerator) InitResources() error { + getSchedules := "/v3/schedules" + body, err := g.generateRequest(getSchedules) + if err != nil { + return err + } + err = json.Unmarshal(body, &getSchedulesResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getSchedulesResponse.Data) + + return nil +} diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 9d2cc103da..a77a20252b 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -2,12 +2,14 @@ package squadcast import ( "context" + "encoding/json" "fmt" - "github.com/GoogleCloudPlatform/terraformer/terraformutils" "io" "io/ioutil" "log" "net/http" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) type SquadcastService struct { @@ -29,6 +31,48 @@ func GetHost(region string) string { } } +// @desc function used for GetAccessToken, GetTeamID, GetServiceID +func Request [TRes any] (url string, header map[string]string) (*TRes, error) { + ctx := context.Background() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + log.Fatal(err) + } + + for k, v := range header { + req.Header.Set(k, v) + } + req.Header.Set("User-Agent", UserAgent) + resp, err := http.DefaultClient.Do(req) + + var response struct { + Data *TRes `json:"data"` + *Meta + } + + if err != nil { + log.Fatal(err) + } + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + log.Fatal(err) + } + }(resp.Body) + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + err = json.Unmarshal(body, &response) + if err != nil { + return nil, err + } + return response.Data, nil +} + +// @desc function used for other APIs func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { host := GetHost(s.Args["region"].(string)) if host == "" { From 36847ed3c7adac0a606a1105d558e40bd5a60a20 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Fri, 2 Sep 2022 12:48:11 +0530 Subject: [PATCH 39/73] fix: merged request functions --- providers/squadcast/squad.go | 10 +- providers/squadcast/squadcast_provider.go | 115 ++++------------------ providers/squadcast/squadcast_service.go | 43 +++++--- providers/squadcast/team.go | 13 +-- providers/squadcast/team_roles.go | 11 +-- 5 files changed, 51 insertions(+), 141 deletions(-) diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index e35f67e1de..f09550f8f3 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" @@ -46,16 +45,11 @@ func (g *SquadGenerator) InitResources() error { return errors.New("--team-name is required") } getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", teamID); - body, err := g.generateRequest(getSquadsURL) - if err != nil { - return err - } - err = json.Unmarshal(body, &getSquadsResponse) + response, err := Request[[]Squad](getSquadsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - - g.Resources = g.createResources(*getSquadsResponse.Data) + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 844c33cd33..e65d57c550 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -1,13 +1,9 @@ package squadcast import ( - "context" - "encoding/json" "errors" "fmt" - "io" "log" - "net/http" "net/url" "os" @@ -95,7 +91,7 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error return nil } -// @desc GetConfig is used to send details to provider block of terraform-provider-squadcast +// @desc GetConfig: send details to provider block of terraform-provider-squadcast func (p *SquadcastProvider) GetConfig() cty.Value { return cty.ObjectVal(map[string]cty.Value{ @@ -124,111 +120,36 @@ func (p *SquadcastProvider) GetName() string { func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ - "user": &UserGenerator{}, - "service": &ServiceGenerator{}, + // "user": &UserGenerator{}, + // "service": &ServiceGenerator{}, "squad": &SquadGenerator{}, - "team": &TeamGenerator{}, - "team_member": &TeamMemberGenerator{}, - "team_roles": &TeamRolesGenerator{}, - "escalation_policy": &EscalationPolicyGenerator{}, - "runbook": &RunbookGenerator{}, - "slo": &SLOGenerator{}, + // "team": &TeamGenerator{}, + // "team_member": &TeamMemberGenerator{}, + // "team_roles": &TeamRolesGenerator{}, + // "escalation_policy": &EscalationPolicyGenerator{}, + // "runbook": &RunbookGenerator{}, + // "slo": &SLOGenerator{}, } } func (p *SquadcastProvider) GetAccessToken() { - host := GetHost(p.region) - ctx := context.Background() + url := "/oauth/access-token" + // header := map[string]string{"X-Refresh-Token": p.refreshtoken} + response, err := Request[AccessToken](url, p.refreshtoken, p.region, false) - url := fmt.Sprintf("https://auth.%s/oauth/access-token", host) - - req, err := http.NewRequestWithContext(ctx, http.MethodGet,url , nil) - if err != nil { - log.Fatal(err) - } - - req.Header.Set("X-Refresh-Token", p.refreshtoken) - req.Header.Set("User-Agent", UserAgent) - - resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } - - var response struct { - Data AccessToken `json:"data"` - *Meta - } - - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - log.Fatal(err) - } - }(resp.Body) - - bytes, err := io.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - - if err := json.Unmarshal(bytes, &response); err != nil { - log.Fatal(err) - } - - if resp.StatusCode > 299 { - log.Fatal(err) - } - - p.accesstoken = response.Data.AccessToken + p.accesstoken = response.AccessToken } func (p *SquadcastProvider) GetTeamID() { - host := GetHost(p.region) - ctx := context.Background() - - url := fmt.Sprintf("https://api.%s/v3/teams/by-name?name=%s", host, url.QueryEscape(p.teamName)) - - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + url := fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(p.teamName)) + // header := map[string]string{"Authorization": fmt.Sprintf("Bearer %s", p.accesstoken)} + response, err := Request[Team](url, p.accesstoken, p.region, true) if err != nil { log.Fatal(err) } - - accessToken := fmt.Sprintf("Bearer %s", p.accesstoken) - - req.Header.Set("Authorization", accessToken) - req.Header.Set("User-Agent", UserAgent) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - log.Fatal(err) - } - - var response struct { - Data Team `json:"data"` - *Meta - } - - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - log.Fatal(err) - } - }(resp.Body) - - bytes, err := io.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - - if err := json.Unmarshal(bytes, &response); err != nil { - log.Fatal(err) - } - - if resp.StatusCode > 299 { - log.Fatal(err) - } - - p.teamID = response.Data.ID -} \ No newline at end of file + p.teamID = response.ID +} diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 1ab87de601..75fc30166d 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -2,6 +2,7 @@ package squadcast import ( "context" + "encoding/json" "fmt" "io" "io/ioutil" @@ -26,28 +27,33 @@ func GetHost(region string) string { } } - - -func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { - host := GetHost(s.Args["region"].(string)) - if host == "" { - log.Fatal("unknown region") - } - +func Request [TRes any] (url string, token string, region string, isAuthenticated bool) (*TRes, error) { ctx := context.Background() - url := fmt.Sprintf("https://api.%s%s", host, uri) - - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + var URL string + var req *http.Request + var err error + host := GetHost(region) + if isAuthenticated { + URL = fmt.Sprintf("https://api.%s%s", host, url) + req, err = http.NewRequestWithContext(ctx, http.MethodGet, URL, nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) + } else { + URL = fmt.Sprintf("https://auth.%s%s", host, url) + req, err = http.NewRequestWithContext(ctx, http.MethodGet, URL, nil) + req.Header.Set("X-Refresh-Token", token) + } if err != nil { log.Fatal(err) } - accessToken := fmt.Sprintf("Bearer %s", s.Args["access_token"]) - - req.Header.Set("Authorization", accessToken) req.Header.Set("User-Agent", UserAgent) - resp, err := http.DefaultClient.Do(req) + + var response struct { + Data *TRes `json:"data"` + *Meta + } + if err != nil { log.Fatal(err) } @@ -63,5 +69,10 @@ func (s *SquadcastService) generateRequest(uri string) ([]byte, error) { return nil, err } - return body, nil + err = json.Unmarshal(body, &response) + if err != nil { + return nil, err + } + + return response.Data, nil } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index 87899500e1..1b11046ffa 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -1,8 +1,6 @@ package squadcast import ( - "encoding/json" - "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -45,17 +43,10 @@ func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource func (g *TeamGenerator) InitResources() error { getTeamsURL := "/v3/teams" - body, err := g.generateRequest(getTeamsURL) + response,err := Request[[]Team](getTeamsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - - err = json.Unmarshal(body, &getTeamsResponse) - if err != nil { - return err - } - - g.Resources = g.createResources(*getTeamsResponse.Data) - + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 897f4bb930..4dba864935 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" @@ -48,17 +47,11 @@ func (g *TeamRolesGenerator) InitResources() error { return errors.New("--team-name is required") } getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", teamID) - - body, err := g.generateRequest(getTeamRolesURL) - if err != nil { - return err - } - - err = json.Unmarshal(body, &getTeamRolesResponse) + response,err := Request[[]TeamRole](getTeamRolesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - g.Resources = g.createResources(*getTeamRolesResponse.Data) + g.Resources = g.createResources(*response) return nil } From 097908cf9477672ad2dbaeff8ef323af8763996d Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Fri, 2 Sep 2022 15:44:01 +0530 Subject: [PATCH 40/73] fix: updated dependency from genereateRequest to Request function for all resources --- providers/squadcast/escalation_policy.go | 15 ++---------- providers/squadcast/runbook.go | 15 ++---------- providers/squadcast/service.go | 14 ++--------- providers/squadcast/slo.go | 19 +++++---------- providers/squadcast/squad.go | 12 ++++------ providers/squadcast/squadcast_provider.go | 29 +++++++++++------------ providers/squadcast/squadcast_service.go | 2 +- providers/squadcast/team.go | 8 ++----- providers/squadcast/team_member.go | 17 ++----------- providers/squadcast/team_roles.go | 8 ++----- providers/squadcast/user.go | 15 ++---------- 11 files changed, 39 insertions(+), 115 deletions(-) diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 1dd03f77fc..e2a86d7ee9 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" @@ -17,10 +16,6 @@ type EscalationPolicy struct { Name string `json:"name"` } -var getEscalationPolicyResponse struct { - Data *[]EscalationPolicy `json:"data"` -} - func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) []terraformutils.Resource { var resourceList []terraformutils.Resource for _, policy := range policies { @@ -46,17 +41,11 @@ func (g *EscalationPolicyGenerator) InitResources() error { return errors.New("--team-name is required") } getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", teamID) - body, err := g.generateRequest(getEscalationPolicyURL) + response, err := Request[[]EscalationPolicy](getEscalationPolicyURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - err = json.Unmarshal(body, &getEscalationPolicyResponse) - if err != nil { - return err - } - - g.Resources = g.createResources(*getEscalationPolicyResponse.Data) - + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index 13d2a29413..201d8bc5f6 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -3,7 +3,6 @@ package squadcast import ( - "encoding/json" "errors" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -18,11 +17,6 @@ type Runbook struct { Name string `json:"name"` } - -var getRunbooksResponse struct { - Data *[]Runbook `json:"data"` -} - func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils.Resource { var runbookList []terraformutils.Resource for _, runbook := range runbooks { @@ -46,16 +40,11 @@ func (g *RunbookGenerator) InitResources() error { return errors.New("--team-name is required") } getRunbooksURL := "/v3/runbooks" - body, err := g.generateRequest(getRunbooksURL) - if err != nil { - return err - } - - err = json.Unmarshal(body, &getRunbooksResponse) + response, err := Request[[]Runbook](getRunbooksURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - g.Resources = g.createResources(*getRunbooksResponse.Data) + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index b04df45d85..1ca26cbb82 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -3,7 +3,6 @@ package squadcast import ( - "encoding/json" "errors" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -18,10 +17,6 @@ type Service struct { Name string `json:"name"` } -var getServicesResponse struct { - Data *[]Service `json:"data"` -} - func (g *ServiceGenerator) createResources(services []Service) []terraformutils.Resource { var serviceList []terraformutils.Resource for _, service := range services { @@ -45,16 +40,11 @@ func (g *ServiceGenerator) InitResources() error { return errors.New("--team-name is required") } getServicesURL := "/v3/services" - body, err := g.generateRequest(getServicesURL) - if err != nil { - return err - } - - err = json.Unmarshal(body, &getServicesResponse) + response, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - g.Resources = g.createResources(*getServicesResponse.Data) + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go index 37fb3cafa3..33318488d1 100644 --- a/providers/squadcast/slo.go +++ b/providers/squadcast/slo.go @@ -3,7 +3,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" @@ -15,14 +14,12 @@ type SLOGenerator struct { } type SLO struct { - ID int `json:"id"` + ID int `json:"id"` Name string `json:"name"` } -var getSLOsResponse struct { - Data struct { - SLOs *[]SLO `json:"slos"` - } `json:"data"` +type getSLOsResponse struct { + SLOs *[]SLO `json:"slos"` } func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { @@ -49,15 +46,11 @@ func (g *SLOGenerator) InitResources() error { return errors.New("--team-name is required") } getSLOsURL := fmt.Sprintf("/v3/slo?owner_id=%s", teamID) - body, err := g.generateRequest(getSLOsURL) + response, err := Request[getSLOsResponse](getSLOsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - - err = json.Unmarshal(body, &getSLOsResponse) - if err != nil { - return err - } - g.Resources = g.createResources(*getSLOsResponse.Data.SLOs) + + g.Resources = g.createResources(*response.SLOs) return nil } diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index f09550f8f3..4728438156 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -12,14 +12,10 @@ type SquadGenerator struct { } type Squad struct { - ID string `json:"id"` + ID string `json:"id"` Name string `json:"name"` } -var getSquadsResponse struct { - Data *[]Squad `json:"data"` -} - func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resource { var resources []terraformutils.Resource for _, squad := range squads { @@ -30,7 +26,7 @@ func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resour "squadcast", map[string]string{ "team_id": g.Args["team_id"].(string), - "name": squad.Name, + "name": squad.Name, }, []string{}, map[string]interface{}{}, @@ -44,12 +40,12 @@ func (g *SquadGenerator) InitResources() error { if teamID == "" { return errors.New("--team-name is required") } - getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", teamID); - + getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", teamID) response, err := Request[[]Squad](getSquadsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index e65d57c550..90f9ad3f5c 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -17,8 +17,8 @@ type SquadcastProvider struct { accesstoken string refreshtoken string region string - teamID string - teamName string + teamID string + teamName string } type AccessToken struct { @@ -83,10 +83,10 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetProviderName(p.GetName()) // SetArgs are used for fetching details within other files in the terraformer code. p.Service.SetArgs(map[string]interface{}{ - "access_token": p.accesstoken, - "region": p.region, - "team_id": p.teamID, - "team_name": p.teamName, + "access_token": p.accesstoken, + "region": p.region, + "team_id": p.teamID, + "team_name": p.teamName, }) return nil } @@ -120,19 +120,18 @@ func (p *SquadcastProvider) GetName() string { func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ - // "user": &UserGenerator{}, - // "service": &ServiceGenerator{}, + "user": &UserGenerator{}, + "service": &ServiceGenerator{}, "squad": &SquadGenerator{}, - // "team": &TeamGenerator{}, - // "team_member": &TeamMemberGenerator{}, - // "team_roles": &TeamRolesGenerator{}, - // "escalation_policy": &EscalationPolicyGenerator{}, - // "runbook": &RunbookGenerator{}, - // "slo": &SLOGenerator{}, + "team": &TeamGenerator{}, + "team_member": &TeamMemberGenerator{}, + "team_roles": &TeamRolesGenerator{}, + "escalation_policy": &EscalationPolicyGenerator{}, + "runbook": &RunbookGenerator{}, + "slo": &SLOGenerator{}, } } - func (p *SquadcastProvider) GetAccessToken() { url := "/oauth/access-token" // header := map[string]string{"X-Refresh-Token": p.refreshtoken} diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 75fc30166d..3574fb0596 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -27,7 +27,7 @@ func GetHost(region string) string { } } -func Request [TRes any] (url string, token string, region string, isAuthenticated bool) (*TRes, error) { +func Request[TRes any](url string, token string, region string, isAuthenticated bool) (*TRes, error) { ctx := context.Background() var URL string var req *http.Request diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index 1b11046ffa..2a11a47511 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -22,11 +22,6 @@ type DataTeamMember struct { RoleIDs []string `json:"role_ids"` } -var getTeamsResponse struct { - Data *[]Team `json:"data"` -} - - func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource { var teamList []terraformutils.Resource for _, team := range teams { @@ -43,10 +38,11 @@ func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource func (g *TeamGenerator) InitResources() error { getTeamsURL := "/v3/teams" - response,err := Request[[]Team](getTeamsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + response, err := Request[[]Team](getTeamsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index eb826539cc..33955fbb6c 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" "net/url" @@ -13,10 +12,6 @@ type TeamMemberGenerator struct { SquadcastService } -var getTeamResponse struct { - Data *Team `json:"data"` -} - func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resource { var teamMemberList []terraformutils.Resource for _, member := range team.Members { @@ -40,21 +35,13 @@ func (g *TeamMemberGenerator) InitResources() error { if len(teamName) == 0 { return errors.New("--team-name is required") } - escapedTeamName := url.QueryEscape(teamName) getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) - - body, err := g.generateRequest(getTeamURL) - if err != nil { - return err - } - - err = json.Unmarshal(body, &getTeamResponse) + response, err := Request[Team](getTeamURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - g.Resources = g.createResources(*getTeamResponse.Data) - + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 4dba864935..3a6fffd3fa 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -18,10 +18,6 @@ type TeamRole struct { Default bool `json:"default"` } -var getTeamRolesResponse struct { - Data *[]TeamRole `json:"data"` -} - func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformutils.Resource { var teamRolesList []terraformutils.Resource for _, role := range teamRoles { @@ -47,11 +43,11 @@ func (g *TeamRolesGenerator) InitResources() error { return errors.New("--team-name is required") } getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", teamID) - response,err := Request[[]TeamRole](getTeamRolesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + response, err := Request[[]TeamRole](getTeamRolesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - g.Resources = g.createResources(*response) + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 7378c70e5f..1fc4c3669c 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -15,11 +14,6 @@ type User struct { ID string `json:"id"` } -var getUsersResponse struct { - Data *[]User `json:"data"` -} - - func (g *UserGenerator) createResources(users []User) []terraformutils.Resource { var resources []terraformutils.Resource for _, user := range users { @@ -36,16 +30,11 @@ func (g *UserGenerator) createResources(users []User) []terraformutils.Resource func (g *UserGenerator) InitResources() error { getUsersURL := "/v3/users" - body, err := g.generateRequest(getUsersURL) - if err != nil { - return err - } - - err = json.Unmarshal(body, &getUsersResponse) + response, err := Request[[]User](getUsersURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - g.Resources = g.createResources(*getUsersResponse.Data) + g.Resources = g.createResources(*response) return nil } From a18ffc2ff0279c0924b5e1e8570dd4f7b3da7b9d Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Fri, 2 Sep 2022 16:42:44 +0530 Subject: [PATCH 41/73] fix: refactored code replaced "sqaudcast" with GetProviderName function to follow the convention, used Sprintf, also removed not required attributes from different structs. --- providers/squadcast/escalation_policy.go | 2 +- providers/squadcast/runbook.go | 3 ++- providers/squadcast/service.go | 3 ++- providers/squadcast/slo.go | 2 +- providers/squadcast/squad.go | 4 +-- providers/squadcast/squadcast_provider.go | 33 ++++++++--------------- providers/squadcast/squadcast_service.go | 4 +++ providers/squadcast/team.go | 20 +++++--------- providers/squadcast/team_member.go | 8 ++++-- providers/squadcast/team_roles.go | 8 +++--- providers/squadcast/user.go | 2 +- 11 files changed, 40 insertions(+), 49 deletions(-) diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index e2a86d7ee9..5f39391241 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -21,7 +21,7 @@ func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) for _, policy := range policies { resourceList = append(resourceList, terraformutils.NewResource( policy.ID, - "policy_"+(policy.ID), + fmt.Sprintf("policy_%s", policy.Name), "squadcast_escalation_policy", g.GetProviderName(), map[string]string{ diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index 201d8bc5f6..d9ed8cf0b1 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -4,6 +4,7 @@ package squadcast import ( "errors" + "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -22,7 +23,7 @@ func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils. for _, runbook := range runbooks { runbookList = append(runbookList, terraformutils.NewResource( runbook.ID, - "runbook_"+(runbook.Name), + fmt.Sprintf("runbook_%s", runbook.Name), "squadcast_runbook", g.GetProviderName(), map[string]string{ diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index 1ca26cbb82..bff9bd0d4f 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -4,6 +4,7 @@ package squadcast import ( "errors" + "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -22,7 +23,7 @@ func (g *ServiceGenerator) createResources(services []Service) []terraformutils. for _, service := range services { serviceList = append(serviceList, terraformutils.NewResource( service.ID, - "service_"+(service.Name), + fmt.Sprintf("service_%s", service.Name), "squadcast_service", g.GetProviderName(), map[string]string{ diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go index 33318488d1..7fa5f1a23f 100644 --- a/providers/squadcast/slo.go +++ b/providers/squadcast/slo.go @@ -27,7 +27,7 @@ func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { for _, s := range slo { SLOList = append(SLOList, terraformutils.NewResource( fmt.Sprintf("%d", s.ID), - "slo_"+(s.Name), + fmt.Sprintf("slo_%s", s.Name), "squadcast_slo", g.GetProviderName(), map[string]string{ diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index 4728438156..90d3f77584 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -21,9 +21,9 @@ func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resour for _, squad := range squads { resources = append(resources, terraformutils.NewResource( squad.ID, - squad.Name, + fmt.Sprintf("squad_%s", squad.Name), "squadcast_squad", - "squadcast", + g.GetProviderName(), map[string]string{ "team_id": g.Args["team_id"].(string), "name": squad.Name, diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 90f9ad3f5c..435b926383 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -14,19 +14,15 @@ import ( type SquadcastProvider struct { terraformutils.Provider - accesstoken string - refreshtoken string + accessToken string + refreshToken string region string teamID string teamName string } type AccessToken struct { - Type string `json:"type"` - AccessToken string `json:"access_token"` - IssuedAt int64 `json:"issued_at"` - ExpiresAt int64 `json:"expires_at"` - RefreshToken string `json:"refresh_token"` + AccessToken string `json:"access_token"` } // Meta holds the status of the request information @@ -39,19 +35,15 @@ type AppError struct { Message string `json:"error_message,omitempty"` } -const ( - UserAgent = "terraformer-squadcast" -) - func (p *SquadcastProvider) Init(args []string) error { if refreshToken := os.Getenv("SQUADCAST_REFRESH_TOKEN"); refreshToken != "" { - p.refreshtoken = os.Getenv("SQUADCAST_REFRESH_TOKEN") + p.refreshToken = os.Getenv("SQUADCAST_REFRESH_TOKEN") } if args[0] != "" { - p.refreshtoken = args[0] + p.refreshToken = args[0] } - if p.refreshtoken == "" { + if p.refreshToken == "" { return errors.New("required refresh Token missing") } @@ -83,7 +75,7 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetProviderName(p.GetName()) // SetArgs are used for fetching details within other files in the terraformer code. p.Service.SetArgs(map[string]interface{}{ - "access_token": p.accesstoken, + "access_token": p.accessToken, "region": p.region, "team_id": p.teamID, "team_name": p.teamName, @@ -96,7 +88,7 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error func (p *SquadcastProvider) GetConfig() cty.Value { return cty.ObjectVal(map[string]cty.Value{ "region": cty.StringVal(p.region), - "refresh_token": cty.StringVal(p.refreshtoken), + "refresh_token": cty.StringVal(p.refreshToken), }) } @@ -134,19 +126,16 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv func (p *SquadcastProvider) GetAccessToken() { url := "/oauth/access-token" - // header := map[string]string{"X-Refresh-Token": p.refreshtoken} - response, err := Request[AccessToken](url, p.refreshtoken, p.region, false) - + response, err := Request[AccessToken](url, p.refreshToken, p.region, false) if err != nil { log.Fatal(err) } - p.accesstoken = response.AccessToken + p.accessToken = response.AccessToken } func (p *SquadcastProvider) GetTeamID() { url := fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(p.teamName)) - // header := map[string]string{"Authorization": fmt.Sprintf("Bearer %s", p.accesstoken)} - response, err := Request[Team](url, p.accesstoken, p.region, true) + response, err := Request[Team](url, p.accessToken, p.region, true) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 3574fb0596..0c94978a91 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -16,6 +16,10 @@ type SquadcastService struct { terraformutils.Service } +const ( + UserAgent = "terraformer-squadcast" +) + func GetHost(region string) string { switch region { case "us": diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index 2a11a47511..12b67b7474 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -1,6 +1,7 @@ package squadcast import ( + "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -9,17 +10,10 @@ type TeamGenerator struct { } type Team struct { - ID string `json:"id"` - Name string `json:"name"` - Description string `json:"description"` - Default bool `json:"default"` - Members []*DataTeamMember `json:"members"` - Roles []*TeamRole `json:"roles"` -} - -type DataTeamMember struct { - UserID string `json:"user_id"` - RoleIDs []string `json:"role_ids"` + ID string `json:"id"` + Name string `json:"name"` + Members []*TeamMember `json:"members"` + Roles []*TeamRole `json:"roles"` } func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource { @@ -27,9 +21,9 @@ func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource for _, team := range teams { teamList = append(teamList, terraformutils.NewSimpleResource( team.ID, - team.Name, + fmt.Sprintf("team_%s", team.Name), "squadcast_team", - "squadcast", + g.GetProviderName(), []string{}, )) } diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index 33955fbb6c..7ebec95fd2 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -12,14 +12,18 @@ type TeamMemberGenerator struct { SquadcastService } +type TeamMember struct { + UserID string `json:"user_id"` +} + func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resource { var teamMemberList []terraformutils.Resource for _, member := range team.Members { teamMemberList = append(teamMemberList, terraformutils.NewResource( member.UserID, - "squadcast_team_member_"+(member.UserID), + fmt.Sprintf("squadcast_team_member_%s", member.UserID), "squadcast_team_member", - g.ProviderName, + g.GetProviderName(), map[string]string{ "team_id": team.ID, }, diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 3a6fffd3fa..46974ea7d8 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -12,10 +12,8 @@ type TeamRolesGenerator struct { } type TeamRole struct { - ID string `json:"id"` - Name string `json:"name"` - Slug string `json:"slug"` - Default bool `json:"default"` + ID string `json:"id"` + Name string `json:"name"` } func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformutils.Resource { @@ -23,7 +21,7 @@ func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformut for _, role := range teamRoles { teamRolesList = append(teamRolesList, terraformutils.NewResource( role.ID, - fmt.Sprintf("team_role_%s", role.ID), + fmt.Sprintf("team_role_%s", role.Name), "squadcast_team_role", g.GetProviderName(), map[string]string{ diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 1fc4c3669c..47aa6a4426 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -21,7 +21,7 @@ func (g *UserGenerator) createResources(users []User) []terraformutils.Resource user.ID, fmt.Sprintf("user_%s", user.ID), "squadcast_user", - "squadcast", + g.GetProviderName(), []string{}, )) } From d8a3452caa0fd2a7152dee2f3183809945c0fc83 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 13:06:25 +0530 Subject: [PATCH 42/73] feat: added tagging rules to squadcast --- providers/squadcast/tagging_rules.go | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 providers/squadcast/tagging_rules.go diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go new file mode 100644 index 0000000000..2d8b07da77 --- /dev/null +++ b/providers/squadcast/tagging_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type TaggingRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type TaggingRules struct { + ID string `json:"id"` + ServiceID string `json:"service_id"` + Rules []*TaggingRule `json:"rules"` +} +type TaggingRule struct { + IsBasic bool `json:"is_basic"` + Expression string `json:"expression"` +} + +var responseTaggingRule struct { + Data *TaggingRules `json:"data"` +} + +func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range taggingRule.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + g.teamID+"_"+rule.Expression, + "tagging_rule_"+(rule.Expression), + "squadcast_tagging_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *TaggingRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.serviceID)) + if err != nil { + return nil + } + err = json.Unmarshal(body, &responseTaggingRule) + if err != nil { + return err + } + + g.Resources = g.createResources(*responseTaggingRule.Data) + + return nil +} From 2fb401b245ca92966396448069991296c673c201 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 14:18:40 +0530 Subject: [PATCH 43/73] fix: fixed invalid service ID --- providers/squadcast/tagging_rules.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index 2d8b07da77..f94327ac8b 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -37,7 +37,8 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr "squadcast_tagging_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, + "team_id": g.teamID, + "service_id": g.serviceID, }, []string{}, map[string]interface{}{}, From 71e7f7eff079c17aeb600c8e5897e311b2b64045 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:21:18 +0530 Subject: [PATCH 44/73] feat: added routing rules to squadcast provider --- providers/squadcast/routing_rule.go | 84 ++++++++++++++++++++++++++++ providers/squadcast/tagging_rules.go | 8 +-- 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 providers/squadcast/routing_rule.go diff --git a/providers/squadcast/routing_rule.go b/providers/squadcast/routing_rule.go new file mode 100644 index 0000000000..9f785bb4d9 --- /dev/null +++ b/providers/squadcast/routing_rule.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type RoutingRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type RoutingRules struct { + ID string `json:"id"` + Rules []*RoutingRule `json:"rules"` +} + +type RoutingRule struct { + ID string `json:"rule_id"` +} + +var getRoutingRuleResponse struct { + Data *RoutingRules `json:"data"` +} + +func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range routingRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "routing_rule_"+(rule.ID), + "squadcast_routing_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *RoutingRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getRoutingRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getRoutingRuleResponse.Data) + + return nil +} diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index f94327ac8b..12fec20e70 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -24,7 +24,7 @@ type TaggingRule struct { Expression string `json:"expression"` } -var responseTaggingRule struct { +var getTaggingRuleResponse struct { Data *TaggingRules `json:"data"` } @@ -72,14 +72,14 @@ func (g *TaggingRulesGenerator) InitResources() error { g.serviceID = service.ID body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.serviceID)) if err != nil { - return nil + return err } - err = json.Unmarshal(body, &responseTaggingRule) + err = json.Unmarshal(body, &getTaggingRuleResponse) if err != nil { return err } - g.Resources = g.createResources(*responseTaggingRule.Data) + g.Resources = g.createResources(*getTaggingRuleResponse.Data) return nil } From 7cf0382d2970f25916b24ac1b5b19688b3c25ca4 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:45:53 +0530 Subject: [PATCH 45/73] feat: deduplication rules resource added to squadcast provider --- providers/squadcast/deduplication_rules.go | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 providers/squadcast/deduplication_rules.go diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go new file mode 100644 index 0000000000..44e17a89f8 --- /dev/null +++ b/providers/squadcast/deduplication_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type DeduplicationRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type DeduplicationRules struct { + ID string `json:"id"` + Rules []*DeduplicationRule `json:"rules"` +} + +type DeduplicationRule struct { + ID string `json:"rule_id"` +} + +var getDeduplicationRuleResponse struct { + Data *DeduplicationRules `json:"data"` +} + +func (g *DeduplicationRulesGenerator) createResources(deduplicationRules DeduplicationRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range deduplicationRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "deduplication_rule_"+(rule.ID), + "squadcast_deduplication_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *DeduplicationRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getDeduplicationRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getDeduplicationRuleResponse.Data) + + return nil +} From 5832864445abbc49bec16041d5f1603e14290606 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 17:23:13 +0530 Subject: [PATCH 46/73] fixed routing rules file name --- providers/squadcast/{routing_rule.go => routing_rules.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename providers/squadcast/{routing_rule.go => routing_rules.go} (100%) diff --git a/providers/squadcast/routing_rule.go b/providers/squadcast/routing_rules.go similarity index 100% rename from providers/squadcast/routing_rule.go rename to providers/squadcast/routing_rules.go From 98427d8efe911396750b351111af8d71e6f0ba8a Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 17:43:27 +0530 Subject: [PATCH 47/73] feat: added suppression rules resource to squadcast provider --- providers/squadcast/suppression_rules.go | 84 ++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 providers/squadcast/suppression_rules.go diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go new file mode 100644 index 0000000000..c5218434d5 --- /dev/null +++ b/providers/squadcast/suppression_rules.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type SuppressionRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type SuppressionRules struct { + ID string `json:"id"` + Rules []*SuppressionRule `json:"rules"` +} + +type SuppressionRule struct { + ID string `json:"rule_id"` +} + +var getSuppressionRuleResponse struct { + Data *SuppressionRules `json:"data"` +} + +func (g *SuppressionRulesGenerator) createResources(suppressionRules SuppressionRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range suppressionRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "suppression_rule_"+(rule.ID), + "squadcast_suppression_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *SuppressionRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/suppression-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getSuppressionRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getSuppressionRuleResponse.Data) + + return nil +} From 26df8e41de5a50553ea340d9b71c214adbd99b25 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 15:21:18 +0530 Subject: [PATCH 48/73] feat: added routing rules to squadcast provider --- providers/squadcast/routing_rule.go | 84 +++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 providers/squadcast/routing_rule.go diff --git a/providers/squadcast/routing_rule.go b/providers/squadcast/routing_rule.go new file mode 100644 index 0000000000..9f785bb4d9 --- /dev/null +++ b/providers/squadcast/routing_rule.go @@ -0,0 +1,84 @@ +package squadcast + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" + "net/url" +) + +type RoutingRulesGenerator struct { + SquadcastService + serviceID string + teamID string +} + +type RoutingRules struct { + ID string `json:"id"` + Rules []*RoutingRule `json:"rules"` +} + +type RoutingRule struct { + ID string `json:"rule_id"` +} + +var getRoutingRuleResponse struct { + Data *RoutingRules `json:"data"` +} + +func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range routingRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + "routing_rule_"+(rule.ID), + "squadcast_routing_rules", + g.GetProviderName(), + map[string]string{ + "team_id": g.teamID, + "service_id": g.serviceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *RoutingRulesGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + return errors.New("--service-name is required") + } + if len(g.Args["team_name"].(string)) == 0 { + return errors.New("--team-name is required") + } + + team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) + if err != nil { + return err + } + err = json.Unmarshal(team, &getTeamResponse) + if err != nil { + return err + } + g.teamID = getTeamResponse.Data.ID + service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) + if err != nil { + return err + } + g.serviceID = service.ID + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.serviceID)) + if err != nil { + return err + } + err = json.Unmarshal(body, &getRoutingRuleResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getRoutingRuleResponse.Data) + + return nil +} From d83b8c65a41cb21a327e962e033c478f9501a5f3 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 29 Aug 2022 17:23:13 +0530 Subject: [PATCH 49/73] fixed routing rules file name --- providers/squadcast/routing_rule.go | 84 ----------------------------- 1 file changed, 84 deletions(-) delete mode 100644 providers/squadcast/routing_rule.go diff --git a/providers/squadcast/routing_rule.go b/providers/squadcast/routing_rule.go deleted file mode 100644 index 9f785bb4d9..0000000000 --- a/providers/squadcast/routing_rule.go +++ /dev/null @@ -1,84 +0,0 @@ -package squadcast - -import ( - "encoding/json" - "errors" - "fmt" - "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" -) - -type RoutingRulesGenerator struct { - SquadcastService - serviceID string - teamID string -} - -type RoutingRules struct { - ID string `json:"id"` - Rules []*RoutingRule `json:"rules"` -} - -type RoutingRule struct { - ID string `json:"rule_id"` -} - -var getRoutingRuleResponse struct { - Data *RoutingRules `json:"data"` -} - -func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []terraformutils.Resource { - var resourceList []terraformutils.Resource - for _, rule := range routingRules.Rules { - resourceList = append(resourceList, terraformutils.NewResource( - rule.ID, - "routing_rule_"+(rule.ID), - "squadcast_routing_rules", - g.GetProviderName(), - map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, - }, - []string{}, - map[string]interface{}{}, - )) - } - - return resourceList -} - -func (g *RoutingRulesGenerator) InitResources() error { - if len(g.Args["service_name"].(string)) == 0 { - return errors.New("--service-name is required") - } - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.serviceID)) - if err != nil { - return err - } - err = json.Unmarshal(body, &getRoutingRuleResponse) - if err != nil { - return err - } - - g.Resources = g.createResources(*getRoutingRuleResponse.Data) - - return nil -} From a1a8d13bd33456936c584ab1e75d7d183def3a71 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Tue, 30 Aug 2022 16:20:04 +0530 Subject: [PATCH 50/73] refactored the code --- cmd/provider_cmd_squadcast.go | 4 +-- providers/squadcast/deduplication_rules.go | 23 +++-------------- providers/squadcast/routing_rules.go | 23 +++-------------- providers/squadcast/suppression_rules.go | 23 +++-------------- providers/squadcast/tagging_rules.go | 30 +++++----------------- 5 files changed, 17 insertions(+), 86 deletions(-) diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index 72bf5d2531..050d9ebd64 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -8,7 +8,7 @@ import ( ) func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { - var refreshToken, teamName, region string + var refreshToken, teamName, region, serviceName string cmd := &cobra.Command{ Use: "squadcast", @@ -17,7 +17,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { provider := newSquadcastProvider() options.PathPattern += region + "/" - err := Import(provider, options, []string{refreshToken, region, teamName}) + err := Import(provider, options, []string{refreshToken, region, teamName, serviceName}) if err != nil { return err } diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index 44e17a89f8..93a09d5b18 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -5,13 +5,10 @@ import ( "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" ) type DeduplicationRulesGenerator struct { SquadcastService - serviceID string - teamID string } type DeduplicationRules struct { @@ -36,8 +33,8 @@ func (g *DeduplicationRulesGenerator) createResources(deduplicationRules Dedupli "squadcast_deduplication_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, + "team_id": g.Args["team_id"].(string), + "service_id": g.Args["service_id"].(string), }, []string{}, map[string]interface{}{}, @@ -55,21 +52,7 @@ func (g *DeduplicationRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.serviceID)) + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"])) if err != nil { return err } diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index 9f785bb4d9..a556db9cdf 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -5,13 +5,10 @@ import ( "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" ) type RoutingRulesGenerator struct { SquadcastService - serviceID string - teamID string } type RoutingRules struct { @@ -36,8 +33,8 @@ func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []ter "squadcast_routing_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, + "team_id": g.Args["team_id"].(string), + "service_id": g.Args["service_id"].(string), }, []string{}, map[string]interface{}{}, @@ -55,21 +52,7 @@ func (g *RoutingRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.serviceID)) + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"])) if err != nil { return err } diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index c5218434d5..f566ea4712 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -5,13 +5,10 @@ import ( "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" ) type SuppressionRulesGenerator struct { SquadcastService - serviceID string - teamID string } type SuppressionRules struct { @@ -36,8 +33,8 @@ func (g *SuppressionRulesGenerator) createResources(suppressionRules Suppression "squadcast_suppression_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, + "team_id": g.Args["team_id"].(string), + "service_id": g.Args["service_id"].(string), }, []string{}, map[string]interface{}{}, @@ -55,21 +52,7 @@ func (g *SuppressionRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/suppression-rules", g.serviceID)) + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"])) if err != nil { return err } diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index 12fec20e70..93da88743c 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -5,13 +5,10 @@ import ( "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" - "net/url" ) type TaggingRulesGenerator struct { SquadcastService - serviceID string - teamID string } type TaggingRules struct { @@ -20,8 +17,7 @@ type TaggingRules struct { Rules []*TaggingRule `json:"rules"` } type TaggingRule struct { - IsBasic bool `json:"is_basic"` - Expression string `json:"expression"` + ID string `json:"rule_id"` } var getTaggingRuleResponse struct { @@ -32,13 +28,13 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr var resourceList []terraformutils.Resource for _, rule := range taggingRule.Rules { resourceList = append(resourceList, terraformutils.NewResource( - g.teamID+"_"+rule.Expression, - "tagging_rule_"+(rule.Expression), + g.Args["team_id"].(string)+"_"+rule.ID, + "tagging_rule_"+(rule.ID), "squadcast_tagging_rules", g.GetProviderName(), map[string]string{ - "team_id": g.teamID, - "service_id": g.serviceID, + "team_id": g.Args["team_id"].(string), + "service_id": g.Args["service_id"].(string), }, []string{}, map[string]interface{}{}, @@ -56,21 +52,7 @@ func (g *TaggingRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - team, err := g.generateRequest(fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string)))) - if err != nil { - return err - } - err = json.Unmarshal(team, &getTeamResponse) - if err != nil { - return err - } - g.teamID = getTeamResponse.Data.ID - service, err := g.getServiceByName(g.teamID, g.Args["service_name"].(string)) - if err != nil { - return err - } - g.serviceID = service.ID - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.serviceID)) + body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"])) if err != nil { return err } From 035a3105db10a3fcf07d75ca7a59bb26d1b512c3 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Thu, 1 Sep 2022 15:43:42 +0530 Subject: [PATCH 51/73] fix: refactored code --- providers/squadcast/deduplication_rules.go | 10 ++-- providers/squadcast/squadcast_schedule.go | 56 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 providers/squadcast/squadcast_schedule.go diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index 93a09d5b18..a5269a6ae0 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -20,7 +21,7 @@ type DeduplicationRule struct { ID string `json:"rule_id"` } -var getDeduplicationRuleResponse struct { +var getDeduplicationRulesResponse struct { Data *DeduplicationRules `json:"data"` } @@ -52,16 +53,17 @@ func (g *DeduplicationRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"])) + getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]) + body, err := g.generateRequest(getDeduplicationRulesURL) if err != nil { return err } - err = json.Unmarshal(body, &getDeduplicationRuleResponse) + err = json.Unmarshal(body, &getDeduplicationRulesResponse) if err != nil { return err } - g.Resources = g.createResources(*getDeduplicationRuleResponse.Data) + g.Resources = g.createResources(*getDeduplicationRulesResponse.Data) return nil } diff --git a/providers/squadcast/squadcast_schedule.go b/providers/squadcast/squadcast_schedule.go new file mode 100644 index 0000000000..4648003122 --- /dev/null +++ b/providers/squadcast/squadcast_schedule.go @@ -0,0 +1,56 @@ +package squadcast + +import ( + "encoding/json" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type SchedulesGenerator struct { + SquadcastService +} + +type Schedule struct { + ID string `json:"id"` + Name string `json:"name"` +} + +var getSchedulesResponse struct { + Data *[]Schedule `json:"data"` +} + +func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, schedule := range schedules { + resourceList = append(resourceList, terraformutils.NewResource( + schedule.ID, + schedule.Name, + "squadcast_schedule", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + "name": g.Args["schedule_name"].(string), + }, + []string{}, + map[string]interface{}{}, + )) + } + + return resourceList +} + +func (g *SchedulesGenerator) InitResources() error { + getSchedules := "/v3/schedules" + body, err := g.generateRequest(getSchedules) + if err != nil { + return err + } + err = json.Unmarshal(body, &getSchedulesResponse) + if err != nil { + return err + } + + g.Resources = g.createResources(*getSchedulesResponse.Data) + + return nil +} From d31ade49f26abbed6f37812d247039bc71cb042c Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Fri, 2 Sep 2022 17:23:19 +0530 Subject: [PATCH 52/73] fix: switched from generateRequest to Request function --- providers/squadcast/deduplication_rules.go | 17 +++------------- providers/squadcast/routing_rules.go | 15 +++----------- providers/squadcast/squadcast_provider.go | 23 +++++++++++++++------- providers/squadcast/squadcast_schedule.go | 23 ++++++---------------- providers/squadcast/suppression_rules.go | 15 +++----------- providers/squadcast/tagging_rules.go | 16 +++------------ 6 files changed, 34 insertions(+), 75 deletions(-) diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index a5269a6ae0..edd8365577 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" @@ -21,16 +20,12 @@ type DeduplicationRule struct { ID string `json:"rule_id"` } -var getDeduplicationRulesResponse struct { - Data *DeduplicationRules `json:"data"` -} - func (g *DeduplicationRulesGenerator) createResources(deduplicationRules DeduplicationRules) []terraformutils.Resource { var resourceList []terraformutils.Resource for _, rule := range deduplicationRules.Rules { resourceList = append(resourceList, terraformutils.NewResource( rule.ID, - "deduplication_rule_"+(rule.ID), + fmt.Sprintf("deduplication_rule_%s", rule.ID), "squadcast_deduplication_rules", g.GetProviderName(), map[string]string{ @@ -41,7 +36,6 @@ func (g *DeduplicationRulesGenerator) createResources(deduplicationRules Dedupli map[string]interface{}{}, )) } - return resourceList } @@ -54,16 +48,11 @@ func (g *DeduplicationRulesGenerator) InitResources() error { } getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]) - body, err := g.generateRequest(getDeduplicationRulesURL) + response, err := Request[DeduplicationRules](getDeduplicationRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - err = json.Unmarshal(body, &getDeduplicationRulesResponse) - if err != nil { - return err - } - - g.Resources = g.createResources(*getDeduplicationRulesResponse.Data) + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index a556db9cdf..20ce96bda0 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -20,10 +19,6 @@ type RoutingRule struct { ID string `json:"rule_id"` } -var getRoutingRuleResponse struct { - Data *RoutingRules `json:"data"` -} - func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []terraformutils.Resource { var resourceList []terraformutils.Resource for _, rule := range routingRules.Rules { @@ -52,16 +47,12 @@ func (g *RoutingRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"])) - if err != nil { - return err - } - err = json.Unmarshal(body, &getRoutingRuleResponse) + getRoutingRulesURL := fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"]) + response, err := Request[RoutingRules](getRoutingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - g.Resources = g.createResources(*getRoutingRuleResponse.Data) - + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 506451b88e..2d1277e22d 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -87,13 +87,13 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetProviderName(p.GetName()) // SetArgs are used for fetching details within other files in the terraformer code. p.Service.SetArgs(map[string]interface{}{ - "access_token": p.accessToken, - "region": p.region, - "team_id": p.teamID, - "team_name": p.teamName, - "service_name": p.serviceName, - "service_id": p.serviceID, - "schedule_name": p.scheduleName, + "access_token": p.accessToken, + "region": p.region, + "team_id": p.teamID, + "team_name": p.teamName, + "service_name": p.serviceName, + "service_id": p.serviceID, + "schedule_name": p.scheduleName, }) return nil } @@ -161,3 +161,12 @@ func (p *SquadcastProvider) GetTeamID() { } p.teamID = response.ID } + +func (p *SquadcastProvider) GetServiceID() { + url := fmt.Sprintf("/v3/services/by-name?name=%s&owner_id=%s", url.QueryEscape(p.serviceName), p.teamID) + response, err := Request[Service](url, p.accessToken, p.region, true) + if err != nil { + log.Fatal(err) + } + p.serviceID = response.ID +} diff --git a/providers/squadcast/squadcast_schedule.go b/providers/squadcast/squadcast_schedule.go index 4648003122..3bce1e8b51 100644 --- a/providers/squadcast/squadcast_schedule.go +++ b/providers/squadcast/squadcast_schedule.go @@ -1,8 +1,6 @@ package squadcast import ( - "encoding/json" - "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -11,14 +9,10 @@ type SchedulesGenerator struct { } type Schedule struct { - ID string `json:"id"` + ID string `json:"id"` Name string `json:"name"` } -var getSchedulesResponse struct { - Data *[]Schedule `json:"data"` -} - func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformutils.Resource { var resourceList []terraformutils.Resource for _, schedule := range schedules { @@ -28,8 +22,8 @@ func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformut "squadcast_schedule", g.GetProviderName(), map[string]string{ - "team_id": g.Args["team_id"].(string), - "name": g.Args["schedule_name"].(string), + "team_id": g.Args["team_id"].(string), + "name": g.Args["schedule_name"].(string), }, []string{}, map[string]interface{}{}, @@ -40,17 +34,12 @@ func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformut } func (g *SchedulesGenerator) InitResources() error { - getSchedules := "/v3/schedules" - body, err := g.generateRequest(getSchedules) + getSchedulesURL := "/v3/schedules" + response, err := Request[[]Schedule](getSchedulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - err = json.Unmarshal(body, &getSchedulesResponse) - if err != nil { - return err - } - - g.Resources = g.createResources(*getSchedulesResponse.Data) + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index f566ea4712..81f8b199ac 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -20,10 +19,6 @@ type SuppressionRule struct { ID string `json:"rule_id"` } -var getSuppressionRuleResponse struct { - Data *SuppressionRules `json:"data"` -} - func (g *SuppressionRulesGenerator) createResources(suppressionRules SuppressionRules) []terraformutils.Resource { var resourceList []terraformutils.Resource for _, rule := range suppressionRules.Rules { @@ -52,16 +47,12 @@ func (g *SuppressionRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"])) - if err != nil { - return err - } - err = json.Unmarshal(body, &getSuppressionRuleResponse) + getSuppressionRulesURL := fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"]) + response, err := Request[SuppressionRules](getSuppressionRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - g.Resources = g.createResources(*getSuppressionRuleResponse.Data) - + g.Resources = g.createResources(*response) return nil } diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index 93da88743c..ad570223ae 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -1,7 +1,6 @@ package squadcast import ( - "encoding/json" "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -20,10 +19,6 @@ type TaggingRule struct { ID string `json:"rule_id"` } -var getTaggingRuleResponse struct { - Data *TaggingRules `json:"data"` -} - func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terraformutils.Resource { var resourceList []terraformutils.Resource for _, rule := range taggingRule.Rules { @@ -40,7 +35,6 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr map[string]interface{}{}, )) } - return resourceList } @@ -52,16 +46,12 @@ func (g *TaggingRulesGenerator) InitResources() error { return errors.New("--team-name is required") } - body, err := g.generateRequest(fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"])) + getTaggingRulesURL := fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"]) + response, err := Request[TaggingRules](getTaggingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err } - err = json.Unmarshal(body, &getTaggingRuleResponse) - if err != nil { - return err - } - - g.Resources = g.createResources(*getTaggingRuleResponse.Data) + g.Resources = g.createResources(*response) return nil } From 2d7bbe0efa92a8e0b5a6a3067159dccc4253c9bd Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 5 Sep 2022 11:29:19 +0530 Subject: [PATCH 53/73] fix: renamed squadcast_schedule.go to schedule.go to follow the convention --- providers/squadcast/{squadcast_schedule.go => schedule.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename providers/squadcast/{squadcast_schedule.go => schedule.go} (100%) diff --git a/providers/squadcast/squadcast_schedule.go b/providers/squadcast/schedule.go similarity index 100% rename from providers/squadcast/squadcast_schedule.go rename to providers/squadcast/schedule.go From 384a69f7baeeba1edb9ab7232e9152c9296f1037 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 5 Sep 2022 12:43:23 +0530 Subject: [PATCH 54/73] fix: updated squadcast provider doc --- docs/squadcast.md | 56 +++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/docs/squadcast.md b/docs/squadcast.md index 54a8cd4e87..382bb2562b 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -38,39 +38,53 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T ### Flags: - `--team-name` - - Required for the following resources: - - squad - - service + - deduplication_rules - escalation_policy + - routing_rules + - runbook + - schedules + - service + - slo + - squad + - suppression_rules + - tagging_rules - team_member - team_roles - - slo - - runbook -- `--region` +- `--service-name` + - Required for the following resources: + - deduplication_rules + - routing_rules + - suppression_rules + - tagging_rules +- `--schedule-name` + - Required for the following resources: + - schedule + +- `--region` - Supported Values: - `us` - `eu` +- `--refresh-token` (optional) + - Supported Values: + - + ### Supported resources: -- `user` - - [squadcast_user](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/user) -- `team` - - [squadcast_team](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team) -- `team_member` - - [squadcast_team_member](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team_member) -- `team_roles` - - [squadcast_team_roles](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team_roles) -- `squad` - - [squadcast_squad](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/squad) -- `service` - - [squadcast_service](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/service) +- `deduplication_rules` - `escalation_policy` - - [squadcast_escalation_policy](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/escalation_policy) +- `routing_rules` - `runbook` - - [squadcast_runbook](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/runbook) +- `schedule` +- `service` - `slo` - - [squadcast_slo](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/slo) +- `squad` +- `suppression_rules` +- `tagging_rules` +- `team` +- `team_member` +- `team_roles` +- `user` From 0df2d0b93c6b38b9c81c9e3f458bc21bd3bd97ac Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:01:13 +0530 Subject: [PATCH 55/73] fix: added links in squadcast doc --- docs/squadcast.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/squadcast.md b/docs/squadcast.md index 382bb2562b..e97fdb1bb8 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -74,17 +74,17 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T ### Supported resources: -- `deduplication_rules` -- `escalation_policy` -- `routing_rules` -- `runbook` -- `schedule` -- `service` -- `slo` -- `squad` -- `suppression_rules` -- `tagging_rules` -- `team` -- `team_member` -- `team_roles` -- `user` +- [`deduplication_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/deduplication_rules) +- [`escalation_policy`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/escalation_policy) +- [`routing_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/routing_rules) +- [`runbook`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/runbook) +- [`schedule`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/schedule) +- [`service`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/service) +- [`slo`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/slo) +- [`squad`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/squad) +- [`suppression_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/suppression_rules) +- [`tagging_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/tagging_rules) +- [`team`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team) +- [`team_member`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team_member) +- [`team_roles`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team_role) +- [`user`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/user) From b4cba21693b4f3d8dd510ce541f0b5a2788484f1 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Tue, 6 Sep 2022 00:23:21 +0530 Subject: [PATCH 56/73] fix: removed schedules reference from the doc --- docs/squadcast.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/squadcast.md b/docs/squadcast.md index e97fdb1bb8..857478b52a 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -43,7 +43,6 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - escalation_policy - routing_rules - runbook - - schedules - service - slo - squad @@ -59,10 +58,6 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - suppression_rules - tagging_rules -- `--schedule-name` - - Required for the following resources: - - schedule - - `--region` - Supported Values: - `us` @@ -78,7 +73,6 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - [`escalation_policy`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/escalation_policy) - [`routing_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/routing_rules) - [`runbook`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/runbook) -- [`schedule`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/schedule) - [`service`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/service) - [`slo`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/slo) - [`squad`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/squad) From fe2eda46d72586e8b8e7959ac23fad5df39a7d4c Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Tue, 6 Sep 2022 11:27:15 +0530 Subject: [PATCH 57/73] fix: removed --schedule-name flag --- cmd/provider_cmd_squadcast.go | 5 ++--- providers/squadcast/schedule.go | 6 +++++- providers/squadcast/squadcast_provider.go | 5 ----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index 13c98c975e..6880e339ca 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -8,7 +8,7 @@ import ( ) func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { - var refreshToken, teamName, region, serviceName, scheduleName string + var refreshToken, teamName, region, serviceName string cmd := &cobra.Command{ Use: "squadcast", @@ -17,7 +17,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { provider := newSquadcastProvider() options.PathPattern += region + "/" - err := Import(provider, options, []string{refreshToken, region, teamName, serviceName, scheduleName}) + err := Import(provider, options, []string{refreshToken, region, teamName, serviceName}) if err != nil { return err } @@ -30,7 +30,6 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { cmd.PersistentFlags().StringVarP(®ion, "region", "", "", "eu or us") cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "Squadcast team name") cmd.PersistentFlags().StringVarP(&serviceName, "service-name", "", "", "Squadcast service name") - cmd.PersistentFlags().StringVarP(&scheduleName, "schedule-name", "", "", "Squadcast schedule name") return cmd } diff --git a/providers/squadcast/schedule.go b/providers/squadcast/schedule.go index 3bce1e8b51..687c4c6020 100644 --- a/providers/squadcast/schedule.go +++ b/providers/squadcast/schedule.go @@ -1,6 +1,8 @@ package squadcast import ( + "errors" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -23,7 +25,6 @@ func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformut g.GetProviderName(), map[string]string{ "team_id": g.Args["team_id"].(string), - "name": g.Args["schedule_name"].(string), }, []string{}, map[string]interface{}{}, @@ -34,6 +35,9 @@ func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformut } func (g *SchedulesGenerator) InitResources() error { + if g.Args["team_id"].(string) == "" { + return errors.New("--team-name is required") + } getSchedulesURL := "/v3/schedules" response, err := Request[[]Schedule](getSchedulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 2d1277e22d..052ebcd16d 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -69,10 +69,6 @@ func (p *SquadcastProvider) Init(args []string) error { p.GetServiceID() } - if args[4] != "" { - p.scheduleName = args[4] - } - return nil } @@ -93,7 +89,6 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error "team_name": p.teamName, "service_name": p.serviceName, "service_id": p.serviceID, - "schedule_name": p.scheduleName, }) return nil } From 18cb9a500e857a0f8e9663f30d125d4a7bf14277 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Tue, 6 Sep 2022 11:54:59 +0530 Subject: [PATCH 58/73] fix: refactored code --- providers/squadcast/squadcast_provider.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 052ebcd16d..518876e832 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -21,7 +21,6 @@ type SquadcastProvider struct { teamName string serviceName string serviceID string - scheduleName string } type AccessToken struct { @@ -83,12 +82,12 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error p.Service.SetProviderName(p.GetName()) // SetArgs are used for fetching details within other files in the terraformer code. p.Service.SetArgs(map[string]interface{}{ - "access_token": p.accessToken, - "region": p.region, - "team_id": p.teamID, - "team_name": p.teamName, - "service_name": p.serviceName, - "service_id": p.serviceID, + "access_token": p.accessToken, + "region": p.region, + "team_id": p.teamID, + "team_name": p.teamName, + "service_name": p.serviceName, + "service_id": p.serviceID, }) return nil } From a8e0f6fd5611525e9b91187c748a52b41489b504 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Tue, 6 Sep 2022 16:44:21 +0530 Subject: [PATCH 59/73] fix: updated main README file --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1fe260956e..0b8af99bf2 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ A CLI tool that generates `tf`/`json` and `tfstate` files based on existing infr * [Mackerel](/docs/mackerel.md) * [PagerDuty](/docs/pagerduty.md) * [Opsgenie](/docs/opsgenie.md) + * [SquadCast](/docs/squadcast.md) * Community * [Keycloak](/docs/keycloak.md) * [Logz.io](/docs/logz.md) @@ -301,6 +302,7 @@ Links to download Terraform Providers: * Mackerel provider > 0.0.6 - [here](https://github.com/mackerelio-labs/terraform-provider-mackerel) * Pagerduty >=1.9 - [here](https://releases.hashicorp.com/terraform-provider-pagerduty/) * Opsgenie >= 0.6.0 [here](https://releases.hashicorp.com/terraform-provider-opsgenie/) + * SquadCast provider >= 1.0.4 - [here](https://github.com/SquadcastHub/terraform-provider-squadcast) * Community * Keycloak provider >=1.19.0 - [here](https://github.com/mrparkers/terraform-provider-keycloak/) * Logz.io provider >=1.1.1 - [here](https://github.com/jonboydell/logzio_terraform_provider/) From 3518475e7e11d3aec8cf76ccf1a9c3a17685c495 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Fri, 9 Sep 2022 12:15:49 +0530 Subject: [PATCH 60/73] fix: refactored code --- providers/squadcast/escalation_policy.go | 5 ++--- providers/squadcast/runbook.go | 2 +- providers/squadcast/schedule.go | 5 +++-- providers/squadcast/squad.go | 5 ++--- providers/squadcast/suppression_rules.go | 3 ++- providers/squadcast/tagging_rules.go | 5 +++-- providers/squadcast/team_roles.go | 5 ++--- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 5f39391241..fb456b5001 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -36,11 +36,10 @@ func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) } func (g *EscalationPolicyGenerator) InitResources() error { - teamID := g.Args["team_id"].(string) - if teamID == "" { + if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } - getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", teamID) + getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.Args["team_id"].(string)) response, err := Request[[]EscalationPolicy](getEscalationPolicyURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index d9ed8cf0b1..a8d0326fbd 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -37,7 +37,7 @@ func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils. } func (g *RunbookGenerator) InitResources() error { - if g.Args["team_id"].(string) == "" { + if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } getRunbooksURL := "/v3/runbooks" diff --git a/providers/squadcast/schedule.go b/providers/squadcast/schedule.go index 687c4c6020..f7d9387cd7 100644 --- a/providers/squadcast/schedule.go +++ b/providers/squadcast/schedule.go @@ -2,6 +2,7 @@ package squadcast import ( "errors" + "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -20,7 +21,7 @@ func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformut for _, schedule := range schedules { resourceList = append(resourceList, terraformutils.NewResource( schedule.ID, - schedule.Name, + fmt.Sprintf("schedule_%s", schedule.Name), "squadcast_schedule", g.GetProviderName(), map[string]string{ @@ -35,7 +36,7 @@ func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformut } func (g *SchedulesGenerator) InitResources() error { - if g.Args["team_id"].(string) == "" { + if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } getSchedulesURL := "/v3/schedules" diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index 90d3f77584..0c62d994cf 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -36,11 +36,10 @@ func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resour } func (g *SquadGenerator) InitResources() error { - teamID := g.Args["team_id"].(string) - if teamID == "" { + if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } - getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", teamID) + getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", g.Args["team_id"].(string)) response, err := Request[[]Squad](getSquadsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index 81f8b199ac..074e0c3437 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -3,6 +3,7 @@ package squadcast import ( "errors" "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -24,7 +25,7 @@ func (g *SuppressionRulesGenerator) createResources(suppressionRules Suppression for _, rule := range suppressionRules.Rules { resourceList = append(resourceList, terraformutils.NewResource( rule.ID, - "suppression_rule_"+(rule.ID), + fmt.Sprintf("suppression_rule_%s", rule.ID), "squadcast_suppression_rules", g.GetProviderName(), map[string]string{ diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index ad570223ae..e78e013824 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -3,6 +3,7 @@ package squadcast import ( "errors" "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -23,8 +24,8 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr var resourceList []terraformutils.Resource for _, rule := range taggingRule.Rules { resourceList = append(resourceList, terraformutils.NewResource( - g.Args["team_id"].(string)+"_"+rule.ID, - "tagging_rule_"+(rule.ID), + rule.ID, + fmt.Sprintf("tagging_rule_%s", rule.ID), "squadcast_tagging_rules", g.GetProviderName(), map[string]string{ diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 46974ea7d8..8e2a88316d 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -36,11 +36,10 @@ func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformut } func (g *TeamRolesGenerator) InitResources() error { - teamID := g.Args["team_id"].(string) - if teamID == "" { + if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } - getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", teamID) + getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", g.Args["team_id"].(string)) response, err := Request[[]TeamRole](getTeamRolesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err From e4aa226914adb7e00d1543370f964d4824b60014 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Fri, 9 Sep 2022 13:01:16 +0530 Subject: [PATCH 61/73] fix: refactored code --- providers/squadcast/escalation_policy.go | 2 +- providers/squadcast/routing_rules.go | 3 +-- providers/squadcast/runbook.go | 7 ++++--- providers/squadcast/schedule.go | 2 +- providers/squadcast/service.go | 9 +++++---- providers/squadcast/slo.go | 12 ++++++------ providers/squadcast/squad.go | 7 ++++--- providers/squadcast/suppression_rules.go | 1 - providers/squadcast/team.go | 6 +++--- providers/squadcast/team_member.go | 13 ++++++------- providers/squadcast/team_roles.go | 8 ++++---- providers/squadcast/user.go | 6 +++--- 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index fb456b5001..44de6a16a9 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -31,7 +31,6 @@ func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) map[string]interface{}{}, )) } - return resourceList } @@ -39,6 +38,7 @@ func (g *EscalationPolicyGenerator) InitResources() error { if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } + getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.Args["team_id"].(string)) response, err := Request[[]EscalationPolicy](getEscalationPolicyURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index 20ce96bda0..15b8879966 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -24,7 +24,7 @@ func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []ter for _, rule := range routingRules.Rules { resourceList = append(resourceList, terraformutils.NewResource( rule.ID, - "routing_rule_"+(rule.ID), + fmt.Sprintf("routing_rule_%s", rule.ID), "squadcast_routing_rules", g.GetProviderName(), map[string]string{ @@ -35,7 +35,6 @@ func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []ter map[string]interface{}{}, )) } - return resourceList } diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index a8d0326fbd..4850eed575 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -19,9 +19,9 @@ type Runbook struct { } func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils.Resource { - var runbookList []terraformutils.Resource + var resourceList []terraformutils.Resource for _, runbook := range runbooks { - runbookList = append(runbookList, terraformutils.NewResource( + resourceList = append(resourceList, terraformutils.NewResource( runbook.ID, fmt.Sprintf("runbook_%s", runbook.Name), "squadcast_runbook", @@ -33,13 +33,14 @@ func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils. map[string]interface{}{}, )) } - return runbookList + return resourceList } func (g *RunbookGenerator) InitResources() error { if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } + getRunbooksURL := "/v3/runbooks" response, err := Request[[]Runbook](getRunbooksURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/schedule.go b/providers/squadcast/schedule.go index f7d9387cd7..8718fd7ec9 100644 --- a/providers/squadcast/schedule.go +++ b/providers/squadcast/schedule.go @@ -31,7 +31,6 @@ func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformut map[string]interface{}{}, )) } - return resourceList } @@ -39,6 +38,7 @@ func (g *SchedulesGenerator) InitResources() error { if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } + getSchedulesURL := "/v3/schedules" response, err := Request[[]Schedule](getSchedulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index bff9bd0d4f..1e69caf6eb 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -19,9 +19,9 @@ type Service struct { } func (g *ServiceGenerator) createResources(services []Service) []terraformutils.Resource { - var serviceList []terraformutils.Resource + var resourceList []terraformutils.Resource for _, service := range services { - serviceList = append(serviceList, terraformutils.NewResource( + resourceList = append(resourceList, terraformutils.NewResource( service.ID, fmt.Sprintf("service_%s", service.Name), "squadcast_service", @@ -33,13 +33,14 @@ func (g *ServiceGenerator) createResources(services []Service) []terraformutils. map[string]interface{}{}, )) } - return serviceList + return resourceList } func (g *ServiceGenerator) InitResources() error { - if g.Args["team_id"].(string) == "" { + if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } + getServicesURL := "/v3/services" response, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go index 7fa5f1a23f..5a607abbb2 100644 --- a/providers/squadcast/slo.go +++ b/providers/squadcast/slo.go @@ -23,9 +23,9 @@ type getSLOsResponse struct { } func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { - var SLOList []terraformutils.Resource + var resourceList []terraformutils.Resource for _, s := range slo { - SLOList = append(SLOList, terraformutils.NewResource( + resourceList = append(resourceList, terraformutils.NewResource( fmt.Sprintf("%d", s.ID), fmt.Sprintf("slo_%s", s.Name), "squadcast_slo", @@ -37,15 +37,15 @@ func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { map[string]interface{}{}, )) } - return SLOList + return resourceList } func (g *SLOGenerator) InitResources() error { - teamID := g.Args["team_id"].(string) - if teamID == "" { + if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } - getSLOsURL := fmt.Sprintf("/v3/slo?owner_id=%s", teamID) + + getSLOsURL := fmt.Sprintf("/v3/slo?owner_id=%s", g.Args["team_id"].(string)) response, err := Request[getSLOsResponse](getSLOsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index 0c62d994cf..9400394a16 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -17,9 +17,9 @@ type Squad struct { } func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resource { - var resources []terraformutils.Resource + var resourceList []terraformutils.Resource for _, squad := range squads { - resources = append(resources, terraformutils.NewResource( + resourceList = append(resourceList, terraformutils.NewResource( squad.ID, fmt.Sprintf("squad_%s", squad.Name), "squadcast_squad", @@ -32,13 +32,14 @@ func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resour map[string]interface{}{}, )) } - return resources + return resourceList } func (g *SquadGenerator) InitResources() error { if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } + getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", g.Args["team_id"].(string)) response, err := Request[[]Squad](getSquadsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index 074e0c3437..daae547b53 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -36,7 +36,6 @@ func (g *SuppressionRulesGenerator) createResources(suppressionRules Suppression map[string]interface{}{}, )) } - return resourceList } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index 12b67b7474..e0e38fb89e 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -17,9 +17,9 @@ type Team struct { } func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource { - var teamList []terraformutils.Resource + var resourceList []terraformutils.Resource for _, team := range teams { - teamList = append(teamList, terraformutils.NewSimpleResource( + resourceList = append(resourceList, terraformutils.NewSimpleResource( team.ID, fmt.Sprintf("team_%s", team.Name), "squadcast_team", @@ -27,7 +27,7 @@ func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource []string{}, )) } - return teamList + return resourceList } func (g *TeamGenerator) InitResources() error { diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index 7ebec95fd2..d7fb3fc32e 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -17,9 +17,9 @@ type TeamMember struct { } func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resource { - var teamMemberList []terraformutils.Resource + var resourceList []terraformutils.Resource for _, member := range team.Members { - teamMemberList = append(teamMemberList, terraformutils.NewResource( + resourceList = append(resourceList, terraformutils.NewResource( member.UserID, fmt.Sprintf("squadcast_team_member_%s", member.UserID), "squadcast_team_member", @@ -31,16 +31,15 @@ func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resour map[string]interface{}{}, )) } - return teamMemberList + return resourceList } func (g *TeamMemberGenerator) InitResources() error { - teamName := g.Args["team_name"].(string) - if len(teamName) == 0 { + if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } - escapedTeamName := url.QueryEscape(teamName) - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", escapedTeamName) + + getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string))) response, err := Request[Team](getTeamURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { return err diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 8e2a88316d..2aaba21f82 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -17,9 +17,9 @@ type TeamRole struct { } func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformutils.Resource { - var teamRolesList []terraformutils.Resource + var resourceList []terraformutils.Resource for _, role := range teamRoles { - teamRolesList = append(teamRolesList, terraformutils.NewResource( + resourceList = append(resourceList, terraformutils.NewResource( role.ID, fmt.Sprintf("team_role_%s", role.Name), "squadcast_team_role", @@ -31,14 +31,14 @@ func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformut map[string]interface{}{}, )) } - - return teamRolesList + return resourceList } func (g *TeamRolesGenerator) InitResources() error { if len(g.Args["team_name"].(string)) == 0 { return errors.New("--team-name is required") } + getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", g.Args["team_id"].(string)) response, err := Request[[]TeamRole](getTeamRolesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 47aa6a4426..369852ba26 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -15,9 +15,9 @@ type User struct { } func (g *UserGenerator) createResources(users []User) []terraformutils.Resource { - var resources []terraformutils.Resource + var resourceList []terraformutils.Resource for _, user := range users { - resources = append(resources, terraformutils.NewSimpleResource( + resourceList = append(resourceList, terraformutils.NewSimpleResource( user.ID, fmt.Sprintf("user_%s", user.ID), "squadcast_user", @@ -25,7 +25,7 @@ func (g *UserGenerator) createResources(users []User) []terraformutils.Resource []string{}, )) } - return resources + return resourceList } func (g *UserGenerator) InitResources() error { From f4cdbf947abea0927d7f9355324c50b83729bb9e Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Mon, 12 Sep 2022 22:28:47 +0530 Subject: [PATCH 62/73] feat: added support for .tech --- providers/squadcast/squadcast_service.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 0c94978a91..be640903ad 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -26,6 +26,8 @@ func GetHost(region string) string { return "squadcast.com" case "eu": return "eu.squadcast.com" + case "staging": + return "squadcast.tech" default: return "" } From 8268239b22d47b2720890279ca5d071e8eb49e80 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Fri, 16 Sep 2022 11:58:32 +0530 Subject: [PATCH 63/73] fix: update --team-name flag and README --- README.md | 4 ++-- cmd/provider_cmd_squadcast.go | 2 +- docs/squadcast.md | 23 +++++++++++++++++++++- providers/squadcast/deduplication_rules.go | 3 --- providers/squadcast/escalation_policy.go | 5 ----- providers/squadcast/routing_rules.go | 4 +--- providers/squadcast/runbook.go | 5 ----- providers/squadcast/schedule.go | 5 ----- providers/squadcast/service.go | 5 ----- providers/squadcast/slo.go | 5 ----- providers/squadcast/squad.go | 5 ----- providers/squadcast/squadcast_provider.go | 7 ++++--- providers/squadcast/suppression_rules.go | 3 --- providers/squadcast/tagging_rules.go | 4 ---- providers/squadcast/team_member.go | 5 ----- providers/squadcast/team_roles.go | 5 ----- 16 files changed, 30 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 1312c4e639..36877a5947 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ A CLI tool that generates `tf`/`json` and `tfstate` files based on existing infr * [PagerDuty](/docs/pagerduty.md) * [Opsgenie](/docs/opsgenie.md) * [Honeycomb.io](/docs/honeycombio.md) - * [SquadCast](/docs/squadcast.md) + * [Squadcast](/docs/squadcast.md) * Community * [Keycloak](/docs/keycloak.md) * [Logz.io](/docs/logz.md) @@ -306,7 +306,7 @@ Links to download Terraform Providers: * Pagerduty >=1.9 - [here](https://releases.hashicorp.com/terraform-provider-pagerduty/) * Opsgenie >= 0.6.0 [here](https://releases.hashicorp.com/terraform-provider-opsgenie/) * Honeycomb.io >= 0.10.0 - [here](https://github.com/honeycombio/terraform-provider-honeycombio/releases) - * SquadCast provider >= 1.0.4 - [here](https://github.com/SquadcastHub/terraform-provider-squadcast) + * Squadcast provider >= 1.0.4 - [here](https://github.com/SquadcastHub/terraform-provider-squadcast) * Community * Keycloak provider >=1.19.0 - [here](https://github.com/mrparkers/terraform-provider-keycloak/) * Logz.io provider >=1.1.1 - [here](https://github.com/jonboydell/logzio_terraform_provider/) diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index 6880e339ca..fe93753c6b 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -26,7 +26,7 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { } cmd.AddCommand(listCmd(newSquadcastProvider())) baseProviderFlags(cmd.PersistentFlags(), &options, "user", "") - cmd.PersistentFlags().StringVarP(&refreshToken, "refresh-token", "", "", "YOUR_SQUADCAST_REFRESH_TOKEN or env param SQUADCAST_REFRESH_TOKEN") + cmd.PersistentFlags().StringVarP(&refreshToken, "refresh-token", "", "", "YOUR_SQUADCAST_REFRESH_TOKEN or env variable SQUADCAST_REFRESH_TOKEN") cmd.PersistentFlags().StringVarP(®ion, "region", "", "", "eu or us") cmd.PersistentFlags().StringVarP(&teamName, "team-name", "", "", "Squadcast team name") cmd.PersistentFlags().StringVarP(&serviceName, "service-name", "", "", "Squadcast service name") diff --git a/docs/squadcast.md b/docs/squadcast.md index 857478b52a..e822c8ac80 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -13,7 +13,7 @@ Add `--refresh-token` flag in cmd terraformer import squadcast --resources= --region=SQUADCAST_REGION ``` -Examples: +### Examples: - `Import Resource by providing refresh-token as a flag` @@ -34,6 +34,27 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T ``` +### In order to use terraform files: + +- Update version and add source in `provider.tf` + - Go to `/generated/squadcast///provider.tf` + - Add `source = "SquadcastHub/squadcast"` to squadcast inside `required_providers` + - Update `version` in `required_providers` by removing `.exe` (Windows users only) +- Update `terraform_version` + - `cd /generated/squadcast//` + - `terraform state replace-provider -auto-approve "registry.terraform.io/-/squadcast" "SquadcastHub/squadcast"` + +### Example: +``` +terraform { + required_providers { + squadcast = { + version = "~> 1.0.5" + source = "SquadcastHub/squadcast" + } + } +} +``` ### Flags: diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index edd8365577..c18c2154d4 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -43,9 +43,6 @@ func (g *DeduplicationRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { return errors.New("--service-name is required") } - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]) response, err := Request[DeduplicationRules](getDeduplicationRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 44de6a16a9..071ff56093 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -35,10 +34,6 @@ func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) } func (g *EscalationPolicyGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.Args["team_id"].(string)) response, err := Request[[]EscalationPolicy](getEscalationPolicyURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index 15b8879966..dc34f036df 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -3,6 +3,7 @@ package squadcast import ( "errors" "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -42,9 +43,6 @@ func (g *RoutingRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { return errors.New("--service-name is required") } - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } getRoutingRulesURL := fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"]) response, err := Request[RoutingRules](getRoutingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index 4850eed575..3f13a35690 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -3,7 +3,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -37,10 +36,6 @@ func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils. } func (g *RunbookGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getRunbooksURL := "/v3/runbooks" response, err := Request[[]Runbook](getRunbooksURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/schedule.go b/providers/squadcast/schedule.go index 8718fd7ec9..139cf4e56b 100644 --- a/providers/squadcast/schedule.go +++ b/providers/squadcast/schedule.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -35,10 +34,6 @@ func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformut } func (g *SchedulesGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getSchedulesURL := "/v3/schedules" response, err := Request[[]Schedule](getSchedulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index 1e69caf6eb..0db73ceee4 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -3,7 +3,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -37,10 +36,6 @@ func (g *ServiceGenerator) createResources(services []Service) []terraformutils. } func (g *ServiceGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getServicesURL := "/v3/services" response, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go index 5a607abbb2..9d81273dfb 100644 --- a/providers/squadcast/slo.go +++ b/providers/squadcast/slo.go @@ -3,7 +3,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -41,10 +40,6 @@ func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { } func (g *SLOGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getSLOsURL := fmt.Sprintf("/v3/slo?owner_id=%s", g.Args["team_id"].(string)) response, err := Request[getSLOsResponse](getSLOsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index 9400394a16..668efa0a43 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -36,10 +35,6 @@ func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resour } func (g *SquadGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", g.Args["team_id"].(string)) response, err := Request[[]Squad](getSquadsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 518876e832..871f00f5a1 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -58,10 +58,11 @@ func (p *SquadcastProvider) Init(args []string) error { p.region = args[1] p.GetAccessToken() - if args[2] != "" { - p.teamName = args[2] - p.GetTeamID() + if args[2] == "" { + return errors.New("required team name missing") } + p.teamName = args[2] + p.GetTeamID() if args[3] != "" { p.serviceName = args[3] diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index daae547b53..d5303511b2 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -43,9 +43,6 @@ func (g *SuppressionRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { return errors.New("--service-name is required") } - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } getSuppressionRulesURL := fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"]) response, err := Request[SuppressionRules](getSuppressionRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index e78e013824..02590d524c 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -43,10 +43,6 @@ func (g *TaggingRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { return errors.New("--service-name is required") } - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getTaggingRulesURL := fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"]) response, err := Request[TaggingRules](getTaggingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index d7fb3fc32e..20644c9047 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "net/url" @@ -35,10 +34,6 @@ func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resour } func (g *TeamMemberGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string))) response, err := Request[Team](getTeamURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 2aaba21f82..483daecd52 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -35,10 +34,6 @@ func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformut } func (g *TeamRolesGenerator) InitResources() error { - if len(g.Args["team_name"].(string)) == 0 { - return errors.New("--team-name is required") - } - getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", g.Args["team_id"].(string)) response, err := Request[[]TeamRole](getTeamRolesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) if err != nil { From 7f1c1aca9708a02f14e434e7de8d22b67d09b41b Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Sun, 18 Sep 2022 00:39:06 +0530 Subject: [PATCH 64/73] feat: generate automation rules for all services under a specified team name --- providers/squadcast/deduplication_rules.go | 38 +++++++++++++++------- providers/squadcast/routing_rules.go | 38 +++++++++++++++------- providers/squadcast/suppression_rules.go | 38 +++++++++++++++------- providers/squadcast/tagging_rules.go | 35 ++++++++++++++------ 4 files changed, 103 insertions(+), 46 deletions(-) diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index c18c2154d4..7464299714 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -12,8 +11,9 @@ type DeduplicationRulesGenerator struct { } type DeduplicationRules struct { - ID string `json:"id"` - Rules []*DeduplicationRule `json:"rules"` + ID string `json:"id"` + ServiceID string `json:"service_id"` + Rules []*DeduplicationRule `json:"rules"` } type DeduplicationRule struct { @@ -30,7 +30,7 @@ func (g *DeduplicationRulesGenerator) createResources(deduplicationRules Dedupli g.GetProviderName(), map[string]string{ "team_id": g.Args["team_id"].(string), - "service_id": g.Args["service_id"].(string), + "service_id": deduplicationRules.ServiceID, }, []string{}, map[string]interface{}{}, @@ -41,15 +41,29 @@ func (g *DeduplicationRulesGenerator) createResources(deduplicationRules Dedupli func (g *DeduplicationRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { - return errors.New("--service-name is required") - } + getServicesURL := "/v3/services" + responseService, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } - getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]) - response, err := Request[DeduplicationRules](getDeduplicationRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) - if err != nil { - return err - } + for _, service := range *responseService { + getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", service.ID) + response, err := Request[DeduplicationRules](getDeduplicationRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } - g.Resources = g.createResources(*response) + g.Resources = append(g.Resources, g.createResources(*response)...) + } + } else { + getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]) + response, err := Request[DeduplicationRules](getDeduplicationRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + } return nil } diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index dc34f036df..199f2113e8 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -12,8 +11,9 @@ type RoutingRulesGenerator struct { } type RoutingRules struct { - ID string `json:"id"` - Rules []*RoutingRule `json:"rules"` + ID string `json:"id"` + ServiceID string `json:"service_id"` + Rules []*RoutingRule `json:"rules"` } type RoutingRule struct { @@ -30,7 +30,7 @@ func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []ter g.GetProviderName(), map[string]string{ "team_id": g.Args["team_id"].(string), - "service_id": g.Args["service_id"].(string), + "service_id": routingRules.ServiceID, }, []string{}, map[string]interface{}{}, @@ -41,15 +41,29 @@ func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []ter func (g *RoutingRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { - return errors.New("--service-name is required") - } + getServicesURL := "/v3/services" + responseService, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } - getRoutingRulesURL := fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"]) - response, err := Request[RoutingRules](getRoutingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) - if err != nil { - return err - } + for _, service := range *responseService { + getRoutingRulesURL := fmt.Sprintf("/v3/services/%s/routing-rules", service.ID) + response, err := Request[RoutingRules](getRoutingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } - g.Resources = g.createResources(*response) + g.Resources = append(g.Resources, g.createResources(*response)...) + } + } else { + getRoutingRulesURL := fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"]) + response, err := Request[RoutingRules](getRoutingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + } return nil } diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index d5303511b2..cbfcb7b033 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -12,8 +11,9 @@ type SuppressionRulesGenerator struct { } type SuppressionRules struct { - ID string `json:"id"` - Rules []*SuppressionRule `json:"rules"` + ID string `json:"id"` + ServiceID string `json:"service_id"` + Rules []*SuppressionRule `json:"rules"` } type SuppressionRule struct { @@ -30,7 +30,7 @@ func (g *SuppressionRulesGenerator) createResources(suppressionRules Suppression g.GetProviderName(), map[string]string{ "team_id": g.Args["team_id"].(string), - "service_id": g.Args["service_id"].(string), + "service_id": suppressionRules.ServiceID, }, []string{}, map[string]interface{}{}, @@ -41,15 +41,29 @@ func (g *SuppressionRulesGenerator) createResources(suppressionRules Suppression func (g *SuppressionRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { - return errors.New("--service-name is required") - } + getServicesURL := "/v3/services" + responseService, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } - getSuppressionRulesURL := fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"]) - response, err := Request[SuppressionRules](getSuppressionRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) - if err != nil { - return err - } + for _, service := range *responseService { + getSuppressionRulesURL := fmt.Sprintf("/v3/services/%s/suppression-rules", service.ID) + response, err := Request[SuppressionRules](getSuppressionRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } - g.Resources = g.createResources(*response) + g.Resources = append(g.Resources, g.createResources(*response)...) + } + } else { + getSuppressionRulesURL := fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"]) + response, err := Request[SuppressionRules](getSuppressionRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + } return nil } diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index 02590d524c..c7e9356f5b 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -1,7 +1,6 @@ package squadcast import ( - "errors" "fmt" "github.com/GoogleCloudPlatform/terraformer/terraformutils" @@ -16,6 +15,7 @@ type TaggingRules struct { ServiceID string `json:"service_id"` Rules []*TaggingRule `json:"rules"` } + type TaggingRule struct { ID string `json:"rule_id"` } @@ -30,7 +30,7 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr g.GetProviderName(), map[string]string{ "team_id": g.Args["team_id"].(string), - "service_id": g.Args["service_id"].(string), + "service_id": taggingRule.ServiceID, }, []string{}, map[string]interface{}{}, @@ -41,14 +41,29 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr func (g *TaggingRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { - return errors.New("--service-name is required") - } - getTaggingRulesURL := fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"]) - response, err := Request[TaggingRules](getTaggingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) - if err != nil { - return err - } + getServicesURL := "/v3/services" + responseService, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } - g.Resources = g.createResources(*response) + for _, service := range *responseService { + getTaggingRulesURL := fmt.Sprintf("/v3/services/%s/tagging-rules", service.ID) + response, err := Request[TaggingRules](getTaggingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } + + g.Resources = append(g.Resources, g.createResources(*response)...) + } + } else { + getTaggingRulesURL := fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"]) + response, err := Request[TaggingRules](getTaggingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + } return nil } From 79c07c0cd760ca81e115028f9131f0e19634015c Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Mon, 19 Sep 2022 10:24:09 +0530 Subject: [PATCH 65/73] updated squadcast.md in docs --- docs/squadcast.md | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/docs/squadcast.md b/docs/squadcast.md index e822c8ac80..99967da89b 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -24,7 +24,7 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - `Import User Resource` ``` -terraformer import squadcast --resources=user --region=us +terraformer import squadcast --resources=user --region=us --team-name="Defualt Team" ``` - `Import Squad Resource` @@ -33,6 +33,18 @@ terraformer import squadcast --resources=user --region=us terraformer import squadcast --resources=team --region=us --team-name="Default Team" ``` +- `Import Deduplication Rules Resource` (without `--service-name` flag) + - Deduplication Rules for all the services under Default Team will be generated. +``` +terraformer import squadcast --resources=deduplication_rules --region=us --team-name="Default Team" +``` + +- `Import Deduplication Rules Resource` + - Deduplication Rules only for Example Service will be generated. + +``` +terraformer import squadcast --resources=deduplication_rules --region=us --team-name="Default Team" --service-name="Example Service" +``` ### In order to use terraform files: @@ -47,12 +59,12 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T ### Example: ``` terraform { - required_providers { - squadcast = { - version = "~> 1.0.5" - source = "SquadcastHub/squadcast" - } - } + required_providers { + squadcast = { + version = "~> 1.0.5" + source = "SquadcastHub/squadcast" + } + } } ``` @@ -64,6 +76,7 @@ terraform { - escalation_policy - routing_rules - runbook + - schedule - service - slo - squad @@ -71,19 +84,21 @@ terraform { - tagging_rules - team_member - team_roles - -- `--service-name` - - Required for the following resources: - - deduplication_rules - - routing_rules - - suppression_rules - - tagging_rules + - user - `--region` - Supported Values: - `us` - `eu` +- `--service-name` (optional) + - Supported for the following resources: + - deduplication_rules + - routing_rules + - suppression_rules + - tagging_rules + - If service name is not provided, resources for specified automation rule for all the service within the specified team will be generated. However it will only generate for a specific service when this flag is used. [see examples](squadcast.md:36) + - `--refresh-token` (optional) - Supported Values: - @@ -94,6 +109,7 @@ terraform { - [`escalation_policy`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/escalation_policy) - [`routing_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/routing_rules) - [`runbook`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/runbook) +- [`schedule`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/schedule) - [`service`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/service) - [`slo`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/slo) - [`squad`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/squad) From feb1f82a2ae26b05fb161dc060376ec3a4ae763d Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Tue, 20 Sep 2022 10:22:28 +0530 Subject: [PATCH 66/73] fix: removed schedule resource --- docs/squadcast.md | 2 - providers/squadcast/schedule.go | 45 ----------------------- providers/squadcast/squadcast_provider.go | 1 - 3 files changed, 48 deletions(-) delete mode 100644 providers/squadcast/schedule.go diff --git a/docs/squadcast.md b/docs/squadcast.md index 99967da89b..d1dd6fd482 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -76,7 +76,6 @@ terraform { - escalation_policy - routing_rules - runbook - - schedule - service - slo - squad @@ -109,7 +108,6 @@ terraform { - [`escalation_policy`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/escalation_policy) - [`routing_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/routing_rules) - [`runbook`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/runbook) -- [`schedule`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/schedule) - [`service`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/service) - [`slo`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/slo) - [`squad`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/squad) diff --git a/providers/squadcast/schedule.go b/providers/squadcast/schedule.go deleted file mode 100644 index 139cf4e56b..0000000000 --- a/providers/squadcast/schedule.go +++ /dev/null @@ -1,45 +0,0 @@ -package squadcast - -import ( - "fmt" - - "github.com/GoogleCloudPlatform/terraformer/terraformutils" -) - -type SchedulesGenerator struct { - SquadcastService -} - -type Schedule struct { - ID string `json:"id"` - Name string `json:"name"` -} - -func (g *SchedulesGenerator) createResources(schedules []Schedule) []terraformutils.Resource { - var resourceList []terraformutils.Resource - for _, schedule := range schedules { - resourceList = append(resourceList, terraformutils.NewResource( - schedule.ID, - fmt.Sprintf("schedule_%s", schedule.Name), - "squadcast_schedule", - g.GetProviderName(), - map[string]string{ - "team_id": g.Args["team_id"].(string), - }, - []string{}, - map[string]interface{}{}, - )) - } - return resourceList -} - -func (g *SchedulesGenerator) InitResources() error { - getSchedulesURL := "/v3/schedules" - response, err := Request[[]Schedule](getSchedulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) - if err != nil { - return err - } - - g.Resources = g.createResources(*response) - return nil -} diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 871f00f5a1..593345eadf 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -135,7 +135,6 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv "routing_rules": &RoutingRulesGenerator{}, "deduplication_rules": &DeduplicationRulesGenerator{}, "suppression_rules": &SuppressionRulesGenerator{}, - "schedule": &SchedulesGenerator{}, } } From 07621bf3593826d97262083fbf6efc852aaf279a Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Tue, 20 Sep 2022 12:14:38 +0530 Subject: [PATCH 67/73] fix: fixed some golangci-lint error --- providers/squadcast/squadcast_service.go | 3 +-- providers/squadcast/team.go | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index be640903ad..cfa8db963c 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "log" "net/http" @@ -70,7 +69,7 @@ func Request[TRes any](url string, token string, region string, isAuthenticated } }(resp.Body) - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index e0e38fb89e..0eb3f98b58 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -2,6 +2,7 @@ package squadcast import ( "fmt" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) From 71482327564d4888b5192503c2848042aa30f4e4 Mon Sep 17 00:00:00 2001 From: Lucifer8729 <72292326+Lucifer8729@users.noreply.github.com> Date: Wed, 21 Sep 2022 15:24:29 +0530 Subject: [PATCH 68/73] fix: renamed SquadcastSevice to SCService and SqaudcastProvider to SCProvider --- cmd/provider_cmd_squadcast.go | 2 +- providers/squadcast/deduplication_rules.go | 2 +- providers/squadcast/escalation_policy.go | 2 +- providers/squadcast/routing_rules.go | 2 +- providers/squadcast/runbook.go | 2 +- providers/squadcast/service.go | 2 +- providers/squadcast/slo.go | 2 +- providers/squadcast/squad.go | 2 +- providers/squadcast/squadcast_provider.go | 22 +++++++++++----------- providers/squadcast/squadcast_service.go | 2 +- providers/squadcast/suppression_rules.go | 2 +- providers/squadcast/tagging_rules.go | 2 +- providers/squadcast/team.go | 2 +- providers/squadcast/team_member.go | 2 +- providers/squadcast/team_roles.go | 2 +- providers/squadcast/user.go | 2 +- 16 files changed, 26 insertions(+), 26 deletions(-) diff --git a/cmd/provider_cmd_squadcast.go b/cmd/provider_cmd_squadcast.go index fe93753c6b..8214ae8b5f 100644 --- a/cmd/provider_cmd_squadcast.go +++ b/cmd/provider_cmd_squadcast.go @@ -34,5 +34,5 @@ func newCmdSquadcastImporter(options ImportOptions) *cobra.Command { } func newSquadcastProvider() terraformutils.ProviderGenerator { - return &squadcast_terraforming.SquadcastProvider{} + return &squadcast_terraforming.SCProvider{} } diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index 7464299714..ea9b75efb8 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -7,7 +7,7 @@ import ( ) type DeduplicationRulesGenerator struct { - SquadcastService + SCService } type DeduplicationRules struct { diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 071ff56093..d5ca56a116 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -7,7 +7,7 @@ import ( ) type EscalationPolicyGenerator struct { - SquadcastService + SCService } type EscalationPolicy struct { diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index 199f2113e8..2f0815d09d 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -7,7 +7,7 @@ import ( ) type RoutingRulesGenerator struct { - SquadcastService + SCService } type RoutingRules struct { diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index 3f13a35690..1cb62a7a55 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -9,7 +9,7 @@ import ( ) type RunbookGenerator struct { - SquadcastService + SCService } type Runbook struct { diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index 0db73ceee4..674980f3bd 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -9,7 +9,7 @@ import ( ) type ServiceGenerator struct { - SquadcastService + SCService } type Service struct { diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go index 9d81273dfb..48de8e4ec7 100644 --- a/providers/squadcast/slo.go +++ b/providers/squadcast/slo.go @@ -9,7 +9,7 @@ import ( ) type SLOGenerator struct { - SquadcastService + SCService } type SLO struct { diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index 668efa0a43..f9e8aa81f3 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -7,7 +7,7 @@ import ( ) type SquadGenerator struct { - SquadcastService + SCService } type Squad struct { diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 593345eadf..70be28db00 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -12,7 +12,7 @@ import ( "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) -type SquadcastProvider struct { +type SCProvider struct { terraformutils.Provider accessToken string refreshToken string @@ -37,7 +37,7 @@ type AppError struct { Message string `json:"error_message,omitempty"` } -func (p *SquadcastProvider) Init(args []string) error { +func (p *SCProvider) Init(args []string) error { if refreshToken := os.Getenv("SQUADCAST_REFRESH_TOKEN"); refreshToken != "" { p.refreshToken = os.Getenv("SQUADCAST_REFRESH_TOKEN") @@ -72,7 +72,7 @@ func (p *SquadcastProvider) Init(args []string) error { return nil } -func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error { +func (p *SCProvider) InitService(serviceName string, verbose bool) error { var isSupported bool if _, isSupported = p.GetSupportedService()[serviceName]; !isSupported { return errors.New(p.GetName() + ": " + serviceName + " not supported service") @@ -95,14 +95,14 @@ func (p *SquadcastProvider) InitService(serviceName string, verbose bool) error // @desc GetConfig: send details to provider block of terraform-provider-squadcast -func (p *SquadcastProvider) GetConfig() cty.Value { +func (p *SCProvider) GetConfig() cty.Value { return cty.ObjectVal(map[string]cty.Value{ "region": cty.StringVal(p.region), "refresh_token": cty.StringVal(p.refreshToken), }) } -func (p *SquadcastProvider) GetProviderData(...string) map[string]interface{} { +func (p *SCProvider) GetProviderData(...string) map[string]interface{} { return map[string]interface{}{ "provider": map[string]interface{}{ "squadcast": map[string]interface{}{ @@ -112,15 +112,15 @@ func (p *SquadcastProvider) GetProviderData(...string) map[string]interface{} { } } -func (p *SquadcastProvider) GetResourceConnections() map[string]map[string][]string { +func (p *SCProvider) GetResourceConnections() map[string]map[string][]string { return map[string]map[string][]string{} } -func (p *SquadcastProvider) GetName() string { +func (p *SCProvider) GetName() string { return "squadcast" } -func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { +func (p *SCProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ "user": &UserGenerator{}, "service": &ServiceGenerator{}, @@ -138,7 +138,7 @@ func (p *SquadcastProvider) GetSupportedService() map[string]terraformutils.Serv } } -func (p *SquadcastProvider) GetAccessToken() { +func (p *SCProvider) GetAccessToken() { url := "/oauth/access-token" response, err := Request[AccessToken](url, p.refreshToken, p.region, false) if err != nil { @@ -147,7 +147,7 @@ func (p *SquadcastProvider) GetAccessToken() { p.accessToken = response.AccessToken } -func (p *SquadcastProvider) GetTeamID() { +func (p *SCProvider) GetTeamID() { url := fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(p.teamName)) response, err := Request[Team](url, p.accessToken, p.region, true) if err != nil { @@ -156,7 +156,7 @@ func (p *SquadcastProvider) GetTeamID() { p.teamID = response.ID } -func (p *SquadcastProvider) GetServiceID() { +func (p *SCProvider) GetServiceID() { url := fmt.Sprintf("/v3/services/by-name?name=%s&owner_id=%s", url.QueryEscape(p.serviceName), p.teamID) response, err := Request[Service](url, p.accessToken, p.region, true) if err != nil { diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index cfa8db963c..67f137f220 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -11,7 +11,7 @@ import ( "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) -type SquadcastService struct { +type SCService struct { terraformutils.Service } diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index cbfcb7b033..1fd937af97 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -7,7 +7,7 @@ import ( ) type SuppressionRulesGenerator struct { - SquadcastService + SCService } type SuppressionRules struct { diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index c7e9356f5b..22957ef2c3 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -7,7 +7,7 @@ import ( ) type TaggingRulesGenerator struct { - SquadcastService + SCService } type TaggingRules struct { diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index 0eb3f98b58..be1728da74 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -7,7 +7,7 @@ import ( ) type TeamGenerator struct { - SquadcastService + SCService } type Team struct { diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index 20644c9047..af5e42cb30 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -8,7 +8,7 @@ import ( ) type TeamMemberGenerator struct { - SquadcastService + SCService } type TeamMember struct { diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 483daecd52..166b73e492 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -7,7 +7,7 @@ import ( ) type TeamRolesGenerator struct { - SquadcastService + SCService } type TeamRole struct { diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 369852ba26..52a842de1a 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -7,7 +7,7 @@ import ( ) type UserGenerator struct { - SquadcastService + SCService } type User struct { From 3e8b2d27ce5a822cb6e02924829331ea761fcf57 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Wed, 15 Mar 2023 19:40:37 +0530 Subject: [PATCH 69/73] fix: error handling --- providers/squadcast/squadcast_service.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 67f137f220..640ada6a19 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -78,6 +78,11 @@ func Request[TRes any](url string, token string, region string, isAuthenticated if err != nil { return nil, err } + if response.Meta != nil { + if response.Meta.Meta.Status >= 400 { + return nil, fmt.Errorf("Error: %s", response.Meta.Meta.Message) + } + } return response.Data, nil } From ff020d8d5ba71e720c7c033eb16736d1222f13fd Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Wed, 15 May 2024 10:51:11 +0530 Subject: [PATCH 70/73] feat: add support for new resources --- docs/squadcast.md | 34 +++- go.mod | 4 +- go.sum | 6 + providers/squadcast/deduplication_rules.go | 27 +++- providers/squadcast/deduplocation_rules_v2.go | 74 +++++++++ providers/squadcast/escalation_policy.go | 10 +- providers/squadcast/global_event_rules.go | 151 ++++++++++++++++++ providers/squadcast/routing_rules.go | 27 +++- providers/squadcast/routing_rules_v2.go | 74 +++++++++ providers/squadcast/runbook.go | 9 +- providers/squadcast/schedules_v2.go | 76 +++++++++ providers/squadcast/service.go | 9 +- providers/squadcast/slo.go | 9 +- providers/squadcast/squad.go | 9 +- providers/squadcast/squadcast_provider.go | 63 +++++--- providers/squadcast/squadcast_service.go | 61 +++++-- providers/squadcast/status_page.go | 51 ++++++ providers/squadcast/status_page_components.go | 64 ++++++++ providers/squadcast/status_page_groups.go | 64 ++++++++ providers/squadcast/suppression_rule_v2.go | 74 +++++++++ providers/squadcast/suppression_rules.go | 27 +++- providers/squadcast/tagging_rule_v2.go | 74 +++++++++ providers/squadcast/tagging_rules.go | 27 +++- providers/squadcast/team.go | 9 +- providers/squadcast/team_member.go | 10 +- providers/squadcast/team_roles.go | 9 +- providers/squadcast/user.go | 9 +- providers/squadcast/webform.go | 45 ++++++ 28 files changed, 1026 insertions(+), 80 deletions(-) create mode 100644 providers/squadcast/deduplocation_rules_v2.go create mode 100644 providers/squadcast/global_event_rules.go create mode 100644 providers/squadcast/routing_rules_v2.go create mode 100644 providers/squadcast/schedules_v2.go create mode 100644 providers/squadcast/status_page.go create mode 100644 providers/squadcast/status_page_components.go create mode 100644 providers/squadcast/status_page_groups.go create mode 100644 providers/squadcast/suppression_rule_v2.go create mode 100644 providers/squadcast/tagging_rule_v2.go create mode 100644 providers/squadcast/webform.go diff --git a/docs/squadcast.md b/docs/squadcast.md index d1dd6fd482..8ff517a473 100644 --- a/docs/squadcast.md +++ b/docs/squadcast.md @@ -4,11 +4,10 @@ Syntax: `export SQUADCAST_REFRESH_TOKEN=` -OR +OR Add `--refresh-token` flag in cmd - ``` terraformer import squadcast --resources= --region=SQUADCAST_REGION ``` @@ -35,6 +34,7 @@ terraformer import squadcast --resources=team --region=us --team-name="Default T - `Import Deduplication Rules Resource` (without `--service-name` flag) - Deduplication Rules for all the services under Default Team will be generated. + ``` terraformer import squadcast --resources=deduplication_rules --region=us --team-name="Default Team" ``` @@ -48,20 +48,21 @@ terraformer import squadcast --resources=deduplication_rules --region=us --team- ### In order to use terraform files: -- Update version and add source in `provider.tf` +- Update version and add source in `provider.tf` - Go to `/generated/squadcast///provider.tf` - Add `source = "SquadcastHub/squadcast"` to squadcast inside `required_providers` - Update `version` in `required_providers` by removing `.exe` (Windows users only) - Update `terraform_version` - `cd /generated/squadcast//` - `terraform state replace-provider -auto-approve "registry.terraform.io/-/squadcast" "SquadcastHub/squadcast"` - + ### Example: + ``` terraform { required_providers { squadcast = { - version = "~> 1.0.5" + version = "~> 2.0.1" source = "SquadcastHub/squadcast" } } @@ -71,6 +72,7 @@ terraform { ### Flags: - `--team-name` + - Required for the following resources: - deduplication_rules - escalation_policy @@ -84,18 +86,30 @@ terraform { - team_member - team_roles - user + - webform + - schedules_v2 + - global_event_rules + - status_pages + - status_page_components + - status_page_groups - `--region` + - Supported Values: - `us` - `eu` - `--service-name` (optional) + - Supported for the following resources: - deduplication_rules - routing_rules - suppression_rules - tagging_rules + - deduplication_rules_v2 + - routing_rules_v2 + - suppression_rules_v2 + - tagging_rules_v2 - If service name is not provided, resources for specified automation rule for all the service within the specified team will be generated. However it will only generate for a specific service when this flag is used. [see examples](squadcast.md:36) - `--refresh-token` (optional) @@ -105,15 +119,25 @@ terraform { ### Supported resources: - [`deduplication_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/deduplication_rules) +- [`deduplication_rule_v2`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/deduplication_rule_v2) - [`escalation_policy`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/escalation_policy) - [`routing_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/routing_rules) +- [`routing_rule_v2`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/routing_rule_v2) - [`runbook`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/runbook) - [`service`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/service) - [`slo`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/slo) - [`squad`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/squad) - [`suppression_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/suppression_rules) +- [`suppression_rule_v2`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/suppression_rule_v2) - [`tagging_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/tagging_rules) +- [`tagging_rule_v2`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/tagging_rule_v2) - [`team`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team) - [`team_member`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team_member) - [`team_roles`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/team_role) - [`user`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/user) +- [`webforms`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/webform) +- [`status_pages`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/status_page) +- [`status_page_components`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/status_page_component) +- [`status_page_groups`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/status_page_group) +- [`global_event_rules`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/ger) +- [`schedules_v2`](https://registry.terraform.io/providers/SquadcastHub/squadcast/latest/docs/resources/schedule_v2) diff --git a/go.mod b/go.mod index ac705d93b9..c0846bd073 100644 --- a/go.mod +++ b/go.mod @@ -257,7 +257,7 @@ require ( github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/google/jsonapi v1.0.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -389,11 +389,13 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 // indirect k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect + nhooyr.io/websocket v1.8.10 // indirect sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect ) require ( github.com/gofrs/uuid/v3 v3.1.2 + github.com/hasura/go-graphql-client v0.12.1 github.com/ionos-cloud/sdk-go-cert-manager v1.0.0 github.com/ionos-cloud/sdk-go-container-registry v1.0.0 github.com/ionos-cloud/sdk-go-dataplatform v1.0.1 diff --git a/go.sum b/go.sum index 31eccc180f..d4f6825081 100644 --- a/go.sum +++ b/go.sum @@ -895,6 +895,8 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -1036,6 +1038,8 @@ github.com/hashicorp/vault v0.10.4/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bA github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 h1:xixZ2bWeofWV68J+x6AzmKuVM/JWCQwkWm6GW/MUR6I= github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hasura/go-graphql-client v0.12.1 h1:tL+BCoyubkYYyaQ+tJz+oPe/pSxYwOJHwe5SSqqi6WI= +github.com/hasura/go-graphql-client v0.12.1/go.mod h1:F4N4kR6vY8amio3gEu3tjSZr8GPOXJr3zj72DKixfLE= github.com/heimweh/go-pagerduty v0.0.0-20210930203304-530eff2acdc6 h1:/D0VtHEOCdotE1vSB9XznceAjIGkUieZ4BF6VKUIqNU= github.com/heimweh/go-pagerduty v0.0.0-20210930203304-530eff2acdc6/go.mod h1:JtJGtgN0y9KOCaqFMZFaBCWskpO/KK3Ro9TwjP9ss6w= github.com/heroku/heroku-go/v5 v5.4.1 h1:J1nNnR3/571b2iUDHl+y1B3VkhKm6YOXIq9GGzQUv5s= @@ -2416,6 +2420,8 @@ k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdi k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= +nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index ea9b75efb8..a6e3ee86bb 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -41,15 +41,25 @@ func (g *DeduplicationRulesGenerator) createResources(deduplicationRules Dedupli func (g *DeduplicationRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { - getServicesURL := "/v3/services" - responseService, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + responseService, err := Request[[]Service](req) if err != nil { return err } for _, service := range *responseService { - getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", service.ID) - response, err := Request[DeduplicationRules](getDeduplicationRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/deduplication-rules", service.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[DeduplicationRules](req) if err != nil { return err } @@ -57,8 +67,13 @@ func (g *DeduplicationRulesGenerator) InitResources() error { g.Resources = append(g.Resources, g.createResources(*response)...) } } else { - getDeduplicationRulesURL := fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]) - response, err := Request[DeduplicationRules](getDeduplicationRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[DeduplicationRules](req) if err != nil { return err } diff --git a/providers/squadcast/deduplocation_rules_v2.go b/providers/squadcast/deduplocation_rules_v2.go new file mode 100644 index 0000000000..4f514f74d9 --- /dev/null +++ b/providers/squadcast/deduplocation_rules_v2.go @@ -0,0 +1,74 @@ +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type DeduplicationRuleGenerator struct { + SCService +} + +func (g *DeduplicationRuleGenerator) createResources(deduplicationRulesV2 DeduplicationRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range deduplicationRulesV2.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + fmt.Sprintf("deduplication_rule_v2_%s", rule.ID), + "squadcast_deduplication_rule_v2", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + "service_id": deduplicationRulesV2.ServiceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + return resourceList +} + +func (g *DeduplicationRuleGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + responseService, err := Request[[]Service](req) + if err != nil { + return err + } + + for _, service := range *responseService { + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/deduplication-rules", service.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[DeduplicationRules](req) + if err != nil { + return err + } + + g.Resources = append(g.Resources, g.createResources(*response)...) + } + } else { + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/deduplication-rules", g.Args["service_id"]), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[DeduplicationRules](req) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + } + return nil +} diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index d5ca56a116..157ac91694 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -34,8 +34,14 @@ func (g *EscalationPolicyGenerator) createResources(policies []EscalationPolicy) } func (g *EscalationPolicyGenerator) InitResources() error { - getEscalationPolicyURL := fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.Args["team_id"].(string)) - response, err := Request[[]EscalationPolicy](getEscalationPolicyURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/escalation-policies?owner_id=%s", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + + response, err := Request[[]EscalationPolicy](req) if err != nil { return err } diff --git a/providers/squadcast/global_event_rules.go b/providers/squadcast/global_event_rules.go new file mode 100644 index 0000000000..0b94eda140 --- /dev/null +++ b/providers/squadcast/global_event_rules.go @@ -0,0 +1,151 @@ +package squadcast + +import ( + "fmt" + "log" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type GlobalEventRulesGenerator struct { + SCService +} + +type GER struct { + ID uint `json:"id"` + Rulesets []GER_Ruleset `json:"rulesets"` +} +type GER_Ruleset struct { + ID uint `json:"id"` + AlertSourceName string + AlertSourceShortName string `json:"alert_source_shortname"` + AlertSourceVersion string `json:"alert_source_version"` + + Rules []GER_Ruleset_Rules +} +type GER_Ruleset_Rules struct { + ID uint `json:"id"` + GER_ID uint `json:"global_event_rule_id"` +} + +func (g *GlobalEventRulesGenerator) createResources(ger []GER) []terraformutils.Resource { + var resourceList []terraformutils.Resource + alertSourcesMap, err := g.getAlertSources() + if err != nil { + log.Fatal(err) + } + for _, rule := range ger { + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", rule.ID), + fmt.Sprintf("ger_%d", rule.ID), + "squadcast_ger", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + }, + []string{}, + map[string]interface{}{}, + )) + for _, rs := range rule.Rulesets { + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", rs.ID), + fmt.Sprintf("ger_ruleset_%d", rs.ID), + "squadcast_ger_ruleset", + g.GetProviderName(), + map[string]string{ + "ger_id": fmt.Sprintf("%d", rule.ID), + "alert_source": alertSourcesMap[rs.AlertSourceShortName], + "alert_source_shortname": rs.AlertSourceShortName, + "alert_source_version": rs.AlertSourceVersion, + }, + []string{}, + map[string]interface{}{}, + )) + + for _, r := range rs.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", r.ID), + fmt.Sprintf("ger_ruleset_rule_%d", r.ID), + "squadcast_ger_ruleset_rule", + g.GetProviderName(), + map[string]string{ + "ger_id": fmt.Sprintf("%d", rule.ID), + "alert_source": alertSourcesMap[rs.AlertSourceShortName], + "alert_source_shortname": rs.AlertSourceShortName, + "alert_source_version": rs.AlertSourceVersion, + }, + []string{}, + map[string]interface{}{}, + )) + } + } + } + return resourceList +} + +func (g *GlobalEventRulesGenerator) InitResources() error { + req := TRequest{ + URL: fmt.Sprintf("/v3/global-event-rules?owner_id=%s", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]GER](req) + if err != nil { + return err + } + + ger := *response + + for i, rule := range ger { + for j, rs := range rule.Rulesets { + req := TRequest{ + URL: fmt.Sprintf("/v3/global-event-rules/%d/rulesets/%s/%s/rules", rule.ID, rs.AlertSourceVersion, rs.AlertSourceShortName), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + resp, err := Request[[]GER_Ruleset_Rules](req) + if err != nil { + return err + } + ger[i].Rulesets[j].Rules = *resp + } + } + + g.Resources = g.createResources(*response) + return nil +} + +type AlertSource struct { + ID string `json:"_id"` + Type string `json:"type"` + Heading string `json:"heading"` + SupportDocURL string `json:"supportDoc"` + DisplayKeyOnly bool `json:"displayKeyOnly"` + ShortName string `json:"shortName"` + Version string `json:"version"` + + IsValid bool `json:"isValid"` + IsPrivate bool `json:"isPrivate"` + IsDeprecated bool `json:"deprecated"` +} + +func (g *GlobalEventRulesGenerator) getAlertSources() (map[string]string, error) { + alertSourcesMap := make(map[string]string, 0) + req := TRequest{ + URL: "/v2/public/integrations", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + IsV2: true, + } + alertSources, err := Request[[]AlertSource](req) + if err != nil { + return nil, err + } + for _, alertSourceData := range *alertSources { + alertSourcesMap[alertSourceData.ShortName] = alertSourceData.Type + } + return alertSourcesMap, nil +} diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index 2f0815d09d..4412de2d05 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -41,15 +41,25 @@ func (g *RoutingRulesGenerator) createResources(routingRules RoutingRules) []ter func (g *RoutingRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { - getServicesURL := "/v3/services" - responseService, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + responseService, err := Request[[]Service](req) if err != nil { return err } for _, service := range *responseService { - getRoutingRulesURL := fmt.Sprintf("/v3/services/%s/routing-rules", service.ID) - response, err := Request[RoutingRules](getRoutingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/routing-rules", service.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[RoutingRules](req) if err != nil { return err } @@ -57,8 +67,13 @@ func (g *RoutingRulesGenerator) InitResources() error { g.Resources = append(g.Resources, g.createResources(*response)...) } } else { - getRoutingRulesURL := fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"]) - response, err := Request[RoutingRules](getRoutingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"]), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[RoutingRules](req) if err != nil { return err } diff --git a/providers/squadcast/routing_rules_v2.go b/providers/squadcast/routing_rules_v2.go new file mode 100644 index 0000000000..78cf3675a9 --- /dev/null +++ b/providers/squadcast/routing_rules_v2.go @@ -0,0 +1,74 @@ +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type RoutingRuleGenerator struct { + SCService +} + +func (g *RoutingRuleGenerator) createResources(routingRules RoutingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range routingRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + fmt.Sprintf("routing_rule_v2_%s", rule.ID), + "squadcast_routing_rule_v2", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + "service_id": routingRules.ServiceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + return resourceList +} + +func (g *RoutingRuleGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + responseService, err := Request[[]Service](req) + if err != nil { + return err + } + + for _, service := range *responseService { + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/routing-rules", service.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[RoutingRules](req) + if err != nil { + return err + } + + g.Resources = append(g.Resources, g.createResources(*response)...) + } + } else { + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/routing-rules", g.Args["service_id"]), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[RoutingRules](req) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + } + return nil +} diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index 1cb62a7a55..67a63f65b3 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -36,8 +36,13 @@ func (g *RunbookGenerator) createResources(runbooks []Runbook) []terraformutils. } func (g *RunbookGenerator) InitResources() error { - getRunbooksURL := "/v3/runbooks" - response, err := Request[[]Runbook](getRunbooksURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: "/v3/runbooks", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]Runbook](req) if err != nil { return err } diff --git a/providers/squadcast/schedules_v2.go b/providers/squadcast/schedules_v2.go new file mode 100644 index 0000000000..907d2b534c --- /dev/null +++ b/providers/squadcast/schedules_v2.go @@ -0,0 +1,76 @@ +// service resource is yet to be implemented + +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type SchedulesGenerator struct { + SCService +} + +type ScheduleQueryStruct struct { + Schedules []*Schedule `graphql:"schedules(filters: { teamID: $teamID })"` +} + +type Schedule struct { + ID int `graphql:"ID" json:"ID"` + Rotations []*Rotation `graphql:"rotations" json:"rotations"` +} + +type Rotation struct { + ID int `graphql:"ID" json:"id"` +} + +func (g *SchedulesGenerator) createResources(schedules []*Schedule) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, sch := range schedules { + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", sch.ID), + fmt.Sprintf("schedule_v2_%d", sch.ID), + "squadcast_schedule_v2", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + }, + []string{}, + map[string]interface{}{}, + )) + } + for _, sch := range schedules { + for _, rot := range sch.Rotations { + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", rot.ID), + fmt.Sprintf("rotation_v2_%d", rot.ID), + "squadcast_schedule_rotation_v2", + g.GetProviderName(), + map[string]string{ + "schedule_id": fmt.Sprintf("%d", sch.ID), + }, + []string{}, + map[string]interface{}{}, + )) + } + } + + return resourceList +} + +func (g *SchedulesGenerator) InitResources() error { + var payload ScheduleQueryStruct + + variables := map[string]interface{}{ + "teamID": g.Args["team_id"].(string), + } + + response, err := GraphQLRequest[ScheduleQueryStruct]("query", g.Args["access_token"].(string), g.Args["region"].(string), &payload, variables) + if err != nil { + return err + } + + g.Resources = g.createResources(response.Schedules) + return nil +} diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index 674980f3bd..ef80cf30a8 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -36,8 +36,13 @@ func (g *ServiceGenerator) createResources(services []Service) []terraformutils. } func (g *ServiceGenerator) InitResources() error { - getServicesURL := "/v3/services" - response, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]Service](req) if err != nil { return err } diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go index 48de8e4ec7..fb4c81b8c0 100644 --- a/providers/squadcast/slo.go +++ b/providers/squadcast/slo.go @@ -40,8 +40,13 @@ func (g *SLOGenerator) createResources(slo []SLO) []terraformutils.Resource { } func (g *SLOGenerator) InitResources() error { - getSLOsURL := fmt.Sprintf("/v3/slo?owner_id=%s", g.Args["team_id"].(string)) - response, err := Request[getSLOsResponse](getSLOsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/slo?owner_id=%s", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[getSLOsResponse](req) if err != nil { return err } diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index f9e8aa81f3..1b6f5cbf48 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -35,8 +35,13 @@ func (g *SquadGenerator) createResources(squads []Squad) []terraformutils.Resour } func (g *SquadGenerator) InitResources() error { - getSquadsURL := fmt.Sprintf("/v3/squads?owner_id=%s", g.Args["team_id"].(string)) - response, err := Request[[]Squad](getSquadsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/squads?owner_id=%s", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]Squad](req) if err != nil { return err } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 70be28db00..2001f7fde9 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -122,25 +122,40 @@ func (p *SCProvider) GetName() string { func (p *SCProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator { return map[string]terraformutils.ServiceGenerator{ - "user": &UserGenerator{}, - "service": &ServiceGenerator{}, - "squad": &SquadGenerator{}, - "team": &TeamGenerator{}, - "team_member": &TeamMemberGenerator{}, - "team_roles": &TeamRolesGenerator{}, - "escalation_policy": &EscalationPolicyGenerator{}, - "runbook": &RunbookGenerator{}, - "slo": &SLOGenerator{}, - "tagging_rules": &TaggingRulesGenerator{}, - "routing_rules": &RoutingRulesGenerator{}, - "deduplication_rules": &DeduplicationRulesGenerator{}, - "suppression_rules": &SuppressionRulesGenerator{}, + "user": &UserGenerator{}, + "service": &ServiceGenerator{}, + "squad": &SquadGenerator{}, + "team": &TeamGenerator{}, + "team_member": &TeamMemberGenerator{}, + "team_roles": &TeamRolesGenerator{}, + "escalation_policy": &EscalationPolicyGenerator{}, + "runbook": &RunbookGenerator{}, + "slo": &SLOGenerator{}, + "tagging_rules": &TaggingRulesGenerator{}, + "tagging_rule_v2": &TaggingRuleGenerator{}, + "routing_rules": &RoutingRulesGenerator{}, + "routing_rule_v2": &RoutingRuleGenerator{}, + "deduplication_rules": &DeduplicationRulesGenerator{}, + "deduplication_rule_v2": &DeduplicationRuleGenerator{}, + "suppression_rules": &SuppressionRulesGenerator{}, + "suppression_rule_v2": &SuppressionRuleGenerator{}, + "global_event_rules": &GlobalEventRulesGenerator{}, + "webforms": &WebformsGenerator{}, + "status_pages": &StatusPagesGenerator{}, + "status_page_components": &StatusPageComponentsGenerator{}, + "status_page_groups": &StatusPageGroupsGenerator{}, + "schedules_v2": &SchedulesGenerator{}, } } func (p *SCProvider) GetAccessToken() { - url := "/oauth/access-token" - response, err := Request[AccessToken](url, p.refreshToken, p.region, false) + req := TRequest{ + URL: "/oauth/access-token", + RefreshToken: p.refreshToken, + Region: p.region, + IsAuthenticated: false, + } + response, err := Request[AccessToken](req) if err != nil { log.Fatal(err) } @@ -148,8 +163,13 @@ func (p *SCProvider) GetAccessToken() { } func (p *SCProvider) GetTeamID() { - url := fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(p.teamName)) - response, err := Request[Team](url, p.accessToken, p.region, true) + req := TRequest{ + URL: fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(p.teamName)), + AccessToken: p.accessToken, + Region: p.region, + IsAuthenticated: true, + } + response, err := Request[Team](req) if err != nil { log.Fatal(err) } @@ -157,8 +177,13 @@ func (p *SCProvider) GetTeamID() { } func (p *SCProvider) GetServiceID() { - url := fmt.Sprintf("/v3/services/by-name?name=%s&owner_id=%s", url.QueryEscape(p.serviceName), p.teamID) - response, err := Request[Service](url, p.accessToken, p.region, true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/by-name?name=%s&owner_id=%s", url.QueryEscape(p.serviceName), p.teamID), + AccessToken: p.accessToken, + Region: p.region, + IsAuthenticated: true, + } + response, err := Request[Service](req) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 640ada6a19..41988fe3b7 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -8,6 +8,8 @@ import ( "log" "net/http" + "github.com/hasura/go-graphql-client" + "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -19,7 +21,7 @@ const ( UserAgent = "terraformer-squadcast" ) -func GetHost(region string) string { +func getHost(region string) string { switch region { case "us": return "squadcast.com" @@ -32,23 +34,38 @@ func GetHost(region string) string { } } -func Request[TRes any](url string, token string, region string, isAuthenticated bool) (*TRes, error) { +type TRequest struct { + URL string + AccessToken string + RefreshToken string + Region string + IsAuthenticated bool + IsV2 bool +} + +func Request[TRes any](request TRequest) (*TRes, error) { ctx := context.Background() var URL string var req *http.Request var err error - host := GetHost(region) - if isAuthenticated { - URL = fmt.Sprintf("https://api.%s%s", host, url) - req, err = http.NewRequestWithContext(ctx, http.MethodGet, URL, nil) - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) + host := getHost(request.Region) + if request.IsAuthenticated { + if !request.IsV2 { + URL = fmt.Sprintf("https://api.%s%s", host, request.URL) + req, err = http.NewRequestWithContext(ctx, http.MethodGet, URL, nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", request.AccessToken)) + } else { + URL = fmt.Sprintf("https://platform-backend.%s%s", host, request.URL) + req, err = http.NewRequestWithContext(ctx, http.MethodGet, URL, nil) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", request.AccessToken)) + } } else { - URL = fmt.Sprintf("https://auth.%s%s", host, url) + URL = fmt.Sprintf("https://auth.%s%s", host, request.URL) req, err = http.NewRequestWithContext(ctx, http.MethodGet, URL, nil) - req.Header.Set("X-Refresh-Token", token) + req.Header.Set("X-Refresh-Token", request.RefreshToken) } if err != nil { - log.Fatal(err) + return nil, err } req.Header.Set("User-Agent", UserAgent) @@ -58,10 +75,10 @@ func Request[TRes any](url string, token string, region string, isAuthenticated Data *TRes `json:"data"` *Meta } - if err != nil { - log.Fatal(err) + return nil, err } + defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { @@ -80,9 +97,27 @@ func Request[TRes any](url string, token string, region string, isAuthenticated } if response.Meta != nil { if response.Meta.Meta.Status >= 400 { - return nil, fmt.Errorf("Error: %s", response.Meta.Meta.Message) + return nil, fmt.Errorf("error: %s", response.Meta.Meta.Message) } } return response.Data, nil } + +var gqlClient *graphql.Client + +func GraphQLRequest[TReq any](method string, token string, region string, payload *TReq, variables map[string]interface{}) (*TReq, error) { + graphQLURL := fmt.Sprintf("https://api.%s/v3/graphql", getHost(region)) + bearerToken := fmt.Sprintf("Bearer %s", token) + + if gqlClient == nil { + gqlClient = graphql.NewClient(graphQLURL, nil).WithRequestModifier(func(req *http.Request) { + req.Header.Set("Authorization", bearerToken) + }) + } + if err := gqlClient.WithDebug(false).Query(context.Background(), payload, variables); err != nil { + return nil, err + } + + return payload, nil +} diff --git a/providers/squadcast/status_page.go b/providers/squadcast/status_page.go new file mode 100644 index 0000000000..a2cd5c2697 --- /dev/null +++ b/providers/squadcast/status_page.go @@ -0,0 +1,51 @@ +// service resource is yet to be implemented + +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type StatusPagesGenerator struct { + SCService +} + +type StatusPage struct { + ID uint `json:"id"` +} + +func (g *StatusPagesGenerator) createResources(statusPages []StatusPage) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, sp := range statusPages { + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", sp.ID), + fmt.Sprintf("status_page_%d", sp.ID), + "squadcast_status_page", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + }, + []string{}, + map[string]interface{}{}, + )) + } + return resourceList +} + +func (g *StatusPagesGenerator) InitResources() error { + req := TRequest{ + URL: fmt.Sprintf("/v4/statuspages?teamID=%s", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]StatusPage](req) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + return nil +} diff --git a/providers/squadcast/status_page_components.go b/providers/squadcast/status_page_components.go new file mode 100644 index 0000000000..11a2135afe --- /dev/null +++ b/providers/squadcast/status_page_components.go @@ -0,0 +1,64 @@ +// service resource is yet to be implemented + +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type StatusPageComponentsGenerator struct { + SCService +} + +type StatusPageComponent struct { + ID uint `json:"id"` + PageID uint `json:"pageID"` +} + +func (g *StatusPageComponentsGenerator) createResources(statusPageComponents []StatusPageComponent) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, spc := range statusPageComponents { + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", spc.ID), + fmt.Sprintf("status_page_component_%d", spc.ID), + "squadcast_status_page_component", + g.GetProviderName(), + map[string]string{ + "status_page_id": fmt.Sprintf("%d", spc.PageID), + }, + []string{}, + map[string]interface{}{}, + )) + } + return resourceList +} + +func (g *StatusPageComponentsGenerator) InitResources() error { + req := TRequest{ + URL: fmt.Sprintf("/v4/statuspages?teamID=%s", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]StatusPage](req) + if err != nil { + return err + } + for _, sp := range *response { + req := TRequest{ + URL: fmt.Sprintf("/v4/statuspages/%d/components", sp.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]StatusPageComponent](req) + if err != nil { + return err + } + + g.Resources = append(g.Resources, g.createResources(*response)...) + } + return nil +} diff --git a/providers/squadcast/status_page_groups.go b/providers/squadcast/status_page_groups.go new file mode 100644 index 0000000000..dc4a9d150a --- /dev/null +++ b/providers/squadcast/status_page_groups.go @@ -0,0 +1,64 @@ +// service resource is yet to be implemented + +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type StatusPageGroupsGenerator struct { + SCService +} + +type StatusPageGroup struct { + ID uint `json:"id"` + PageID uint `json:"pageID"` +} + +func (g *StatusPageGroupsGenerator) createResources(statusPageGroups []StatusPageGroup) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, spc := range statusPageGroups { + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", spc.ID), + fmt.Sprintf("status_page_group_%d", spc.ID), + "squadcast_status_page_group", + g.GetProviderName(), + map[string]string{ + "status_page_id": fmt.Sprintf("%d", spc.PageID), + }, + []string{}, + map[string]interface{}{}, + )) + } + return resourceList +} + +func (g *StatusPageGroupsGenerator) InitResources() error { + req := TRequest{ + URL: fmt.Sprintf("/v4/statuspages?teamID=%s", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]StatusPage](req) + if err != nil { + return err + } + for _, sp := range *response { + req := TRequest{ + URL: fmt.Sprintf("/v4/statuspages/%d/groups", sp.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]StatusPageGroup](req) + if err != nil { + return err + } + + g.Resources = append(g.Resources, g.createResources(*response)...) + } + return nil +} diff --git a/providers/squadcast/suppression_rule_v2.go b/providers/squadcast/suppression_rule_v2.go new file mode 100644 index 0000000000..aa08d88585 --- /dev/null +++ b/providers/squadcast/suppression_rule_v2.go @@ -0,0 +1,74 @@ +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type SuppressionRuleGenerator struct { + SCService +} + +func (g *SuppressionRuleGenerator) createResources(suppressionRules SuppressionRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range suppressionRules.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + fmt.Sprintf("suppression_rule_v2_%s", rule.ID), + "squadcast_suppression_rule_v2", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + "service_id": suppressionRules.ServiceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + return resourceList +} + +func (g *SuppressionRuleGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + responseService, err := Request[[]Service](req) + if err != nil { + return err + } + + for _, service := range *responseService { + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/suppression-rules", service.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[SuppressionRules](req) + if err != nil { + return err + } + + g.Resources = append(g.Resources, g.createResources(*response)...) + } + } else { + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"]), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[SuppressionRules](req) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + } + return nil +} diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index 1fd937af97..c32efd65b0 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -41,15 +41,25 @@ func (g *SuppressionRulesGenerator) createResources(suppressionRules Suppression func (g *SuppressionRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { - getServicesURL := "/v3/services" - responseService, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + responseService, err := Request[[]Service](req) if err != nil { return err } for _, service := range *responseService { - getSuppressionRulesURL := fmt.Sprintf("/v3/services/%s/suppression-rules", service.ID) - response, err := Request[SuppressionRules](getSuppressionRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/suppression-rules", service.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[SuppressionRules](req) if err != nil { return err } @@ -57,8 +67,13 @@ func (g *SuppressionRulesGenerator) InitResources() error { g.Resources = append(g.Resources, g.createResources(*response)...) } } else { - getSuppressionRulesURL := fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"]) - response, err := Request[SuppressionRules](getSuppressionRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/suppression-rules", g.Args["service_id"]), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[SuppressionRules](req) if err != nil { return err } diff --git a/providers/squadcast/tagging_rule_v2.go b/providers/squadcast/tagging_rule_v2.go new file mode 100644 index 0000000000..4f3b7977b1 --- /dev/null +++ b/providers/squadcast/tagging_rule_v2.go @@ -0,0 +1,74 @@ +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type TaggingRuleGenerator struct { + SCService +} + +func (g *TaggingRuleGenerator) createResources(taggingRule TaggingRules) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, rule := range taggingRule.Rules { + resourceList = append(resourceList, terraformutils.NewResource( + rule.ID, + fmt.Sprintf("tagging_rule_v2_%s", rule.ID), + "squadcast_tagging_rule_v2", + g.GetProviderName(), + map[string]string{ + "team_id": g.Args["team_id"].(string), + "service_id": taggingRule.ServiceID, + }, + []string{}, + map[string]interface{}{}, + )) + } + return resourceList +} + +func (g *TaggingRuleGenerator) InitResources() error { + if len(g.Args["service_name"].(string)) == 0 { + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + responseService, err := Request[[]Service](req) + if err != nil { + return err + } + + for _, service := range *responseService { + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/tagging-rules", service.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[TaggingRules](req) + if err != nil { + return err + } + + g.Resources = append(g.Resources, g.createResources(*response)...) + } + } else { + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"]), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[TaggingRules](req) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + } + return nil +} diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index 22957ef2c3..aa5bea6c20 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -41,15 +41,25 @@ func (g *TaggingRulesGenerator) createResources(taggingRule TaggingRules) []terr func (g *TaggingRulesGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { - getServicesURL := "/v3/services" - responseService, err := Request[[]Service](getServicesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: "/v3/services", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + responseService, err := Request[[]Service](req) if err != nil { return err } for _, service := range *responseService { - getTaggingRulesURL := fmt.Sprintf("/v3/services/%s/tagging-rules", service.ID) - response, err := Request[TaggingRules](getTaggingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/tagging-rules", service.ID), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[TaggingRules](req) if err != nil { return err } @@ -57,8 +67,13 @@ func (g *TaggingRulesGenerator) InitResources() error { g.Resources = append(g.Resources, g.createResources(*response)...) } } else { - getTaggingRulesURL := fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"]) - response, err := Request[TaggingRules](getTaggingRulesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/services/%s/tagging-rules", g.Args["service_id"]), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[TaggingRules](req) if err != nil { return err } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index be1728da74..ca23f906ad 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -32,8 +32,13 @@ func (g *TeamGenerator) createResources(teams []Team) []terraformutils.Resource } func (g *TeamGenerator) InitResources() error { - getTeamsURL := "/v3/teams" - response, err := Request[[]Team](getTeamsURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: "/v3/teams", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]Team](req) if err != nil { return err } diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index af5e42cb30..088610522b 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -34,8 +34,14 @@ func (g *TeamMemberGenerator) createResources(team Team) []terraformutils.Resour } func (g *TeamMemberGenerator) InitResources() error { - getTeamURL := fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string))) - response, err := Request[Team](getTeamURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/teams/by-name?name=%s", url.QueryEscape(g.Args["team_name"].(string))), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + + response, err := Request[Team](req) if err != nil { return err } diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index 166b73e492..ec9f47a942 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -34,8 +34,13 @@ func (g *TeamRolesGenerator) createResources(teamRoles []TeamRole) []terraformut } func (g *TeamRolesGenerator) InitResources() error { - getTeamRolesURL := fmt.Sprintf("/v3/teams/%s/roles", g.Args["team_id"].(string)) - response, err := Request[[]TeamRole](getTeamRolesURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: fmt.Sprintf("/v3/teams/%s/roles", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]TeamRole](req) if err != nil { return err } diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 52a842de1a..2b77b06f9d 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -29,8 +29,13 @@ func (g *UserGenerator) createResources(users []User) []terraformutils.Resource } func (g *UserGenerator) InitResources() error { - getUsersURL := "/v3/users" - response, err := Request[[]User](getUsersURL, g.Args["access_token"].(string), g.Args["region"].(string), true) + req := TRequest{ + URL: "/v3/users", + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]User](req) if err != nil { return err } diff --git a/providers/squadcast/webform.go b/providers/squadcast/webform.go new file mode 100644 index 0000000000..86f73c472c --- /dev/null +++ b/providers/squadcast/webform.go @@ -0,0 +1,45 @@ +package squadcast + +import ( + "fmt" + + "github.com/GoogleCloudPlatform/terraformer/terraformutils" +) + +type WebformsGenerator struct { + SCService +} + +type Webform struct { + ID uint `json:"id"` +} + +func (g *WebformsGenerator) createResources(webforms []Webform) []terraformutils.Resource { + var resourceList []terraformutils.Resource + for _, webform := range webforms { + resourceList = append(resourceList, terraformutils.NewSimpleResource( + fmt.Sprintf("%d", webform.ID), + fmt.Sprintf("webform_%d", webform.ID), + "squadcast_webform", + g.GetProviderName(), + []string{}, + )) + } + return resourceList +} + +func (g *WebformsGenerator) InitResources() error { + req := TRequest{ + URL: fmt.Sprintf("/v3/webforms?owner_id=%s", g.Args["team_id"].(string)), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, err := Request[[]Webform](req) + if err != nil { + return err + } + + g.Resources = g.createResources(*response) + return nil +} From c1aee7bf25792e8ddf1a1c7fe2fbf6a53f32707f Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Wed, 15 May 2024 12:12:56 +0530 Subject: [PATCH 71/73] minor change --- providers/squadcast/global_event_rules.go | 14 +++----------- providers/squadcast/schedules_v2.go | 3 +-- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/providers/squadcast/global_event_rules.go b/providers/squadcast/global_event_rules.go index 0b94eda140..c2ca80709b 100644 --- a/providers/squadcast/global_event_rules.go +++ b/providers/squadcast/global_event_rules.go @@ -118,17 +118,9 @@ func (g *GlobalEventRulesGenerator) InitResources() error { } type AlertSource struct { - ID string `json:"_id"` - Type string `json:"type"` - Heading string `json:"heading"` - SupportDocURL string `json:"supportDoc"` - DisplayKeyOnly bool `json:"displayKeyOnly"` - ShortName string `json:"shortName"` - Version string `json:"version"` - - IsValid bool `json:"isValid"` - IsPrivate bool `json:"isPrivate"` - IsDeprecated bool `json:"deprecated"` + Type string `json:"type"` + ShortName string `json:"shortName"` + Version string `json:"version"` } func (g *GlobalEventRulesGenerator) getAlertSources() (map[string]string, error) { diff --git a/providers/squadcast/schedules_v2.go b/providers/squadcast/schedules_v2.go index 907d2b534c..e474d06968 100644 --- a/providers/squadcast/schedules_v2.go +++ b/providers/squadcast/schedules_v2.go @@ -39,8 +39,7 @@ func (g *SchedulesGenerator) createResources(schedules []*Schedule) []terraformu []string{}, map[string]interface{}{}, )) - } - for _, sch := range schedules { + for _, rot := range sch.Rotations { resourceList = append(resourceList, terraformutils.NewResource( fmt.Sprintf("%d", rot.ID), From 2603fb6a2cca936c9db7c3e93b92a8ee0496cb55 Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Wed, 15 May 2024 16:15:16 +0530 Subject: [PATCH 72/73] implement pagination --- providers/squadcast/deduplication_rules.go | 6 +- providers/squadcast/deduplocation_rules_v2.go | 6 +- providers/squadcast/escalation_policy.go | 2 +- providers/squadcast/global_event_rules.go | 61 +++++++++++++------ providers/squadcast/routing_rules.go | 6 +- providers/squadcast/routing_rules_v2.go | 6 +- providers/squadcast/runbook.go | 2 +- providers/squadcast/service.go | 2 +- providers/squadcast/slo.go | 2 +- providers/squadcast/squad.go | 2 +- providers/squadcast/squadcast_provider.go | 11 ++-- providers/squadcast/squadcast_service.go | 16 ++--- providers/squadcast/status_page.go | 30 ++++++--- providers/squadcast/status_page_components.go | 4 +- providers/squadcast/status_page_groups.go | 4 +- providers/squadcast/suppression_rule_v2.go | 6 +- providers/squadcast/suppression_rules.go | 6 +- providers/squadcast/tagging_rule_v2.go | 6 +- providers/squadcast/tagging_rules.go | 6 +- providers/squadcast/team.go | 2 +- providers/squadcast/team_member.go | 2 +- providers/squadcast/team_roles.go | 2 +- providers/squadcast/user.go | 2 +- providers/squadcast/webform.go | 2 +- 24 files changed, 116 insertions(+), 78 deletions(-) diff --git a/providers/squadcast/deduplication_rules.go b/providers/squadcast/deduplication_rules.go index a6e3ee86bb..0eeb239c00 100644 --- a/providers/squadcast/deduplication_rules.go +++ b/providers/squadcast/deduplication_rules.go @@ -47,7 +47,7 @@ func (g *DeduplicationRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - responseService, err := Request[[]Service](req) + responseService, _, err := Request[[]Service](req) if err != nil { return err } @@ -59,7 +59,7 @@ func (g *DeduplicationRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[DeduplicationRules](req) + response, _, err := Request[DeduplicationRules](req) if err != nil { return err } @@ -73,7 +73,7 @@ func (g *DeduplicationRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[DeduplicationRules](req) + response, _, err := Request[DeduplicationRules](req) if err != nil { return err } diff --git a/providers/squadcast/deduplocation_rules_v2.go b/providers/squadcast/deduplocation_rules_v2.go index 4f514f74d9..fd38f19c6c 100644 --- a/providers/squadcast/deduplocation_rules_v2.go +++ b/providers/squadcast/deduplocation_rules_v2.go @@ -37,7 +37,7 @@ func (g *DeduplicationRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - responseService, err := Request[[]Service](req) + responseService, _, err := Request[[]Service](req) if err != nil { return err } @@ -49,7 +49,7 @@ func (g *DeduplicationRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[DeduplicationRules](req) + response, _, err := Request[DeduplicationRules](req) if err != nil { return err } @@ -63,7 +63,7 @@ func (g *DeduplicationRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[DeduplicationRules](req) + response, _, err := Request[DeduplicationRules](req) if err != nil { return err } diff --git a/providers/squadcast/escalation_policy.go b/providers/squadcast/escalation_policy.go index 157ac91694..55a62d7475 100644 --- a/providers/squadcast/escalation_policy.go +++ b/providers/squadcast/escalation_policy.go @@ -41,7 +41,7 @@ func (g *EscalationPolicyGenerator) InitResources() error { IsAuthenticated: true, } - response, err := Request[[]EscalationPolicy](req) + response, _, err := Request[[]EscalationPolicy](req) if err != nil { return err } diff --git a/providers/squadcast/global_event_rules.go b/providers/squadcast/global_event_rules.go index c2ca80709b..9d6c79aa05 100644 --- a/providers/squadcast/global_event_rules.go +++ b/providers/squadcast/global_event_rules.go @@ -77,43 +77,70 @@ func (g *GlobalEventRulesGenerator) createResources(ger []GER) []terraformutils. []string{}, map[string]interface{}{}, )) + } + resourceList = append(resourceList, terraformutils.NewResource( + fmt.Sprintf("%d", rs.ID), + fmt.Sprintf("ger_ruleset_rules_ordering_%d", rs.ID), + "squadcast_ger_ruleset_rules_ordering", + g.GetProviderName(), + map[string]string{ + "ger_id": fmt.Sprintf("%d", rule.ID), + "alert_source": alertSourcesMap[rs.AlertSourceShortName], + "alert_source_shortname": rs.AlertSourceShortName, + "alert_source_version": rs.AlertSourceVersion, + }, + []string{}, + map[string]interface{}{}, + )) } } return resourceList } func (g *GlobalEventRulesGenerator) InitResources() error { - req := TRequest{ - URL: fmt.Sprintf("/v3/global-event-rules?owner_id=%s", g.Args["team_id"].(string)), - AccessToken: g.Args["access_token"].(string), - Region: g.Args["region"].(string), - IsAuthenticated: true, - } - response, err := Request[[]GER](req) - if err != nil { - return err - } + var allRules []GER + page := 1 + pageSize := 100 - ger := *response + for { + req := TRequest{ + URL: fmt.Sprintf("/v3/global-event-rules?owner_id=%s&page_number=%d&page_size=%d", g.Args["team_id"].(string), page, pageSize), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + + response, meta, err := Request[[]GER](req) + if err != nil { + return err + } + + allRules = append(allRules, *response...) + if page*pageSize >= meta.TotalCount { + break + } + + page++ + } - for i, rule := range ger { + for i, rule := range allRules { for j, rs := range rule.Rulesets { req := TRequest{ - URL: fmt.Sprintf("/v3/global-event-rules/%d/rulesets/%s/%s/rules", rule.ID, rs.AlertSourceVersion, rs.AlertSourceShortName), + URL: fmt.Sprintf("/v3/global-event-rules/%d/rulesets/%s/%s/rules?page_number=1&page_size=100", rule.ID, rs.AlertSourceVersion, rs.AlertSourceShortName), AccessToken: g.Args["access_token"].(string), Region: g.Args["region"].(string), IsAuthenticated: true, } - resp, err := Request[[]GER_Ruleset_Rules](req) + resp, _, err := Request[[]GER_Ruleset_Rules](req) if err != nil { return err } - ger[i].Rulesets[j].Rules = *resp + allRules[i].Rulesets[j].Rules = *resp } } - g.Resources = g.createResources(*response) + g.Resources = g.createResources(allRules) return nil } @@ -132,7 +159,7 @@ func (g *GlobalEventRulesGenerator) getAlertSources() (map[string]string, error) IsAuthenticated: true, IsV2: true, } - alertSources, err := Request[[]AlertSource](req) + alertSources, _, err := Request[[]AlertSource](req) if err != nil { return nil, err } diff --git a/providers/squadcast/routing_rules.go b/providers/squadcast/routing_rules.go index 4412de2d05..8ac4f6dd18 100644 --- a/providers/squadcast/routing_rules.go +++ b/providers/squadcast/routing_rules.go @@ -47,7 +47,7 @@ func (g *RoutingRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - responseService, err := Request[[]Service](req) + responseService, _, err := Request[[]Service](req) if err != nil { return err } @@ -59,7 +59,7 @@ func (g *RoutingRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[RoutingRules](req) + response, _, err := Request[RoutingRules](req) if err != nil { return err } @@ -73,7 +73,7 @@ func (g *RoutingRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[RoutingRules](req) + response, _, err := Request[RoutingRules](req) if err != nil { return err } diff --git a/providers/squadcast/routing_rules_v2.go b/providers/squadcast/routing_rules_v2.go index 78cf3675a9..eb9964c6d5 100644 --- a/providers/squadcast/routing_rules_v2.go +++ b/providers/squadcast/routing_rules_v2.go @@ -37,7 +37,7 @@ func (g *RoutingRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - responseService, err := Request[[]Service](req) + responseService, _, err := Request[[]Service](req) if err != nil { return err } @@ -49,7 +49,7 @@ func (g *RoutingRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[RoutingRules](req) + response, _, err := Request[RoutingRules](req) if err != nil { return err } @@ -63,7 +63,7 @@ func (g *RoutingRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[RoutingRules](req) + response, _, err := Request[RoutingRules](req) if err != nil { return err } diff --git a/providers/squadcast/runbook.go b/providers/squadcast/runbook.go index 67a63f65b3..ab68d9eb1e 100644 --- a/providers/squadcast/runbook.go +++ b/providers/squadcast/runbook.go @@ -42,7 +42,7 @@ func (g *RunbookGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]Runbook](req) + response, _, err := Request[[]Runbook](req) if err != nil { return err } diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index ef80cf30a8..4bb31276dc 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -42,7 +42,7 @@ func (g *ServiceGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]Service](req) + response, _, err := Request[[]Service](req) if err != nil { return err } diff --git a/providers/squadcast/slo.go b/providers/squadcast/slo.go index fb4c81b8c0..c67b6a578c 100644 --- a/providers/squadcast/slo.go +++ b/providers/squadcast/slo.go @@ -46,7 +46,7 @@ func (g *SLOGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[getSLOsResponse](req) + response, _, err := Request[getSLOsResponse](req) if err != nil { return err } diff --git a/providers/squadcast/squad.go b/providers/squadcast/squad.go index 1b6f5cbf48..6cdf5059e8 100644 --- a/providers/squadcast/squad.go +++ b/providers/squadcast/squad.go @@ -41,7 +41,7 @@ func (g *SquadGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]Squad](req) + response, _, err := Request[[]Squad](req) if err != nil { return err } diff --git a/providers/squadcast/squadcast_provider.go b/providers/squadcast/squadcast_provider.go index 2001f7fde9..a6e27d8d2e 100644 --- a/providers/squadcast/squadcast_provider.go +++ b/providers/squadcast/squadcast_provider.go @@ -29,7 +29,9 @@ type AccessToken struct { // Meta holds the status of the request information type Meta struct { - Meta AppError `json:"meta,omitempty"` + Meta AppError `json:"meta,omitempty"` + TotalCount int `json:"total_count"` + TotalPages int `json:"totalCount"` } type AppError struct { @@ -38,7 +40,6 @@ type AppError struct { } func (p *SCProvider) Init(args []string) error { - if refreshToken := os.Getenv("SQUADCAST_REFRESH_TOKEN"); refreshToken != "" { p.refreshToken = os.Getenv("SQUADCAST_REFRESH_TOKEN") } @@ -155,7 +156,7 @@ func (p *SCProvider) GetAccessToken() { Region: p.region, IsAuthenticated: false, } - response, err := Request[AccessToken](req) + response, _, err := Request[AccessToken](req) if err != nil { log.Fatal(err) } @@ -169,7 +170,7 @@ func (p *SCProvider) GetTeamID() { Region: p.region, IsAuthenticated: true, } - response, err := Request[Team](req) + response, _, err := Request[Team](req) if err != nil { log.Fatal(err) } @@ -183,7 +184,7 @@ func (p *SCProvider) GetServiceID() { Region: p.region, IsAuthenticated: true, } - response, err := Request[Service](req) + response, _, err := Request[Service](req) if err != nil { log.Fatal(err) } diff --git a/providers/squadcast/squadcast_service.go b/providers/squadcast/squadcast_service.go index 41988fe3b7..2fef0e30b5 100644 --- a/providers/squadcast/squadcast_service.go +++ b/providers/squadcast/squadcast_service.go @@ -43,7 +43,7 @@ type TRequest struct { IsV2 bool } -func Request[TRes any](request TRequest) (*TRes, error) { +func Request[TRes any](request TRequest) (*TRes, *Meta, error) { ctx := context.Background() var URL string var req *http.Request @@ -65,7 +65,7 @@ func Request[TRes any](request TRequest) (*TRes, error) { req.Header.Set("X-Refresh-Token", request.RefreshToken) } if err != nil { - return nil, err + return nil, nil, err } req.Header.Set("User-Agent", UserAgent) @@ -73,10 +73,10 @@ func Request[TRes any](request TRequest) (*TRes, error) { var response struct { Data *TRes `json:"data"` - *Meta + Meta *Meta `json:"meta"` } if err != nil { - return nil, err + return nil, nil, err } defer func(Body io.ReadCloser) { @@ -88,20 +88,20 @@ func Request[TRes any](request TRequest) (*TRes, error) { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, err + return nil, nil, err } err = json.Unmarshal(body, &response) if err != nil { - return nil, err + return nil, nil, err } if response.Meta != nil { if response.Meta.Meta.Status >= 400 { - return nil, fmt.Errorf("error: %s", response.Meta.Meta.Message) + return nil, nil, fmt.Errorf("error: %s", response.Meta.Meta.Message) } } - return response.Data, nil + return response.Data, response.Meta, nil } var gqlClient *graphql.Client diff --git a/providers/squadcast/status_page.go b/providers/squadcast/status_page.go index a2cd5c2697..543c06e74d 100644 --- a/providers/squadcast/status_page.go +++ b/providers/squadcast/status_page.go @@ -35,17 +35,27 @@ func (g *StatusPagesGenerator) createResources(statusPages []StatusPage) []terra } func (g *StatusPagesGenerator) InitResources() error { - req := TRequest{ - URL: fmt.Sprintf("/v4/statuspages?teamID=%s", g.Args["team_id"].(string)), - AccessToken: g.Args["access_token"].(string), - Region: g.Args["region"].(string), - IsAuthenticated: true, - } - response, err := Request[[]StatusPage](req) - if err != nil { - return err + var allStatusPages []StatusPage + page := 1 + pageSize := 100 + for { + req := TRequest{ + URL: fmt.Sprintf("/v4/statuspages?teamID=%s&pageNumber=%d&pageSize=%d", g.Args["team_id"].(string), page, pageSize), + AccessToken: g.Args["access_token"].(string), + Region: g.Args["region"].(string), + IsAuthenticated: true, + } + response, meta, err := Request[[]StatusPage](req) + if err != nil { + return err + } + allStatusPages = append(allStatusPages, *response...) + if page*pageSize >= meta.TotalPages { + break + } + page++ } - g.Resources = g.createResources(*response) + g.Resources = g.createResources(allStatusPages) return nil } diff --git a/providers/squadcast/status_page_components.go b/providers/squadcast/status_page_components.go index 11a2135afe..b8b2d24571 100644 --- a/providers/squadcast/status_page_components.go +++ b/providers/squadcast/status_page_components.go @@ -42,7 +42,7 @@ func (g *StatusPageComponentsGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]StatusPage](req) + response, _, err := Request[[]StatusPage](req) if err != nil { return err } @@ -53,7 +53,7 @@ func (g *StatusPageComponentsGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]StatusPageComponent](req) + response, _, err := Request[[]StatusPageComponent](req) if err != nil { return err } diff --git a/providers/squadcast/status_page_groups.go b/providers/squadcast/status_page_groups.go index dc4a9d150a..d35fa1bcbb 100644 --- a/providers/squadcast/status_page_groups.go +++ b/providers/squadcast/status_page_groups.go @@ -42,7 +42,7 @@ func (g *StatusPageGroupsGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]StatusPage](req) + response, _, err := Request[[]StatusPage](req) if err != nil { return err } @@ -53,7 +53,7 @@ func (g *StatusPageGroupsGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]StatusPageGroup](req) + response, _, err := Request[[]StatusPageGroup](req) if err != nil { return err } diff --git a/providers/squadcast/suppression_rule_v2.go b/providers/squadcast/suppression_rule_v2.go index aa08d88585..279850077a 100644 --- a/providers/squadcast/suppression_rule_v2.go +++ b/providers/squadcast/suppression_rule_v2.go @@ -37,7 +37,7 @@ func (g *SuppressionRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - responseService, err := Request[[]Service](req) + responseService, _, err := Request[[]Service](req) if err != nil { return err } @@ -49,7 +49,7 @@ func (g *SuppressionRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[SuppressionRules](req) + response, _, err := Request[SuppressionRules](req) if err != nil { return err } @@ -63,7 +63,7 @@ func (g *SuppressionRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[SuppressionRules](req) + response, _, err := Request[SuppressionRules](req) if err != nil { return err } diff --git a/providers/squadcast/suppression_rules.go b/providers/squadcast/suppression_rules.go index c32efd65b0..ea3021e159 100644 --- a/providers/squadcast/suppression_rules.go +++ b/providers/squadcast/suppression_rules.go @@ -47,7 +47,7 @@ func (g *SuppressionRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - responseService, err := Request[[]Service](req) + responseService, _, err := Request[[]Service](req) if err != nil { return err } @@ -59,7 +59,7 @@ func (g *SuppressionRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[SuppressionRules](req) + response, _, err := Request[SuppressionRules](req) if err != nil { return err } @@ -73,7 +73,7 @@ func (g *SuppressionRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[SuppressionRules](req) + response, _, err := Request[SuppressionRules](req) if err != nil { return err } diff --git a/providers/squadcast/tagging_rule_v2.go b/providers/squadcast/tagging_rule_v2.go index 4f3b7977b1..aee7a72dad 100644 --- a/providers/squadcast/tagging_rule_v2.go +++ b/providers/squadcast/tagging_rule_v2.go @@ -37,7 +37,7 @@ func (g *TaggingRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - responseService, err := Request[[]Service](req) + responseService, _, err := Request[[]Service](req) if err != nil { return err } @@ -49,7 +49,7 @@ func (g *TaggingRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[TaggingRules](req) + response, _, err := Request[TaggingRules](req) if err != nil { return err } @@ -63,7 +63,7 @@ func (g *TaggingRuleGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[TaggingRules](req) + response, _, err := Request[TaggingRules](req) if err != nil { return err } diff --git a/providers/squadcast/tagging_rules.go b/providers/squadcast/tagging_rules.go index aa5bea6c20..9413d2442c 100644 --- a/providers/squadcast/tagging_rules.go +++ b/providers/squadcast/tagging_rules.go @@ -47,7 +47,7 @@ func (g *TaggingRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - responseService, err := Request[[]Service](req) + responseService, _, err := Request[[]Service](req) if err != nil { return err } @@ -59,7 +59,7 @@ func (g *TaggingRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[TaggingRules](req) + response, _, err := Request[TaggingRules](req) if err != nil { return err } @@ -73,7 +73,7 @@ func (g *TaggingRulesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[TaggingRules](req) + response, _, err := Request[TaggingRules](req) if err != nil { return err } diff --git a/providers/squadcast/team.go b/providers/squadcast/team.go index ca23f906ad..ceb8f349ac 100644 --- a/providers/squadcast/team.go +++ b/providers/squadcast/team.go @@ -38,7 +38,7 @@ func (g *TeamGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]Team](req) + response, _, err := Request[[]Team](req) if err != nil { return err } diff --git a/providers/squadcast/team_member.go b/providers/squadcast/team_member.go index 088610522b..a26ef4ba07 100644 --- a/providers/squadcast/team_member.go +++ b/providers/squadcast/team_member.go @@ -41,7 +41,7 @@ func (g *TeamMemberGenerator) InitResources() error { IsAuthenticated: true, } - response, err := Request[Team](req) + response, _, err := Request[Team](req) if err != nil { return err } diff --git a/providers/squadcast/team_roles.go b/providers/squadcast/team_roles.go index ec9f47a942..1660bef65a 100644 --- a/providers/squadcast/team_roles.go +++ b/providers/squadcast/team_roles.go @@ -40,7 +40,7 @@ func (g *TeamRolesGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]TeamRole](req) + response, _, err := Request[[]TeamRole](req) if err != nil { return err } diff --git a/providers/squadcast/user.go b/providers/squadcast/user.go index 2b77b06f9d..f6e337ab13 100644 --- a/providers/squadcast/user.go +++ b/providers/squadcast/user.go @@ -35,7 +35,7 @@ func (g *UserGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]User](req) + response, _, err := Request[[]User](req) if err != nil { return err } diff --git a/providers/squadcast/webform.go b/providers/squadcast/webform.go index 86f73c472c..9f5ba7449f 100644 --- a/providers/squadcast/webform.go +++ b/providers/squadcast/webform.go @@ -35,7 +35,7 @@ func (g *WebformsGenerator) InitResources() error { Region: g.Args["region"].(string), IsAuthenticated: true, } - response, err := Request[[]Webform](req) + response, _, err := Request[[]Webform](req) if err != nil { return err } From 2433691d74ce2f53f6b5a7c2e8612347e2c621af Mon Sep 17 00:00:00 2001 From: Mohammad Muazam Date: Fri, 17 May 2024 15:56:24 +0530 Subject: [PATCH 73/73] update services url --- providers/squadcast/deduplocation_rules_v2.go | 7 ++++++- providers/squadcast/routing_rules_v2.go | 7 ++++++- providers/squadcast/service.go | 7 ++++++- providers/squadcast/suppression_rule_v2.go | 7 ++++++- providers/squadcast/tagging_rule_v2.go | 7 ++++++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/providers/squadcast/deduplocation_rules_v2.go b/providers/squadcast/deduplocation_rules_v2.go index fd38f19c6c..4e832e366a 100644 --- a/providers/squadcast/deduplocation_rules_v2.go +++ b/providers/squadcast/deduplocation_rules_v2.go @@ -2,6 +2,7 @@ package squadcast import ( "fmt" + "strings" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -31,8 +32,12 @@ func (g *DeduplicationRuleGenerator) createResources(deduplicationRulesV2 Dedupl func (g *DeduplicationRuleGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { + getServicesURL := "/v3/services" + if strings.TrimSpace(g.Args["team_id"].(string)) != "" { + getServicesURL = fmt.Sprintf("/v3/services?owner_id=%s", g.Args["team_id"].(string)) + } req := TRequest{ - URL: "/v3/services", + URL: getServicesURL, AccessToken: g.Args["access_token"].(string), Region: g.Args["region"].(string), IsAuthenticated: true, diff --git a/providers/squadcast/routing_rules_v2.go b/providers/squadcast/routing_rules_v2.go index eb9964c6d5..74989af272 100644 --- a/providers/squadcast/routing_rules_v2.go +++ b/providers/squadcast/routing_rules_v2.go @@ -2,6 +2,7 @@ package squadcast import ( "fmt" + "strings" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -31,8 +32,12 @@ func (g *RoutingRuleGenerator) createResources(routingRules RoutingRules) []terr func (g *RoutingRuleGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { + getServicesURL := "/v3/services" + if strings.TrimSpace(g.Args["team_id"].(string)) != "" { + getServicesURL = fmt.Sprintf("/v3/services?owner_id=%s", g.Args["team_id"].(string)) + } req := TRequest{ - URL: "/v3/services", + URL: getServicesURL, AccessToken: g.Args["access_token"].(string), Region: g.Args["region"].(string), IsAuthenticated: true, diff --git a/providers/squadcast/service.go b/providers/squadcast/service.go index 4bb31276dc..de5cbdfb48 100644 --- a/providers/squadcast/service.go +++ b/providers/squadcast/service.go @@ -4,6 +4,7 @@ package squadcast import ( "fmt" + "strings" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -36,8 +37,12 @@ func (g *ServiceGenerator) createResources(services []Service) []terraformutils. } func (g *ServiceGenerator) InitResources() error { + getServicesURL := "/v3/services" + if strings.TrimSpace(g.Args["team_id"].(string)) != "" { + getServicesURL = fmt.Sprintf("/v3/services?owner_id=%s", g.Args["team_id"].(string)) + } req := TRequest{ - URL: "/v3/services", + URL: getServicesURL, AccessToken: g.Args["access_token"].(string), Region: g.Args["region"].(string), IsAuthenticated: true, diff --git a/providers/squadcast/suppression_rule_v2.go b/providers/squadcast/suppression_rule_v2.go index 279850077a..59519150d8 100644 --- a/providers/squadcast/suppression_rule_v2.go +++ b/providers/squadcast/suppression_rule_v2.go @@ -2,6 +2,7 @@ package squadcast import ( "fmt" + "strings" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -31,8 +32,12 @@ func (g *SuppressionRuleGenerator) createResources(suppressionRules SuppressionR func (g *SuppressionRuleGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { + getServicesURL := "/v3/services" + if strings.TrimSpace(g.Args["team_id"].(string)) != "" { + getServicesURL = fmt.Sprintf("/v3/services?owner_id=%s", g.Args["team_id"].(string)) + } req := TRequest{ - URL: "/v3/services", + URL: getServicesURL, AccessToken: g.Args["access_token"].(string), Region: g.Args["region"].(string), IsAuthenticated: true, diff --git a/providers/squadcast/tagging_rule_v2.go b/providers/squadcast/tagging_rule_v2.go index aee7a72dad..c653927b72 100644 --- a/providers/squadcast/tagging_rule_v2.go +++ b/providers/squadcast/tagging_rule_v2.go @@ -2,6 +2,7 @@ package squadcast import ( "fmt" + "strings" "github.com/GoogleCloudPlatform/terraformer/terraformutils" ) @@ -31,8 +32,12 @@ func (g *TaggingRuleGenerator) createResources(taggingRule TaggingRules) []terra func (g *TaggingRuleGenerator) InitResources() error { if len(g.Args["service_name"].(string)) == 0 { + getServicesURL := "/v3/services" + if strings.TrimSpace(g.Args["team_id"].(string)) != "" { + getServicesURL = fmt.Sprintf("/v3/services?owner_id=%s", g.Args["team_id"].(string)) + } req := TRequest{ - URL: "/v3/services", + URL: getServicesURL, AccessToken: g.Args["access_token"].(string), Region: g.Args["region"].(string), IsAuthenticated: true,