From cc952884b12e0e5c61aceacb57ff7652a803073b Mon Sep 17 00:00:00 2001 From: Janos Bonic <86970079+janosdebugs@users.noreply.github.com> Date: Wed, 6 Apr 2022 16:25:44 +0200 Subject: [PATCH] Fixes #149: Get affinity groups by name --- affinitygroup.go | 2 + affinitygroup_create.go | 3 ++ affinitygroup_get.go | 3 +- affinitygroup_get_by_name.go | 81 +++++++++++++++++++++++++++++++ affinitygroup_get_by_name_test.go | 20 ++++++++ errors.go | 5 ++ 6 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 affinitygroup_get_by_name.go create mode 100644 affinitygroup_get_by_name_test.go diff --git a/affinitygroup.go b/affinitygroup.go index 203fe25..6cd5220 100644 --- a/affinitygroup.go +++ b/affinitygroup.go @@ -21,6 +21,8 @@ type AffinityGroupClient interface { // GetAffinityGroup returns a specific affinity group based on its ID. An error is returned if the affinity label // doesn't exist. GetAffinityGroup(clusterID ClusterID, id AffinityGroupID, retries ...RetryStrategy) (AffinityGroup, error) + // GetAffinityGroupByName returns an affinity group by name. + GetAffinityGroupByName(clusterID ClusterID, name string, retries ...RetryStrategy) (AffinityGroup, error) // RemoveAffinityGroup removes the affinity group specified. RemoveAffinityGroup(clusterID ClusterID, id AffinityGroupID, retries ...RetryStrategy) error diff --git a/affinitygroup_create.go b/affinitygroup_create.go index 6a0a769..0599833 100644 --- a/affinitygroup_create.go +++ b/affinitygroup_create.go @@ -12,6 +12,9 @@ func (o *oVirtClient) CreateAffinityGroup( params CreateAffinityGroupOptionalParams, retries ...RetryStrategy, ) (result AffinityGroup, err error) { + if params == nil { + params = CreateAffinityGroupParams() + } retries = defaultRetries(retries, defaultWriteTimeouts()) err = retry( fmt.Sprintf("creating affinity group in cluster %s", clusterID), diff --git a/affinitygroup_get.go b/affinitygroup_get.go index 19dd719..a896239 100644 --- a/affinitygroup_get.go +++ b/affinitygroup_get.go @@ -19,8 +19,9 @@ func (o *oVirtClient) GetAffinityGroup(clusterID ClusterID, id AffinityGroupID, if !ok { return newError( ENotFound, - "no cluster returned when getting cluster ID %s", + "no affinity group returned when getting affinity group ID %s in cluster ID %s", id, + clusterID, ) } result, err = convertSDKAffinityGroup(sdkObject, o) diff --git a/affinitygroup_get_by_name.go b/affinitygroup_get_by_name.go new file mode 100644 index 0000000..0091924 --- /dev/null +++ b/affinitygroup_get_by_name.go @@ -0,0 +1,81 @@ +package ovirtclient + +import ( + "fmt" + + ovirtsdk "github.com/ovirt/go-ovirt" +) + +func (o *oVirtClient) GetAffinityGroupByName(clusterID ClusterID, name string, retries ...RetryStrategy) (result AffinityGroup, err error) { + retries = defaultRetries(retries, defaultReadTimeouts()) + err = retry( + fmt.Sprintf("getting affinity group %s", name), + o.logger, + retries, + func() error { + response, err := o.conn.SystemService().ClustersService().ClusterService(string(clusterID)).AffinityGroupsService().List().Send() + if err != nil { + return err + } + sdkObject, ok := response.Groups() + if !ok { + return newError( + ENotFound, + "no affinity group returned when listing affinity groups in cluster ID %s", + clusterID, + ) + } + slice := sdkObject.Slice() + if len(slice) == 0 { + return newError(ENotFound, "no affinity group named %s found in cluster %s", name, clusterID) + } + var results []*ovirtsdk.AffinityGroup + for _, item := range slice { + n, ok := item.Name() + if ok && n == name { + results = append(results, item) + } + } + if len(results) > 1 { + return newError(EMultipleResults, "no affinity group named %s found in cluster %s", name, clusterID) + } + result, err = convertSDKAffinityGroup(results[0], o) + if err != nil { + return wrap( + err, + EBug, + "failed to convert affinity group %s", + name, + ) + } + return nil + }) + return result, err +} + +func (m *mockClient) GetAffinityGroupByName(clusterID ClusterID, name string, retries ...RetryStrategy) (result AffinityGroup, err error) { + + retries = defaultRetries(retries, defaultWriteTimeouts()) + + err = retry( + fmt.Sprintf("getting affinity group %s from cluster %s", name, clusterID), + m.logger, + retries, + func() error { + m.lock.Lock() + defer m.lock.Unlock() + + clusterAffinityGroups, ok := m.affinityGroups[clusterID] + if !ok { + return newError(ENotFound, "Cluster with ID %s not found", clusterID) + } + for _, ag := range clusterAffinityGroups { + if ag.name == name { + result = ag + return nil + } + } + return newError(ENotFound, "Affinity group with name %s not found in cluster %s", name, clusterID) + }) + return +} diff --git a/affinitygroup_get_by_name_test.go b/affinitygroup_get_by_name_test.go new file mode 100644 index 0000000..b103619 --- /dev/null +++ b/affinitygroup_get_by_name_test.go @@ -0,0 +1,20 @@ +package ovirtclient_test + +import "testing" + +func TestGetAGByName(t *testing.T) { + helper := getHelper(t) + + // Create a dummy AG to test if the real AG is actually returned + assertCanCreateAffinityGroup(t, helper, nil) + // Create the AG we are looking for + ag := assertCanCreateAffinityGroup(t, helper, nil) + // Fetch the AG + ag2, err := helper.GetClient().GetAffinityGroupByName(ag.ClusterID(), ag.Name()) + if err != nil { + t.Fatalf("failed to fetch affinity group by name (%v)", err) + } + if ag.ID() != ag2.ID() { + t.Fatalf("Affinity group ID mismatch after fetching by name (expected: %s, got: %s)", ag.ID(), ag2.ID()) + } +} diff --git a/errors.go b/errors.go index 33164c1..8a28aaa 100644 --- a/errors.go +++ b/errors.go @@ -24,6 +24,9 @@ const ETLSError ErrorCode = "tls_error" // ENotFound signals that the resource requested was not found. const ENotFound ErrorCode = "not_found" +// EMultipleResults indicates that multiple items were found where only one was expected. +const EMultipleResults ErrorCode = "multiple_results" + // EBug signals an error that should never happen. Please report this. const EBug ErrorCode = "bug" @@ -94,6 +97,8 @@ func (e ErrorCode) CanAutoRetry() bool { return false case ENotFound: return false + case EMultipleResults: + return false case EBug: return false case EUnsupported: