Skip to content

Commit

Permalink
code-refactoring: add new util functionality (#1167)
Browse files Browse the repository at this point in the history
* fix: don't set phase to available during host reconciliation  (#918)

* upgrade golangci-lint

Signed-off-by: Jaideep Rao <[email protected]>

* fix phase reconciliation during host reconciliation

Signed-off-by: Jaideep Rao <[email protected]>

* address review comment

Signed-off-by: Jaideep Rao <[email protected]>

* set phase to pending if ingress not found

Signed-off-by: Jaideep Rao <[email protected]>

---------

Signed-off-by: Jaideep Rao <[email protected]>

* update owners file (#953)

* Move to only adding two roles for managed namespaces (#954)

* Move to only adding two roles for managed namespaces
---------

Signed-off-by: Salem Elrahal <[email protected]>
Co-authored-by: Salem Elrahal <[email protected]>

* feat: expose operator metrics  (#928)

Track and expose custom operator performance metrics 
---------

Signed-off-by: Jaideep Rao <[email protected]>

* add build.os config for readthedocs (#967)

* setup 0.8.0 (#966)

* feat: Add conversion webhook for ArgoCD v1alpha1 to v1beta1 migration (#964)

* Add ArgoCD v1beta1 & deprecate v1alpha1

- Add new ArgoCD v1beta1 api
- Mark ArgoCD v1alpha1 as deprecated & add back the removed sso fields
- Use server side validation for "kubectl apply" as client side results into
  failure due to exceeding annotation size limit.

Signed-off-by: Siddhesh Ghadi <[email protected]>

Add funcs for ArgoCD alpha to beta conversion

Signed-off-by: Siddhesh Ghadi <[email protected]>

Add conversion webhook

- Create webhook & setup webhook server on 9443
- Disable operator namespaced install via OLM so that OLM can handle certs for webhook server
- For manual install, user needs to explicitly configure cert manager to inject certs and enable
  webhook server in operator by setting env ENABLE_CONVERSION_WEBHOOK="true"

Signed-off-by: Siddhesh Ghadi <[email protected]>

Resolve local build issues

Signed-off-by: Siddhesh Ghadi <[email protected]>

Tweak webhook configs

Signed-off-by: Siddhesh Ghadi <[email protected]>

Update operator installation docs

Signed-off-by: Siddhesh Ghadi <[email protected]>

Add e2e tests

Signed-off-by: Siddhesh Ghadi <[email protected]>

Minor updates

Signed-off-by: Siddhesh Ghadi <[email protected]>

Fix go-lint ci failure

Signed-off-by: Siddhesh Ghadi <[email protected]>

Update docs

Signed-off-by: Siddhesh Ghadi <[email protected]>

Remove webhook from 0.7.0 bundle

Signed-off-by: Siddhesh Ghadi <[email protected]>

Add spaces in bundle

Signed-off-by: Siddhesh Ghadi <[email protected]>

* update 0.8.0 bundle

Signed-off-by: Siddhesh Ghadi <[email protected]>

---------

Signed-off-by: Siddhesh Ghadi <[email protected]>

* chore(deps): bump pygments from 2.7.4 to 2.15.0 in /docs (#950)

Bumps [pygments](https://github.com/pygments/pygments) from 2.7.4 to 2.15.0.
- [Release notes](https://github.com/pygments/pygments/releases)
- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)
- [Commits](pygments/pygments@2.7.4...2.15.0)

---
updated-dependencies:
- dependency-name: pygments
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat: upgrade RH-SSO from 7.5 to 7.6 (#977)

* upgrade RH-SSO from 7.5 to 7.6

Signed-off-by: iam-veeramalla <[email protected]>

* fix: failing tests

Signed-off-by: iam-veeramalla <[email protected]>

* fix: failing tests

Signed-off-by: iam-veeramalla <[email protected]>

---------

Signed-off-by: iam-veeramalla <[email protected]>

* refactor: Remove dead code (#979)

* Remove dead code

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Fix import

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Fix imports

Signed-off-by: Siddhesh Ghadi <[email protected]>

---------

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Replace ArgoCD v1alpha1 references with v1beta1 (#975)

Signed-off-by: Siddhesh Ghadi <[email protected]>

* refactor: Remove deprecated .spec.resourceCustomizations (#973)

* Remove .spec.resourceCustomizations code

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Update docs

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Update docs

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Address review comments

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Fix typo

Signed-off-by: Siddhesh Ghadi <[email protected]>

---------

Signed-off-by: Siddhesh Ghadi <[email protected]>

* upgrade ArgoCD version to 2.8.2 and update the CRDs (#984)

* upgrade ArgoCD version to 2.8.2 and update the CRDs

Signed-off-by: ishitasequeira <[email protected]>

* Update argocd image

Signed-off-by: ishitasequeira <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>

* chore: Update ArgoCD v1alpha1 deprecation message (#988)

* Update ArgoCD v1alpha1 deprecation message

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Run code gen

Signed-off-by: Siddhesh Ghadi <[email protected]>

---------

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Add support for tls self signed certs in AppSet Gitlab SCM Provider (#985)

* add support for tls self signed certs in AppSet Gitlab SCM Provider

Signed-off-by: ishitasequeira <[email protected]>

* add e2e test

Signed-off-by: ishitasequeira <[email protected]>

* add unit tests

Signed-off-by: ishitasequeira <[email protected]>

* renamed field ScmRootCaPath to SCMRootCaPath

Signed-off-by: ishitasequeira <[email protected]>

* Add documentation and address comments

Signed-off-by: ishitasequeira <[email protected]>

* Address comments

Signed-off-by: ishitasequeira <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>

* chore(deps): bump github.com/argoproj/argo-cd/v2 from 2.8.2 to 2.8.3 (#992)

Bumps [github.com/argoproj/argo-cd/v2](https://github.com/argoproj/argo-cd) from 2.8.2 to 2.8.3.
- [Release notes](https://github.com/argoproj/argo-cd/releases)
- [Changelog](https://github.com/argoproj/argo-cd/blob/master/CHANGELOG.md)
- [Commits](argoproj/argo-cd@v2.8.2...v2.8.3)

---
updated-dependencies:
- dependency-name: github.com/argoproj/argo-cd/v2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat: pick up argo cd v2.8.3 (#993)

Signed-off-by: iam-veeramalla <[email protected]>

* fix: replace deprecated syntax in kustomization.yaml (#1000)

Signed-off-by: minchao <[email protected]>

* Missing syntax-highlighting, toggle button for screen mode in argocd-operator docs (#1002)

* Update requirements.txt

added markdown= 3.3.7 and  markdown-include=0.6.0

Signed-off-by: Surajyadav <[email protected]>

* Delete docs/assets/extra.css

deleted extra.css

Signed-off-by: Surajyadav <[email protected]>

* Update mkdocs.yml

added markdown_extension  markdown_include with  codehighlight and toggle for screen mode

Signed-off-by: Surajyadav <[email protected]>

* Update mkdocs.yml

Signed-off-by: Surajyadav <[email protected]>

---------

Signed-off-by: Surajyadav <[email protected]>

* fix: keycloak probes failure and intermittent perforamance issues (#1007)

* fix: keycloak probes failure results in pod crash

Signed-off-by: iam-veeramalla <[email protected]>

* fix: use latest keycloak image to handle performance issue

Signed-off-by: iam-veeramalla <[email protected]>

---------

Signed-off-by: iam-veeramalla <[email protected]>

* bug: fix heathcheck subkey generation for resources with no group  (#1013)

* account for empty group during resource customization config subkey generation

---------

Signed-off-by: Jaideep Rao <[email protected]>

* chore(deps): bump golang.org/x/net from 0.11.0 to 0.17.0 (#1019)

Bumps [golang.org/x/net](https://github.com/golang/net) from 0.11.0 to 0.17.0.
- [Commits](golang/net@v0.11.0...v0.17.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add labelSelector option to filter the ArgoCD instances for reconciliation (#961)

* Added labelselector string to map conversion

Signed-off-by: Raghavi Shirur <[email protected]>

* Changed data-type for labelSelector to parse string

Signed-off-by: Raghavi Shirur <[email protected]>

* Added code to reconcile selected ArgoCD instances based on label selector

Signed-off-by: Raghavi Shirur <[email protected]>

* remove comments

Signed-off-by: Raghavi Shirur <[email protected]>

* Updated argoCD label fetch, renamed env var

Signed-off-by: Raghavi Shirur <[email protected]>

* Updated unit test and yaml

Signed-off-by: Raghavi Shirur <[email protected]>

* Updated unit test

Signed-off-by: Raghavi Shirur <[email protected]>

* Fix yaml env ValueFrom field

Signed-off-by: Raghavi Shirur <[email protected]>

* Added comments and labelSelector check in main.go

Signed-off-by: Raghavi Shirur <[email protected]>

* removed label-selector option from manifest

Signed-off-by: Raghavi Shirur <[email protected]>

* updated label-selector format in manifests

Signed-off-by: Raghavi Shirur <[email protected]>

* added label selector logs

Signed-off-by: Raghavi Shirur <[email protected]>

* go mod tidy

Signed-off-by: Raghavi Shirur <[email protected]>

* added e2e tests for label-selector

Signed-off-by: Raghavi Shirur <[email protected]>

* restructured kuttl files and added operator patch file

Signed-off-by: Raghavi Shirur <[email protected]>

* go mod tidy

Signed-off-by: Raghavi Shirur <[email protected]>

* corrected kuttl tests for cm failure

Signed-off-by: Raghavi Shirur <[email protected]>

* Added documentation for Environment Variable ARGOCD_LABEL_SELECTOR

Signed-off-by: Raghavi Shirur <[email protected]>

* cleanup

Signed-off-by: Raghavi Shirur <[email protected]>

* improved unit tests and some minor changes

Signed-off-by: Raghavi Shirur <[email protected]>

* kuttl rerun

Signed-off-by: Raghavi Shirur <[email protected]>

* removed env var

Signed-off-by: Raghavi Shirur <[email protected]>

* misc modifications

Signed-off-by: Raghavi Shirur <[email protected]>

* argocd-operator csv correction

Signed-off-by: Raghavi Shirur <[email protected]>

* fix bundle error

Signed-off-by: Raghavi Shirur <[email protected]>

* fix bundle error

Signed-off-by: Raghavi Shirur <[email protected]>

* fix manifests build

Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: Ishita Sequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>

* Added more unit test cases

Signed-off-by: Raghavi Shirur <[email protected]>

* rebase

Signed-off-by: Raghavi Shirur <[email protected]>

* removed excess reconcilers

Signed-off-by: Raghavi Shirur <[email protected]>

* minor fix

Signed-off-by: Raghavi Shirur <[email protected]>

* removed extraneous test case and cleaned manager.yaml

Signed-off-by: Raghavi Shirur <[email protected]>

* cleaned manager.yaml

Signed-off-by: Raghavi Shirur <[email protected]>

* fix make bundle issue

Signed-off-by: Raghavi Shirur <[email protected]>

* fix make bundle issue

Signed-off-by: Raghavi Shirur <[email protected]>

---------

Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: Ishita Sequeira <[email protected]>
Co-authored-by: ishitasequeira <[email protected]>

* fix: address CVE-2023-39325 (#1022)

*address CVE-2023-39325
- upgrade to golang v1.20.10 
- disable http/2 for webhook and metrics server, use http/1.1 by default but make it a configurable flag
- upgarde k8s library packages to v0.28.3
- Add new structs for keycloak API that were previously part of the (now deprecated) keycloak-operator repo 
- upgrade to controller-runtime to v0.16.3
- refactor all unit tests 

---------

Signed-off-by: Jaideep Rao <[email protected]>

* Add gcp cherry-pick bot config (#1023)

Signed-off-by: Siddhesh Ghadi <[email protected]>

* Add .github/dependabot.yml to enable auto dependency version updates (#1025)

* feat(dex): add optional env field (#1005)

* feat(dex): add optional env field

Signed-off-by: Robert Deusser <[email protected]>

* fix: remove non-default configuration

Signed-off-by: Robert Deusser <[email protected]>

* fix: v1alpha1 is deprecated

Signed-off-by: Robert Deusser <[email protected]>

* fix: convert dex spec between api versions

Signed-off-by: Robert Deusser <[email protected]>

* fix: ensure there is no diff in the bundle

Signed-off-by: Robert Deusser <[email protected]>

---------

Signed-off-by: Robert Deusser <[email protected]>

* fix: replace deprecated AddToScheme with Install, and deprecated SchemeGroupVersion with GroupVersion. (#1066)

Signed-off-by: Cheng Fang <[email protected]>

* allow enabling ArgoCD workloads independently (#1021)

* allow enabling ArgoCD core workloads independently

Signed-off-by: ishitasequeira <[email protected]>

* fix lint

Signed-off-by: ishitasequeira <[email protected]>

* check for dependent component urls if dependent components are disabled

Signed-off-by: ishitasequeira <[email protected]>

* fix build

Signed-off-by: ishitasequeira <[email protected]>

* fix make bundle

Signed-off-by: ishitasequeira <[email protected]>

* fix tests

Signed-off-by: ishitasequeira <[email protected]>

* Update flags for each component

Signed-off-by: ishitasequeira <[email protected]>

* Update configuration using remote flag

Signed-off-by: ishitasequeira <[email protected]>

* fix CI

Signed-off-by: ishitasequeira <[email protected]>

* Address comments

Signed-off-by: ishitasequeira <[email protected]>

* Addressed feedback

Signed-off-by: ishitasequeira <[email protected]>

* update conversion webhook

Signed-off-by: ishitasequeira <[email protected]>

* fix make build

Signed-off-by: ishitasequeira <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>

* chore(deps): bump argoproj/argocd in /build/util (#1080)

Bumps argoproj/argocd from `d40da8f` to `644c386`.

---
updated-dependencies:
- dependency-name: argoproj/argocd
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat: upgrade Argo CD for release v.9.0 (#1082)

* feat: upgrade Argo CD for release v.9.0

Signed-off-by: iam-veeramalla <[email protected]>

* fix: unit test failures

Signed-off-by: iam-veeramalla <[email protected]>

---------

Signed-off-by: iam-veeramalla <[email protected]>

* fix the logic for applicationset resources reconcilation when spec.applicationset.enabled is false (#1089)

* fix the logic for applicationset resources reconciliation when spec.applicationset.enabled is false

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* fix tests

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* delete repo server when repo.enabled is set to false

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* Update status.Phase based on component enabled flag

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* Added kuttl tests

Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* Added namespace creation step

Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>

* delete services created for resources

Signed-off-by: ishitasequeira <[email protected]>

* delete server deployment when enabled flag set to false

Signed-off-by: ishitasequeira <[email protected]>

* fix e2e test

Signed-off-by: ishitasequeira <[email protected]>

* fix log message

Signed-off-by: ishitasequeira <[email protected]>

* revert kuttl test timeout

Signed-off-by: ishitasequeira <[email protected]>

* Added test for reverse scenario

Signed-off-by: Raghavi Shirur <[email protected]>

* Dir rename

Signed-off-by: Raghavi Shirur <[email protected]>

* Added e2e test for ha mode

Signed-off-by: Raghavi Shirur <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Co-authored-by: Raghavi Shirur <[email protected]>

* docs: enabling/disabling individual argocd core components (#1098)

* Add documentation for enabling/disabling argocd core components

Signed-off-by: ishitasequeira <[email protected]>

* rephrase doc

Signed-off-by: ishitasequeira <[email protected]>

* Address comments

Signed-off-by: ishitasequeira <[email protected]>

---------

Signed-off-by: ishitasequeira <[email protected]>

* fix: Proper reference to where to find default admin password (#1094)

Signed-off-by: ikegentz <[email protected]>

* adding applicationsets in server rbac policy rule (#1140)

Signed-off-by: Mangaal <[email protected]>

* remove extra argoutils

Signed-off-by: Jaideep Rao <[email protected]>

* add supplementary utils

Signed-off-by: Jaideep Rao <[email protected]>

* add changes to resource.go

Signed-off-by: Jaideep Rao <[email protected]>

* add unit tests for util pkg

Signed-off-by: Jaideep Rao <[email protected]>

---------

Signed-off-by: Jaideep Rao <[email protected]>
Signed-off-by: Salem Elrahal <[email protected]>
Signed-off-by: Siddhesh Ghadi <[email protected]>
Signed-off-by: dependabot[bot] <[email protected]>
Signed-off-by: iam-veeramalla <[email protected]>
Signed-off-by: ishitasequeira <[email protected]>
Signed-off-by: minchao <[email protected]>
Signed-off-by: Surajyadav <[email protected]>
Signed-off-by: Raghavi Shirur <[email protected]>
Signed-off-by: Ishita Sequeira <[email protected]>
Signed-off-by: Robert Deusser <[email protected]>
Signed-off-by: Cheng Fang <[email protected]>
Signed-off-by: ikegentz <[email protected]>
Signed-off-by: Mangaal <[email protected]>
Co-authored-by: Regina Scott <[email protected]>
Co-authored-by: Salem Elrahal <[email protected]>
Co-authored-by: Salem Elrahal <[email protected]>
Co-authored-by: Siddhesh Ghadi <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Abhishek Veeramalla <[email protected]>
Co-authored-by: Ishita Sequeira <[email protected]>
Co-authored-by: Minchao <[email protected]>
Co-authored-by: Suraj yadav <[email protected]>
Co-authored-by: Raghavi <[email protected]>
Co-authored-by: ishitasequeira <[email protected]>
Co-authored-by: Cheng Fang <[email protected]>
Co-authored-by: Robert Deusser <[email protected]>
Co-authored-by: Isaac Gentz <[email protected]>
Co-authored-by: Mangaal <[email protected]>
  • Loading branch information
16 people authored Jan 18, 2024
1 parent 162c95b commit 896f4c6
Show file tree
Hide file tree
Showing 15 changed files with 891 additions and 9 deletions.
20 changes: 16 additions & 4 deletions pkg/argoutil/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ package argoutil
import (
"fmt"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

argoprojv1alpha1 "github.com/argoproj-labs/argocd-operator/api/v1alpha1"
"github.com/argoproj-labs/argocd-operator/common"
)

// FqdnServiceRef will return the FQDN referencing a specific service name, as set up by the operator, with the
Expand All @@ -32,13 +35,22 @@ func NameWithSuffix(name, suffix string) string {
}

// GenerateResourceName generates names for namespace scoped resources
func GenerateResourceName(instanceName, component string) string {
return NameWithSuffix(instanceName, component)
func GenerateResourceName(instanceName, suffix string) string {
return NameWithSuffix(instanceName, suffix)
}

// GenerateUniqueResourceName generates unique names for cluster scoped resources
func GenerateUniqueResourceName(instanceName, instanceNamespace, component string) string {
return fmt.Sprintf("%s-%s-%s", instanceName, instanceNamespace, component)
func GenerateUniqueResourceName(instanceName, instanceNamespace, suffix string) string {
return fmt.Sprintf("%s-%s-%s", instanceName, instanceNamespace, suffix)
}

func GetObjMeta(resName, resNs, instanceName, instanceNs, component string) metav1.ObjectMeta {
return metav1.ObjectMeta{
Name: resName,
Namespace: resNs,
Labels: common.DefaultResourceLabels(resName, instanceName, component),
Annotations: common.DefaultResourceAnnotations(instanceName, instanceNs),
}
}

// FetchStorageSecretName will return the name of the Secret to use for the export process.
Expand Down
File renamed without changes.
63 changes: 63 additions & 0 deletions pkg/util/error.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package util

import (
"errors"
)

// MultiError employs the generic error interface but allows storage of a slice of errors
type MultiError struct {
Errs []error
}

// Split returns the slice of collected errors
func (e *MultiError) Split() []error {
return e.Errs
}

func (e MultiError) Error() string {
if e.IsNil() {
return ""
}
return errors.Join(e.Errs...).Error()
}

// Append adds errors to the slice. Nil errors are filtered out.
// Errors are not flattened out
func (e *MultiError) Append(errs ...error) {
for _, err := range errs {
if err == nil {
continue
}
e.Errs = append(e.Errs, err)
}
}

// Flatten recursively flattens out a MultiError
func (e *MultiError) Flatten() []error {
var flattenedErrors []error = make([]error, 0)

for _, err := range e.Errs {
if subMultiErr, ok := err.(*MultiError); ok {
// If the error is a MultiError, recursively flatten it
flattenedErrors = append(flattenedErrors, subMultiErr.Flatten()...)
} else {
// Otherwise, add the error to the flattened list
flattenedErrors = append(flattenedErrors, err)
}
}

return flattenedErrors
}

// IsNil determins if the MultiError by checking if the length of the error slice is 0 or not
func (e *MultiError) IsNil() bool {
return len(e.Errs) == 0
}

// ErrOrNil returns nil if the given error is determined to be nil, else it returns the error itself
func (e *MultiError) ErrOrNil() error {
if e.IsNil() {
return nil
}
return e
}
214 changes: 214 additions & 0 deletions pkg/util/error_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
package util

import (
"errors"
"reflect"
"testing"
)

func TestMultiError_Split(t *testing.T) {
tests := []struct {
name string
multiErr *MultiError
expected []error
}{
{
"Basic split",
&MultiError{Errs: []error{errors.New("error1"), errors.New("error2")}},
[]error{errors.New("error1"), errors.New("error2")},
},
{
"split Empty",
&MultiError{Errs: []error{}},
[]error{},
},
{
"split MultiError",
&MultiError{Errs: []error{errors.New("error1"), &MultiError{Errs: []error{errors.New("error2"), errors.New("error3")}}}},
[]error{errors.New("error1"), &MultiError{Errs: []error{errors.New("error2"), errors.New("error3")}}},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := tt.multiErr.Split()
if !reflect.DeepEqual(got, tt.expected) {
t.Errorf("Unwrap() = %v, want %v", got, tt.expected)
}
})
}
}

func TestMultiError_Error(t *testing.T) {
tests := []struct {
name string
multiErr *MultiError
expected string
}{
{
"Basic Error",
&MultiError{Errs: []error{errors.New("error1"), errors.New("error2")}},
"error1\nerror2",
},
{
"Error Empty",
&MultiError{Errs: []error{}},
"",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := tt.multiErr.Error()
if got != tt.expected {
t.Errorf("Error() = %v, want %v", got, tt.expected)
}
})
}
}

func TestMultiError_Append(t *testing.T) {
tests := []struct {
name string
multiErr *MultiError
errors []error
expected []error
}{
{
"Basic Append",
&MultiError{Errs: []error{errors.New("error1")}},
[]error{errors.New("error2")},
[]error{errors.New("error1"), errors.New("error2")},
},
{
"Append Nil Error",
&MultiError{Errs: []error{errors.New("error1")}},
[]error{nil, errors.New("error2")},
[]error{errors.New("error1"), errors.New("error2")},
},
{
"Append MultiError",
&MultiError{Errs: []error{errors.New("error1")}},
[]error{&MultiError{Errs: []error{errors.New("error2"), errors.New("error3")}}},
[]error{errors.New("error1"), &MultiError{Errs: []error{errors.New("error2"), errors.New("error3")}}},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.multiErr.Append(tt.errors...)

got := tt.multiErr.Split()

if !reflect.DeepEqual(got, tt.expected) {
t.Errorf("Append() = %v, want %v", got, tt.expected)
}
})
}
}

func TestMultiError_Flatten(t *testing.T) {
tests := []struct {
name string
multiErr *MultiError
expected []error
}{
{
"Basic Flatten",
&MultiError{Errs: []error{errors.New("error1"), errors.New("error2")}},
[]error{errors.New("error1"), errors.New("error2")},
},
{
"Flatten Nested MultiError",
&MultiError{Errs: []error{errors.New("error1"), &MultiError{Errs: []error{errors.New("error2"), errors.New("error3")}}}},
[]error{errors.New("error1"), errors.New("error2"), errors.New("error3")},
},
{
"Flatten Empty MultiError",
&MultiError{Errs: []error{}},
[]error{},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := tt.multiErr.Flatten()

if !reflect.DeepEqual(got, tt.expected) {
t.Errorf("Flatten() = %v, want %v", got, tt.expected)
}
})
}
}

func TestMultiError_IsNil(t *testing.T) {
tests := []struct {
name string
multiErr *MultiError
expected bool
}{
{
"IsNil True",
&MultiError{Errs: []error{}},
true,
},
{
"IsNil False",
&MultiError{Errs: []error{errors.New("error1")}},
false,
},
{
"IsNil MultiError",
&MultiError{Errs: []error{&MultiError{Errs: []error{errors.New("error2")}}}},
false,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := tt.multiErr.IsNil()

if got != tt.expected {
t.Errorf("IsNil() = %v, want %v", got, tt.expected)
}
})
}
}

func TestMultiError_ErrOrNil(t *testing.T) {

testME := MultiError{Errs: []error{errors.New("error1")}}
testMultiME := MultiError{Errs: []error{&MultiError{Errs: []error{errors.New("error2")}}}}

tests := []struct {
name string
multiErr *MultiError
expected error
}{
{
"ErrOrNil Nil",
&MultiError{Errs: []error{}},
nil,
},
{
"ErrOrNil Non-Nil",
&testME,
&testME,
},
{
"ErrOrNil MultiError",
&testMultiME,
&testMultiME,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := tt.multiErr.ErrOrNil()

if got != tt.expected {
t.Errorf("ErrOrNil() = %v, want %v", got, tt.expected)
}
})
}
}
4 changes: 4 additions & 0 deletions pkg/util/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import (

// CombineImageTag will return the combined image and tag in the proper format for tags and digests.
func CombineImageTag(img string, tag string) string {
if img == "" {
return tag
}

if strings.Contains(tag, ":") {
return fmt.Sprintf("%s@%s", img, tag) // Digest
} else if len(tag) > 0 {
Expand Down
53 changes: 53 additions & 0 deletions pkg/util/image_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package util

import "testing"

func TestCombineImageTag(t *testing.T) {
tests := []struct {
name string
img string
tag string
expected string
}{
{
"CombineImageTag Tag",
"my-image",
"latest",
"my-image:latest",
},
{
"CombineImageTag Digest",
"my-image",
"sha256:abc123",
"my-image@sha256:abc123",
},
{
"CombineImageTag NoTag",
"my-image",
"",
"my-image",
},
{
"CombineImageTag Tag With Colon",
"my-image",
"v1.0:20220101",
"[email protected]:20220101",
},
{
"CombineImageTag Empty Image",
"",
"latest",
"latest",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := CombineImageTag(tt.img, tt.tag)

if got != tt.expected {
t.Errorf("CombineImageTag() = %v, want %v", got, tt.expected)
}
})
}
}
5 changes: 5 additions & 0 deletions pkg/util/int.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package util

// Int32Ptr returns a pointer to the provided int32 value
func Int32Ptr(val int32) *int32 {
return &val
}

// Int64Ptr returns a pointer to the provided int64 value
func Int64Ptr(val int64) *int64 {
return &val
Expand Down
Loading

0 comments on commit 896f4c6

Please sign in to comment.