Skip to content

Commit 190edf6

Browse files
Migrate controller to eris (#4463)
* Update controller code * Update tests
1 parent 1b89788 commit 190edf6

File tree

107 files changed

+605
-612
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+605
-612
lines changed

v2/cmd/controller/app/setup.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
2121
"github.com/benbjohnson/clock"
2222
"github.com/go-logr/logr"
23-
"github.com/pkg/errors"
23+
"github.com/rotisserie/eris"
2424
"golang.org/x/time/rate"
2525
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2626
"k8s.io/apimachinery/pkg/runtime"
@@ -151,7 +151,7 @@ func SetupControllerManager(ctx context.Context, setupLog logr.Logger, flgs *Fla
151151

152152
included := crdmanagement.IncludedCRDs(installationInstructions)
153153
if len(included) == 0 {
154-
err = errors.New("No existing CRDs in cluster and no --crd-pattern specified")
154+
err = eris.New("No existing CRDs in cluster and no --crd-pattern specified")
155155
setupLog.Error(err, "failed to apply CRDs")
156156
os.Exit(1)
157157
}
@@ -297,7 +297,7 @@ func getDefaultAzureTokenCredential(cfg config.Values, setupLog logr.Logger) (az
297297
TokenFilePath: identity.FederatedTokenFilePath,
298298
})
299299
if err != nil {
300-
return nil, errors.Wrapf(err, "unable to get workload identity credential")
300+
return nil, eris.Wrapf(err, "unable to get workload identity credential")
301301
}
302302

303303
return credential, nil
@@ -307,15 +307,15 @@ func getDefaultAzureTokenCredential(cfg config.Values, setupLog logr.Logger) (az
307307
certPassword := os.Getenv(common.AzureClientCertificatePassword)
308308
credential, err := identity.NewClientCertificateCredential(cfg.TenantID, cfg.ClientID, []byte(cert), []byte(certPassword))
309309
if err != nil {
310-
return nil, errors.Wrapf(err, "unable to get client certificate credential")
310+
return nil, eris.Wrapf(err, "unable to get client certificate credential")
311311
}
312312

313313
return credential, nil
314314
}
315315

316316
credential, err := azidentity.NewDefaultAzureCredential(nil)
317317
if err != nil {
318-
return nil, errors.Wrapf(err, "unable to get default azure credential")
318+
return nil, eris.Wrapf(err, "unable to get default azure credential")
319319
}
320320

321321
return credential, err
@@ -340,7 +340,7 @@ func initializeClients(cfg config.Values, mgr ctrl.Manager) (*clients, error) {
340340

341341
credential, err := getDefaultAzureCredential(cfg, log)
342342
if err != nil {
343-
return nil, errors.Wrap(err, "error while fetching default global credential")
343+
return nil, eris.Wrap(err, "error while fetching default global credential")
344344
}
345345

346346
kubeClient := kubeclient.NewClient(mgr.GetClient())
@@ -366,7 +366,7 @@ func initializeClients(cfg config.Values, mgr ctrl.Manager) (*clients, error) {
366366
asocel.Log(log),
367367
)
368368
if err != nil {
369-
return nil, errors.Wrap(err, "error creating expression evaluator")
369+
return nil, eris.Wrap(err, "error creating expression evaluator")
370370
}
371371
// Register the evaluator for use by webhooks
372372
asocel.RegisterEvaluator(expressionEvaluator)
@@ -396,13 +396,13 @@ func initializeWatchers(readyResources map[string]apiextensions.CustomResourceDe
396396
clients.expressionEvaluator,
397397
clients.options)
398398
if err != nil {
399-
return errors.Wrap(err, "failed getting storage types and reconcilers")
399+
return eris.Wrap(err, "failed getting storage types and reconcilers")
400400
}
401401

402402
// Filter the types to register
403403
objs, err = crdmanagement.FilterStorageTypesByReadyCRDs(clients.log, mgr.GetScheme(), readyResources, objs)
404404
if err != nil {
405-
return errors.Wrap(err, "failed to filter storage types by ready CRDs")
405+
return eris.Wrap(err, "failed to filter storage types by ready CRDs")
406406
}
407407

408408
err = generic.RegisterAll(
@@ -413,7 +413,7 @@ func initializeWatchers(readyResources map[string]apiextensions.CustomResourceDe
413413
objs,
414414
clients.options)
415415
if err != nil {
416-
return errors.Wrap(err, "failed to register gvks")
416+
return eris.Wrap(err, "failed to register gvks")
417417
}
418418

419419
return nil
@@ -463,7 +463,7 @@ func newCRDManager(logger logr.Logger, k8sConfig *rest.Config) (*crdmanagement.M
463463
_ = apiextensions.AddToScheme(crdScheme)
464464
crdClient, err := client.New(k8sConfig, client.Options{Scheme: crdScheme})
465465
if err != nil {
466-
return nil, errors.Wrap(err, "unable to create CRD client")
466+
return nil, eris.Wrap(err, "unable to create CRD client")
467467
}
468468

469469
crdManager := crdmanagement.NewManager(logger, kubeclient.NewClient(crdClient))

v2/internal/annotations/parse.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ package annotations
88
import (
99
"strings"
1010

11-
"github.com/pkg/errors"
11+
"github.com/rotisserie/eris"
1212
)
1313

1414
type Annotation struct {
@@ -20,20 +20,20 @@ type Annotation struct {
2020
func Parse(s string) (Annotation, error) {
2121
split := strings.Split(s, "=")
2222
if len(split) != 2 {
23-
return Annotation{}, errors.Errorf("%s must have two parts separated by '='", s)
23+
return Annotation{}, eris.Errorf("%s must have two parts separated by '='", s)
2424
}
2525

2626
// see https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set
2727
key := split[0]
2828
value := split[1]
2929

3030
if len(key) == 0 {
31-
return Annotation{}, errors.New("key can't be length 0")
31+
return Annotation{}, eris.New("key can't be length 0")
3232
}
3333

3434
keySplit := strings.Split(key, "/")
3535
if len(keySplit) > 2 {
36-
return Annotation{}, errors.Errorf("key %s must contain only a single '/'", key)
36+
return Annotation{}, eris.Errorf("key %s must contain only a single '/'", key)
3737
}
3838

3939
var name string
@@ -48,11 +48,11 @@ func Parse(s string) (Annotation, error) {
4848
}
4949

5050
if len(key) > 63 {
51-
return Annotation{}, errors.Errorf("name %s must be 63 characters or less", name)
51+
return Annotation{}, eris.Errorf("name %s must be 63 characters or less", name)
5252
}
5353

5454
if len(prefix) > 253 {
55-
return Annotation{}, errors.Errorf("prefix %s must be 253 characters or less", prefix)
55+
return Annotation{}, eris.Errorf("prefix %s must be 253 characters or less", prefix)
5656
}
5757

5858
// TODO: Could enforce character restrictions too but not bothering for now
@@ -70,7 +70,7 @@ func ParseAll(annotations []string) ([]Annotation, error) {
7070
for _, annotation := range annotations {
7171
parsed, err := Parse(annotation)
7272
if err != nil {
73-
return nil, errors.Wrapf(err, "failed parsing %s", annotation)
73+
return nil, eris.Wrapf(err, "failed parsing %s", annotation)
7474
}
7575
result = append(result, parsed)
7676
}

v2/internal/config/operatormode.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"fmt"
88
"strings"
99

10-
"github.com/pkg/errors"
10+
"github.com/rotisserie/eris"
1111
)
1212

1313
// OperatorMode determines whether we'll run watchers and/or webhooks.
@@ -57,6 +57,6 @@ func ParseOperatorMode(value string) (OperatorMode, error) {
5757
case "watchers-and-webhooks":
5858
return OperatorModeBoth, nil
5959
default:
60-
return OperatorMode(0), errors.Errorf(`operator mode value must be one of "watchers-and-webhooks", "webhooks" or "watchers" but was %q`, value)
60+
return OperatorMode(0), eris.Errorf(`operator mode value must be one of "watchers-and-webhooks", "webhooks" or "watchers" but was %q`, value)
6161
}
6262
}

v2/internal/config/vars.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"time"
1212

1313
"github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud"
14-
"github.com/pkg/errors"
14+
"github.com/rotisserie/eris"
1515

1616
"github.com/Azure/azure-service-operator/v2/pkg/common/config"
1717
)
@@ -119,7 +119,7 @@ func ParseRateLimitMode(s string) (RateLimitMode, error) {
119119
case string(RateLimitModeBucket):
120120
return RateLimitModeBucket, nil
121121
default:
122-
return "", errors.Errorf("invalid rate limit mode %q", s)
122+
return "", eris.Errorf("invalid rate limit mode %q", s)
123123
}
124124
}
125125

@@ -245,7 +245,7 @@ func ReadFromEnvironment() (Values, error) {
245245
result.TargetNamespaces = parseTargetNamespaces(os.Getenv(config.TargetNamespaces))
246246
result.SyncPeriod, err = parseSyncPeriod()
247247
if err != nil {
248-
return result, errors.Wrapf(err, "parsing %q", config.SyncPeriod)
248+
return result, eris.Wrapf(err, "parsing %q", config.SyncPeriod)
249249
}
250250

251251
result.ResourceManagerEndpoint = envOrDefault(config.ResourceManagerEndpoint, DefaultEndpoint)
@@ -296,13 +296,13 @@ func ReadAndValidate() (Values, error) {
296296
// Validate checks whether the configuration settings are consistent.
297297
func (v Values) Validate() error {
298298
if v.PodNamespace == "" {
299-
return errors.Errorf("missing value for %s", config.PodNamespace)
299+
return eris.Errorf("missing value for %s", config.PodNamespace)
300300
}
301301
if !v.OperatorMode.IncludesWatchers() && len(v.TargetNamespaces) > 0 {
302-
return errors.Errorf("%s must include watchers to specify target namespaces", config.TargetNamespaces)
302+
return eris.Errorf("%s must include watchers to specify target namespaces", config.TargetNamespaces)
303303
}
304304
if v.MaxConcurrentReconciles <= 0 {
305-
return errors.Errorf("%s must be at least 1", config.MaxConcurrentReconciles)
305+
return eris.Errorf("%s must be at least 1", config.MaxConcurrentReconciles)
306306
}
307307
return nil
308308
}
@@ -349,19 +349,19 @@ func envParseOrDefault[T int | string | float64](env string, def T) (T, error) {
349349
case int:
350350
parsedVal, err := strconv.Atoi(str)
351351
if err != nil {
352-
return def, errors.Wrapf(err, "failed to parse value %q for %q", str, env)
352+
return def, eris.Wrapf(err, "failed to parse value %q for %q", str, env)
353353
}
354354
result = any(parsedVal).(T)
355355
case string:
356356
result = any(str).(T)
357357
case float64:
358358
parsedVal, err := strconv.ParseFloat(str, 64)
359359
if err != nil {
360-
return def, errors.Wrapf(err, "failed to parse value %q for %q", str, env)
360+
return def, eris.Wrapf(err, "failed to parse value %q for %q", str, env)
361361
}
362362
result = any(parsedVal).(T)
363363
default:
364-
return def, errors.Errorf("can't read unsupported type %T from env", def)
364+
return def, eris.Errorf("can't read unsupported type %T from env", def)
365365
}
366366

367367
return result, nil

v2/internal/controllers/controller_resources.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
. "github.com/Azure/azure-service-operator/v2/internal/logging"
1717

1818
"github.com/go-logr/logr"
19-
"github.com/pkg/errors"
19+
"github.com/rotisserie/eris"
2020
corev1 "k8s.io/api/core/v1"
2121
"k8s.io/apimachinery/pkg/conversion"
2222
"k8s.io/apimachinery/pkg/runtime"
@@ -174,21 +174,21 @@ func getGeneratedStorageTypes(
174174

175175
err := resourceResolver.IndexStorageTypes(schemer.GetScheme(), knownStorageTypes)
176176
if err != nil {
177-
return nil, errors.Wrap(err, "failed add storage types to resource resolver")
177+
return nil, eris.Wrap(err, "failed add storage types to resource resolver")
178178
}
179179

180180
var extensions map[schema.GroupVersionKind]genruntime.ResourceExtension
181181
extensions, err = GetResourceExtensions(schemer.GetScheme())
182182
if err != nil {
183-
return nil, errors.Wrap(err, "failed getting extensions")
183+
return nil, eris.Wrap(err, "failed getting extensions")
184184
}
185185

186186
for _, t := range knownStorageTypes {
187187
// Use the provided GVK to construct a new runtime object of the desired concrete type.
188188
var gvk schema.GroupVersionKind
189189
gvk, err = apiutil.GVKForObject(t.Obj, schemer.GetScheme())
190190
if err != nil {
191-
return nil, errors.Wrapf(err, "creating GVK for obj %T", t.Obj)
191+
return nil, eris.Wrapf(err, "creating GVK for obj %T", t.Obj)
192192
}
193193
extension := extensions[gvk]
194194

@@ -242,7 +242,7 @@ func makeStandardPredicate() predicate.Predicate {
242242
func augmentWithControllerName(t *registration.StorageType) error {
243243
controllerName, err := getControllerName(t.Obj)
244244
if err != nil {
245-
return errors.Wrapf(err, "failed to get controller name for obj %T", t.Obj)
245+
return eris.Wrapf(err, "failed to get controller name for obj %T", t.Obj)
246246
}
247247

248248
t.Name = controllerName
@@ -255,14 +255,14 @@ var groupRegex = regexp.MustCompile(`.*/v2/api/([a-zA-Z0-9.]+)/`)
255255
func getControllerName(obj client.Object) (string, error) {
256256
v, err := conversion.EnforcePtr(obj)
257257
if err != nil {
258-
return "", errors.Wrap(err, "t.Obj was expected to be ptr but was not")
258+
return "", eris.Wrap(err, "t.Obj was expected to be ptr but was not")
259259
}
260260

261261
typ := v.Type()
262262
pkgPath := typ.PkgPath()
263263
matches := groupRegex.FindStringSubmatch(pkgPath)
264264
if len(matches) == 0 {
265-
return "", errors.Errorf("couldn't parse package path %s", pkgPath)
265+
return "", eris.Errorf("couldn't parse package path %s", pkgPath)
266266
}
267267
group := strings.Replace(matches[1], ".", "", -1) // elide . for groups like network.frontdoor
268268
name := fmt.Sprintf("%s_%s", group, strings.ToLower(typ.Name()))
@@ -302,7 +302,7 @@ func GetResourceExtensions(scheme *runtime.Scheme) (map[schema.GroupVersionKind]
302302
// Make sure the type casting goes well, and we can extract the GVK successfully.
303303
resourceObj, ok := resource.(runtime.Object)
304304
if !ok {
305-
err := errors.Errorf("unexpected resource type for resource '%s', found '%T'", resource.AzureName(), resource)
305+
err := eris.Errorf("unexpected resource type for resource '%s', found '%T'", resource.AzureName(), resource)
306306
return nil, err
307307
}
308308

v2/internal/crdmanagement/helpers.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"fmt"
88

99
"github.com/go-logr/logr"
10-
"github.com/pkg/errors"
10+
"github.com/rotisserie/eris"
1111
apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1212
"k8s.io/apimachinery/pkg/runtime"
1313
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -47,7 +47,7 @@ func FilterStorageTypesByReadyCRDs(
4747
// Use the provided GVK to construct a new runtime object of the desired concrete type.
4848
gvk, err := apiutil.GVKForObject(storageType.Obj, scheme)
4949
if err != nil {
50-
return nil, errors.Wrapf(err, "creating GVK for obj %T", storageType.Obj)
50+
return nil, eris.Wrapf(err, "creating GVK for obj %T", storageType.Obj)
5151
}
5252

5353
if !includeKinds.Contains(gvk.GroupKind()) {
@@ -80,7 +80,7 @@ func FilterKnownTypesByReadyCRDs(
8080
// Use the provided GVK to construct a new runtime object of the desired concrete type.
8181
gvk, err := apiutil.GVKForObject(knownType, scheme)
8282
if err != nil {
83-
return nil, errors.Wrapf(err, "creating GVK for obj %T", knownType)
83+
return nil, eris.Wrapf(err, "creating GVK for obj %T", knownType)
8484
}
8585
if !includeKinds.Contains(gvk.GroupKind()) {
8686
logger.V(0).Info(

0 commit comments

Comments
 (0)