From 27b7674177c503a1dfc6c0a7c135e9dd247eb5ce Mon Sep 17 00:00:00 2001 From: Tom Weininger Date: Tue, 24 Sep 2024 08:39:38 +0000 Subject: [PATCH 1/3] Add amphora image tag configuration This configures the cloud to use the amphora image with vertical scaling optimization when using a compute flavor with multiple vCPUs. JIRA: https://issues.redhat.com/browse/OSPRH-8446 --- pkg/amphoracontrollers/flavors.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/amphoracontrollers/flavors.go b/pkg/amphoracontrollers/flavors.go index 360f6cb4..e6555bcd 100644 --- a/pkg/amphoracontrollers/flavors.go +++ b/pkg/amphoracontrollers/flavors.go @@ -45,6 +45,7 @@ type OctaviaFlavors struct { // FlavorProfileData - type FlavorProfileData struct { ComputeFlavorID string `json:"compute_flavor"` + AmpImageTag string `json:"amp_image_tag"` } var ( @@ -217,6 +218,13 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc flavorProfileData := FlavorProfileData{ ComputeFlavorID: amphoraFlavors[flavorOpts.Name].ID, } + + if amphoraFlavors[flavorOpts.Name].VCPUs == 1 { + flavorProfileData.AmpImageTag = octavia.AmphoraImageTag + } else { + flavorProfileData.AmpImageTag = octavia.AmphoraImageVertTag + } + fpDataJSON, err := json.Marshal(flavorProfileData) if err != nil { return "", err From 462aa0fd5b3644d17b2d82b7ca2179c254560aae Mon Sep 17 00:00:00 2001 From: Tom Weininger Date: Mon, 30 Sep 2024 11:49:14 +0000 Subject: [PATCH 2/3] Add some context to error object in flavors.go --- pkg/amphoracontrollers/flavors.go | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/pkg/amphoracontrollers/flavors.go b/pkg/amphoracontrollers/flavors.go index e6555bcd..147c4050 100644 --- a/pkg/amphoracontrollers/flavors.go +++ b/pkg/amphoracontrollers/flavors.go @@ -78,11 +78,11 @@ func getAmphoraFlavors(computeClient *gophercloud.ServiceClient) (map[string]com } allPages, err := computeflavors.ListDetail(computeClient, listOpts).AllPages() if err != nil { - return nil, err + return nil, fmt.Errorf("error listing compute flavors: %w", err) } allFlavors, err := computeflavors.ExtractFlavors(allPages) if err != nil { - return nil, err + return nil, fmt.Errorf("error extracting compute flavors: %w", err) } amphoraFlavors := make(map[string]computeflavors.Flavor) for _, flavor := range allFlavors { @@ -97,11 +97,11 @@ func getOctaviaFlavorProfiles(lbClient *gophercloud.ServiceClient) (map[string]f listOpts := flavorprofiles.ListOpts{} allPages, err := flavorprofiles.List(lbClient, listOpts).AllPages() if err != nil { - return nil, err + return nil, fmt.Errorf("error listing flavor profiles: %w", err) } allFlavorProfiles, err := flavorprofiles.ExtractFlavorProfiles(allPages) if err != nil { - return nil, err + return nil, fmt.Errorf("error extracting flavor profiles: %w", err) } flavorProfiles := make(map[string]flavorprofiles.FlavorProfile) for _, flavorProfile := range allFlavorProfiles { @@ -114,11 +114,11 @@ func getOctaviaFlavors(lbClient *gophercloud.ServiceClient) (map[string]flavors. listOpts := flavors.ListOpts{} allPages, err := flavors.List(lbClient, listOpts).AllPages() if err != nil { - return nil, err + return nil, fmt.Errorf("error listing flavors: %w", err) } allFlavors, err := flavors.ExtractFlavors(allPages) if err != nil { - return nil, err + return nil, fmt.Errorf("error extracting flavors: %w", err) } flavors := make(map[string]flavors.Flavor) for _, flavor := range allFlavors { @@ -130,17 +130,17 @@ func getOctaviaFlavors(lbClient *gophercloud.ServiceClient) (map[string]flavors. func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *octaviav1.OctaviaAmphoraController) (string, error) { computeClient, err := octavia.GetComputeClient(osclient) if err != nil { - return "", err + return "", fmt.Errorf("error getting compute client: %w", err) } lbClient, err := octavia.GetLoadBalancerClient(osclient) if err != nil { - return "", err + return "", fmt.Errorf("error getting loadbalancer client: %w", err) } amphoraFlavors, err := getAmphoraFlavors(computeClient) if err != nil { - return "", err + return "", fmt.Errorf("error getting amphora flavors: %w", err) } isPublic := false @@ -189,7 +189,7 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc log.Info(fmt.Sprintf("Creating Amphora flavor \"%s\"", flavorOpts.Name)) flavor, err := computeflavors.Create(computeClient, flavorOpts).Extract() if err != nil { - return "", err + return "", fmt.Errorf("error creating amphora flavor \"%s\": %w", flavorOpts.Name, err) } amphoraFlavors[flavorOpts.Name] = *flavor if idx == 0 { @@ -201,12 +201,12 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc // Get Octavia FlavorProfiles and Flavors flavorProfileMap, err := getOctaviaFlavorProfiles(lbClient) if err != nil { - return "", err + return "", fmt.Errorf("error getting flavor profiles: %w", err) } flavorMap, err := getOctaviaFlavors(lbClient) if err != nil { - return "", err + return "", fmt.Errorf("error getting flavors: %w", err) } for _, flavorOpts := range flavorsCreateOpts { @@ -238,7 +238,7 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc log.Info(fmt.Sprintf("Creating Octavia flavor profile \"%s\"", flavorProfileCreateOpts.Name)) fp, err := flavorprofiles.Create(lbClient, flavorProfileCreateOpts).Extract() if err != nil { - return "", err + return "", fmt.Errorf("error creating flavor profiles: %w", err) } flavorProfileMap[fp.Name] = *fp } @@ -254,7 +254,7 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc log.Info(fmt.Sprintf("Creating Octavia flavor \"%s\"", flavorCreateOpts.Name)) _, err := flavors.Create(lbClient, flavorCreateOpts).Extract() if err != nil { - return "", err + return "", fmt.Errorf("error creating flavor \"%s\": %w", flavorCreateOpts.Name, err) } } } @@ -268,12 +268,12 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc func EnsureFlavors(ctx context.Context, instance *octaviav1.OctaviaAmphoraController, log *logr.Logger, helper *helper.Helper) (string, error) { osclient, err := octavia.GetOpenstackClient(ctx, instance.Namespace, helper) if err != nil { - return "", fmt.Errorf("Error while getting a service client when creating flavors: %w", err) + return "", fmt.Errorf("error while getting a service client when creating flavors: %w", err) } defaultNovaFlavorID, err := ensureFlavors(osclient, log, instance) if err != nil { - return "", fmt.Errorf("Error while creating flavors: %w", err) + return "", fmt.Errorf("error while creating flavors: %w", err) } return defaultNovaFlavorID, nil From c3b4d3824bb36ba3649b67d9fe2be6b6c8202fa4 Mon Sep 17 00:00:00 2001 From: Tom Weininger Date: Tue, 1 Oct 2024 11:08:56 +0000 Subject: [PATCH 3/3] Skip flavor configuration on error Return error only if none of the flavors could be configured. --- pkg/amphoracontrollers/flavors.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pkg/amphoracontrollers/flavors.go b/pkg/amphoracontrollers/flavors.go index 147c4050..5a873a82 100644 --- a/pkg/amphoracontrollers/flavors.go +++ b/pkg/amphoracontrollers/flavors.go @@ -209,6 +209,7 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc return "", fmt.Errorf("error getting flavors: %w", err) } + flavorSuccess := false for _, flavorOpts := range flavorsCreateOpts { // Create FlavorProfiles if they don't exist @@ -238,7 +239,12 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc log.Info(fmt.Sprintf("Creating Octavia flavor profile \"%s\"", flavorProfileCreateOpts.Name)) fp, err := flavorprofiles.Create(lbClient, flavorProfileCreateOpts).Extract() if err != nil { - return "", fmt.Errorf("error creating flavor profiles: %w", err) + errFmt := fmt.Errorf("error creating flavor profile: %w", err) + log.Error(errFmt, fmt.Sprintf("Amphora image might be missing or not "+ + "tagged correctly. Skipping configuration of octavia "+ + "flavor profile %s and octavia flavor %s.", + flavorProfileCreateOpts.Name, name)) + continue } flavorProfileMap[fp.Name] = *fp } @@ -257,8 +263,11 @@ func ensureFlavors(osclient *openstack.OpenStack, log *logr.Logger, instance *oc return "", fmt.Errorf("error creating flavor \"%s\": %w", flavorCreateOpts.Name, err) } } + flavorSuccess = true + } + if !flavorSuccess { + return "", fmt.Errorf("none of the Octavia flavors could be configured because of errors. last error: %w", err) } - return defaultFlavorID, nil }