diff --git a/examples/regionalized_list_versions.go b/examples/regionalized_list_versions.go new file mode 100644 index 00000000..75534bfc --- /dev/null +++ b/examples/regionalized_list_versions.go @@ -0,0 +1,82 @@ +/* +Copyright (c) 2023 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// This example shows how to retrieve the collection of clusters from a specific OCM region + +package main + +import ( + "context" + "fmt" + "os" + + sdk "github.com/openshift-online/ocm-sdk-go" + cmv1 "github.com/openshift-online/ocm-sdk-go/clustersmgmt/v1" + "github.com/openshift-online/ocm-sdk-go/logging" +) + +func main() { + // Create a context: + ctx := context.Background() + + // Create a logger that has the debug level enabled: + logger, err := logging.NewGoLoggerBuilder(). + Debug(true). + Build() + if err != nil { + fmt.Fprintf(os.Stderr, "Can't build logger: %v\n", err) + os.Exit(1) + } + + regValue, err := sdk.GetRhRegion("https://api.stage.openshift.com", "rh-singapore") + if err != nil { + fmt.Fprintf(os.Stderr, "Can't find region: %v", err) + os.Exit(1) + } + token := os.Getenv("OCM_TOKEN") + + // Build a regionalized connection based on the desired shard + connection, err := sdk.NewConnectionBuilder(). + Logger(logger). + Tokens(token). + URL(fmt.Sprintf("https://%s", regValue.URL)). // Apply the region URL + BuildContext(ctx) + if err != nil { + fmt.Fprintf(os.Stderr, "Can't build connection: %v\n", err) + os.Exit(1) + } + defer connection.Close() + + // Get the client for the resource that manages the collection of clusters: + collection := connection.ClustersMgmt().V1().Versions() + + // Retrieve the list of clusters using pages of ten items, till we get a page that has less + // items than requests, as that marks the end of the collection: + // Retrieve the page: + response, err := collection.List(). + SendContext(ctx) + if err != nil { + fmt.Fprintf(os.Stderr, "Can't retrieve versions : %s\n", err) + os.Exit(1) + } + + // Display the page: + response.Items().Each(func(version *cmv1.Version) bool { + fmt.Printf("%s\n", version.ID()) + return true + }) + +} diff --git a/rh_region.go b/rh_region.go new file mode 100644 index 00000000..a72b0919 --- /dev/null +++ b/rh_region.go @@ -0,0 +1,60 @@ +package sdk + +import ( + json2 "encoding/json" + "fmt" + "net/http" + "net/url" + "strings" +) + +type Region struct { + URL string + AWS []string + GCP []string +} + +func GetRhRegions(ocmServiceUrl string) (map[string]Region, error) { + var regions map[string]Region + url, err := DetermineRegionDiscoveryUrl(ocmServiceUrl) + if err != nil { + return regions, fmt.Errorf("Can't determine region discovery URL: %s\n", err) + } + // Adding nolint here in order to prevent linter from failing due to variable http get + resp, err := http.Get(url) //nolint + if err != nil { + return regions, fmt.Errorf("Can't retrieve shards: %s", err) + } + err = json2.NewDecoder(resp.Body).Decode(®ions) + if err != nil { + return regions, fmt.Errorf("Can't decode shards: %s", err) + } + return regions, nil +} + +func GetRhRegion(ocmServiceUrl string, regionName string) (Region, error) { + regions, err := GetRhRegions(ocmServiceUrl) + if err != nil { + return Region{}, err + } + for regName, regValue := range regions { + if regName == regionName { + return regValue, nil + } + } + return Region{}, fmt.Errorf("Can't find region %s", regionName) +} + +func DetermineRegionDiscoveryUrl(ocmServiceUrl string) (string, error) { + baseUrl, err := url.Parse(ocmServiceUrl) + if err != nil { + return "", err + } + regionDiscoveryHost := "api.openshift.com" + if strings.HasSuffix(baseUrl.Hostname(), "integration.openshift.com") { + regionDiscoveryHost = "api.integration.openshift.com" + } else if strings.HasSuffix(baseUrl.Hostname(), "stage.openshift.com") { + regionDiscoveryHost = "api.stage.openshift.com" + } + return fmt.Sprintf("https://%s/static/ocm-shards.json", regionDiscoveryHost), nil +}