Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🧹 Allow to override the API endpoint #12

Merged
merged 2 commits into from
Dec 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
30 changes: 28 additions & 2 deletions gen/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"io"
"log"
"net/http"
"net/url"
"os"
"path/filepath"
"sort"
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
}
23 changes: 23 additions & 0 deletions gen/gen_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Loading