From 6e2174ca0d6b971448ed5d2a9cc4543f4a2aab21 Mon Sep 17 00:00:00 2001 From: tithakka Date: Mon, 18 Dec 2023 15:32:54 -0500 Subject: [PATCH 1/7] Add regions support from ocm shards --- examples/regionalized_list_versions.go | 83 ++++++++++++++++++++++++++ rh_region.go | 61 +++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 examples/regionalized_list_versions.go create mode 100644 rh_region.go diff --git a/examples/regionalized_list_versions.go b/examples/regionalized_list_versions.go new file mode 100644 index 000000000..7a0c6f85c --- /dev/null +++ b/examples/regionalized_list_versions.go @@ -0,0 +1,83 @@ +/* +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) + } + + // Create the global connection + regValue, err := sdk.GetRhRegion("https://api.integration.openshift.com", "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 000000000..740a46a55 --- /dev/null +++ b/rh_region.go @@ -0,0 +1,61 @@ +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 + } + regionName = fmt.Sprintf("rh-%s", regionName) + regVal, ok := regions[regionName] + if !ok { + return Region{}, fmt.Errorf("Can't find region %s", regionName) + } + return regVal, nil +} + +func DetermineRegionDiscoveryUrl(ocmServiceUrl string) (string, error) { + baseUrl, err := url.Parse(ocmServiceUrl) + if err != nil { + return "", err + } + regionDiscoveryHost := "api.openshift.com" + //TODO: Remove the OR condition from this if statement before the MR merge + if strings.HasSuffix(baseUrl.Hostname(), "integration.openshift.com") || true { + 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 +} From f14bc6c4174fce5906e6677f78c5b0f2fcdb9939 Mon Sep 17 00:00:00 2001 From: tithakka Date: Mon, 18 Dec 2023 15:36:17 -0500 Subject: [PATCH 2/7] Removed unnecessary comment --- examples/regionalized_list_versions.go | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/regionalized_list_versions.go b/examples/regionalized_list_versions.go index 7a0c6f85c..b5a48ab1c 100644 --- a/examples/regionalized_list_versions.go +++ b/examples/regionalized_list_versions.go @@ -41,7 +41,6 @@ func main() { os.Exit(1) } - // Create the global connection regValue, err := sdk.GetRhRegion("https://api.integration.openshift.com", "singapore") if err != nil { fmt.Fprintf(os.Stderr, "Can't find region: %v", err) From 1fb7969e1251ae77e8dc798c20f152b17357404d Mon Sep 17 00:00:00 2001 From: tithakka Date: Tue, 19 Dec 2023 17:08:25 -0500 Subject: [PATCH 3/7] Added contains logic instead of the exact match for getting the region --- rh_region.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rh_region.go b/rh_region.go index 740a46a55..261b471bb 100644 --- a/rh_region.go +++ b/rh_region.go @@ -37,12 +37,12 @@ func GetRhRegion(ocmServiceUrl string, regionName string) (Region, error) { if err != nil { return Region{}, err } - regionName = fmt.Sprintf("rh-%s", regionName) - regVal, ok := regions[regionName] - if !ok { - return Region{}, fmt.Errorf("Can't find region %s", regionName) + for regName, regValue := range regions { + if strings.Contains(regName, regionName) { + return regValue, nil + } } - return regVal, nil + return Region{}, fmt.Errorf("Can't find region %s", regionName) } func DetermineRegionDiscoveryUrl(ocmServiceUrl string) (string, error) { From d085ed37c09f99d75db0438f38e4edf3b8bf4944 Mon Sep 17 00:00:00 2001 From: tithakka Date: Tue, 19 Dec 2023 17:35:25 -0500 Subject: [PATCH 4/7] Changed method to check for regionaname --- rh_region.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rh_region.go b/rh_region.go index 261b471bb..8fcc60cb0 100644 --- a/rh_region.go +++ b/rh_region.go @@ -38,7 +38,7 @@ func GetRhRegion(ocmServiceUrl string, regionName string) (Region, error) { return Region{}, err } for regName, regValue := range regions { - if strings.Contains(regName, regionName) { + if regName == regionName { return regValue, nil } } From 4674ea3b120dbfd8ee39e19fbaffbebab5822248 Mon Sep 17 00:00:00 2001 From: tithakka Date: Tue, 30 Jan 2024 10:37:41 -0800 Subject: [PATCH 5/7] Removed todo comment --- rh_region.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rh_region.go b/rh_region.go index 8fcc60cb0..a72b0919b 100644 --- a/rh_region.go +++ b/rh_region.go @@ -51,8 +51,7 @@ func DetermineRegionDiscoveryUrl(ocmServiceUrl string) (string, error) { return "", err } regionDiscoveryHost := "api.openshift.com" - //TODO: Remove the OR condition from this if statement before the MR merge - if strings.HasSuffix(baseUrl.Hostname(), "integration.openshift.com") || true { + 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" From b127190c4cadbbe687825add06cc39854b69c5e5 Mon Sep 17 00:00:00 2001 From: tithakka Date: Tue, 30 Jan 2024 11:15:32 -0800 Subject: [PATCH 6/7] Fixed example --- examples/regionalized_list_versions.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/regionalized_list_versions.go b/examples/regionalized_list_versions.go index b5a48ab1c..309396f0c 100644 --- a/examples/regionalized_list_versions.go +++ b/examples/regionalized_list_versions.go @@ -41,7 +41,7 @@ func main() { os.Exit(1) } - regValue, err := sdk.GetRhRegion("https://api.integration.openshift.com", "singapore") + regValue, err := sdk.GetRhRegion("https://api.integration.openshift.com", "rh-singapore") if err != nil { fmt.Fprintf(os.Stderr, "Can't find region: %v", err) os.Exit(1) From 955a865fcb8e65b4c1cb0ffe21b807595637fc6a Mon Sep 17 00:00:00 2001 From: tithakka Date: Wed, 31 Jan 2024 10:03:50 -0800 Subject: [PATCH 7/7] Changed environment to stage in example --- examples/regionalized_list_versions.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/regionalized_list_versions.go b/examples/regionalized_list_versions.go index 309396f0c..75534bfc0 100644 --- a/examples/regionalized_list_versions.go +++ b/examples/regionalized_list_versions.go @@ -41,7 +41,7 @@ func main() { os.Exit(1) } - regValue, err := sdk.GetRhRegion("https://api.integration.openshift.com", "rh-singapore") + 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)