diff --git a/README.md b/README.md index 34fc24e..eb55fa8 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,14 @@ make test For any requests, bug or comments, please [open an issue][issues] or [submit a pull request][pulls]. +## Development + +When developing new APIs locally, you can overwrite the API endpoint. +Specify `MONDOO_API_ENDPOINT` environment variable for the `generate` command, e.g.,: +``` +MONDOO_API_ENDPOINT=http://127.0.0.1 make generate +``` + ## Kudos This implementation is heavily inspired by the [GitHub GraphQL Go Client](https://github.com/shurcooL/githubv4). diff --git a/gen/gen.go b/gen/gen.go index edfdd63..c679185 100644 --- a/gen/gen.go +++ b/gen/gen.go @@ -13,6 +13,7 @@ import ( "io" "log" "net/http" + "net/url" "os" "path/filepath" "sort" @@ -74,7 +75,6 @@ func generateSchema(token string, basePath string) error { // loadSchema loads the GraphQL schema from the Mondoo API. func loadSchema(token string) (schema interface{}, err error) { - apiHost := "us.api.mondoo.com" introspection := ` { __schema { @@ -176,10 +176,12 @@ fragment TypeRef on __Type { } } ` + apiEndpoint, apiHost := getAPIEndpoint() + fmt.Printf("using endpoint %s\n", apiEndpoint) // do introspection query req, err := http.NewRequest( "POST", - "https://"+apiHost+"/query", + apiEndpoint, strings.NewReader(`{"query":`+strconv.Quote(introspection)+`}`), ) if err != nil { @@ -338,3 +340,27 @@ func parseTemplate(text string) *template.Template { }, }).Parse(text)) } + +func getAPIEndpoint() (string, string) { + apiHost := "us.api.mondoo.com" + apiEndpoint, err := url.JoinPath("https://", apiHost, "/query") + if err != nil { + log.Fatalf("invalid MONDOO_API_ENDPOINT: %v", err) + } + endpoint, ok := os.LookupEnv("MONDOO_API_ENDPOINT") + if ok { + if !strings.HasPrefix(endpoint, "http://") && !strings.HasPrefix(endpoint, "https://") { + endpoint = "https://" + endpoint + } + apiEndpoint, err = url.JoinPath(endpoint, "/query") + if err != nil { + log.Fatalf("invalid MONDOO_API_ENDPOINT: %v", err) + } + } + parsedUrl, err := url.Parse(apiEndpoint) + if err != nil { + log.Fatalf("invalid API url: %v", err) + } + + return apiEndpoint, parsedUrl.Host +} diff --git a/gen/gen_test.go b/gen/gen_test.go index 4119e0c..87097b2 100644 --- a/gen/gen_test.go +++ b/gen/gen_test.go @@ -18,3 +18,26 @@ func TestRun(t *testing.T) { err := generateSchema(token, "..") require.NoError(t, err) } +func TestGetAPIEndpoint(t *testing.T) { + // Test case 1: MONDOO_API_ENDPOINT not set + expectedEndpoint := "https://us.api.mondoo.com/query" + expectedHost := "us.api.mondoo.com" + actualEndpoint, actualHost := getAPIEndpoint() + require.Equal(t, expectedEndpoint, actualEndpoint, "Unexpected API endpoint") + require.Equal(t, expectedHost, actualHost, "Unexpected host") + + // Test case 2: MONDOO_API_ENDPOINT set + os.Setenv("MONDOO_API_ENDPOINT", "custom.api.endpoint") + expectedEndpoint = "https://custom.api.endpoint/query" + expectedHost = "custom.api.endpoint" + actualEndpoint, actualHost = getAPIEndpoint() + require.Equal(t, expectedEndpoint, actualEndpoint, "Unexpected API endpoint") + require.Equal(t, expectedHost, actualHost, "Unexpected host") + + os.Setenv("MONDOO_API_ENDPOINT", "http://custom.api.endpoint:1234") + expectedEndpoint = "http://custom.api.endpoint:1234/query" + expectedHost = "custom.api.endpoint:1234" + actualEndpoint, actualHost = getAPIEndpoint() + require.Equal(t, expectedEndpoint, actualEndpoint, "Unexpected API endpoint") + require.Equal(t, expectedHost, actualHost, "Unexpected host") +}